Mercurial > mplayer.hg
annotate libmpdemux/demux_pva.c @ 34346:3d0c795524b0
Fix bug with wrong focus in file selector.
The focus can only be set to fsFNameList after it's realized and mapped.
This also removes the irritating selection of the fsPathCombo.
author | ib |
---|---|
date | Sun, 11 Dec 2011 16:02:02 +0000 |
parents | 6cc07dbad511 |
children | f3c835ddce85 |
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 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
30 |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7364
diff
changeset
|
31 #include <stdio.h> |
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7364
diff
changeset
|
32 #include <stdlib.h> |
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7364
diff
changeset
|
33 #include <string.h> |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
34 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
35 #include "config.h" |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
36 #include "mp_msg.h" |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
37 #include "help_mp.h" |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
38 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
21421
diff
changeset
|
39 #include "stream/stream.h" |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
40 #include "demuxer.h" |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
41 #include "stheader.h" |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
42 |
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 * #defines below taken from PVA spec (see URL above) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
45 */ |
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 #define PVA_MAX_VIDEO_PACK_LEN 6*1024 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
48 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
49 #define VIDEOSTREAM 0x01 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
50 #define MAINAUDIOSTREAM 0x02 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
51 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
52 typedef struct { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
53 off_t offset; |
34107
4529cc476aa6
Do not use long type, it makes the code more platform dependent for no
reimar
parents:
34106
diff
changeset
|
54 int size; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
55 uint8_t type; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
56 uint8_t is_packet_start; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
57 float pts; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
58 } pva_payload_t; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
59 |
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 typedef struct { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
62 float last_audio_pts; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
63 float last_video_pts; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
64 float video_pts_after_prebytes; |
34107
4529cc476aa6
Do not use long type, it makes the code more platform dependent for no
reimar
parents:
34106
diff
changeset
|
65 int video_size_after_prebytes; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
66 uint8_t prebytes_delivered; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
67 uint8_t just_synced; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
68 uint8_t synced_stream_id; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
69 } pva_priv_t; |
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 |
30570
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
29489
diff
changeset
|
73 static int pva_sync(demuxer_t * demuxer) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
74 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
75 uint8_t buffer[5]={0,0,0,0,0}; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
76 int count; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
77 pva_priv_t * priv = (pva_priv_t *) demuxer->priv; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
78 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
79 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
80 /* 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
|
81 * is not indexed. |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
82 * 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
|
83 * 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
|
84 * 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
|
85 */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
86 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
87 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
88 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
|
89 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
90 buffer[0]=buffer[1]; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
91 buffer[1]=buffer[2]; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
92 buffer[2]=buffer[3]; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
93 buffer[3]=buffer[4]; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
94 buffer[4]=stream_read_char(demuxer->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
95 /* |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
96 * 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
|
97 * 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
|
98 */ |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
99 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
|
100 //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
|
101 } |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
102 if(priv->just_synced) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
103 { |
18115 | 104 priv->synced_stream_id=buffer[2]; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
105 return 1; |
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 else |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
108 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
109 return 0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
110 } |
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 |
16175 | 113 static int pva_check_file(demuxer_t * demuxer) |
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 uint8_t buffer[5]={0,0,0,0,0}; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
116 mp_msg(MSGT_DEMUX, MSGL_V, "Checking for PVA\n"); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
117 stream_read(demuxer->stream,buffer,5); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
118 if(buffer[0]=='A' && buffer[1] == 'V' && buffer[4] == 0x55) |
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 mp_msg(MSGT_DEMUX,MSGL_DBG2, "Success: PVA\n"); |
16175 | 121 return DEMUXER_TYPE_PVA; |
7364
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 else |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
124 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
125 mp_msg(MSGT_DEMUX,MSGL_DBG2, "Failed: PVA\n"); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
126 return 0; |
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 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
129 |
16175 | 130 static demuxer_t * demux_open_pva (demuxer_t * demuxer) |
7364
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 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
|
133 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
|
134 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
135 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
136 pva_priv_t * priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
137 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
138 stream_reset(demuxer->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
139 stream_seek(demuxer->stream,0); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
140 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
141 |
7364
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 priv=malloc(sizeof(pva_priv_t)); |
29263
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 if(demuxer->stream->type!=STREAMTYPE_FILE) demuxer->seekable=0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
146 else demuxer->seekable=1; |
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 demuxer->priv=priv; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
149 memset(demuxer->priv,0,sizeof(pva_priv_t)); |
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 if(!pva_sync(demuxer)) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
152 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
153 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
|
154 return NULL; |
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 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
157 //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
|
158 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
159 demuxer->video->sh=sh_video; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
160 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
161 //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
|
162 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
163 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
164 mp_msg(MSGT_DEMUXER,MSGL_INFO,"Opened PVA demuxer...\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
165 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
166 /* |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
167 * Audio and Video codecs: |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
168 * 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
|
169 * 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
|
170 * the used codecs. |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
171 */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
172 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
173 sh_video->format=0x10000002; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
174 sh_video->ds=demuxer->video; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
175 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
176 /* |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
177 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
|
178 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
|
179 */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
180 |
26299
4d56038ec730
Fix lots and lots of other demuxers broken by r26301
reimar
parents:
25707
diff
changeset
|
181 demuxer->audio->id = 0; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
182 demuxer->audio->sh=sh_audio; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
183 sh_audio->format=0x50; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
184 sh_audio->ds=demuxer->audio; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
185 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
186 demuxer->movi_start=0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
187 demuxer->movi_end=demuxer->stream->end_pos; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
188 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
189 priv->last_video_pts=-1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
190 priv->last_audio_pts=-1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
191 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
192 return demuxer; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
193 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
194 |
32349
0e554fa55be8
Mark pva_get_payload() as static, it is not used outside of the file.
diego
parents:
31616
diff
changeset
|
195 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
|
196 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
197 uint8_t flags,pes_head_len; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
198 uint16_t pack_size; |
33336 | 199 off_t pva_payload_start; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
200 unsigned char buffer[256]; |
17913
f000129a16b3
10l, checking for NULL after dereferencing makes no sense (though what is this check for anyway?)
reimar
parents:
17636
diff
changeset
|
201 pva_priv_t * priv; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
202 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
203 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
204 if(d==NULL) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
205 { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
206 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
|
207 return 0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
208 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
209 |
17913
f000129a16b3
10l, checking for NULL after dereferencing makes no sense (though what is this check for anyway?)
reimar
parents:
17636
diff
changeset
|
210 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
|
211 d->filepos=stream_tell(d->stream); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
212 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
213 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
214 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
215 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
216 if(d->stream->eof) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
217 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
218 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
|
219 return 0; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
220 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
221 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
222 //printf("priv->just_synced %s\n",priv->just_synced?"SET":"UNSET"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
223 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
224 if(priv->prebytes_delivered) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
225 /* 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
|
226 * 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
|
227 * 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
|
228 */ |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
229 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
230 //printf("prebytes_delivered=1. Resetting.\n"); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
231 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
|
232 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
|
233 payload->is_packet_start = 1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
234 payload->offset = stream_tell(d->stream); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
235 payload->type = VIDEOSTREAM; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
236 priv->prebytes_delivered = 0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
237 return 1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
238 } |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
239 if(!priv->just_synced) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
240 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
241 if(stream_read_word(d->stream) != (('A'<<8)|'V')) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
242 { |
17366 | 243 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
|
244 if(!pva_sync(d)) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
245 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
246 if (!d->stream->eof) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
247 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
248 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
|
249 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
250 return 0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
251 } |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
252 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
253 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
254 if(priv->just_synced) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
255 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
256 payload->type=priv->synced_stream_id; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
257 priv->just_synced=0; |
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 else |
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 payload->type=stream_read_char(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
262 stream_skip(d->stream,2); //counter and reserved |
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 flags=stream_read_char(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
265 payload->is_packet_start=flags & 0x10; |
31616
3da109629fca
Remove completely nonsensical le2me usages, the only effect
reimar
parents:
31609
diff
changeset
|
266 pack_size=stream_read_word(d->stream); |
17366 | 267 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
|
268 pva_payload_start=stream_tell(d->stream); |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
269 |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
270 |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
271 /* |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
272 * 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
|
273 * 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
|
274 * 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
|
275 * 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
|
276 * 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
|
277 * 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
|
278 * PES header start. |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
279 * 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
|
280 */ |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
281 #ifdef DEMUX_PVA_MULTIDEC_HACK |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
282 if(payload->type==MAINAUDIOSTREAM) |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
283 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
284 stream_read(d->stream,buffer,3); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
285 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
|
286 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
287 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
|
288 payload->is_packet_start=1; |
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 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
|
291 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
292 #endif |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
293 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
294 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
295 if(!payload->is_packet_start) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
296 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
297 payload->offset=stream_tell(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
298 payload->size=pack_size; |
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 else |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
301 { //here comes the good part... |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
302 switch(payload->type) |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
303 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
304 case VIDEOSTREAM: |
31616
3da109629fca
Remove completely nonsensical le2me usages, the only effect
reimar
parents:
31609
diff
changeset
|
305 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
|
306 //printf("Video PTS: %f\n",payload->pts); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
307 if((flags&0x03) |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
308 && !priv->prebytes_delivered |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
309 ) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
310 { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
311 //printf("Delivering prebytes. Setting prebytes_delivered."); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
312 payload->offset=stream_tell(d->stream); |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
313 payload->size = flags & 0x03; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
314 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
|
315 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
|
316 payload->pts=priv->last_video_pts; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
317 payload->is_packet_start=0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
318 priv->prebytes_delivered=1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
319 return 1; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
320 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
321 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
322 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
323 //now we are at real beginning of payload. |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
324 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
|
325 //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
|
326 payload->size=pack_size - 4 - (flags & 0x03); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
327 break; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
328 case MAINAUDIOSTREAM: |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
329 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
|
330 //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
|
331 stream_skip(d->stream,4); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
332 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
333 buffer[255]=stream_read_char(d->stream); |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
334 pes_head_len=stream_read_char(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
335 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
|
336 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
|
337 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
338 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
|
339 payload->pts=priv->last_audio_pts; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
340 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
341 } |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
342 else //PES header DOES contain PTS |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
343 { |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
344 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
|
345 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
346 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
|
347 payload->pts=priv->last_audio_pts; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
348 // return 0; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
349 } |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
350 else |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
351 { |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
352 uint64_t temp_pts; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
353 |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
354 temp_pts=0LL; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
355 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
|
356 temp_pts|=buffer[1]<<22; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
357 temp_pts|=(buffer[2] & 0xfe) << 14; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
358 temp_pts|=buffer[3]<<7; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
359 temp_pts|=(buffer[4] & 0xfe) >> 1; |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
360 /* |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
361 * PTS parsing is hopefully finished. |
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
362 */ |
31616
3da109629fca
Remove completely nonsensical le2me usages, the only effect
reimar
parents:
31609
diff
changeset
|
363 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
|
364 } |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
365 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
366 payload->offset=stream_tell(d->stream); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
367 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
|
368 break; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
369 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
370 } |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7364
diff
changeset
|
371 return 1; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
372 } |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
373 |
32350
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
374 // 0 = EOF or no stream found |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
375 // 1 = successfully read a packet |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
376 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
|
377 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
378 uint8_t done=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
379 demux_packet_t * dp; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
380 pva_priv_t * priv=demux->priv; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
381 pva_payload_t current_payload; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
382 |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
383 while(!done) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
384 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
385 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
|
386 switch(current_payload.type) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
387 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
388 case VIDEOSTREAM: |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
389 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
|
390 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
|
391 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
392 /* 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
|
393 * 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
|
394 * 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
|
395 * player a bogus PTS. |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
396 */ |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
397 done=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
398 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
399 else |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
400 { |
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 * 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
|
403 * 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
|
404 */ |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
405 done=1; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
406 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
407 if(demux->video->id!=0) done=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
408 if(current_payload.is_packet_start) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
409 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
410 priv->last_video_pts=current_payload.pts; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
411 //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
|
412 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
413 if(done) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
414 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
415 dp=new_demux_packet(current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
416 dp->pts=priv->last_video_pts; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
417 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
|
418 ds_add_packet(demux->video,dp); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
419 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
420 else |
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 //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
|
423 stream_skip(demux->stream,current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
424 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
425 break; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
426 case MAINAUDIOSTREAM: |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
427 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
|
428 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
|
429 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
430 /* 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
|
431 done=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
432 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
433 else |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
434 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
435 done=1; |
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 if(current_payload.is_packet_start) |
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 priv->last_audio_pts=current_payload.pts; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
440 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
441 if(demux->audio->id!=0) done=0; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
442 if(done) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
443 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
444 dp=new_demux_packet(current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
445 dp->pts=priv->last_audio_pts; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
446 if(current_payload.offset != stream_tell(demux->stream)) |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
447 stream_seek(demux->stream,current_payload.offset); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
448 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
|
449 ds_add_packet(demux->audio,dp); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
450 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
451 else |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
452 { |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
453 stream_skip(demux->stream,current_payload.size); |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
454 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
455 break; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
456 } |
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 return 1; |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
459 } |
bf5f7fa4d519
Move pva_get_payload() around to avoid a forward declaration.
diego
parents:
32349
diff
changeset
|
460 |
17636 | 461 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
|
462 { |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
463 int total_bitrate=0; |
7663
eb3afb162aa4
* Fix for the broken MultiDec files I had originally posted with the
arpi
parents:
7472
diff
changeset
|
464 off_t dest_offset; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
465 pva_priv_t * priv=demuxer->priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
466 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
467 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
|
468 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
469 /* |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
470 * 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
|
471 * 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
|
472 * 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
|
473 * the overhead caused by PVA and PES headers. |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
474 * 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
|
475 */ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
476 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
477 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
|
478 if(dest_offset<0) dest_offset=0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
479 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
480 stream_seek(demuxer->stream,dest_offset); |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
481 |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
482 if(!pva_sync(demuxer)) |
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 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
|
485 return; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
486 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
487 |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
488 /* |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
489 * 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
|
490 * 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
|
491 * |
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 priv->last_video_pts=-1; |
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
495 priv->last_audio_pts=-1; |
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 |
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 |
16175 | 500 static void demux_close_pva(demuxer_t * demuxer) |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
501 { |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32350
diff
changeset
|
502 free(demuxer->priv); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32350
diff
changeset
|
503 demuxer->priv = NULL; |
7364
b2445802532c
.PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff
changeset
|
504 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
505 |
16175 | 506 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
22605
diff
changeset
|
507 const demuxer_desc_t demuxer_desc_pva = { |
16175 | 508 "PVA demuxer", |
509 "pva", | |
510 "PVA", | |
511 "Matteo Giani", | |
512 "streams from DVB cards", | |
513 DEMUXER_TYPE_PVA, | |
514 0, // unsafe autodetect | |
515 pva_check_file, | |
516 demux_pva_fill_buffer, | |
517 demux_open_pva, | |
518 demux_close_pva, | |
519 demux_seek_pva, | |
520 NULL | |
521 }; |