Mercurial > mplayer.hg
annotate libmpdemux/demux_pva.c @ 26625:5b89b42f6d50
Only compile and use libmpeg2 AltiVec code when AltiVec is available. The
AltiVec code needs -maltivec to compile, but then AltiVec instructions
appear in other places of the code causing MPlayer to sigill.
Somehow upstream libmpeg2 manages not to sigill under what appear to be
the same circumstances. Enlightenment welcome.
author | diego |
---|---|
date | Sat, 03 May 2008 15:23:22 +0000 |
parents | 4d56038ec730 |
children | d643e4643313 |
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 |
26299
4d56038ec730
Fix lots and lots of other demuxers broken by r26301
reimar
parents:
25707
diff
changeset
|
173 demuxer->audio->id = 0; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
174 demuxer->audio->sh=sh_audio; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
175 sh_audio->format=0x50; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
176 sh_audio->ds=demuxer->audio; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
177 |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
178 demuxer->movi_start=0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
179 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
|
180 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
181 priv->last_video_pts=-1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
182 priv->last_audio_pts=-1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
183 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
184 return demuxer; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
185 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
186 |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7364
diff
changeset
|
187 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
|
188 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
189 // 0 = EOF or no stream found |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
190 // 1 = successfully read a packet |
16175 | 191 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
|
192 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
193 uint8_t done=0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
194 demux_packet_t * dp; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
195 pva_priv_t * priv=demux->priv; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
196 pva_payload_t current_payload; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
197 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
198 while(!done) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
199 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
200 if(!pva_get_payload(demux,¤t_payload)) return 0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
201 switch(current_payload.type) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
202 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
203 case VIDEOSTREAM: |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
204 if(demux->video->id==-1) demux->video->id=0; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
205 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
|
206 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
207 /* 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
|
208 * 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
|
209 * 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
|
210 * player a bogus PTS. |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
211 */ |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
212 done=0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
213 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
214 else |
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 /* |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
217 * 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
|
218 * 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
|
219 */ |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
220 done=1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
221 } |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
222 if(demux->video->id!=0) done=0; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
223 if(current_payload.is_packet_start) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
224 { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
225 priv->last_video_pts=current_payload.pts; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
226 //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
|
227 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
228 if(done) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
229 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
230 dp=new_demux_packet(current_payload.size); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
231 dp->pts=priv->last_video_pts; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
232 stream_read(demux->stream,dp->buffer,current_payload.size); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
233 ds_add_packet(demux->video,dp); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
234 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
235 else |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
236 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
237 //printf("Skipping %u video bytes\n",current_payload.size); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
238 stream_skip(demux->stream,current_payload.size); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
239 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
240 break; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
241 case MAINAUDIOSTREAM: |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
242 if(demux->audio->id==-1) demux->audio->id=0; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
243 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
|
244 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
245 /* Same as above for invalid video PTS, just for audio. */ |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
246 done=0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
247 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
248 else |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
249 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
250 done=1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
251 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
252 if(current_payload.is_packet_start) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
253 { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
254 priv->last_audio_pts=current_payload.pts; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
255 } |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
256 if(demux->audio->id!=0) done=0; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
257 if(done) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
258 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
259 dp=new_demux_packet(current_payload.size); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
260 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
|
261 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
|
262 stream_seek(demux->stream,current_payload.offset); |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
263 stream_read(demux->stream,dp->buffer,current_payload.size); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
264 ds_add_packet(demux->audio,dp); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
265 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
266 else |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
267 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
268 stream_skip(demux->stream,current_payload.size); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
269 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
270 break; |
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 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
273 return 1; |
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 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
276 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
|
277 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
278 uint8_t flags,pes_head_len; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
279 uint16_t pack_size; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
280 off_t next_offset,pva_payload_start; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
281 unsigned char buffer[256]; |
8254
772d6d27fd66
warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents:
7663
diff
changeset
|
282 #ifndef PVA_NEW_PREBYTES_CODE |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
283 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
|
284 #endif |
17913
f000129a16b3
10l, checking for NULL after dereferencing makes no sense (though what is this check for anyway?)
reimar
parents:
17636
diff
changeset
|
285 pva_priv_t * priv; |
7364
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 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
288 if(d==NULL) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
289 { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
290 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
|
291 return 0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
292 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
293 |
17913
f000129a16b3
10l, checking for NULL after dereferencing makes no sense (though what is this check for anyway?)
reimar
parents:
17636
diff
changeset
|
294 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
|
295 d->filepos=stream_tell(d->stream); |
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 |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
298 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
299 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
300 if(d->stream->eof) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
301 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
302 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
|
303 return 0; |
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 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
306 //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
|
307 |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
308 #ifdef PVA_NEW_PREBYTES_CODE |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
309 if(priv->prebytes_delivered) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
310 /* 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
|
311 * 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
|
312 * 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
|
313 */ |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
314 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
315 //printf("prebytes_delivered=1. Resetting.\n"); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
316 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
|
317 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
|
318 payload->is_packet_start = 1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
319 payload->offset = stream_tell(d->stream); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
320 payload->type = VIDEOSTREAM; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
321 priv->prebytes_delivered = 0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
322 return 1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
323 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
324 #endif |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
325 if(!priv->just_synced) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
326 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
327 if(stream_read_word(d->stream) != (('A'<<8)|'V')) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
328 { |
17366 | 329 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
|
330 if(!pva_sync(d)) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
331 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
332 if (!d->stream->eof) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
333 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
334 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
|
335 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
336 return 0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
337 } |
7364
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 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
340 if(priv->just_synced) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
341 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
342 payload->type=priv->synced_stream_id; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
343 priv->just_synced=0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
344 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
345 else |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
346 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
347 payload->type=stream_read_char(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
348 stream_skip(d->stream,2); //counter and reserved |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
349 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
350 flags=stream_read_char(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
351 payload->is_packet_start=flags & 0x10; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
352 pack_size=le2me_16(stream_read_word(d->stream)); |
17366 | 353 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
|
354 pva_payload_start=stream_tell(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
355 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
|
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 /* |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
359 * 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
|
360 * 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
|
361 * 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
|
362 * 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
|
363 * 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
|
364 * 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
|
365 * PES header start. |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
366 * 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
|
367 */ |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
368 #ifdef DEMUX_PVA_MULTIDEC_HACK |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
369 if(payload->type==MAINAUDIOSTREAM) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
370 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
371 stream_read(d->stream,buffer,3); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
372 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
|
373 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
374 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
|
375 payload->is_packet_start=1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
376 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
377 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
|
378 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
379 #endif |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
380 |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
381 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
382 if(!payload->is_packet_start) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
383 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
384 payload->offset=stream_tell(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
385 payload->size=pack_size; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
386 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
387 else |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
388 { //here comes the good part... |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
389 switch(payload->type) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
390 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
391 case VIDEOSTREAM: |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
392 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
|
393 //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
|
394 if((flags&0x03) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
395 #ifdef PVA_NEW_PREBYTES_CODE |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
396 && !priv->prebytes_delivered |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
397 #endif |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
398 ) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
399 { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
400 #ifndef PVA_NEW_PREBYTES_CODE |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
401 dp=new_demux_packet(flags&0x03); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
402 stream_read(d->stream,dp->buffer,flags & 0x03); //read PreBytes |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
403 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
|
404 #else |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
405 //printf("Delivering prebytes. Setting prebytes_delivered."); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
406 payload->offset=stream_tell(d->stream); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
407 payload->size = flags & 0x03; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
408 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
|
409 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
|
410 payload->pts=priv->last_video_pts; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
411 payload->is_packet_start=0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
412 priv->prebytes_delivered=1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
413 return 1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
414 #endif |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
415 } |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
416 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
417 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
418 //now we are at real beginning of payload. |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
419 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
|
420 //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
|
421 payload->size=pack_size - 4 - (flags & 0x03); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
422 break; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
423 case MAINAUDIOSTREAM: |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
424 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
|
425 //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
|
426 stream_skip(d->stream,4); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
427 |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
428 buffer[255]=stream_read_char(d->stream); |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
429 pes_head_len=stream_read_char(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
430 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
|
431 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
|
432 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
433 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
|
434 payload->pts=priv->last_audio_pts; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
435 break; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
436 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
437 else //PES header DOES contain PTS |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
438 { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
439 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
|
440 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
441 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
|
442 payload->pts=priv->last_audio_pts; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
443 // return 0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
444 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
445 else |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
446 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
447 uint64_t temp_pts; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
448 |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
449 temp_pts=0LL; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
450 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
|
451 temp_pts|=buffer[1]<<22; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
452 temp_pts|=(buffer[2] & 0xfe) << 14; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
453 temp_pts|=buffer[3]<<7; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
454 temp_pts|=(buffer[4] & 0xfe) >> 1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
455 /* |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
456 * PTS parsing is hopefully finished. |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
457 */ |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
458 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
|
459 } |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
460 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
461 payload->offset=stream_tell(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
462 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
|
463 break; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
464 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
465 } |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7364
diff
changeset
|
466 return 1; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
467 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
468 |
17636 | 469 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
|
470 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
471 int total_bitrate=0; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
472 off_t dest_offset; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
473 pva_priv_t * priv=demuxer->priv; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
474 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
475 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
|
476 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
477 /* |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
478 * 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
|
479 * 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
|
480 * 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
|
481 * the overhead caused by PVA and PES headers. |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
482 * 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
|
483 */ |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
484 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
485 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
|
486 if(dest_offset<0) dest_offset=0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
487 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
488 stream_seek(demuxer->stream,dest_offset); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
489 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
490 if(!pva_sync(demuxer)) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
491 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
492 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
|
493 return; |
7364
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 /* |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
497 * 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
|
498 * 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
|
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 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
502 priv->last_video_pts=-1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
503 priv->last_audio_pts=-1; |
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 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
507 |
16175 | 508 static void demux_close_pva(demuxer_t * demuxer) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
509 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
510 if(demuxer->priv) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
511 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
512 free(demuxer->priv); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
513 demuxer->priv=NULL; |
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 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
516 |
16175 | 517 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
22605
diff
changeset
|
518 const demuxer_desc_t demuxer_desc_pva = { |
16175 | 519 "PVA demuxer", |
520 "pva", | |
521 "PVA", | |
522 "Matteo Giani", | |
523 "streams from DVB cards", | |
524 DEMUXER_TYPE_PVA, | |
525 0, // unsafe autodetect | |
526 pva_check_file, | |
527 demux_pva_fill_buffer, | |
528 demux_open_pva, | |
529 demux_close_pva, | |
530 demux_seek_pva, | |
531 NULL | |
532 }; |