annotate libmpdemux/demux_mpg.c @ 31632:fc6f2b4e8a26

Avoid calling av_resample_init again when the values are the same as before. The init function can be called multiple times when e.g. additional format filters are inserted, so this speeds things up. Patch by Dan Oscarsson [Dan.Oscarsson tieto com].
author reimar
date Sun, 11 Jul 2010 09:46:58 +0000
parents 9e2c61ae171f
children c3b7fc7eb796
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29238
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
1 /*
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
2 * MPG/VOB file parser for DEMUXER v2.5
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
3 * copyright (c) 2001 by A'rpi/ESP-team
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
4 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
5 * This file is part of MPlayer.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
6 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
7 * MPlayer is free software; you can redistribute it and/or modify
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
8 * 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: 28051
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
10 * (at your option) any later version.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
11 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
12 * MPlayer is distributed in the hope that it will be useful,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
15 * GNU General Public License for more details.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
16 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
17 * 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: 28051
diff changeset
18 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28051
diff changeset
20 */
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
21
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
22 #include <stdio.h>
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
23 #include <stdlib.h>
1430
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1338
diff changeset
24 #include <unistd.h>
22036
2c6cccdeaf65 include math.h for fabsf()
nicodvb
parents: 22035
diff changeset
25 #include <math.h>
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
26
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
27 #include "config.h"
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
28 #include "mp_msg.h"
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1735
diff changeset
29 #include "help_mp.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
30
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 22507
diff changeset
31 #include "stream/stream.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
32 #include "demuxer.h"
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
33 #include "parse_es.h"
2338
4f3e8c8ea32f includes cleanup
arpi
parents: 2310
diff changeset
34 #include "stheader.h"
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
35 #include "mp3_hdr.h"
31414
5e0a4702be52 Add header file for externally used variable ps_probe.
diego
parents: 30578
diff changeset
36 #include "demux_mpg.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
37
524
9105fc95636c A fast'n'ugly hack to correct DVD VOB playback problems
lgb
parents: 501
diff changeset
38 //#define MAX_PS_PACKETSIZE 2048
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
39 #define MAX_PS_PACKETSIZE (224*1024)
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
40
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
41 #define UNKNOWN 0
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
42 #define VIDEO_MPEG1 0x10000001
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
43 #define VIDEO_MPEG2 0x10000002
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
44 #define VIDEO_MPEG4 0x10000004
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
45 #define VIDEO_H264 0x10000005
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
46 #define AUDIO_MP2 0x50
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
47 #define AUDIO_A52 0x2000
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
48 #define AUDIO_LPCM_BE 0x10001
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
49 #define AUDIO_AAC mmioFOURCC('M', 'P', '4', 'A')
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
50
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
51 typedef struct mpg_demuxer {
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
52 float last_pts;
22021
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
53 float first_pts; // first pts found in stream
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
54 float first_to_final_pts_len; // difference between final pts and first pts
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
55 int has_valid_timestamps; // !=0 iff time stamps look linear
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
56 // (not necessarily starting with 0)
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
57 unsigned int es_map[0x40]; //es map of stream types (associated to the pes id) from 0xb0 to 0xef
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
58 int num_a_streams;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
59 int a_stream_ids[MAX_A_STREAMS];
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
60 } mpg_demuxer_t;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
61
17286
b0046966ab82 don't reset dvdsub->id unless -slang is specified; assign default sub stream id when demux->sub->id is -1 (autodetect)
nicodvb
parents: 16877
diff changeset
62 extern char* dvdsub_lang;
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
63 static int mpeg_pts_error=0;
22037
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
64 off_t ps_probe = 0;
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
65
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
66 static int parse_psm(demuxer_t *demux, int len) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
67 unsigned char c, id, type;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
68 unsigned int plen, prog_len, es_map_len;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
69 mpg_demuxer_t *priv = (mpg_demuxer_t *) demux->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
70
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
71 mp_dbg(MSGT_DEMUX,MSGL_V, "PARSE_PSM, len=%d\n", len);
18549
845f94a75729 psm longer than 1018 bytes is not allowed, thus invalid
nicodvb
parents: 18382
diff changeset
72 if(! len || len > 1018)
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
73 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
74
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
75 c = stream_read_char(demux->stream);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
76 if(! (c & 0x80)) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
77 stream_skip(demux->stream, len - 1); //not yet valid, discard
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
78 return 0;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
79 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
80 stream_skip(demux->stream, 1);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
81 prog_len = stream_read_word(demux->stream); //length of program descriptors
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
82 stream_skip(demux->stream, prog_len); //.. that we ignore
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
83 es_map_len = stream_read_word(demux->stream); //length of elementary streams map
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 20872
diff changeset
84 es_map_len = FFMIN(es_map_len, len - prog_len - 8); //sanity check
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
85 while(es_map_len > 0) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
86 type = stream_read_char(demux->stream);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
87 id = stream_read_char(demux->stream);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
88 if(id >= 0xB0 && id <= 0xEF && priv) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
89 int idoffset = id - 0xB0;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
90 switch(type) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
91 case 0x1:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
92 priv->es_map[idoffset] = VIDEO_MPEG1;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
93 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
94 case 0x2:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
95 priv->es_map[idoffset] = VIDEO_MPEG2;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
96 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
97 case 0x3:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
98 case 0x4:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
99 priv->es_map[idoffset] = AUDIO_MP2;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
100 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
101 case 0x0f:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
102 case 0x11:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
103 priv->es_map[idoffset] = AUDIO_AAC;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
104 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
105 case 0x10:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
106 priv->es_map[idoffset] = VIDEO_MPEG4;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
107 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
108 case 0x1b:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
109 priv->es_map[idoffset] = VIDEO_H264;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
110 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
111 case 0x81:
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
112 priv->es_map[idoffset] = AUDIO_A52;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
113 break;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
114 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
115 mp_dbg(MSGT_DEMUX,MSGL_V, "PSM ES, id=0x%x, type=%x, stype: %x\n", id, type, priv->es_map[idoffset]);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
116 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
117 plen = stream_read_word(demux->stream); //length of elementary stream descriptors
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 20872
diff changeset
118 plen = FFMIN(plen, es_map_len); //sanity check
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
119 stream_skip(demux->stream, plen); //skip descriptors for now
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
120 es_map_len -= 4 + plen;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
121 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
122 stream_skip(demux->stream, 4); //skip crc32
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
123 return 1;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
124 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
125
18072
284751bccd04 make sure the check for valid timestamps does not accidentially search through
reimar
parents: 17822
diff changeset
126 // 500000 is a wild guess
284751bccd04 make sure the check for valid timestamps does not accidentially search through
reimar
parents: 17822
diff changeset
127 #define TIMESTAMP_PROBE_LEN 500000
284751bccd04 make sure the check for valid timestamps does not accidentially search through
reimar
parents: 17822
diff changeset
128
22021
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
129 //MAX_PTS_DIFF_FOR_CONSECUTIVE denotes the maximum difference
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
130 //between two pts to consider them consecutive
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
131 //1.0 is a wild guess
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
132 #define MAX_PTS_DIFF_FOR_CONSECUTIVE 1.0
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
133
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
134 //returns the first pts found within TIME_STAMP_PROBE_LEN bytes after stream_pos in demuxer's stream.
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
135 //if no pts is found or an error occurs, -1.0 is returned.
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
136 //Packs are freed.
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
137 static float read_first_mpeg_pts_at_position(demuxer_t* demuxer, off_t stream_pos)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
138 {
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
139 stream_t *s = demuxer->stream;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
140 mpg_demuxer_t *mpg_d = demuxer->priv;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
141 float pts = -1.0; //the pts to return;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
142 float found_pts1; //the most recently found pts
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
143 float found_pts2; //the pts found before found_pts1
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
144 float found_pts3; //the pts found before found_pts2
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
145 int found = 0;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
146
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
147 if(!mpg_d || stream_pos < 0)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
148 return pts;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
149
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
150 found_pts3 = found_pts2 = found_pts1 = mpg_d->last_pts;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
151 stream_seek(s, stream_pos);
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
152
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
153 //We look for pts.
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
154 //However, we do not stop at the first found one, as timestamps may reset
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
155 //Therefore, we seek until we found three consecutive
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
156 //pts within MAX_PTS_DIFF_FOR_CONSECUTIVE.
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
157
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
158 while(found<3 && !s->eof
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
159 && (fabsf(found_pts2-found_pts1) < MAX_PTS_DIFF_FOR_CONSECUTIVE)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
160 && (fabsf(found_pts3-found_pts2) < MAX_PTS_DIFF_FOR_CONSECUTIVE)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
161 && (stream_tell(s) < stream_pos + TIMESTAMP_PROBE_LEN)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
162 && ds_fill_buffer(demuxer->video))
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
163 {
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
164 if(mpg_d->last_pts != found_pts1)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
165 {
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
166 if(!found)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
167 found_pts3 = found_pts2 = found_pts1 = mpg_d->last_pts; //the most recently found pts
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
168 else
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
169 {
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
170 found_pts3 = found_pts2;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
171 found_pts2 = found_pts1;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
172 found_pts1 = mpg_d->last_pts;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
173 }
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
174 found++;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
175 }
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
176 }
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
177
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
178 if(found == 3) pts = found_pts3;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
179
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
180 //clean up from searching of first pts;
26927
ff446aa58931 use demux_flush() where appropriate
nicodvb
parents: 25883
diff changeset
181 demux_flush(demuxer);
22021
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
182
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
183 return pts;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
184 }
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
185
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
186 /// Open an mpg physical stream
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
187 static demuxer_t* demux_mpg_open(demuxer_t* demuxer) {
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
188 stream_t *s = demuxer->stream;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
189 mpg_demuxer_t* mpg_d;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
190
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
191 if (!ds_fill_buffer(demuxer->video)) return 0;
18885
5c8acc972551 rm unnecesary casts from void* - part 4
reynaldo
parents: 18758
diff changeset
192 mpg_d = calloc(1,sizeof(mpg_demuxer_t));
22021
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
193 if(mpg_d)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
194 {
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
195 demuxer->priv = mpg_d;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
196 mpg_d->last_pts = -1.0;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
197 mpg_d->first_pts = -1.0;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
198
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
199 //if seeking is allowed set has_valid_timestamps if appropriate
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
200 if(demuxer->seekable
22363
03ba33feaae9 test the continuity of timestamps for STREAMTYPE_VCD, too; patch by Zuxy Meng
nicodvb
parents: 22352
diff changeset
201 && (demuxer->stream->type == STREAMTYPE_FILE
03ba33feaae9 test the continuity of timestamps for STREAMTYPE_VCD, too; patch by Zuxy Meng
nicodvb
parents: 22352
diff changeset
202 || demuxer->stream->type == STREAMTYPE_VCD)
22021
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
203 && demuxer->movi_start != demuxer-> movi_end
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
204 )
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
205 {
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
206 //We seek to the beginning of the stream, to somewhere in the
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
207 //middle, and to the end of the stream, while remembering the pts
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
208 //at each of the three positions. With these pts, we check whether
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
209 //or not the pts are "linear enough" to justify seeking by the pts
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
210 //of the stream
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
211
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
212 //The position where the stream is now
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
213 off_t pos = stream_tell(s);
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
214 float first_pts = read_first_mpeg_pts_at_position(demuxer, demuxer->movi_start);
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
215 if(first_pts != -1.0)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
216 {
22351
1f40a27bd2ad 100000l: average != semidistance, fixed seeking to the middle position; patch by Zuxy meng (zuxy.megn gmail com)
nicodvb
parents: 22170
diff changeset
217 float middle_pts = read_first_mpeg_pts_at_position(demuxer, (demuxer->movi_end + demuxer->movi_start)/2);
22021
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
218 if(middle_pts != -1.0)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
219 {
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
220 float final_pts = read_first_mpeg_pts_at_position(demuxer, demuxer->movi_end - TIMESTAMP_PROBE_LEN);
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
221 if(final_pts != -1.0)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
222 {
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
223 // found proper first, middle, and final pts.
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
224 float proportion = (middle_pts-first_pts==0) ? -1 : (final_pts-middle_pts)/(middle_pts-first_pts);
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
225 // if they are linear enough set has_valid_timestamps
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
226 if((0.5 < proportion) && (proportion < 2))
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
227 {
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
228 mpg_d->first_pts = first_pts;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
229 mpg_d->first_to_final_pts_len = final_pts - first_pts;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
230 mpg_d->has_valid_timestamps = 1;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
231 }
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
232 }
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
233 }
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
234 }
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
235
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
236 //Cleaning up from seeking in stream
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
237 demuxer->stream->eof=0;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
238 demuxer->video->eof=0;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
239 demuxer->audio->eof=0;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
240
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
241 stream_seek(s,pos);
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
242 ds_fill_buffer(demuxer->video);
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
243 } // if ( demuxer->seekable )
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
244 } // if ( mpg_d )
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
245 return demuxer;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
246 }
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
247
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
248 static void demux_close_mpg(demuxer_t* demuxer) {
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
249 mpg_demuxer_t* mpg_d = demuxer->priv;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
250 if (mpg_d) free(mpg_d);
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
251 }
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
252
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
253
18077
cede662f40a5 timestamps are 33 bits long, so they don't fit in an unsigned int; 10l
nicodvb
parents: 18072
diff changeset
254 static unsigned long long read_mpeg_timestamp(stream_t *s,int c){
18381
bbf33e805e74 stream_read_word() returns _unsigned_ int
nicodvb
parents: 18380
diff changeset
255 unsigned int d,e;
18077
cede662f40a5 timestamps are 33 bits long, so they don't fit in an unsigned int; 10l
nicodvb
parents: 18072
diff changeset
256 unsigned long long pts;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 d=stream_read_word(s);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 e=stream_read_word(s);
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
259 if( ((c&1)!=1) || ((d&1)!=1) || ((e&1)!=1) ){
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
260 ++mpeg_pts_error;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
261 return 0; // invalid pts
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
262 }
18380
841789620ed1 in read_mpeg_timestamp() cast int expression to uint64_t before shifting to avoid truncation of bits and to prevent propagation of bit 1 as sign bit in pts
nicodvb
parents: 18077
diff changeset
263 pts=(((uint64_t)((c>>1)&7))<<30)|((d>>1)<<15)|(e>>1);
18382
8486998ba174 fixed %d->PRIu64 in read_mpeg_timestamp()
nicodvb
parents: 18381
diff changeset
264 mp_dbg(MSGT_DEMUX,MSGL_DBG3," pts {%"PRIu64"}",pts);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265 return pts;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
267
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
268 static void new_audio_stream(demuxer_t *demux, int aid){
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
269 if(!demux->a_streams[aid]){
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
270 mpg_demuxer_t *mpg_d=(mpg_demuxer_t*)demux->priv;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
271 sh_audio_t* sh_a;
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 31414
diff changeset
272 new_sh_audio(demux,aid, NULL);
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
273 sh_a = (sh_audio_t*)demux->a_streams[aid];
30088
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29263
diff changeset
274 sh_a->needs_parsing = 1;
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
275 switch(aid & 0xE0){ // 1110 0000 b (high 3 bit: type low 5: id)
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
276 case 0x00: sh_a->format=0x50;break; // mpeg
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
277 case 0xA0: sh_a->format=0x10001;break; // dvd pcm
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
278 case 0x80: if((aid & 0xF8) == 0x88) sh_a->format=0x2001;//dts
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
279 else sh_a->format=0x2000;break; // ac3
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
280 }
21927
ee422890bca9 in evo files [e]ac3 substreams range from 0xc0 to 0xcf
nicodvb
parents: 21919
diff changeset
281 //evo files
21934
a18fc58a4900 1000l; fixed wrong operator precedence
nicodvb
parents: 21927
diff changeset
282 if((aid & 0xC0) == 0xC0) sh_a->format=0x2000;
22170
cc7967b389a1 substream id 0x98..0x9f identifies dts
nicodvb
parents: 22155
diff changeset
283 else if(aid >= 0x98 && aid <= 0x9f) sh_a->format=0x2001;
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
284 if (mpg_d) mpg_d->a_stream_ids[mpg_d->num_a_streams++] = aid;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
285 }
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
286 if(demux->audio->id==-1) demux->audio->id=aid;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
287 }
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
288
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289 static int demux_mpg_read_packet(demuxer_t *demux,int id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
290 int d;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 int len;
21978
1dbe952f3b56 set priv->last_pts to the pts read only if the pts was really read; patch by zaek7q gmx net (Christian Aistleitner)
nicodvb
parents: 21948
diff changeset
292 int set_pts=0; // !=0 iff pts has been set to a proper value
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 unsigned char c=0;
18077
cede662f40a5 timestamps are 33 bits long, so they don't fit in an unsigned int; 10l
nicodvb
parents: 18072
diff changeset
294 unsigned long long pts=0;
cede662f40a5 timestamps are 33 bits long, so they don't fit in an unsigned int; 10l
nicodvb
parents: 18072
diff changeset
295 unsigned long long dts=0;
21781
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
296 int l;
21948
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
297 int pes_ext2_subid=-1;
21781
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
298 double stream_pts = MP_NOPTS_VALUE;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 demux_stream_t *ds=NULL;
21781
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
300 demux_packet_t* dp;
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
301 mpg_demuxer_t *priv = (mpg_demuxer_t *) demux->priv;
23723
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
302
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
303 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"demux_read_packet: %X\n",id);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
304
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
305 // if(id==0x1F0){
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
306 // demux->synced=0; // force resync after 0x1F0
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
307 // return -1;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
308 //}
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
309
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
310 // if(id==0x1BA) packet_start_pos=stream_tell(demux->stream);
21948
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
311 if((id<0x1BC || id>=0x1F0) && id != 0x1FD) return -1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
312 if(id==0x1BE) return -1; // padding stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
313 if(id==0x1BF) return -1; // private2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
314
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
315 len=stream_read_word(demux->stream);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
316 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"PACKET len=%d",len);
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
317 // if(len==62480){ demux->synced=0;return -1;} /* :) */
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
318 if(len==0 || len>MAX_PS_PACKETSIZE){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
319 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Invalid PS packet len: %d\n",len);
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
320 return -2; // invalid packet !!!!!!
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
321 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
322
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
323 mpeg_pts_error=0;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
324
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
325 if(id==0x1BC) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
326 parse_psm(demux, len);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
327 return 0;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
328 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
329
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
330 while(len>0){ // Skip stuFFing bytes
23710
df28abb8fe74 cosmetics: split separate instructions in separate lines
nicodvb
parents: 23709
diff changeset
331 c=stream_read_char(demux->stream);
df28abb8fe74 cosmetics: split separate instructions in separate lines
nicodvb
parents: 23709
diff changeset
332 --len;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
333 if(c!=0xFF)break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 if((c>>6)==1){ // Read (skip) STD scale & size value
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336 // printf(" STD_scale=%d",(c>>5)&1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337 d=((c&0x1F)<<8)|stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
338 len-=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
339 // printf(" STD_size=%d",d);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
340 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
341 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
342 // Read System-1 stream timestamps:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343 if((c>>4)==2){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
344 pts=read_mpeg_timestamp(demux->stream,c);
21978
1dbe952f3b56 set priv->last_pts to the pts read only if the pts was really read; patch by zaek7q gmx net (Christian Aistleitner)
nicodvb
parents: 21948
diff changeset
345 set_pts=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
346 len-=4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
347 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
348 if((c>>4)==3){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
349 pts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
350 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
351 if((c>>4)!=1) pts=0; //printf("{ERROR4}");
21978
1dbe952f3b56 set priv->last_pts to the pts read only if the pts was really read; patch by zaek7q gmx net (Christian Aistleitner)
nicodvb
parents: 21948
diff changeset
352 else set_pts = 1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
353 dts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
354 len-=4+1+4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
355 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
356 if((c>>6)==2){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
357 int pts_flags;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
358 int hdrlen;
21948
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
359 int parse_ext2;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
360 // System-2 (.VOB) stream:
23710
df28abb8fe74 cosmetics: split separate instructions in separate lines
nicodvb
parents: 23709
diff changeset
361 c=stream_read_char(demux->stream);
df28abb8fe74 cosmetics: split separate instructions in separate lines
nicodvb
parents: 23709
diff changeset
362 pts_flags=c>>6;
21948
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
363 parse_ext2 = (id == 0x1FD) && ((c & 0x3F) == 1);
23710
df28abb8fe74 cosmetics: split separate instructions in separate lines
nicodvb
parents: 23709
diff changeset
364 c=stream_read_char(demux->stream);
df28abb8fe74 cosmetics: split separate instructions in separate lines
nicodvb
parents: 23709
diff changeset
365 hdrlen=c;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
366 len-=2;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
367 mp_dbg(MSGT_DEMUX,MSGL_DBG3," hdrlen=%d (len=%d)",hdrlen,len);
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
368 if(hdrlen>len){ mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: invalid header length \n"); return -1;}
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
369 if(pts_flags==2 && hdrlen>=5){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
370 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
371 pts=read_mpeg_timestamp(demux->stream,c);
21978
1dbe952f3b56 set priv->last_pts to the pts read only if the pts was really read; patch by zaek7q gmx net (Christian Aistleitner)
nicodvb
parents: 21948
diff changeset
372 set_pts=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
373 len-=5;hdrlen-=5;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
374 } else
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
375 if(pts_flags==3 && hdrlen>=10){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
376 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
377 pts=read_mpeg_timestamp(demux->stream,c);
21978
1dbe952f3b56 set priv->last_pts to the pts read only if the pts was really read; patch by zaek7q gmx net (Christian Aistleitner)
nicodvb
parents: 21948
diff changeset
378 set_pts=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
379 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
380 dts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
381 len-=10;hdrlen-=10;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
382 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
383 len-=hdrlen;
23723
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
384 if(parse_ext2 && hdrlen>=3) {
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
385 c=stream_read_char(demux->stream);
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
386 hdrlen--;
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
387
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
388 if((c & 0x0F) != 0x0F) {
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
389 mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: pes_extension_flag2 not set, discarding pes packet\n");
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
390 return -1;
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
391 }
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
392 if(c & 0x80) { //pes_private_data_flag
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
393 if(hdrlen<16) {
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
394 mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: not enough pes_private_data bytes: %d < 16, discarding pes packet\n", hdrlen);
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
395 return -1;
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
396 }
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
397 stream_skip(demux->stream, 16);
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
398 hdrlen-=16;
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
399 }
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
400 if(c & 0x40) { //pack_header_field_flag
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
401 int l = stream_read_char(demux->stream);
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
402 if(l < 0) //couldn't read from the stream?
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
403 return -1;
21948
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
404 hdrlen--;
23723
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
405 if(l < 0 || hdrlen < l) {
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
406 mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: not enough pack_header bytes: hdrlen: %d < skip: %d, discarding pes packet\n",
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
407 hdrlen, l);
23709
b214397ad0e2 proper parsing of pes_extension[12] fields (replaces the previous code that relied on specific flags set
nicodvb
parents: 23550
diff changeset
408 return -1;
b214397ad0e2 proper parsing of pes_extension[12] fields (replaces the previous code that relied on specific flags set
nicodvb
parents: 23550
diff changeset
409 }
23723
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
410 stream_skip(demux->stream, l);
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
411 hdrlen-=l;
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
412 }
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
413 if(c & 0x20) { //program_packet_sequence_counter_flag
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
414 if(hdrlen < 2) {
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
415 mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: not enough program_packet bytes: hdrlen: %d, discarding pes packet\n", hdrlen);
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
416 return -1;
23709
b214397ad0e2 proper parsing of pes_extension[12] fields (replaces the previous code that relied on specific flags set
nicodvb
parents: 23550
diff changeset
417 }
23723
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
418 stream_skip(demux->stream, 2);
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
419 hdrlen-=2;
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
420 }
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
421 if(c & 0x10) {
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
422 //STD
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
423 stream_skip(demux->stream, 2);
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
424 hdrlen-=2;
21948
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
425 }
23723
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
426 c=stream_read_char(demux->stream); //pes_extension2 flag
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
427 hdrlen--;
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
428 if(c!=0x81) { mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: unknown pes_extension2 format, len is > 1 \n"); return -1;}
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
429 c=stream_read_char(demux->stream); //pes_extension2 payload === substream id
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
430 hdrlen--;
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
431 if(c<0x55 || c>0x5F) { mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: unknown vc1 substream_id: 0x%x \n", c); return -1;}
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
432 pes_ext2_subid=c;
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
433 }
23722
5c5a3b4c0eb7 unified the skip of header and stuffing bytes after the parsing of pes_extension[12] fields
nicodvb
parents: 23711
diff changeset
434 if(hdrlen>0)
5c5a3b4c0eb7 unified the skip of header and stuffing bytes after the parsing of pes_extension[12] fields
nicodvb
parents: 23711
diff changeset
435 stream_skip(demux->stream,hdrlen); // skip header and stuffing bytes
23723
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
436
21948
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
437 if(id==0x1FD && pes_ext2_subid!=-1) {
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
438 //==== EVO VC1 STREAMS ===//
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
439 if(!demux->v_streams[pes_ext2_subid]) new_sh_video(demux,pes_ext2_subid);
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
440 if(demux->video->id==-1) demux->video->id=pes_ext2_subid;
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
441 if(demux->video->id==pes_ext2_subid){
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
442 ds=demux->video;
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
443 if(!ds->sh) ds->sh=demux->v_streams[pes_ext2_subid];
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
444 if(priv && ds->sh) {
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
445 sh_video_t *sh = (sh_video_t *)ds->sh;
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
446 sh->format = mmioFOURCC('W', 'V', 'C', '1');
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
447 }
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
448 }
3b9115e57f24 demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents: 21934
diff changeset
449 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
450 //============== DVD Audio sub-stream ======================
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
451 if(id==0x1BD){
15815
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
452 int aid, rawa52 = 0;
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
453 off_t tmppos;
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
454 unsigned int tmp;
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
455
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
456 tmppos = stream_tell(demux->stream);
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
457 tmp = stream_read_word(demux->stream);
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
458 stream_seek(demux->stream, tmppos);
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
459 /// vdr stores A52 without the 4 header bytes, so we have to check this condition first
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
460 if(tmp == 0x0B77) {
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
461 aid = 128;
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
462 rawa52 = 1;
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
463 }
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
464 else {
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
465 aid=stream_read_char(demux->stream);--len;
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
466 if(len<3) return -1; // invalid audio packet
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
467 }
23723
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
468
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
469 // AID:
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
470 // 0x20..0x3F subtitle
23530
c325aaa89171 clearly specify the valid substream id range, rather than using unreadable bitmasks (it also prevents misdetection 0xFF as valid)
nicodvb
parents: 22886
diff changeset
471 // 0x80..0x87 and 0xC0..0xCF AC3 audio
c325aaa89171 clearly specify the valid substream id range, rather than using unreadable bitmasks (it also prevents misdetection 0xFF as valid)
nicodvb
parents: 22886
diff changeset
472 // 0x88..0x8F and 0x98..0x9F DTS audio
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
473 // 0xA0..0xBF PCM audio
23723
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
474
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
475 if((aid & 0xE0) == 0x20){
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
476 // subtitle:
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
477 aid&=0x1F;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
478
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
479 if(!demux->s_streams[aid]){
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 31414
diff changeset
480 sh_sub_t *sh = new_sh_sub(demux, aid, NULL);
23550
1915012c8f7d Set subtitle type in mpg demuxer. Fixes subtitle switching with 'j'
reimar
parents: 23530
diff changeset
481 if (sh) sh->type = 'v';
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
482 mp_msg(MSGT_DEMUX,MSGL_V,"==> Found subtitle: %d\n",aid);
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
483 }
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
484
17286
b0046966ab82 don't reset dvdsub->id unless -slang is specified; assign default sub stream id when demux->sub->id is -1 (autodetect)
nicodvb
parents: 16877
diff changeset
485 if(demux->sub->id > -1)
b0046966ab82 don't reset dvdsub->id unless -slang is specified; assign default sub stream id when demux->sub->id is -1 (autodetect)
nicodvb
parents: 16877
diff changeset
486 demux->sub->id &= 0x1F;
31610
9e2c61ae171f Revert and accidentally committed hunk from last commit.
reimar
parents: 31609
diff changeset
487 if(!dvdsub_lang && demux->sub->id == -1)
9e2c61ae171f Revert and accidentally committed hunk from last commit.
reimar
parents: 31609
diff changeset
488 demux->sub->id = aid;
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
489 if(demux->sub->id==aid){
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
490 ds=demux->sub;
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
491 }
23530
c325aaa89171 clearly specify the valid substream id range, rather than using unreadable bitmasks (it also prevents misdetection 0xFF as valid)
nicodvb
parents: 22886
diff changeset
492 } else if((aid >= 0x80 && aid <= 0x8F) || (aid >= 0x98 && aid <= 0xAF) || (aid >= 0xC0 && aid <= 0xCF)) {
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
493
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
494 // aid=128+(aid&0x7F);
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
495 // aid=0x80..0xBF
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
496 new_audio_stream(demux, aid);
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
497 if(demux->audio->id==aid){
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
498 int type;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
499 ds=demux->audio;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
500 if(!ds->sh) ds->sh=demux->a_streams[aid];
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
501 // READ Packet: Skip additional audio header data:
15815
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
502 if(!rawa52) {
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
503 c=stream_read_char(demux->stream);//num of frames
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
504 type=stream_read_char(demux->stream);//startpos hi
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
505 type=(type<<8)|stream_read_char(demux->stream);//startpos lo
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
506 // printf("\r[%02X][%04X]",c,type);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
507 len-=3;
15815
488f31bd127e support raw ac3 (in private pes packets without the usual dvd 4 bytes substream header). Patch by Matthias Scharzott
nicodvb
parents: 15670
diff changeset
508 }
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
509 if((aid&0xE0)==0xA0 && len>=3){
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
510 unsigned char* hdr;
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
511 // save audio header as codecdata!
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
512 if(!((sh_audio_t*)(ds->sh))->codecdata_len){
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
513 ((sh_audio_t*)(ds->sh))->codecdata=malloc(3);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
514 ((sh_audio_t*)(ds->sh))->codecdata_len=3;
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
515 }
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
516 hdr=((sh_audio_t*)(ds->sh))->codecdata;
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
517 // read LPCM header:
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
518 // emphasis[1], mute[1], rvd[1], frame number[5]:
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
519 hdr[0]=stream_read_char(demux->stream);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
520 // printf(" [%01X:%02d]",c>>5,c&31);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
521 // quantization[2],freq[2],rvd[1],channels[3]
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
522 hdr[1]=stream_read_char(demux->stream);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
523 // printf("[%01X:%01X] ",c>>4,c&15);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
524 // dynamic range control (0x80=off):
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
525 hdr[2]=stream_read_char(demux->stream);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
526 // printf("[%02X] ",c);
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
527 len-=3;
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
528 if(len<=0) mp_msg(MSGT_DEMUX,MSGL_V,"End of packet while searching for PCM header\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
529 }
7671
2d186a94dd5f fixed LPCM parsing
arpi
parents: 7559
diff changeset
530 // printf(" \n");
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
531 } // if(demux->audio->id==aid)
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
532
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
533 } else mp_msg(MSGT_DEMUX,MSGL_V,"Unknown 0x1BD substream: 0x%02X \n",aid);
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
534 } //if(id==0x1BD)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
535 } else {
539
48f0c6f0519f dumb bug here too :)
arpi_esp
parents: 536
diff changeset
536 if(c!=0x0f){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
537 mp_msg(MSGT_DEMUX,MSGL_V," {ERROR5,c=%d} \n",c);
539
48f0c6f0519f dumb bug here too :)
arpi_esp
parents: 536
diff changeset
538 return -1; // invalid packet !!!!!!
48f0c6f0519f dumb bug here too :)
arpi_esp
parents: 536
diff changeset
539 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
540 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
541 if(mpeg_pts_error) mp_msg(MSGT_DEMUX,MSGL_V," {PTS_err:%d} \n",mpeg_pts_error);
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
542 mp_dbg(MSGT_DEMUX,MSGL_DBG3," => len=%d\n",len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
543
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
544 // if(len<=0 || len>MAX_PS_PACKETSIZE) return -1; // Invalid packet size
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
545 if(len<=0 || len>MAX_PS_PACKETSIZE){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
546 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Invalid PS data len: %d\n",len);
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
547 return -1; // invalid packet !!!!!!
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
548 }
23723
148b85340a65 100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents: 23722
diff changeset
549
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
550 if(id>=0x1C0 && id<=0x1DF){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
551 // mpeg audio
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
552 int aid=id-0x1C0;
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
553 new_audio_stream(demux, aid);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
554 if(demux->audio->id==aid){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
555 ds=demux->audio;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
556 if(!ds->sh) ds->sh=demux->a_streams[aid];
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
557 if(priv && ds->sh) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
558 sh_audio_t *sh = (sh_audio_t *)ds->sh;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
559 if(priv->es_map[id - 0x1B0])
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
560 sh->format = priv->es_map[id - 0x1B0];
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
561 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"ASSIGNED TO STREAM %d CODEC %x\n", id, priv->es_map[id - 0x1B0]);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
562 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
563 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
564 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
565 if(id>=0x1E0 && id<=0x1EF){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
566 // mpeg video
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
567 int aid=id-0x1E0;
1289
3f490fad9bdf some code clanup (first step to libdemuxer)
arpi
parents: 1162
diff changeset
568 if(!demux->v_streams[aid]) new_sh_video(demux,aid);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
569 if(demux->video->id==-1) demux->video->id=aid;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
570 if(demux->video->id==aid){
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
571 ds=demux->video;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
572 if(!ds->sh) ds->sh=demux->v_streams[aid];
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
573 if(priv && ds->sh) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
574 sh_video_t *sh = (sh_video_t *)ds->sh;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
575 if(priv->es_map[id - 0x1B0]) {
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
576 sh->format = priv->es_map[id - 0x1B0];
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
577 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"ASSIGNED TO STREAM %d CODEC %x\n", id, priv->es_map[id - 0x1B0]);
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
578 }
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
579 }
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
580 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
581 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
582
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
583 if(ds){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
584 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Read %d data bytes from packet %04X\n",len,id);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
585 // printf("packet start = 0x%X \n",stream_tell(demux->stream)-packet_start_pos);
21781
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
586
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
587 dp=new_demux_packet(len);
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
588 if(!dp) {
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
589 mp_dbg(MSGT_DEMUX,MSGL_ERR,"DEMUX_MPG ERROR: couldn't create demux_packet(%d bytes)\n",len);
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
590 stream_skip(demux->stream,len);
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
591 return 0;
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
592 }
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
593 l = stream_read(demux->stream,dp->buffer,len);
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
594 if(l<len)
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
595 resize_demux_packet(dp, l);
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
596 len = l;
24945
46337ac77770 10l, setting a non-existent timestamp (default 0.0) when the pts flag isn't set in
nicodvb
parents: 24681
diff changeset
597 if(set_pts)
24946
259a3df86fbc reindented
nicodvb
parents: 24945
diff changeset
598 dp->pts=pts/90000.0f;
21781
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
599 dp->pos=demux->filepos;
21789
b266f27109a6 set dp->stream_pts only when feeding the video stream to workaround
nicodvb
parents: 21781
diff changeset
600 /*
b266f27109a6 set dp->stream_pts only when feeding the video stream to workaround
nicodvb
parents: 21781
diff changeset
601 workaround:
b266f27109a6 set dp->stream_pts only when feeding the video stream to workaround
nicodvb
parents: 21781
diff changeset
602 set dp->stream_pts only when feeding the video stream, or strangely interleaved files
b266f27109a6 set dp->stream_pts only when feeding the video stream to workaround
nicodvb
parents: 21781
diff changeset
603 (such as SWIII) will show strange alternations in the stream time, wildly going
b266f27109a6 set dp->stream_pts only when feeding the video stream to workaround
nicodvb
parents: 21781
diff changeset
604 back and forth
b266f27109a6 set dp->stream_pts only when feeding the video stream to workaround
nicodvb
parents: 21781
diff changeset
605 */
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 23723
diff changeset
606 if(ds == demux->video && stream_control(demux->stream, STREAM_CTRL_GET_CURRENT_TIME,(void *)&stream_pts)!=STREAM_UNSUPPORTED)
21781
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
607 dp->stream_pts = stream_pts;
36112fcf78d6 replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents: 21531
diff changeset
608 ds_add_packet(ds,dp);
21978
1dbe952f3b56 set priv->last_pts to the pts read only if the pts was really read; patch by zaek7q gmx net (Christian Aistleitner)
nicodvb
parents: 21948
diff changeset
609 if (demux->priv && set_pts) ((mpg_demuxer_t*)demux->priv)->last_pts = pts/90000.0f;
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
610 // if(ds==demux->sub) parse_dvdsub(ds->last->buffer,ds->last->len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
611 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
612 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
613 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Skipping %d data bytes from packet %04X\n",len,id);
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
614 if(len<=2356) stream_skip(demux->stream,len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
615 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
616 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
617
15670
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
618 static int num_elementary_packets100=0;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
619 static int num_elementary_packets101=0;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
620 static int num_elementary_packets12x=0;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
621 static int num_elementary_packets1B6=0;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
622 static int num_elementary_packetsPES=0;
25838
f75a531569a2 in the crazy ES probing code return DEMUXER_TYPE_MPEG_ES (mpeg12v) only if we have at least a couple of SEQ/GOP startcodes
nicodvb
parents: 25707
diff changeset
623 static int num_mpeg12_startcode=0;
15670
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
624 static int num_h264_slice=0; //combined slice
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
625 static int num_h264_dpa=0; //DPA Slice
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
626 static int num_h264_dpb=0; //DPB Slice
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
627 static int num_h264_dpc=0; //DPC Slice
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
628 static int num_h264_idr=0; //IDR Slice
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
629 static int num_h264_sps=0;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
630 static int num_h264_pps=0;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
631
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
632 static int num_mp3audio_packets=0;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
633
22886
71b3e04d0555 "()" to "(void)" function param list fixes
uau
parents: 22605
diff changeset
634 static void clear_stats(void)
22034
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
635 {
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
636 num_elementary_packets100=0;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
637 num_elementary_packets101=0;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
638 num_elementary_packets1B6=0;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
639 num_elementary_packets12x=0;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
640 num_elementary_packetsPES=0;
25838
f75a531569a2 in the crazy ES probing code return DEMUXER_TYPE_MPEG_ES (mpeg12v) only if we have at least a couple of SEQ/GOP startcodes
nicodvb
parents: 25707
diff changeset
641 num_mpeg12_startcode=0;
22034
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
642 num_h264_slice=0; //combined slice
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
643 num_h264_dpa=0; //DPA Slice
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
644 num_h264_dpb=0; //DPB Slice
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
645 num_h264_dpc=0; //DPC Slice
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
646 num_h264_idr=0; //IDR Slice
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
647 num_h264_sps=0;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
648 num_h264_pps=0;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
649 num_mp3audio_packets=0;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
650 }
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
651
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
652 //assumes demuxer->synced < 2
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
653 static inline void update_stats(int head)
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
654 {
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
655 if(head==0x1B6) ++num_elementary_packets1B6;
25838
f75a531569a2 in the crazy ES probing code return DEMUXER_TYPE_MPEG_ES (mpeg12v) only if we have at least a couple of SEQ/GOP startcodes
nicodvb
parents: 25707
diff changeset
656 else if(head==0x1B3 || head==0x1B8) ++num_mpeg12_startcode;
22034
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
657 else if(head==0x100) ++num_elementary_packets100;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
658 else if(head==0x101) ++num_elementary_packets101;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
659 else if(head==0x1BD || (0x1C0<=head && head<=0x1EF))
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
660 num_elementary_packetsPES++;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
661 else if(head>=0x120 && head<=0x12F) ++num_elementary_packets12x;
24681
1ecf2ff1d512 in update_stats() removed a wrong 'else' that would prevent h264 headers to be recognized:
nicodvb
parents: 24257
diff changeset
662 if(head>=0x100 && head<0x1B0)
22034
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
663 {
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
664 if((head&~0x60) == 0x101) ++num_h264_slice;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
665 else if((head&~0x60) == 0x102) ++num_h264_dpa;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
666 else if((head&~0x60) == 0x103) ++num_h264_dpb;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
667 else if((head&~0x60) == 0x104) ++num_h264_dpc;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
668 else if((head&~0x60) == 0x105 && head != 0x105) ++num_h264_idr;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
669 else if((head&~0x60) == 0x107 && head != 0x107) ++num_h264_sps;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
670 else if((head&~0x60) == 0x108 && head != 0x108) ++num_h264_pps;
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
671 }
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
672 }
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
673
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
674 static int demux_mpg_probe(demuxer_t *demuxer) {
15670
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
675 int pes=1;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
676 int tmp;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
677 off_t tmppos;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
678 int file_format = DEMUXER_TYPE_UNKNOWN;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
679
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
680 tmppos=stream_tell(demuxer->stream);
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
681 tmp=stream_read_dword(demuxer->stream);
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
682 if(tmp==0x1E0 || tmp==0x1C0) {
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
683 tmp=stream_read_word(demuxer->stream);
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
684 if(tmp>1 && tmp<=2048) pes=0; // demuxer->synced=3; // PES...
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
685 }
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
686 stream_seek(demuxer->stream,tmppos);
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
687
22034
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
688 clear_stats();
9824
39b68c2664ec H264-ES demuxer
michael
parents: 9069
diff changeset
689
15670
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
690 if(demux_mpg_open(demuxer))
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
691 file_format=DEMUXER_TYPE_MPEG_PS;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
692 else {
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
693 mp_msg(MSGT_DEMUX,MSGL_V,"MPEG packet stats: p100: %d p101: %d p1B6: %d p12x: %d sli: %d a: %d b: %d c: %d idr: %d sps: %d pps: %d PES: %d MP3: %d, synced: %d\n",
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
694 num_elementary_packets100,num_elementary_packets101,
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
695 num_elementary_packets1B6,num_elementary_packets12x,
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
696 num_h264_slice, num_h264_dpa,
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
697 num_h264_dpb, num_h264_dpc=0,
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
698 num_h264_idr, num_h264_sps=0,
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
699 num_h264_pps,
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
700 num_elementary_packetsPES,num_mp3audio_packets, demuxer->synced);
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
701
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
702 //MPEG packet stats: p100: 458 p101: 458 PES: 0 MP3: 1103 (.m2v)
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
703 if(num_mp3audio_packets>50 && num_mp3audio_packets>2*num_elementary_packets100
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
704 && abs(num_elementary_packets100-num_elementary_packets101)>2)
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
705 return file_format;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
706
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
707 // some hack to get meaningfull error messages to our unhappy users:
25838
f75a531569a2 in the crazy ES probing code return DEMUXER_TYPE_MPEG_ES (mpeg12v) only if we have at least a couple of SEQ/GOP startcodes
nicodvb
parents: 25707
diff changeset
708 if(num_mpeg12_startcode>=2 && num_elementary_packets100>=2 && num_elementary_packets101>=2 &&
15670
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
709 abs(num_elementary_packets101+8-num_elementary_packets100)<16) {
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
710 if(num_elementary_packetsPES>=4 && num_elementary_packetsPES>=num_elementary_packets100-4) {
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
711 return file_format;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
712 }
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
713 file_format=DEMUXER_TYPE_MPEG_ES; // <-- hack is here :)
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
714 } else
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
715 // fuzzy mpeg4-es detection. do NOT enable without heavy testing of mpeg formats detection!
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
716 if(num_elementary_packets1B6>3 && num_elementary_packets12x>=1 &&
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
717 num_elementary_packetsPES==0 && num_elementary_packets100<=num_elementary_packets12x &&
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
718 demuxer->synced<2) {
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
719 file_format=DEMUXER_TYPE_MPEG4_ES;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
720 } else
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
721 // fuzzy h264-es detection. do NOT enable without heavy testing of mpeg formats detection!
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
722 if((num_h264_slice>3 || (num_h264_dpa>3 && num_h264_dpb>3 && num_h264_dpc>3)) &&
15670
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
723 /* FIXME num_h264_sps>=1 && */ num_h264_pps>=1 && num_h264_idr>=1 &&
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
724 num_elementary_packets1B6==0 && num_elementary_packetsPES==0 &&
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
725 demuxer->synced<2) {
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
726 file_format=DEMUXER_TYPE_H264_ES;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
727 } else
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
728 {
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
729 if(demuxer->synced==2)
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
730 mp_msg(MSGT_DEMUXER,MSGL_ERR,"MPEG: " MSGTR_MissingVideoStreamBug);
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
731 else
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
732 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_NotSystemStream);
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
733 }
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
734 }
22094
e2d1bb1d2c6b demux_mpg_probe() seek to the initial position before returning - patch by reimar
nicodvb
parents: 22088
diff changeset
735 //FIXME this shouldn't be necessary
e2d1bb1d2c6b demux_mpg_probe() seek to the initial position before returning - patch by reimar
nicodvb
parents: 22088
diff changeset
736 stream_seek(demuxer->stream,tmppos);
15670
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
737 return file_format;
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15285
diff changeset
738 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
739
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
740 static int demux_mpg_es_fill_buffer(demuxer_t *demux, demux_stream_t *ds){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
741 // Elementary video stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
742 if(demux->stream->eof) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
743 demux->filepos=stream_tell(demux->stream);
1735
bdc1ec6fe668 gui seekbar position fixed
arpi
parents: 1628
diff changeset
744 ds_read_packet(demux->video,demux->stream,STREAM_BUFFER_SIZE,0,demux->filepos,0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
745 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
746 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
747
16369
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
748 /**
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
749 * \brief discard until 0x100 header and return a filled buffer
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
750 * \param b buffer-end pointer
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
751 * \param pos current pos in stream, negative since b points to end of buffer
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
752 * \param s stream to read from
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
753 * \return new position, differs from original pos when eof hit and thus
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
754 * b was modified to point to the new end of buffer
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
755 */
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
756 static int find_end(unsigned char **b, int pos, stream_t *s) {
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
757 register int state = 0xffffffff;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
758 unsigned char *buf = *b;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
759 int start = pos;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
760 int read, unused;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
761 // search already read part
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
762 while (state != 0x100 && pos) {
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
763 state = state << 8 | buf[pos++];
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
764 }
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
765 // continue search in stream
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
766 while (state != 0x100) {
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
767 register int c = stream_read_char(s);
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
768 if (c < 0) break;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
769 state = state << 8 | c;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
770 }
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
771 // modify previous header (from 0x1bc or 0x1bf to 0x100)
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
772 buf[start++] = 0;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
773 // copy remaining buffer part to current pos
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
774 memmove(&buf[start], &buf[pos], -pos);
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
775 unused = start + -pos; // -unused bytes in buffer
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
776 read = stream_read(s, &buf[unused], -unused);
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
777 unused += read;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
778 // fix buffer so it ends at pos == 0 (eof case)
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
779 *b = &buf[unused];
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
780 start -= unused;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
781 return start;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
782 }
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
783
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
784 /**
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
785 * This format usually uses an insane bitrate, which makes this function
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
786 * performance-critical!
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
787 * Be sure to benchmark any changes with different compiler versions.
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
788 */
16310
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
789 static int demux_mpg_gxf_fill_buffer(demuxer_t *demux, demux_stream_t *ds) {
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
790 demux_packet_t *pack;
16369
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
791 int len;
16310
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
792 demux->filepos = stream_tell(demux->stream);
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
793 pack = new_demux_packet(STREAM_BUFFER_SIZE);
16369
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
794 len = stream_read(demux->stream, pack->buffer, STREAM_BUFFER_SIZE);
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
795 if (len <= 0)
17779
031185213fa9 Missing free_demux_packet after read error
reimar
parents: 17699
diff changeset
796 {
031185213fa9 Missing free_demux_packet after read error
reimar
parents: 17699
diff changeset
797 free_demux_packet(pack);
16369
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
798 return 0;
17779
031185213fa9 Missing free_demux_packet after read error
reimar
parents: 17699
diff changeset
799 }
16369
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
800 {
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
801 register uint32_t state = (uint32_t)demux->priv;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
802 register int pos = -len;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
803 unsigned char *buf = &pack->buffer[len];
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
804 do {
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
805 state = state << 8 | buf[pos];
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
806 if (unlikely((state | 3) == 0x1bf))
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
807 pos = find_end(&buf, pos, demux->stream);
19182
c68cf9a578a8 Incorrect check in gxf demuxer leading to crash with textKO.gxf sample file
reimar
parents: 18958
diff changeset
808 } while (++pos < 0);
16369
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
809 demux->priv = (void *)state;
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
810 len = buf - pack->buffer;
16310
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
811 }
16369
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
812 if (len < STREAM_BUFFER_SIZE)
8ea2e7ab3106 faster mpg and much faster gxf demuxing
reimar
parents: 16346
diff changeset
813 resize_demux_packet(pack, len);
16310
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
814 ds_add_packet(ds, pack);
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
815 return 1;
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
816 }
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
817
30570
98dc6ae7ede2 libmpdemux: Mark functions not used outside of their files as static.
diego
parents: 30088
diff changeset
818 static int demux_mpg_fill_buffer(demuxer_t *demux, demux_stream_t *ds)
98dc6ae7ede2 libmpdemux: Mark functions not used outside of their files as static.
diego
parents: 30088
diff changeset
819 {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
820 unsigned int head=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
821 int skipped=0;
5570
3a8d8c51355a max_packs increased for some dvd with too many audio/sub
arpi
parents: 4711
diff changeset
822 int max_packs=256; // 512kbyte
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
823 int ret=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
824
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
825 // System stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
826 do{
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
827 demux->filepos=stream_tell(demux->stream);
18713
c6c78e77c857 workaround: at every read update demux->movi_end with stream->end_pos; needed to show the progress bar when playing dvdnav streams
nicodvb
parents: 18680
diff changeset
828 //lame workaround: this is needed to show the progress bar when playing dvdnav://
c6c78e77c857 workaround: at every read update demux->movi_end with stream->end_pos; needed to show the progress bar when playing dvdnav streams
nicodvb
parents: 18680
diff changeset
829 //(ths poor guy doesn't know teh length of the stream at startup)
c6c78e77c857 workaround: at every read update demux->movi_end with stream->end_pos; needed to show the progress bar when playing dvdnav streams
nicodvb
parents: 18680
diff changeset
830 demux->movi_end = demux->stream->end_pos;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
831 head=stream_read_dword(demux->stream);
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
832 if((head&0xFFFFFF00)!=0x100){
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
833 // sync...
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
834 demux->filepos-=skipped;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
835 while(1){
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
836 int c=stream_read_char(demux->stream);
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
837 if(c<0) break; //EOF
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
838 head<<=8;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
839 if(head!=0x100){
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
840 head|=c;
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
841 if(mp_check_mp3_header(head)) ++num_mp3audio_packets;
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
842 ++skipped; //++demux->filepos;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
843 continue;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
844 }
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
845 head|=c;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
846 break;
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
847 }
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
848 demux->filepos+=skipped;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
849 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
850 if(stream_eof(demux->stream)) break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
851 // sure: head=0x000001XX
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
852 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"*** head=0x%X\n",head);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
853 if(demux->synced==0){
3770
4f1a99fb9d9a mpeg VDR vs. BIN fixed?
arpi
parents: 3255
diff changeset
854 if(head==0x1BA) demux->synced=1; //else
4f1a99fb9d9a mpeg VDR vs. BIN fixed?
arpi
parents: 3255
diff changeset
855 // if(head==0x1BD || (head>=0x1C0 && head<=0x1EF)) demux->synced=3; // PES?
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
856 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
857 if(demux->synced==1){
929
6dedc7cb0146 accept 1BD packets for PS stream sync
arpi_esp
parents: 605
diff changeset
858 if(head==0x1BB || head==0x1BD || (head>=0x1C0 && head<=0x1EF)){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
859 demux->synced=2;
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17289
diff changeset
860 mp_msg(MSGT_DEMUX,MSGL_V,"system stream synced at 0x%"PRIX64" (%"PRId64")!\n",(int64_t)demux->filepos,(int64_t)demux->filepos);
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
861 num_elementary_packets100=0; // requires for re-sync!
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
862 num_elementary_packets101=0; // requires for re-sync!
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
863 } else demux->synced=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
864 } // else
3255
ee28577dad02 combined PS/PES sync to allow .VDR playback from stdin
arpi
parents: 2555
diff changeset
865 if(demux->synced>=2){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
866 ret=demux_mpg_read_packet(demux,head);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
867 if(!ret)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
868 if(--max_packs==0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
869 demux->stream->eof=1;
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1735
diff changeset
870 mp_msg(MSGT_DEMUX,MSGL_ERR,MSGTR_DoesntContainSelectedStream);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
871 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
872 }
3255
ee28577dad02 combined PS/PES sync to allow .VDR playback from stdin
arpi
parents: 2555
diff changeset
873 if(demux->synced==3) demux->synced=(ret==1)?2:0; // PES detect
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
874 } else {
22034
a3d208daed8c moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents: 22021
diff changeset
875 update_stats(head);
22035
3d619d883ca5 cosmetics: reindentation and braces removal
nicodvb
parents: 22034
diff changeset
876 if(head>=0x100 && head<0x1B0)
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
877 mp_msg(MSGT_DEMUX,MSGL_DBG3,"Opps... elementary video packet found: %03X\n",head);
22035
3d619d883ca5 cosmetics: reindentation and braces removal
nicodvb
parents: 22034
diff changeset
878 else if((head>=0x1C0 && head<0x1F0) || head==0x1BD)
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
879 mp_msg(MSGT_DEMUX,MSGL_DBG3,"Opps... PES packet found: %03X\n",head);
21919
05223564b604 one more #if 1 removed
nicodvb
parents: 21918
diff changeset
880
22035
3d619d883ca5 cosmetics: reindentation and braces removal
nicodvb
parents: 22034
diff changeset
881 if(((num_elementary_packets100>50 && num_elementary_packets101>50) ||
3d619d883ca5 cosmetics: reindentation and braces removal
nicodvb
parents: 22034
diff changeset
882 (num_elementary_packetsPES>50)) && skipped>4000000){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
883 mp_msg(MSGT_DEMUX,MSGL_V,"sync_mpeg_ps: seems to be ES/PES stream...\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
884 demux->stream->eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
885 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
886 }
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
887 if(num_mp3audio_packets>100 && num_elementary_packets100<10){
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
888 mp_msg(MSGT_DEMUX,MSGL_V,"sync_mpeg_ps: seems to be MP3 stream...\n");
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
889 demux->stream->eof=1;
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
890 break;
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
891 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
892 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
893 } while(ret!=1);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
894 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"demux: %d bad bytes skipped\n",skipped);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
895 if(demux->stream->eof){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
896 mp_msg(MSGT_DEMUX,MSGL_V,"MPEG Stream reached EOF\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
897 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
898 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
899 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
900 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
901
28051
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 26927
diff changeset
902 void skip_audio_frame(sh_audio_t *sh_audio);
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7671
diff changeset
903
30570
98dc6ae7ede2 libmpdemux: Mark functions not used outside of their files as static.
diego
parents: 30088
diff changeset
904 static void demux_seek_mpg(demuxer_t *demuxer, float rel_seek_secs,
98dc6ae7ede2 libmpdemux: Mark functions not used outside of their files as static.
diego
parents: 30088
diff changeset
905 float audio_delay, int flags)
98dc6ae7ede2 libmpdemux: Mark functions not used outside of their files as static.
diego
parents: 30088
diff changeset
906 {
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
907 demux_stream_t *d_audio=demuxer->audio;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
908 demux_stream_t *d_video=demuxer->video;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
909 sh_audio_t *sh_audio=d_audio->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
910 sh_video_t *sh_video=d_video->sh;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
911 mpg_demuxer_t *mpg_d=(mpg_demuxer_t*)demuxer->priv;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
912 int precision = 1;
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
913 float oldpts = 0;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
914 off_t oldpos = demuxer->filepos;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
915 float newpts = 0;
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25838
diff changeset
916 off_t newpos = (flags & SEEK_ABSOLUTE) ? demuxer->movi_start : oldpos;
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
917
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
918 if(mpg_d)
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
919 oldpts = mpg_d->last_pts;
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25838
diff changeset
920 newpts = (flags & SEEK_ABSOLUTE) ? 0.0 : oldpts;
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
921 //================= seek in MPEG ==========================
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
922 //calculate the pts to seek to
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25838
diff changeset
923 if(flags & SEEK_FACTOR) {
22021
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
924 if (mpg_d && mpg_d->first_to_final_pts_len > 0.0)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
925 newpts += mpg_d->first_to_final_pts_len * rel_seek_secs;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
926 else
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
927 newpts += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) * oldpts / oldpos;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
928 } else
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
929 newpts += rel_seek_secs;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
930 if (newpts < 0) newpts = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
931
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25838
diff changeset
932 if(flags&SEEK_FACTOR){
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
933 // float seek 0..1
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
934 newpos+=(demuxer->movi_end-demuxer->movi_start)*rel_seek_secs;
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
935 } else {
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
936 // time seek (secs)
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
937 if (mpg_d && mpg_d->has_valid_timestamps) {
22021
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
938 if (mpg_d->first_to_final_pts_len > 0.0)
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
939 newpos += rel_seek_secs * (demuxer->movi_end - demuxer->movi_start) / mpg_d->first_to_final_pts_len;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
940 else if (oldpts > 0.0)
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
941 newpos += rel_seek_secs * (oldpos - demuxer->movi_start) / oldpts;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
942 } else if(!sh_video || !sh_video->i_bps) // unspecified or VBR
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
943 newpos+=2324*75*rel_seek_secs; // 174.3 kbyte/sec
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
944 else
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
945 newpos+=sh_video->i_bps*rel_seek_secs;
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
946 }
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
947
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
948 while (1) {
4391
6394c1e9e770 DVD start position handling changed (progbar/eta fix)
arpi
parents: 3975
diff changeset
949 if(newpos<demuxer->movi_start){
6394c1e9e770 DVD start position handling changed (progbar/eta fix)
arpi
parents: 3975
diff changeset
950 if(demuxer->stream->type!=STREAMTYPE_VCD) demuxer->movi_start=0; // for VCD
6394c1e9e770 DVD start position handling changed (progbar/eta fix)
arpi
parents: 3975
diff changeset
951 if(newpos<demuxer->movi_start) newpos=demuxer->movi_start;
6394c1e9e770 DVD start position handling changed (progbar/eta fix)
arpi
parents: 3975
diff changeset
952 }
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1597
diff changeset
953
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
954 stream_seek(demuxer->stream,newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
955
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
956 // re-sync video:
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
957 videobuf_code_len=0; // reset ES stream buffer
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
958
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
959 ds_fill_buffer(d_video);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
960 if(sh_audio){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
961 ds_fill_buffer(d_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
962 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
963
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
964 while(1){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
965 int i;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
966 if(sh_audio && !d_audio->eof && d_video->pts && d_audio->pts){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
967 float a_pts=d_audio->pts;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
968 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
969 if(d_video->pts>a_pts){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
970 skip_audio_frame(sh_audio); // sync audio
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
971 continue;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
972 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
973 }
17821
6be72b753b82 check sh_video before seeking; closes cid 56
nicodvb
parents: 17819
diff changeset
974 if(!sh_video) break;
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
975 i=sync_video_packet(d_video);
22155
bea181ba1df4 when seeking and the codec is VC1 sync to sequence or entry point headers
nicodvb
parents: 22094
diff changeset
976 if(sh_video->format == mmioFOURCC('W', 'V', 'C', '1')) {
bea181ba1df4 when seeking and the codec is VC1 sync to sequence or entry point headers
nicodvb
parents: 22094
diff changeset
977 if(i==0x10E || i==0x10F) //entry point or sequence header
bea181ba1df4 when seeking and the codec is VC1 sync to sequence or entry point headers
nicodvb
parents: 22094
diff changeset
978 break;
bea181ba1df4 when seeking and the codec is VC1 sync to sequence or entry point headers
nicodvb
parents: 22094
diff changeset
979 } else
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
980 if(sh_video->format == 0x10000004) { //mpeg4
14923
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
981 if(i==0x1B6) { //vop (frame) startcode
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
982 int pos = videobuf_len;
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
983 if(!read_video_packet(d_video)) break; // EOF
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
984 if((videobuffer[pos+4] & 0x3F) == 0) break; //I-frame
658fc109eefc added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents: 14502
diff changeset
985 }
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
986 } else if(sh_video->format == 0x10000005){ //h264
17289
0c031c0ba80b h264es: don't seek to non-keyframes
lorenm
parents: 17286
diff changeset
987 if((i & ~0x60) == 0x105) break;
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
988 } else { //default mpeg1/2
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
989 if(i==0x1B3 || i==0x1B8) break; // found it!
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
990 }
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
991 if(!i || !skip_video_packet(d_video)) break; // EOF?
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
992 }
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
993 if(!mpg_d)
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
994 break;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
995 if (!precision || abs(newpts - mpg_d->last_pts) < 0.5 || (mpg_d->last_pts == oldpts)) break;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
996 if ((newpos - oldpos) * (mpg_d->last_pts - oldpts) < 0) { // invalid timestamps
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
997 mpg_d->has_valid_timestamps = 0;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
998 break;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
999 }
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1000 precision--;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1001 //prepare another seek because we are off by more than 0.5s
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
1002 if(mpg_d) {
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1003 newpos += (newpts - mpg_d->last_pts) * (newpos - oldpos) / (mpg_d->last_pts - oldpts);
26927
ff446aa58931 use demux_flush() where appropriate
nicodvb
parents: 25883
diff changeset
1004 demux_flush(demuxer);
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1005 demuxer->stream->eof=0; // clear eof flag
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1006 d_video->eof=0;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1007 d_audio->eof=0;
14426
3faa873334d7 fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents: 13738
diff changeset
1008 }
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1009 }
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
1010 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
1011
30570
98dc6ae7ede2 libmpdemux: Mark functions not used outside of their files as static.
diego
parents: 30088
diff changeset
1012 static int demux_mpg_control(demuxer_t *demuxer, int cmd, void *arg)
98dc6ae7ede2 libmpdemux: Mark functions not used outside of their files as static.
diego
parents: 30088
diff changeset
1013 {
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1014 mpg_demuxer_t *mpg_d=(mpg_demuxer_t*)demuxer->priv;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1015
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1016 switch(cmd) {
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1017 case DEMUXER_CTRL_GET_TIME_LENGTH:
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 23723
diff changeset
1018 if(stream_control(demuxer->stream, STREAM_CTRL_GET_TIME_LENGTH, arg) != STREAM_UNSUPPORTED) {
20851
6602a90a06ec consistency fix: STREAM_CTRL_GET_TIME_LENGTH and STREAM_CTRL_GET_CURRENT_TIME now return time in (double) seconds
nicodvb
parents: 20005
diff changeset
1019 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"\r\nDEMUX_MPG_CTRL, (%.3lf)\r\n", *((double*)arg));
17699
b742a2c71c25 try to get duration from the stream layer, if an implementation of STREAM_CTRL_GET_TIME_LENGTH is available
nicodvb
parents: 17636
diff changeset
1020 return DEMUXER_CTRL_GUESS;
b742a2c71c25 try to get duration from the stream layer, if an implementation of STREAM_CTRL_GET_TIME_LENGTH is available
nicodvb
parents: 17636
diff changeset
1021 }
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1022 if (mpg_d && mpg_d->has_valid_timestamps) {
22021
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
1023 *((double *)arg)=(double)mpg_d->first_to_final_pts_len;
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
1024 return DEMUXER_CTRL_OK;
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1025 }
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1026 return DEMUXER_CTRL_DONTKNOW;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1027
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1028 case DEMUXER_CTRL_GET_PERCENT_POS:
22021
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
1029 if (mpg_d && mpg_d->has_valid_timestamps && mpg_d->first_to_final_pts_len > 0.0) {
71d78117fbf0 set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents: 21979
diff changeset
1030 *((int *)arg)=(int)(100 * (mpg_d->last_pts-mpg_d->first_pts) / mpg_d->first_to_final_pts_len);
13738
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1031 return DEMUXER_CTRL_OK;
39004f891def seeking based on the largest timestamp in an mpeg stream
aurel
parents: 13649
diff changeset
1032 }
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14426
diff changeset
1033 return DEMUXER_CTRL_DONTKNOW;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1034
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1035 case DEMUXER_CTRL_SWITCH_AUDIO:
17822
24fc4279bf99 fail immediately if any of the parameters necessary to switch audio stream isn't set/correct; closes cid 55
nicodvb
parents: 17821
diff changeset
1036 if(! (mpg_d && mpg_d->num_a_streams > 1 && demuxer->audio && demuxer->audio->sh))
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1037 return DEMUXER_CTRL_NOTIMPL;
17822
24fc4279bf99 fail immediately if any of the parameters necessary to switch audio stream isn't set/correct; closes cid 55
nicodvb
parents: 17821
diff changeset
1038 else {
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1039 demux_stream_t *d_audio = demuxer->audio;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1040 sh_audio_t *sh_audio = d_audio->sh;
17819
7d5716fd634c init sh_a (new audio stream) to sh_audio (current audio stream); closes cid 241
nicodvb
parents: 17779
diff changeset
1041 sh_audio_t *sh_a = sh_audio;
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1042 int i;
17822
24fc4279bf99 fail immediately if any of the parameters necessary to switch audio stream isn't set/correct; closes cid 55
nicodvb
parents: 17821
diff changeset
1043 if(!sh_audio)
24fc4279bf99 fail immediately if any of the parameters necessary to switch audio stream isn't set/correct; closes cid 55
nicodvb
parents: 17821
diff changeset
1044 return DEMUXER_CTRL_NOTIMPL;
15285
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1045 if (*((int*)arg) < 0)
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1046 {
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1047 for (i = 0; i < mpg_d->num_a_streams; i++) {
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1048 if (d_audio->id == mpg_d->a_stream_ids[i]) break;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1049 }
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1050 i = (i+1) % mpg_d->num_a_streams;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1051 sh_a = (sh_audio_t*)demuxer->a_streams[mpg_d->a_stream_ids[i]];
15285
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1052 }
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1053 else {
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1054 for (i = 0; i < mpg_d->num_a_streams; i++)
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1055 if (*((int*)arg) == mpg_d->a_stream_ids[i]) break;
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1056 if (i < mpg_d->num_a_streams)
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1057 sh_a = (sh_audio_t*)demuxer->a_streams[*((int*)arg)];
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1058 }
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1059 if (i < mpg_d->num_a_streams && d_audio->id != mpg_d->a_stream_ids[i]) {
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1060 d_audio->id = mpg_d->a_stream_ids[i];
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1061 d_audio->sh = sh_a;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1062 ds_free_packs(d_audio);
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1063 }
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1064 }
15285
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1065 *((int*)arg) = demuxer->audio->id;
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1066 return DEMUXER_CTRL_OK;
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14923
diff changeset
1067
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1068 default:
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1069 return DEMUXER_CTRL_NOTIMPL;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1070 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1071 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1072
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1073
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1074 static int demux_mpg_pes_probe(demuxer_t *demuxer) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1075 demuxer->synced = 3;
16314
6720cdd99559 Fix mpeg-pes playback
rtognimp
parents: 16310
diff changeset
1076 return (demux_mpg_probe(demuxer) == DEMUXER_TYPE_MPEG_PS) ? DEMUXER_TYPE_MPEG_PES : 0;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1077 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1078
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1079
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1080 static demuxer_t* demux_mpg_es_open(demuxer_t* demuxer)
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1081 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1082 sh_video_t *sh_video=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1083
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1084 demuxer->audio->sh = NULL; // ES streams has no audio channel
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1085 demuxer->video->sh = new_sh_video(demuxer,0); // create dummy video stream header, id=0
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1086 sh_video=demuxer->video->sh;sh_video->ds=demuxer->video;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1087
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1088 return demuxer;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1089 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1090
16310
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1091 static demuxer_t *demux_mpg_gxf_open(demuxer_t *demuxer) {
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1092 demuxer->audio->sh = NULL;
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1093 demuxer->video->sh = new_sh_video(demuxer,0);
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1094 ((sh_video_t *)demuxer->video->sh)->ds = demuxer->video;
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1095 demuxer->priv = (void *) 0xffffffff;
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1096 return demuxer;
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1097 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1098
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1099 static demuxer_t* demux_mpg_ps_open(demuxer_t* demuxer)
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1100 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1101 sh_audio_t *sh_audio=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1102 sh_video_t *sh_video=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1103
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1104 sh_video=demuxer->video->sh;sh_video->ds=demuxer->video;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1105
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1106 if(demuxer->audio->id!=-2) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1107 if(!ds_fill_buffer(demuxer->audio)){
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1108 mp_msg(MSGT_DEMUXER,MSGL_INFO,"MPEG: " MSGTR_MissingAudioStream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1109 demuxer->audio->sh=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1110 } else {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1111 sh_audio=demuxer->audio->sh;sh_audio->ds=demuxer->audio;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1112 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1113 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1114
22037
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1115 if(!sh_video->format && ps_probe > 0) {
22088
8c4ae9883d53 removed unused variables
nicodvb
parents: 22041
diff changeset
1116 int head;
22037
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1117 off_t pos = stream_tell(demuxer->stream);
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1118
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1119 clear_stats();
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1120 do {
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1121 head=sync_video_packet(demuxer->video);
22041
f0172904ff02 sanity checks during codec detection; also reset demuxer->stream->eof
nicodvb
parents: 22037
diff changeset
1122 if(!head) break;
22037
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1123 update_stats(head);
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1124 skip_video_packet(demuxer->video);
22041
f0172904ff02 sanity checks during codec detection; also reset demuxer->stream->eof
nicodvb
parents: 22037
diff changeset
1125 } while(stream_tell(demuxer->stream) < pos + ps_probe && !demuxer->stream->eof);
22037
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1126
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1127 ds_free_packs(demuxer->video);
22041
f0172904ff02 sanity checks during codec detection; also reset demuxer->stream->eof
nicodvb
parents: 22037
diff changeset
1128 demuxer->stream->eof=0;
22037
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1129 stream_seek(demuxer->stream, pos);
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1130 mp_msg(MSGT_DEMUX,MSGL_INFO,"MPEG packet stats: p100: %d p101: %d p1B6: %d p12x: %d sli: %d a: %d b: %d c: %d idr: %d sps: %d pps: %d\n",
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1131 num_elementary_packets100, num_elementary_packets101,
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1132 num_elementary_packets1B6, num_elementary_packets12x,
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1133 num_h264_slice, num_h264_dpa, num_h264_dpb, num_h264_dpc,
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1134 num_h264_idr, num_h264_sps, num_h264_pps);
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1135
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1136 if(num_elementary_packets1B6>3 && num_elementary_packets12x>=1 &&
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1137 num_elementary_packets100<=num_elementary_packets12x)
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1138 sh_video->format = 0x10000004;
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1139 else if((num_h264_slice>3 || (num_h264_dpa>3 && num_h264_dpb>3 && num_h264_dpc>3)) &&
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1140 num_h264_sps>=1 && num_h264_pps>=1 && num_h264_idr>=1 &&
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1141 num_elementary_packets1B6==0)
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1142 sh_video->format = 0x10000005;
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1143 else sh_video->format = 0x10000002;
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1144 }
489b443a8ecf added code to scan the video stream to search the actual video codec used;
nicodvb
parents: 22036
diff changeset
1145
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1146 return demuxer;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1147 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1148
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1149
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 24946
diff changeset
1150 const demuxer_desc_t demuxer_desc_mpeg_ps = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1151 "MPEG PS demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1152 "mpegps",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1153 "MPEG-PS",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1154 "Arpi?",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1155 "Mpeg",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1156 DEMUXER_TYPE_MPEG_PS,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1157 0, // unsafe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1158 demux_mpg_probe,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1159 demux_mpg_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1160 demux_mpg_ps_open,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1161 demux_close_mpg,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1162 demux_seek_mpg,
16771
82a56c89b54d 10l, demux_mpg_control was missing from demuxer info struct, causing audio
reimar
parents: 16369
diff changeset
1163 demux_mpg_control,
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1164 };
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1165
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1166
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 24946
diff changeset
1167 const demuxer_desc_t demuxer_desc_mpeg_pes = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1168 "MPEG PES demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1169 "mpegpes",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1170 "MPEG-PES",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1171 "Arpi?",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1172 "Mpeg",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1173 DEMUXER_TYPE_MPEG_PES,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1174 0, // unsafe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1175 demux_mpg_pes_probe,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1176 demux_mpg_fill_buffer,
16314
6720cdd99559 Fix mpeg-pes playback
rtognimp
parents: 16310
diff changeset
1177 demux_mpg_ps_open,
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1178 demux_close_mpg,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1179 demux_seek_mpg,
16771
82a56c89b54d 10l, demux_mpg_control was missing from demuxer info struct, causing audio
reimar
parents: 16369
diff changeset
1180 demux_mpg_control,
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1181 };
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1182
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1183
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 24946
diff changeset
1184 const demuxer_desc_t demuxer_desc_mpeg_gxf = {
16310
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1185 "MPEG ES in GXF demuxer",
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1186 "mpeggxf",
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1187 "MPEG-ES in GXF",
22507
a46ab26b2d5e Source files should not contain non-ASCII characters.
diego
parents: 22363
diff changeset
1188 "Reimar Doeffinger",
16310
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1189 "Mpeg",
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1190 DEMUXER_TYPE_MPEG_GXF,
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1191 0, // hack autodetection
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1192 NULL,
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1193 demux_mpg_gxf_fill_buffer,
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1194 demux_mpg_gxf_open,
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1195 NULL,
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1196 NULL,
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1197 NULL
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1198 };
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16175
diff changeset
1199
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 24946
diff changeset
1200 const demuxer_desc_t demuxer_desc_mpeg_es = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1201 "MPEG ES demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1202 "mpeges",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1203 "MPEG-ES",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1204 "Arpi?",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1205 "Mpeg",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1206 DEMUXER_TYPE_MPEG_ES,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1207 0, // hack autodetection
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1208 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1209 demux_mpg_es_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1210 demux_mpg_es_open,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1211 demux_close_mpg,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1212 demux_seek_mpg,
16771
82a56c89b54d 10l, demux_mpg_control was missing from demuxer info struct, causing audio
reimar
parents: 16369
diff changeset
1213 demux_mpg_control,
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1214 };
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1215
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1216
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 24946
diff changeset
1217 const demuxer_desc_t demuxer_desc_mpeg4_es = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1218 "MPEG4 ES demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1219 "mpeg4es",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1220 "MPEG-ES",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1221 "Arpi?",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1222 "Mpeg",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1223 DEMUXER_TYPE_MPEG4_ES,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1224 0, // hack autodetection
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1225 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1226 demux_mpg_es_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1227 demux_mpg_es_open,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1228 demux_close_mpg,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1229 demux_seek_mpg,
16771
82a56c89b54d 10l, demux_mpg_control was missing from demuxer info struct, causing audio
reimar
parents: 16369
diff changeset
1230 demux_mpg_control,
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1231 };
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1232
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1233
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 24946
diff changeset
1234 const demuxer_desc_t demuxer_desc_h264_es = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1235 "H.264 ES demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1236 "h264es",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1237 "H264-ES",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1238 "Arpi?",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1239 "Mpeg",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1240 DEMUXER_TYPE_H264_ES,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1241 0, // hack autodetection
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1242 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1243 demux_mpg_es_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1244 demux_mpg_es_open,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1245 demux_close_mpg,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1246 demux_seek_mpg,
16771
82a56c89b54d 10l, demux_mpg_control was missing from demuxer info struct, causing audio
reimar
parents: 16369
diff changeset
1247 demux_mpg_control,
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15815
diff changeset
1248 };