Mercurial > mplayer.hg
annotate libmpdemux/demux_pva.c @ 26146:20a126aaa756
ve_vfw.c: #include aviheader.h instead of wine avifmt.h
Compilation was broken after libmpdemux/muxer.h started including
libmpdemux/aviheader.h. ve_vfw.c included both muxer.h and
loader/wine/avifmt.h, and the latter has definitions that conflict with
aviheader.h ones. Fix by removing the avifmt.h include.
I did not carefully check that changing the includes doesn't break
any ve_vfw.c code. However it at least fixes compilation, and if the
avifmt.h versions differ in some significant way then the code is
fundamentally broken anyway: ve_vfw cannot use different versions of
the avi struct definitions when it also uses shared muxer.h types
(those must use the standard definitions to keep the type compatible
with what's used in other files).
author | uau |
---|---|
date | Thu, 06 Mar 2008 01:57:26 +0000 |
parents | d4fe6e23283e |
children | 4d56038ec730 |
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 | 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 | 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 | 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 | 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 | 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,¤t_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 | 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 | 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 | 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 | 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 | 516 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
22605
diff
changeset
|
517 const demuxer_desc_t demuxer_desc_pva = { |
16175 | 518 "PVA demuxer", |
519 "pva", | |
520 "PVA", | |
521 "Matteo Giani", | |
522 "streams from DVB cards", | |
523 DEMUXER_TYPE_PVA, | |
524 0, // unsafe autodetect | |
525 pva_check_file, | |
526 demux_pva_fill_buffer, | |
527 demux_open_pva, | |
528 demux_close_pva, | |
529 demux_seek_pva, | |
530 NULL | |
531 }; |