Mercurial > mplayer.hg
annotate libmpdemux/demux_pva.c @ 33259:04dc3e55cd90
Increase the maximum value of the DVB timeout to 240 seconds.
Some devices may need more time for the initial tune (e.g. firmware loading).
Let the user specify higher timeout value if there is need to.
The default remains 30 seconds.
author | iive |
---|---|
date | Sun, 01 May 2011 18:07:59 +0000 |
parents | 8fa2f43cb760 |
children | 15f3c0b69e14 |
rev | line source |
---|---|
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
1 /* |
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
2 * demuxer for PVA files, such as the ones produced by software to manage |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
3 * DVB boards like the Hauppauge WinTV DVBs |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
4 * copyright (c) 2002 Matteo Giani |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
5 * |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
6 * Uses info from the PVA file specifications found at |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
7 * http://www.technotrend.de/download/av_format_v1.pdf |
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
8 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
9 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
10 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
11 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
12 * it under the terms of the GNU General Public License as published by |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
13 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
14 * (at your option) any later version. |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
15 * |
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
16 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
19 * GNU General Public License for more details. |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
20 * |
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
21 * You should have received a copy of the GNU General Public License along |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
22 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
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 |
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
26 /* WARNING: Quite a hack was required in order to get files by MultiDec |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
27 * played back correctly. If it breaks anything else, just comment out |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26299
diff
changeset
|
28 * the #define below and it will not be compiled in. */ |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
29 #define DEMUX_PVA_MULTIDEC_HACK |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
30 #define PVA_NEW_PREBYTES_CODE |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
31 |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7364
diff
changeset
|
32 #include <stdio.h> |
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7364
diff
changeset
|
33 #include <stdlib.h> |
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7364
diff
changeset
|
34 #include <string.h> |
7364
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 #include "config.h" |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
37 #include "mp_msg.h" |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
38 #include "help_mp.h" |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
39 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
21421
diff
changeset
|
40 #include "stream/stream.h" |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
41 #include "demuxer.h" |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
42 #include "stheader.h" |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
43 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
44 /* |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
45 * #defines below taken from PVA spec (see URL above) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
46 */ |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
47 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
48 #define PVA_MAX_VIDEO_PACK_LEN 6*1024 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
49 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
50 #define VIDEOSTREAM 0x01 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
51 #define MAINAUDIOSTREAM 0x02 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
52 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
53 typedef struct { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
54 off_t offset; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
55 long size; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
56 uint8_t type; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
57 uint8_t is_packet_start; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
58 float pts; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
59 } pva_payload_t; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
60 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
61 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
62 typedef struct { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
63 float last_audio_pts; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
64 float last_video_pts; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
65 #ifdef PVA_NEW_PREBYTES_CODE |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
66 float video_pts_after_prebytes; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
67 long video_size_after_prebytes; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
68 uint8_t prebytes_delivered; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
69 #endif |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
70 uint8_t just_synced; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
71 uint8_t synced_stream_id; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
72 } pva_priv_t; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
73 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
74 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
75 |
30570
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
29489
diff
changeset
|
76 static int pva_sync(demuxer_t * demuxer) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
77 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
78 uint8_t buffer[5]={0,0,0,0,0}; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
79 int count; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
80 pva_priv_t * priv = (pva_priv_t *) demuxer->priv; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
81 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
82 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
83 /* 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
|
84 * is not indexed. |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
85 * 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
|
86 * 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
|
87 * 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
|
88 */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
89 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
90 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
91 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
|
92 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
93 buffer[0]=buffer[1]; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
94 buffer[1]=buffer[2]; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
95 buffer[2]=buffer[3]; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
96 buffer[3]=buffer[4]; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
97 buffer[4]=stream_read_char(demuxer->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
98 /* |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
99 * Check for a PVA packet beginning sequence: we check both the "AV" word at the |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
100 * 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
|
101 */ |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
102 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
|
103 //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
|
104 } |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
105 if(priv->just_synced) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
106 { |
18115 | 107 priv->synced_stream_id=buffer[2]; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
108 return 1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
109 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
110 else |
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 return 0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
113 } |
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 |
16175 | 116 static int pva_check_file(demuxer_t * demuxer) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
117 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
118 uint8_t buffer[5]={0,0,0,0,0}; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
119 mp_msg(MSGT_DEMUX, MSGL_V, "Checking for PVA\n"); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
120 stream_read(demuxer->stream,buffer,5); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
121 if(buffer[0]=='A' && buffer[1] == 'V' && buffer[4] == 0x55) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
122 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
123 mp_msg(MSGT_DEMUX,MSGL_DBG2, "Success: PVA\n"); |
16175 | 124 return DEMUXER_TYPE_PVA; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
125 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
126 else |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
127 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
128 mp_msg(MSGT_DEMUX,MSGL_DBG2, "Failed: PVA\n"); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
129 return 0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
130 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
131 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
132 |
16175 | 133 static demuxer_t * demux_open_pva (demuxer_t * demuxer) |
7364
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 sh_video_t *sh_video = new_sh_video(demuxer,0); |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
30570
diff
changeset
|
136 sh_audio_t *sh_audio = new_sh_audio(demuxer,0, NULL); |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
137 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
138 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
139 pva_priv_t * priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
140 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
141 stream_reset(demuxer->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
142 stream_seek(demuxer->stream,0); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
143 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
144 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
145 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
146 priv=malloc(sizeof(pva_priv_t)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
147 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
148 if(demuxer->stream->type!=STREAMTYPE_FILE) demuxer->seekable=0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
149 else demuxer->seekable=1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
150 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
151 demuxer->priv=priv; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
152 memset(demuxer->priv,0,sizeof(pva_priv_t)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
153 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
154 if(!pva_sync(demuxer)) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
155 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
156 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
|
157 return NULL; |
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 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
160 //printf("priv->just_synced %s after initial sync!\n",priv->just_synced?"set":"UNSET"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
161 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
162 demuxer->video->sh=sh_video; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
163 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
164 //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
|
165 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
166 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
167 mp_msg(MSGT_DEMUXER,MSGL_INFO,"Opened PVA demuxer...\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
168 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
169 /* |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
170 * Audio and Video codecs: |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
171 * 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
|
172 * 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
|
173 * the used codecs. |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
174 */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
175 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
176 sh_video->format=0x10000002; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
177 sh_video->ds=demuxer->video; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
178 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
179 /* |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
180 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
|
181 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
|
182 */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
183 |
26299
4d56038ec730
Fix lots and lots of other demuxers broken by r26301
reimar
parents:
25707
diff
changeset
|
184 demuxer->audio->id = 0; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
185 demuxer->audio->sh=sh_audio; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
186 sh_audio->format=0x50; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
187 sh_audio->ds=demuxer->audio; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
188 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
189 demuxer->movi_start=0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
190 demuxer->movi_end=demuxer->stream->end_pos; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
191 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
192 priv->last_video_pts=-1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
193 priv->last_audio_pts=-1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
194 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
195 return demuxer; |
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 |
32349
0e554fa55be8
Mark pva_get_payload() as static, it is not used outside of the file.
diego
parents:
31616
diff
changeset
|
198 static int pva_get_payload(demuxer_t *d, pva_payload_t *payload) |
7364
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 uint8_t flags,pes_head_len; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
201 uint16_t pack_size; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
202 off_t next_offset,pva_payload_start; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
203 unsigned char buffer[256]; |
8254
772d6d27fd66
warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents:
7663
diff
changeset
|
204 #ifndef PVA_NEW_PREBYTES_CODE |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
205 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
|
206 #endif |
17913
f000129a16b3
10l, checking for NULL after dereferencing makes no sense (though what is this check for anyway?)
reimar
parents:
17636
diff
changeset
|
207 pva_priv_t * priv; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
208 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
209 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
210 if(d==NULL) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
211 { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
212 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
|
213 return 0; |
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 |
17913
f000129a16b3
10l, checking for NULL after dereferencing makes no sense (though what is this check for anyway?)
reimar
parents:
17636
diff
changeset
|
216 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
|
217 d->filepos=stream_tell(d->stream); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
218 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
219 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
220 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
221 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
222 if(d->stream->eof) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
223 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
224 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
|
225 return 0; |
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 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
228 //printf("priv->just_synced %s\n",priv->just_synced?"SET":"UNSET"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
229 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
230 #ifdef PVA_NEW_PREBYTES_CODE |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
231 if(priv->prebytes_delivered) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
232 /* 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
|
233 * 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
|
234 * 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
|
235 */ |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
236 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
237 //printf("prebytes_delivered=1. Resetting.\n"); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
238 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
|
239 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
|
240 payload->is_packet_start = 1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
241 payload->offset = stream_tell(d->stream); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
242 payload->type = VIDEOSTREAM; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
243 priv->prebytes_delivered = 0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
244 return 1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
245 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
246 #endif |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
247 if(!priv->just_synced) |
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 if(stream_read_word(d->stream) != (('A'<<8)|'V')) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
250 { |
17366 | 251 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
|
252 if(!pva_sync(d)) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
253 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
254 if (!d->stream->eof) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
255 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
256 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
|
257 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
258 return 0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
259 } |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
260 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
261 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
262 if(priv->just_synced) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
263 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
264 payload->type=priv->synced_stream_id; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
265 priv->just_synced=0; |
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 else |
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 payload->type=stream_read_char(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
270 stream_skip(d->stream,2); //counter and reserved |
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 flags=stream_read_char(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
273 payload->is_packet_start=flags & 0x10; |
31616
3da109629fca
Remove completely nonsensical le2me usages, the only effect
reimar
parents:
31609
diff
changeset
|
274 pack_size=stream_read_word(d->stream); |
17366 | 275 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
|
276 pva_payload_start=stream_tell(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
277 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
|
278 |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
279 |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
280 /* |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
281 * 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
|
282 * 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
|
283 * 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
|
284 * 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
|
285 * 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
|
286 * 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
|
287 * PES header start. |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
288 * 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
|
289 */ |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
290 #ifdef DEMUX_PVA_MULTIDEC_HACK |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
291 if(payload->type==MAINAUDIOSTREAM) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
292 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
293 stream_read(d->stream,buffer,3); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
294 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
|
295 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
296 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
|
297 payload->is_packet_start=1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
298 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
299 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
|
300 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
301 #endif |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
302 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
303 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
304 if(!payload->is_packet_start) |
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 payload->offset=stream_tell(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
307 payload->size=pack_size; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
308 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
309 else |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
310 { //here comes the good part... |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
311 switch(payload->type) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
312 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
313 case VIDEOSTREAM: |
31616
3da109629fca
Remove completely nonsensical le2me usages, the only effect
reimar
parents:
31609
diff
changeset
|
314 payload->pts=(float)(stream_read_dword(d->stream))/90000; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
315 //printf("Video PTS: %f\n",payload->pts); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
316 if((flags&0x03) |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
317 #ifdef PVA_NEW_PREBYTES_CODE |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
318 && !priv->prebytes_delivered |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
319 #endif |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
320 ) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
321 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
322 #ifndef PVA_NEW_PREBYTES_CODE |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
323 dp=new_demux_packet(flags&0x03); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
324 stream_read(d->stream,dp->buffer,flags & 0x03); //read PreBytes |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
325 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
|
326 #else |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
327 //printf("Delivering prebytes. Setting prebytes_delivered."); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
328 payload->offset=stream_tell(d->stream); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
329 payload->size = flags & 0x03; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
330 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
|
331 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
|
332 payload->pts=priv->last_video_pts; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
333 payload->is_packet_start=0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
334 priv->prebytes_delivered=1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
335 return 1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
336 #endif |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
337 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
338 |
7364
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 //now we are at real beginning of payload. |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
341 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
|
342 //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
|
343 payload->size=pack_size - 4 - (flags & 0x03); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
344 break; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
345 case MAINAUDIOSTREAM: |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
346 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
|
347 //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
|
348 stream_skip(d->stream,4); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
349 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
350 buffer[255]=stream_read_char(d->stream); |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
351 pes_head_len=stream_read_char(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
352 stream_read(d->stream,buffer,pes_head_len); |
29489
228b323e90a7
Fix 100l broken flag check found due to compiler warning.
reimar
parents:
29263
diff
changeset
|
353 if(!(buffer[255]&0x80)) //PES header does not contain PTS. |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
354 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
355 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
|
356 payload->pts=priv->last_audio_pts; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
357 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
358 } |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
359 else //PES header DOES contain PTS |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
360 { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
361 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
|
362 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
363 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
|
364 payload->pts=priv->last_audio_pts; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
365 // return 0; |
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 else |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
368 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
369 uint64_t temp_pts; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
370 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
371 temp_pts=0LL; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
372 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
|
373 temp_pts|=buffer[1]<<22; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
374 temp_pts|=(buffer[2] & 0xfe) << 14; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
375 temp_pts|=buffer[3]<<7; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
376 temp_pts|=(buffer[4] & 0xfe) >> 1; |
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 * PTS parsing is hopefully finished. |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
379 */ |
31616
3da109629fca
Remove completely nonsensical le2me usages, the only effect
reimar
parents:
31609
diff
changeset
|
380 payload->pts=(float)temp_pts/90000; |
7663
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 } |
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-stream_tell(d->stream)+pva_payload_start; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
385 break; |
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 } |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7364
diff
changeset
|
388 return 1; |
7364
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 |
32350
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
391 // 0 = EOF or no stream found |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
392 // 1 = successfully read a packet |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
393 static int demux_pva_fill_buffer (demuxer_t * demux, demux_stream_t *ds) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
394 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
395 uint8_t done=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
396 demux_packet_t * dp; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
397 pva_priv_t * priv=demux->priv; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
398 pva_payload_t current_payload; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
399 |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
400 while(!done) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
401 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
402 if(!pva_get_payload(demux,¤t_payload)) return 0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
403 switch(current_payload.type) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
404 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
405 case VIDEOSTREAM: |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
406 if(demux->video->id==-1) demux->video->id=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
407 if(!current_payload.is_packet_start && priv->last_video_pts==-1) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
408 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
409 /* We should only be here at the beginning of a stream, when we have |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
410 * not yet encountered a valid Video PTS, or after a seek. |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
411 * So, skip these starting packets in order not to deliver the |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
412 * player a bogus PTS. |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
413 */ |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
414 done=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
415 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
416 else |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
417 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
418 /* |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
419 * In every other condition, we are delivering the payload. Set this |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
420 * so that the following code knows whether to skip it or read it. |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
421 */ |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
422 done=1; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
423 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
424 if(demux->video->id!=0) done=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
425 if(current_payload.is_packet_start) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
426 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
427 priv->last_video_pts=current_payload.pts; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
428 //mp_msg(MSGT_DEMUXER,MSGL_DBG2,"demux_pva: Video PTS=%llu , delivered %f\n",current_payload.pts,priv->last_video_pts); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
429 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
430 if(done) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
431 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
432 dp=new_demux_packet(current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
433 dp->pts=priv->last_video_pts; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
434 stream_read(demux->stream,dp->buffer,current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
435 ds_add_packet(demux->video,dp); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
436 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
437 else |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
438 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
439 //printf("Skipping %u video bytes\n",current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
440 stream_skip(demux->stream,current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
441 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
442 break; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
443 case MAINAUDIOSTREAM: |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
444 if(demux->audio->id==-1) demux->audio->id=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
445 if(!current_payload.is_packet_start && priv->last_audio_pts==-1) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
446 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
447 /* Same as above for invalid video PTS, just for audio. */ |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
448 done=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
449 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
450 else |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
451 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
452 done=1; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
453 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
454 if(current_payload.is_packet_start) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
455 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
456 priv->last_audio_pts=current_payload.pts; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
457 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
458 if(demux->audio->id!=0) done=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
459 if(done) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
460 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
461 dp=new_demux_packet(current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
462 dp->pts=priv->last_audio_pts; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
463 if(current_payload.offset != stream_tell(demux->stream)) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
464 stream_seek(demux->stream,current_payload.offset); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
465 stream_read(demux->stream,dp->buffer,current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
466 ds_add_packet(demux->audio,dp); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
467 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
468 else |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
469 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
470 stream_skip(demux->stream,current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
471 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
472 break; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
473 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
474 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
475 return 1; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
476 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
477 |
17636 | 478 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
|
479 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
480 int total_bitrate=0; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
481 off_t dest_offset; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
482 pva_priv_t * priv=demuxer->priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
483 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
484 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
|
485 |
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 * 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
|
488 * 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
|
489 * 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
|
490 * the overhead caused by PVA and PES headers. |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
491 * 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
|
492 */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
493 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
494 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
|
495 if(dest_offset<0) dest_offset=0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
496 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
497 stream_seek(demuxer->stream,dest_offset); |
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 if(!pva_sync(demuxer)) |
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 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
|
502 return; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
503 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
504 |
7364
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 * 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
|
507 * 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
|
508 * |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
509 */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
510 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
511 priv->last_video_pts=-1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
512 priv->last_audio_pts=-1; |
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 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
516 |
16175 | 517 static void demux_close_pva(demuxer_t * demuxer) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
518 { |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32350
diff
changeset
|
519 free(demuxer->priv); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32350
diff
changeset
|
520 demuxer->priv = NULL; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
521 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
522 |
16175 | 523 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
22605
diff
changeset
|
524 const demuxer_desc_t demuxer_desc_pva = { |
16175 | 525 "PVA demuxer", |
526 "pva", | |
527 "PVA", | |
528 "Matteo Giani", | |
529 "streams from DVB cards", | |
530 DEMUXER_TYPE_PVA, | |
531 0, // unsafe autodetect | |
532 pva_check_file, | |
533 demux_pva_fill_buffer, | |
534 demux_open_pva, | |
535 demux_close_pva, | |
536 demux_seek_pva, | |
537 NULL | |
538 }; |