annotate libmpdemux/demux_pva.c @ 35671:96adc233474d

Fix bug introduced in r35757. (A double size video is supposed to change its position in order to fit into the screen, see r34086.)
author ib
date Thu, 17 Jan 2013 16:39:05 +0000
parents 6cc07dbad511
children f3c835ddce85
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
1 /*
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
5e0bafa6f7e8 remove completely pointless != NULL check
reimar
parents: 17913
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
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
15f3c0b69e14 Remove unused variable.
reimar
parents: 32537
diff changeset
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
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17174
diff changeset
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
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17174
diff changeset
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,&current_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
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
508 "PVA demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
509 "pva",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
510 "PVA",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
511 "Matteo Giani",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
512 "streams from DVB cards",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
513 DEMUXER_TYPE_PVA,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
514 0, // unsafe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
515 pva_check_file,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
516 demux_pva_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
517 demux_open_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
518 demux_close_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
519 demux_seek_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
520 NULL
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
521 };