annotate libmpdemux/demux_pva.c @ 25661:293aeec83153

Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with an almost-trivial implementation. This allows making the builtin codec structs const, and it also makes clearer that this "selected" status is not used outside the init functions.
author reimar
date Sat, 12 Jan 2008 14:05:46 +0000
parents 4d81dbdf46b9
children d4fe6e23283e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
1 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
2 * demuxer for PVA files, such as the ones produced by software to manage DVB boards
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
3 * like the Hauppauge WinTV DVBs, for MPlayer.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
4 *
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
5 * Uses info from the PVA file specifications found at
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
6 *
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
7 * http://www.technotrend.de/download/av_format_v1.pdf
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
8 *
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
9 * WARNING: Quite a hack was required in order to get files by MultiDec played back correctly.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
10 * If it breaks anything else, just comment out the "#define DEMUX_PVA_MULTIDEC_HACK" below
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
11 * and it will not be compiled in.
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
12 *
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
13 * Feedback is appreciated.
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
14 *
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
15 * written by Matteo Giani
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
16 */
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
17
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
18 #define DEMUX_PVA_MULTIDEC_HACK
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
19 #define PVA_NEW_PREBYTES_CODE
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
20
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7364
diff changeset
21 #include <stdio.h>
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7364
diff changeset
22 #include <stdlib.h>
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7364
diff changeset
23 #include <string.h>
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
24
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
25 #include "config.h"
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
26 #include "mp_msg.h"
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
27 #include "help_mp.h"
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
28
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 21421
diff changeset
29 #include "stream/stream.h"
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
30 #include "demuxer.h"
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
31 #include "stheader.h"
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
32
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
33 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
34 * #defines below taken from PVA spec (see URL above)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
35 */
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
36
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
37 #define PVA_MAX_VIDEO_PACK_LEN 6*1024
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
38
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
39 #define VIDEOSTREAM 0x01
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
40 #define MAINAUDIOSTREAM 0x02
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
41
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
42 typedef struct {
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
43 off_t offset;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
44 long size;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
45 uint8_t type;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
46 uint8_t is_packet_start;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
47 float pts;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
48 } pva_payload_t;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
49
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
50
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
51 typedef struct {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
52 float last_audio_pts;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
53 float last_video_pts;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
54 #ifdef PVA_NEW_PREBYTES_CODE
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
55 float video_pts_after_prebytes;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
56 long video_size_after_prebytes;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
57 uint8_t prebytes_delivered;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
58 #endif
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
59 uint8_t just_synced;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
60 uint8_t synced_stream_id;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
61 } pva_priv_t;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
62
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
63
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
64
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
65 int pva_sync(demuxer_t * demuxer)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
66 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
67 uint8_t buffer[5]={0,0,0,0,0};
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
68 int count;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
69 pva_priv_t * priv = (pva_priv_t *) demuxer->priv;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
70
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
71
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
72 /* This function is used to find the next nearest PVA packet start after a seek, since a PVA file
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
73 * is not indexed.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
74 * The just_synced field is in the priv structure so that pva_get_payload knows pva_sync
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
75 * has already read (part of) the PVA header. This way we can avoid to seek back and (hopefully)
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
76 * be able to read from pipes and such.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
77 */
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
78
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
79
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
80 for(count=0 ; count<PVA_MAX_VIDEO_PACK_LEN && !demuxer->stream->eof && !priv->just_synced ; count++)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
81 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
82 buffer[0]=buffer[1];
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
83 buffer[1]=buffer[2];
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
84 buffer[2]=buffer[3];
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
85 buffer[3]=buffer[4];
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
86 buffer[4]=stream_read_char(demuxer->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
87 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
88 * Check for a PVA packet beginning sequence: we check both the "AV" word at the
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
89 * very beginning and the "0x55" reserved byte (which is unused and set to 0x55 by spec)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
90 */
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
91 if(buffer[0]=='A' && buffer[1] == 'V' && buffer[4] == 0x55) priv->just_synced=1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
92 //printf("demux_pva: pva_sync(): current offset= %ld\n",stream_tell(demuxer->stream));
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
93 }
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
94 if(priv->just_synced)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
95 {
18115
5e0bafa6f7e8 remove completely pointless != NULL check
reimar
parents: 17913
diff changeset
96 priv->synced_stream_id=buffer[2];
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
97 return 1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
98 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
99 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
100 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
101 return 0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
102 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
103 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
104
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
105 static int pva_check_file(demuxer_t * demuxer)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
106 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
107 uint8_t buffer[5]={0,0,0,0,0};
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
108 mp_msg(MSGT_DEMUX, MSGL_V, "Checking for PVA\n");
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
109 stream_read(demuxer->stream,buffer,5);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
110 if(buffer[0]=='A' && buffer[1] == 'V' && buffer[4] == 0x55)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
111 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
112 mp_msg(MSGT_DEMUX,MSGL_DBG2, "Success: PVA\n");
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
113 return DEMUXER_TYPE_PVA;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
114 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
115 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
116 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
117 mp_msg(MSGT_DEMUX,MSGL_DBG2, "Failed: PVA\n");
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
118 return 0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
119 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
120 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
121
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
122 static demuxer_t * demux_open_pva (demuxer_t * demuxer)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
123 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
124 sh_video_t *sh_video = new_sh_video(demuxer,0);
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
125 sh_audio_t *sh_audio = new_sh_audio(demuxer,0);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
126
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
127
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
128 pva_priv_t * priv;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
129
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
130 stream_reset(demuxer->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
131 stream_seek(demuxer->stream,0);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
132
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
133
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
134
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
135 priv=malloc(sizeof(pva_priv_t));
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
136
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
137 if(demuxer->stream->type!=STREAMTYPE_FILE) demuxer->seekable=0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
138 else demuxer->seekable=1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
139
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
140 demuxer->priv=priv;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
141 memset(demuxer->priv,0,sizeof(pva_priv_t));
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
142
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
143 if(!pva_sync(demuxer))
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
144 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
145 mp_msg(MSGT_DEMUX,MSGL_ERR,"Not a PVA file.\n");
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
146 return NULL;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
147 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
148
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
149 //printf("priv->just_synced %s after initial sync!\n",priv->just_synced?"set":"UNSET");
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
150
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
151 demuxer->video->sh=sh_video;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
152
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
153 //printf("demuxer->stream->end_pos= %d\n",demuxer->stream->end_pos);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
154
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
155
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
156 mp_msg(MSGT_DEMUXER,MSGL_INFO,"Opened PVA demuxer...\n");
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
157
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
158 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
159 * Audio and Video codecs:
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
160 * the PVA spec only allows MPEG2 video and MPEG layer II audio. No need to check the formats then.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
161 * Moreover, there would be no way to do that since the PVA stream format has no fields to describe
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
162 * the used codecs.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
163 */
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
164
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
165 sh_video->format=0x10000002;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
166 sh_video->ds=demuxer->video;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
167
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
168 /*
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
169 printf("demuxer->video->id==%d\n",demuxer->video->id);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
170 printf("demuxer->audio->id==%d\n",demuxer->audio->id);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
171 */
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
172
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
173 demuxer->audio->sh=sh_audio;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
174 sh_audio->format=0x50;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
175 sh_audio->ds=demuxer->audio;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
176
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
177 demuxer->movi_start=0;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
178 demuxer->movi_end=demuxer->stream->end_pos;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
179
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
180 priv->last_video_pts=-1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
181 priv->last_audio_pts=-1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
182
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
183 return demuxer;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
184 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
185
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7364
diff changeset
186 int pva_get_payload(demuxer_t * d,pva_payload_t * payload);
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7364
diff changeset
187
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
188 // 0 = EOF or no stream found
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
189 // 1 = successfully read a packet
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
190 static int demux_pva_fill_buffer (demuxer_t * demux, demux_stream_t *ds)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
191 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
192 uint8_t done=0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
193 demux_packet_t * dp;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
194 pva_priv_t * priv=demux->priv;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
195 pva_payload_t current_payload;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
196
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
197 while(!done)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
198 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
199 if(!pva_get_payload(demux,&current_payload)) return 0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
200 switch(current_payload.type)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
201 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
202 case VIDEOSTREAM:
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
203 if(demux->video->id==-1) demux->video->id=0;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
204 if(!current_payload.is_packet_start && priv->last_video_pts==-1)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
205 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
206 /* We should only be here at the beginning of a stream, when we have
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
207 * not yet encountered a valid Video PTS, or after a seek.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
208 * So, skip these starting packets in order not to deliver the
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
209 * player a bogus PTS.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
210 */
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
211 done=0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
212 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
213 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
214 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
215 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
216 * In every other condition, we are delivering the payload. Set this
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
217 * so that the following code knows whether to skip it or read it.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
218 */
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
219 done=1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
220 }
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
221 if(demux->video->id!=0) done=0;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
222 if(current_payload.is_packet_start)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
223 {
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
224 priv->last_video_pts=current_payload.pts;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
225 //mp_msg(MSGT_DEMUXER,MSGL_DBG2,"demux_pva: Video PTS=%llu , delivered %f\n",current_payload.pts,priv->last_video_pts);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
226 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
227 if(done)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
228 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
229 dp=new_demux_packet(current_payload.size);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
230 dp->pts=priv->last_video_pts;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
231 stream_read(demux->stream,dp->buffer,current_payload.size);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
232 ds_add_packet(demux->video,dp);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
233 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
234 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
235 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
236 //printf("Skipping %u video bytes\n",current_payload.size);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
237 stream_skip(demux->stream,current_payload.size);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
238 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
239 break;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
240 case MAINAUDIOSTREAM:
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
241 if(demux->audio->id==-1) demux->audio->id=0;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
242 if(!current_payload.is_packet_start && priv->last_audio_pts==-1)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
243 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
244 /* Same as above for invalid video PTS, just for audio. */
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
245 done=0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
246 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
247 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
248 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
249 done=1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
250 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
251 if(current_payload.is_packet_start)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
252 {
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
253 priv->last_audio_pts=current_payload.pts;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
254 }
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
255 if(demux->audio->id!=0) done=0;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
256 if(done)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
257 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
258 dp=new_demux_packet(current_payload.size);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
259 dp->pts=priv->last_audio_pts;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
260 if(current_payload.offset != stream_tell(demux->stream))
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
261 stream_seek(demux->stream,current_payload.offset);
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
262 stream_read(demux->stream,dp->buffer,current_payload.size);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
263 ds_add_packet(demux->audio,dp);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
264 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
265 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
266 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
267 stream_skip(demux->stream,current_payload.size);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
268 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
269 break;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
270 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
271 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
272 return 1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
273 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
274
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
275 int pva_get_payload(demuxer_t * d,pva_payload_t * payload)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
276 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
277 uint8_t flags,pes_head_len;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
278 uint16_t pack_size;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
279 off_t next_offset,pva_payload_start;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
280 unsigned char buffer[256];
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7663
diff changeset
281 #ifndef PVA_NEW_PREBYTES_CODE
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
282 demux_packet_t * dp; //hack to deliver the preBytes (see PVA doc)
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7663
diff changeset
283 #endif
17913
f000129a16b3 10l, checking for NULL after dereferencing makes no sense (though what is this check for anyway?)
reimar
parents: 17636
diff changeset
284 pva_priv_t * priv;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
285
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
286
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
287 if(d==NULL)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
288 {
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
289 mp_msg(MSGT_DEMUX,MSGL_ERR,"demux_pva: pva_get_payload got passed a NULL pointer!\n");
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
290 return 0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
291 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
292
17913
f000129a16b3 10l, checking for NULL after dereferencing makes no sense (though what is this check for anyway?)
reimar
parents: 17636
diff changeset
293 priv = (pva_priv_t *)d->priv;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
294 d->filepos=stream_tell(d->stream);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
295
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
296
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
297
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
298
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
299 if(d->stream->eof)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
300 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
301 mp_msg(MSGT_DEMUX,MSGL_V,"demux_pva: pva_get_payload() detected stream->eof!!!\n");
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
302 return 0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
303 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
304
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
305 //printf("priv->just_synced %s\n",priv->just_synced?"SET":"UNSET");
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
306
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
307 #ifdef PVA_NEW_PREBYTES_CODE
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
308 if(priv->prebytes_delivered)
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
309 /* The previous call to this fn has delivered the preBytes. Then we are already inside
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
310 * the payload. Let's just deliver the video along with its right PTS, the one we stored
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
311 * in the priv structure and was in the PVA header before the PreBytes.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
312 */
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
313 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
314 //printf("prebytes_delivered=1. Resetting.\n");
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
315 payload->size = priv->video_size_after_prebytes;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
316 payload->pts = priv->video_pts_after_prebytes;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
317 payload->is_packet_start = 1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
318 payload->offset = stream_tell(d->stream);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
319 payload->type = VIDEOSTREAM;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
320 priv->prebytes_delivered = 0;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
321 return 1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
322 }
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
323 #endif
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
324 if(!priv->just_synced)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
325 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
326 if(stream_read_word(d->stream) != (('A'<<8)|'V'))
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
327 {
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17174
diff changeset
328 mp_msg(MSGT_DEMUX,MSGL_V,"demux_pva: pva_get_payload() missed a SyncWord at %"PRId64"!! Trying to sync...\n",(int64_t)stream_tell(d->stream));
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
329 if(!pva_sync(d))
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
330 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
331 if (!d->stream->eof)
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
332 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
333 mp_msg(MSGT_DEMUX,MSGL_ERR,"demux_pva: couldn't sync! (broken file?)");
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
334 }
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
335 return 0;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
336 }
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
337 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
338 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
339 if(priv->just_synced)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
340 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
341 payload->type=priv->synced_stream_id;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
342 priv->just_synced=0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
343 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
344 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
345 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
346 payload->type=stream_read_char(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
347 stream_skip(d->stream,2); //counter and reserved
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
348 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
349 flags=stream_read_char(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
350 payload->is_packet_start=flags & 0x10;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
351 pack_size=le2me_16(stream_read_word(d->stream));
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17174
diff changeset
352 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_pva::pva_get_payload(): pack_size=%u field read at offset %"PRIu64"\n",pack_size,(int64_t)stream_tell(d->stream)-2);
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
353 pva_payload_start=stream_tell(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
354 next_offset=pva_payload_start+pack_size;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
355
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
356
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
357 /*
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
358 * The code in the #ifdef directive below is a hack needed to get badly formatted PVA files
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
359 * such as the ones written by MultiDec played back correctly.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
360 * Basically, it works like this: if the PVA packet does not signal a PES header, but the
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
361 * payload looks like one, let's assume it IS one. It has worked for me up to now.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
362 * It can be disabled since it's quite an ugly hack and could potentially break things up
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
363 * if the PVA audio payload happens to start with 0x000001 even without being a non signalled
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
364 * PES header start.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
365 * Though it's quite unlikely, it potentially could (AFAIK).
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
366 */
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
367 #ifdef DEMUX_PVA_MULTIDEC_HACK
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
368 if(payload->type==MAINAUDIOSTREAM)
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
369 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
370 stream_read(d->stream,buffer,3);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
371 if(buffer[0]==0x00 && buffer[1]==0x00 && buffer[2]==0x01 && !payload->is_packet_start)
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
372 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
373 mp_msg(MSGT_DEMUX,MSGL_V,"demux_pva: suspecting non signaled audio PES packet start. Maybe file by MultiDec?\n");
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
374 payload->is_packet_start=1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
375 }
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
376 stream_seek(d->stream,stream_tell(d->stream)-3);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
377 }
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
378 #endif
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
379
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
380
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
381 if(!payload->is_packet_start)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
382 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
383 payload->offset=stream_tell(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
384 payload->size=pack_size;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
385 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
386 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
387 { //here comes the good part...
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
388 switch(payload->type)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
389 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
390 case VIDEOSTREAM:
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
391 payload->pts=(float)(le2me_32(stream_read_dword(d->stream)))/90000;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
392 //printf("Video PTS: %f\n",payload->pts);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
393 if((flags&0x03)
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
394 #ifdef PVA_NEW_PREBYTES_CODE
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
395 && !priv->prebytes_delivered
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
396 #endif
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
397 )
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
398 {
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
399 #ifndef PVA_NEW_PREBYTES_CODE
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
400 dp=new_demux_packet(flags&0x03);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
401 stream_read(d->stream,dp->buffer,flags & 0x03); //read PreBytes
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
402 ds_add_packet(d->video,dp);
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
403 #else
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
404 //printf("Delivering prebytes. Setting prebytes_delivered.");
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
405 payload->offset=stream_tell(d->stream);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
406 payload->size = flags & 0x03;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
407 priv->video_pts_after_prebytes = payload->pts;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
408 priv->video_size_after_prebytes = pack_size - 4 - (flags & 0x03);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
409 payload->pts=priv->last_video_pts;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
410 payload->is_packet_start=0;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
411 priv->prebytes_delivered=1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
412 return 1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
413 #endif
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
414 }
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
415
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
416
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
417 //now we are at real beginning of payload.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
418 payload->offset=stream_tell(d->stream);
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
419 //size is pack_size minus PTS size minus PreBytes size.
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
420 payload->size=pack_size - 4 - (flags & 0x03);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
421 break;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
422 case MAINAUDIOSTREAM:
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
423 stream_skip(d->stream,3); //FIXME properly parse PES header.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
424 //printf("StreamID in audio PES header: 0x%2X\n",stream_read_char(d->stream));
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
425 stream_skip(d->stream,4);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
426
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
427 buffer[255]=stream_read_char(d->stream);
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
428 pes_head_len=stream_read_char(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
429 stream_read(d->stream,buffer,pes_head_len);
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
430 if(!buffer[255]&0x80) //PES header does not contain PTS.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
431 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
432 mp_msg(MSGT_DEMUX,MSGL_V,"Audio PES packet does not contain PTS. (pes_head_len=%d)\n",pes_head_len);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
433 payload->pts=priv->last_audio_pts;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
434 break;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
435 }
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
436 else //PES header DOES contain PTS
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
437 {
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
438 if((buffer[0] & 0xf0)!=0x20) // PTS badly formatted
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
439 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
440 mp_msg(MSGT_DEMUX,MSGL_V,"demux_pva: expected audio PTS but badly formatted... (read 0x%02X). Falling back to previous PTS (hack).\n",buffer[0]);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
441 payload->pts=priv->last_audio_pts;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
442 // return 0;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
443 }
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
444 else
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
445 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
446 uint64_t temp_pts;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
447
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
448 temp_pts=0LL;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
449 temp_pts|=((uint64_t)(buffer[0] & 0x0e) << 29);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
450 temp_pts|=buffer[1]<<22;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
451 temp_pts|=(buffer[2] & 0xfe) << 14;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
452 temp_pts|=buffer[3]<<7;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
453 temp_pts|=(buffer[4] & 0xfe) >> 1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
454 /*
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
455 * PTS parsing is hopefully finished.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
456 */
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
457 payload->pts=(float)le2me_64(temp_pts)/90000;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
458 }
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
459 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
460 payload->offset=stream_tell(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
461 payload->size=pack_size-stream_tell(d->stream)+pva_payload_start;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
462 break;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
463 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
464 }
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7364
diff changeset
465 return 1;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
466 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
467
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
468 static void demux_seek_pva(demuxer_t * demuxer,float rel_seek_secs,float audio_delay,int flags)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
469 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
470 int total_bitrate=0;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
471 off_t dest_offset;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
472 pva_priv_t * priv=demuxer->priv;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
473
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
474 total_bitrate=((sh_audio_t *)demuxer->audio->sh)->i_bps + ((sh_video_t *)demuxer->video->sh)->i_bps;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
475
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
476 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
477 * Compute absolute offset inside the stream. Approximate total bitrate with sum of bitrates
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
478 * reported by the audio and video codecs. The seek is not accurate because, just like
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
479 * with MPEG streams, the bitrate is not constant. Moreover, we do not take into account
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
480 * the overhead caused by PVA and PES headers.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
481 * If the calculated absolute offset is negative, seek to the beginning of the file.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
482 */
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
483
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
484 dest_offset=stream_tell(demuxer->stream)+rel_seek_secs*total_bitrate;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
485 if(dest_offset<0) dest_offset=0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
486
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
487 stream_seek(demuxer->stream,dest_offset);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
488
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
489 if(!pva_sync(demuxer))
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
490 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
491 mp_msg(MSGT_DEMUX,MSGL_V,"demux_pva: Couldn't seek!\n");
17174
83a8c738be89 make demuxer seek and close functions return void, patch by Dominik Mierzejewski
wanderer
parents: 16175
diff changeset
492 return;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
493 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
494
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
495 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
496 * Reset the PTS info inside the pva_priv_t structure. This way we don't deliver
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
497 * data with the wrong PTSs (the ones we had before seeking).
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
498 *
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
499 */
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
500
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
501 priv->last_video_pts=-1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
502 priv->last_audio_pts=-1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
503 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
504
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
505
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
506
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
507 static void demux_close_pva(demuxer_t * demuxer)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
508 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
509 if(demuxer->priv)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
510 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
511 free(demuxer->priv);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
512 demuxer->priv=NULL;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
513 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
514 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
515
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
516
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
517 demuxer_desc_t demuxer_desc_pva = {
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
518 "PVA demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
519 "pva",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
520 "PVA",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
521 "Matteo Giani",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
522 "streams from DVB cards",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
523 DEMUXER_TYPE_PVA,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
524 0, // unsafe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
525 pva_check_file,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
526 demux_pva_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
527 demux_open_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
528 demux_close_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
529 demux_seek_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
530 NULL
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
531 };