annotate libmpdemux/demux_pva.c @ 33456:e80ada93a3c5

Remove Spanish and Chinese Comment entries from desktop file. There are no GenericName entries for Spanish and Chinese and it's uncertain whether the Comment entries are OK.
author ib
date Fri, 03 Jun 2011 14:06:32 +0000
parents 15f3c0b69e14
children 73287a787c27
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
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
30 #define PVA_NEW_PREBYTES_CODE
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
31
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7364
diff changeset
32 #include <stdio.h>
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7364
diff changeset
33 #include <stdlib.h>
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7364
diff changeset
34 #include <string.h>
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
35
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
36 #include "config.h"
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
37 #include "mp_msg.h"
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
38 #include "help_mp.h"
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
39
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 21421
diff changeset
40 #include "stream/stream.h"
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
41 #include "demuxer.h"
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
42 #include "stheader.h"
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
43
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
44 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
45 * #defines below taken from PVA spec (see URL above)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
46 */
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
47
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
48 #define PVA_MAX_VIDEO_PACK_LEN 6*1024
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
49
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
50 #define VIDEOSTREAM 0x01
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
51 #define MAINAUDIOSTREAM 0x02
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
52
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
53 typedef struct {
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
54 off_t offset;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
55 long size;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
56 uint8_t type;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
57 uint8_t is_packet_start;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
58 float pts;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
59 } pva_payload_t;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
60
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
61
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
62 typedef struct {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
63 float last_audio_pts;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
64 float last_video_pts;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
65 #ifdef PVA_NEW_PREBYTES_CODE
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
66 float video_pts_after_prebytes;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
67 long video_size_after_prebytes;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
68 uint8_t prebytes_delivered;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
69 #endif
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
70 uint8_t just_synced;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
71 uint8_t synced_stream_id;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
72 } pva_priv_t;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
73
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
74
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
75
30570
98dc6ae7ede2 libmpdemux: Mark functions not used outside of their files as static.
diego
parents: 29489
diff changeset
76 static int pva_sync(demuxer_t * demuxer)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
77 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
78 uint8_t buffer[5]={0,0,0,0,0};
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
79 int count;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
80 pva_priv_t * priv = (pva_priv_t *) demuxer->priv;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
81
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
82
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
83 /* This function is used to find the next nearest PVA packet start after a seek, since a PVA file
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
84 * is not indexed.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
85 * The just_synced field is in the priv structure so that pva_get_payload knows pva_sync
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
86 * has already read (part of) the PVA header. This way we can avoid to seek back and (hopefully)
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
87 * be able to read from pipes and such.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
88 */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
89
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
90
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
91 for(count=0 ; count<PVA_MAX_VIDEO_PACK_LEN && !demuxer->stream->eof && !priv->just_synced ; count++)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
92 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
93 buffer[0]=buffer[1];
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
94 buffer[1]=buffer[2];
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
95 buffer[2]=buffer[3];
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
96 buffer[3]=buffer[4];
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
97 buffer[4]=stream_read_char(demuxer->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
98 /*
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
99 * Check for a PVA packet beginning sequence: we check both the "AV" word at the
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
100 * very beginning and the "0x55" reserved byte (which is unused and set to 0x55 by spec)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
101 */
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
102 if(buffer[0]=='A' && buffer[1] == 'V' && buffer[4] == 0x55) priv->just_synced=1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
103 //printf("demux_pva: pva_sync(): current offset= %ld\n",stream_tell(demuxer->stream));
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
104 }
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
105 if(priv->just_synced)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
106 {
18115
5e0bafa6f7e8 remove completely pointless != NULL check
reimar
parents: 17913
diff changeset
107 priv->synced_stream_id=buffer[2];
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
108 return 1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
109 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
110 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
111 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
112 return 0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
113 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
114 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
115
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
116 static int pva_check_file(demuxer_t * demuxer)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
117 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
118 uint8_t buffer[5]={0,0,0,0,0};
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
119 mp_msg(MSGT_DEMUX, MSGL_V, "Checking for PVA\n");
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
120 stream_read(demuxer->stream,buffer,5);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
121 if(buffer[0]=='A' && buffer[1] == 'V' && buffer[4] == 0x55)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
122 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
123 mp_msg(MSGT_DEMUX,MSGL_DBG2, "Success: PVA\n");
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
124 return DEMUXER_TYPE_PVA;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
125 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
126 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
127 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
128 mp_msg(MSGT_DEMUX,MSGL_DBG2, "Failed: PVA\n");
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
129 return 0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
130 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
131 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
132
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
133 static demuxer_t * demux_open_pva (demuxer_t * demuxer)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
134 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
135 sh_video_t *sh_video = new_sh_video(demuxer,0);
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 30570
diff changeset
136 sh_audio_t *sh_audio = new_sh_audio(demuxer,0, NULL);
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
137
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
138
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
139 pva_priv_t * priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
140
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
141 stream_reset(demuxer->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
142 stream_seek(demuxer->stream,0);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
143
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
144
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
145
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
146 priv=malloc(sizeof(pva_priv_t));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
147
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
148 if(demuxer->stream->type!=STREAMTYPE_FILE) demuxer->seekable=0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
149 else demuxer->seekable=1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
150
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
151 demuxer->priv=priv;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
152 memset(demuxer->priv,0,sizeof(pva_priv_t));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
153
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
154 if(!pva_sync(demuxer))
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
155 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
156 mp_msg(MSGT_DEMUX,MSGL_ERR,"Not a PVA file.\n");
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
157 return NULL;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
158 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
159
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
160 //printf("priv->just_synced %s after initial sync!\n",priv->just_synced?"set":"UNSET");
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
161
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
162 demuxer->video->sh=sh_video;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
163
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
164 //printf("demuxer->stream->end_pos= %d\n",demuxer->stream->end_pos);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
165
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
166
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
167 mp_msg(MSGT_DEMUXER,MSGL_INFO,"Opened PVA demuxer...\n");
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
168
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
169 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
170 * Audio and Video codecs:
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
171 * the PVA spec only allows MPEG2 video and MPEG layer II audio. No need to check the formats then.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
172 * Moreover, there would be no way to do that since the PVA stream format has no fields to describe
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
173 * the used codecs.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
174 */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
175
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
176 sh_video->format=0x10000002;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
177 sh_video->ds=demuxer->video;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
178
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
179 /*
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
180 printf("demuxer->video->id==%d\n",demuxer->video->id);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
181 printf("demuxer->audio->id==%d\n",demuxer->audio->id);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
182 */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
183
26299
4d56038ec730 Fix lots and lots of other demuxers broken by r26301
reimar
parents: 25707
diff changeset
184 demuxer->audio->id = 0;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
185 demuxer->audio->sh=sh_audio;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
186 sh_audio->format=0x50;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
187 sh_audio->ds=demuxer->audio;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
188
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
189 demuxer->movi_start=0;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
190 demuxer->movi_end=demuxer->stream->end_pos;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
191
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
192 priv->last_video_pts=-1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
193 priv->last_audio_pts=-1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
194
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
195 return demuxer;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
196 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
197
32349
0e554fa55be8 Mark pva_get_payload() as static, it is not used outside of the file.
diego
parents: 31616
diff changeset
198 static int pva_get_payload(demuxer_t *d, pva_payload_t *payload)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
199 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
200 uint8_t flags,pes_head_len;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
201 uint16_t pack_size;
33336
15f3c0b69e14 Remove unused variable.
reimar
parents: 32537
diff changeset
202 off_t pva_payload_start;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
203 unsigned char buffer[256];
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7663
diff changeset
204 #ifndef PVA_NEW_PREBYTES_CODE
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
205 demux_packet_t * dp; //hack to deliver the preBytes (see PVA doc)
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7663
diff changeset
206 #endif
17913
f000129a16b3 10l, checking for NULL after dereferencing makes no sense (though what is this check for anyway?)
reimar
parents: 17636
diff changeset
207 pva_priv_t * priv;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
208
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
209
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
210 if(d==NULL)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
211 {
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
212 mp_msg(MSGT_DEMUX,MSGL_ERR,"demux_pva: pva_get_payload got passed a NULL pointer!\n");
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
213 return 0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
214 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
215
17913
f000129a16b3 10l, checking for NULL after dereferencing makes no sense (though what is this check for anyway?)
reimar
parents: 17636
diff changeset
216 priv = (pva_priv_t *)d->priv;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
217 d->filepos=stream_tell(d->stream);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
218
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
219
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
220
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
221
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
222 if(d->stream->eof)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
223 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
224 mp_msg(MSGT_DEMUX,MSGL_V,"demux_pva: pva_get_payload() detected stream->eof!!!\n");
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
225 return 0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
226 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
227
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
228 //printf("priv->just_synced %s\n",priv->just_synced?"SET":"UNSET");
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
229
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
230 #ifdef PVA_NEW_PREBYTES_CODE
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
231 if(priv->prebytes_delivered)
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
232 /* The previous call to this fn has delivered the preBytes. Then we are already inside
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
233 * the payload. Let's just deliver the video along with its right PTS, the one we stored
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
234 * in the priv structure and was in the PVA header before the PreBytes.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
235 */
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
236 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
237 //printf("prebytes_delivered=1. Resetting.\n");
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
238 payload->size = priv->video_size_after_prebytes;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
239 payload->pts = priv->video_pts_after_prebytes;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
240 payload->is_packet_start = 1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
241 payload->offset = stream_tell(d->stream);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
242 payload->type = VIDEOSTREAM;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
243 priv->prebytes_delivered = 0;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
244 return 1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
245 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
246 #endif
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
247 if(!priv->just_synced)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
248 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
249 if(stream_read_word(d->stream) != (('A'<<8)|'V'))
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
250 {
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17174
diff changeset
251 mp_msg(MSGT_DEMUX,MSGL_V,"demux_pva: pva_get_payload() missed a SyncWord at %"PRId64"!! Trying to sync...\n",(int64_t)stream_tell(d->stream));
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
252 if(!pva_sync(d))
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
253 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
254 if (!d->stream->eof)
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
255 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
256 mp_msg(MSGT_DEMUX,MSGL_ERR,"demux_pva: couldn't sync! (broken file?)");
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
257 }
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
258 return 0;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
259 }
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
260 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
261 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
262 if(priv->just_synced)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
263 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
264 payload->type=priv->synced_stream_id;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
265 priv->just_synced=0;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
266 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
267 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
268 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
269 payload->type=stream_read_char(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
270 stream_skip(d->stream,2); //counter and reserved
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
271 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
272 flags=stream_read_char(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
273 payload->is_packet_start=flags & 0x10;
31616
3da109629fca Remove completely nonsensical le2me usages, the only effect
reimar
parents: 31609
diff changeset
274 pack_size=stream_read_word(d->stream);
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17174
diff changeset
275 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_pva::pva_get_payload(): pack_size=%u field read at offset %"PRIu64"\n",pack_size,(int64_t)stream_tell(d->stream)-2);
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
276 pva_payload_start=stream_tell(d->stream);
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
277
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
278
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
279 /*
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
280 * 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
281 * 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
282 * 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
283 * 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
284 * 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
285 * 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
286 * PES header start.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
287 * 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
288 */
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
289 #ifdef DEMUX_PVA_MULTIDEC_HACK
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
290 if(payload->type==MAINAUDIOSTREAM)
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 stream_read(d->stream,buffer,3);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
293 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
294 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
295 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
296 payload->is_packet_start=1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
297 }
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
298 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
299 }
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
300 #endif
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
301
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
302
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
303 if(!payload->is_packet_start)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
304 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
305 payload->offset=stream_tell(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
306 payload->size=pack_size;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
307 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
308 else
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
309 { //here comes the good part...
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
310 switch(payload->type)
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
311 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
312 case VIDEOSTREAM:
31616
3da109629fca Remove completely nonsensical le2me usages, the only effect
reimar
parents: 31609
diff changeset
313 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
314 //printf("Video PTS: %f\n",payload->pts);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
315 if((flags&0x03)
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
316 #ifdef PVA_NEW_PREBYTES_CODE
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
317 && !priv->prebytes_delivered
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
318 #endif
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
319 )
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 #ifndef PVA_NEW_PREBYTES_CODE
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
322 dp=new_demux_packet(flags&0x03);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
323 stream_read(d->stream,dp->buffer,flags & 0x03); //read PreBytes
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
324 ds_add_packet(d->video,dp);
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
325 #else
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
326 //printf("Delivering prebytes. Setting prebytes_delivered.");
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
327 payload->offset=stream_tell(d->stream);
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
328 payload->size = flags & 0x03;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
329 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
330 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
331 payload->pts=priv->last_video_pts;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
332 payload->is_packet_start=0;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
333 priv->prebytes_delivered=1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
334 return 1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
335 #endif
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
336 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
337
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
338
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
339 //now we are at real beginning of payload.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
340 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
341 //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
342 payload->size=pack_size - 4 - (flags & 0x03);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
343 break;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
344 case MAINAUDIOSTREAM:
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
345 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
346 //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
347 stream_skip(d->stream,4);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
348
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
349 buffer[255]=stream_read_char(d->stream);
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
350 pes_head_len=stream_read_char(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
351 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
352 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
353 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
354 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
355 payload->pts=priv->last_audio_pts;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
356 break;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
357 }
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
358 else //PES header DOES contain PTS
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
359 {
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
360 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
361 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
362 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
363 payload->pts=priv->last_audio_pts;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
364 // return 0;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
365 }
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
366 else
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
367 {
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
368 uint64_t temp_pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
369
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
370 temp_pts=0LL;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
371 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
372 temp_pts|=buffer[1]<<22;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
373 temp_pts|=(buffer[2] & 0xfe) << 14;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
374 temp_pts|=buffer[3]<<7;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
375 temp_pts|=(buffer[4] & 0xfe) >> 1;
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
376 /*
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
377 * PTS parsing is hopefully finished.
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
378 */
31616
3da109629fca Remove completely nonsensical le2me usages, the only effect
reimar
parents: 31609
diff changeset
379 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
380 }
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
381 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
382 payload->offset=stream_tell(d->stream);
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
383 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
384 break;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
385 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
386 }
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 7364
diff changeset
387 return 1;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
388 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
389
32350
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
390 // 0 = EOF or no stream found
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
391 // 1 = successfully read a packet
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
392 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
393 {
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
394 uint8_t done=0;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
395 demux_packet_t * dp;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
396 pva_priv_t * priv=demux->priv;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
397 pva_payload_t current_payload;
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 while(!done)
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 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
402 switch(current_payload.type)
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
403 {
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
404 case VIDEOSTREAM:
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
405 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
406 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
407 {
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
408 /* 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
409 * 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
410 * 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
411 * player a bogus 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 done=0;
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 else
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
416 {
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
417 /*
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
418 * 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
419 * 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
420 */
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
421 done=1;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
422 }
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
423 if(demux->video->id!=0) done=0;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
424 if(current_payload.is_packet_start)
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
425 {
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
426 priv->last_video_pts=current_payload.pts;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
427 //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
428 }
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
429 if(done)
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
430 {
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
431 dp=new_demux_packet(current_payload.size);
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
432 dp->pts=priv->last_video_pts;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
433 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
434 ds_add_packet(demux->video,dp);
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
435 }
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
436 else
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
437 {
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
438 //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
439 stream_skip(demux->stream,current_payload.size);
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 break;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
442 case MAINAUDIOSTREAM:
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
443 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
444 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
445 {
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
446 /* 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
447 done=0;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
448 }
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
449 else
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 done=1;
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 if(current_payload.is_packet_start)
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 priv->last_audio_pts=current_payload.pts;
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 if(demux->audio->id!=0) done=0;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
458 if(done)
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 dp=new_demux_packet(current_payload.size);
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
461 dp->pts=priv->last_audio_pts;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
462 if(current_payload.offset != stream_tell(demux->stream))
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
463 stream_seek(demux->stream,current_payload.offset);
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
464 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
465 ds_add_packet(demux->audio,dp);
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
466 }
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
467 else
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
468 {
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
469 stream_skip(demux->stream,current_payload.size);
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
470 }
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
471 break;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
472 }
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
473 }
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
474 return 1;
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
475 }
bf5f7fa4d519 Move pva_get_payload() around to avoid a forward declaration.
diego
parents: 32349
diff changeset
476
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
477 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
478 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
479 int total_bitrate=0;
7663
eb3afb162aa4 * Fix for the broken MultiDec files I had originally posted with the
arpi
parents: 7472
diff changeset
480 off_t dest_offset;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
481 pva_priv_t * priv=demuxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
482
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
483 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
484
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
485 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
486 * 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
487 * 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
488 * 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
489 * the overhead caused by PVA and PES headers.
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
490 * 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
491 */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
492
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
493 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
494 if(dest_offset<0) dest_offset=0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
495
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
496 stream_seek(demuxer->stream,dest_offset);
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 if(!pva_sync(demuxer))
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
499 {
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
500 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
501 return;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
502 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
503
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
504 /*
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
505 * 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
506 * 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
507 *
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
508 */
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
509
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
510 priv->last_video_pts=-1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
511 priv->last_audio_pts=-1;
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
512 }
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
513
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
514
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
515
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
516 static void demux_close_pva(demuxer_t * demuxer)
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
517 {
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32350
diff changeset
518 free(demuxer->priv);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32350
diff changeset
519 demuxer->priv = NULL;
7364
b2445802532c .PVA (mpeg-like fileformat used by MultiDec && WinTV) demuxer
arpi
parents:
diff changeset
520 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
521
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
522
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 22605
diff changeset
523 const demuxer_desc_t demuxer_desc_pva = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
524 "PVA demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
525 "pva",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
526 "PVA",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
527 "Matteo Giani",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
528 "streams from DVB cards",
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
529 DEMUXER_TYPE_PVA,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
530 0, // unsafe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
531 pva_check_file,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
532 demux_pva_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
533 demux_open_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
534 demux_close_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
535 demux_seek_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
536 NULL
6b86089c2edd Demuxer modularization
rtognimp
parents: 8254
diff changeset
537 };