Mercurial > mplayer.hg
annotate libmpdemux/demux_mpg.c @ 37088:3a9a804e488b
mixer: do not unmute to volume 0, instead unmute to max.
It's not very useful for unmute to still result in volume 0.
Plus it makes it easier to enable sound for devices that were
on mute at startup.
author | reimar |
---|---|
date | Tue, 06 May 2014 19:02:02 +0000 |
parents | 180fb662db7a |
children |
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 | 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 | 24 #include <unistd.h> |
22036 | 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 | 27 #include "config.h" |
28 #include "mp_msg.h" | |
32060
c3b7fc7eb796
Move audio_lang / dvdsub_lang extern variable declarations to mpcommon.h.
diego
parents:
31610
diff
changeset
|
29 #include "mpcommon.h" |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1735
diff
changeset
|
30 #include "help_mp.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
31 |
32345
e9556f0abee8
Replace forward declarations of skip_audio_frame() by proper #include.
diego
parents:
32060
diff
changeset
|
32 #include "libmpcodecs/dec_audio.h" |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22507
diff
changeset
|
33 #include "stream/stream.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
34 #include "demuxer.h" |
1466 | 35 #include "parse_es.h" |
2338 | 36 #include "stheader.h" |
4711 | 37 #include "mp3_hdr.h" |
31414
5e0a4702be52
Add header file for externally used variable ps_probe.
diego
parents:
30578
diff
changeset
|
38 #include "demux_mpg.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
39 |
524
9105fc95636c
A fast'n'ugly hack to correct DVD VOB playback problems
lgb
parents:
501
diff
changeset
|
40 //#define MAX_PS_PACKETSIZE 2048 |
501 | 41 #define MAX_PS_PACKETSIZE (224*1024) |
42 | |
14923
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
43 #define UNKNOWN 0 |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
44 #define VIDEO_MPEG1 0x10000001 |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
45 #define VIDEO_MPEG2 0x10000002 |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
46 #define VIDEO_MPEG4 0x10000004 |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
47 #define VIDEO_H264 0x10000005 |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
48 #define AUDIO_MP2 0x50 |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
49 #define AUDIO_A52 0x2000 |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
50 #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
|
51 #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
|
52 |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
53 typedef struct mpg_demuxer { |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
54 float last_pts; |
22021
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
55 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
|
56 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
|
57 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
|
58 // (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
|
59 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
|
60 int num_a_streams; |
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
61 int a_stream_ids[MAX_A_STREAMS]; |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
62 } mpg_demuxer_t; |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
63 |
547 | 64 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
|
65 off_t ps_probe = 0; |
547 | 66 |
14923
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
67 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
|
68 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
|
69 unsigned int plen, prog_len, es_map_len; |
36742 | 70 mpg_demuxer_t *priv = demux->priv; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
71 |
14923
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
72 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
|
73 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
|
74 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
75 |
14923
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
76 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
|
77 if(! (c & 0x80)) { |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
78 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
|
79 return 0; |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
80 } |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
81 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
|
82 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
|
83 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
|
84 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
|
85 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
|
86 while(es_map_len > 0) { |
36446 | 87 if (demux->stream->eof) |
88 return 0; | |
14923
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
89 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
|
90 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
|
91 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
|
92 int idoffset = id - 0xB0; |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
93 switch(type) { |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
94 case 0x1: |
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_MPEG1; |
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 0x2: |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
98 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
|
99 break; |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
100 case 0x3: |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
101 case 0x4: |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
102 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
|
103 break; |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
104 case 0x0f: |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
105 case 0x11: |
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] = AUDIO_AAC; |
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 0x10: |
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_MPEG4; |
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 0x1b: |
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] = VIDEO_H264; |
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 case 0x81: |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
115 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
|
116 break; |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
117 } |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
118 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
|
119 } |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
120 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
|
121 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
|
122 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
|
123 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
|
124 } |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
125 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
|
126 return 1; |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
127 } |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
128 |
18072
284751bccd04
make sure the check for valid timestamps does not accidentially search through
reimar
parents:
17822
diff
changeset
|
129 // 500000 is a wild guess |
284751bccd04
make sure the check for valid timestamps does not accidentially search through
reimar
parents:
17822
diff
changeset
|
130 #define TIMESTAMP_PROBE_LEN 500000 |
284751bccd04
make sure the check for valid timestamps does not accidentially search through
reimar
parents:
17822
diff
changeset
|
131 |
22021
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
132 //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
|
133 //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
|
134 //1.0 is a wild guess |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
135 #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
|
136 |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
137 //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
|
138 //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
|
139 //Packs are freed. |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
140 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
|
141 { |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
142 stream_t *s = demuxer->stream; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
143 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
|
144 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
|
145 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
|
146 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
|
147 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
|
148 int found = 0; |
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 if(!mpg_d || stream_pos < 0) |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
151 return pts; |
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 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
|
154 stream_seek(s, stream_pos); |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
155 |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
156 //We look for pts. |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
157 //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
|
158 //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
|
159 //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
|
160 |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
161 while(found<3 && !s->eof |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
162 && (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
|
163 && (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
|
164 && (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
|
165 && ds_fill_buffer(demuxer->video)) |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
166 { |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
167 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
|
168 { |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
169 if(!found) |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
170 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
|
171 else |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
172 { |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
173 found_pts3 = found_pts2; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
174 found_pts2 = found_pts1; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
175 found_pts1 = mpg_d->last_pts; |
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 found++; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
178 } |
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 |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
181 if(found == 3) pts = found_pts3; |
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 //clean up from searching of first pts; |
26927 | 184 demux_flush(demuxer); |
22021
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
185 |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
186 return pts; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
187 } |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
188 |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
189 /// Open an mpg physical stream |
16175 | 190 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
|
191 stream_t *s = demuxer->stream; |
36740
d29468059da8
Make sure that demuxer priv is allocated early enough.
reimar
parents:
36739
diff
changeset
|
192 mpg_demuxer_t* mpg_d = calloc(1,sizeof(*mpg_d)); |
d29468059da8
Make sure that demuxer priv is allocated early enough.
reimar
parents:
36739
diff
changeset
|
193 if (!mpg_d) |
d29468059da8
Make sure that demuxer priv is allocated early enough.
reimar
parents:
36739
diff
changeset
|
194 return NULL; |
d29468059da8
Make sure that demuxer priv is allocated early enough.
reimar
parents:
36739
diff
changeset
|
195 demuxer->priv = mpg_d; |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
196 |
36447
740a60d26cc0
Only detect a file as MPEG-PS if we can find at least 2 packets.
reimar
parents:
36446
diff
changeset
|
197 while (demuxer->video->packs + demuxer->audio->packs < 2) |
36749 | 198 if (!demux_fill_buffer(demuxer, demuxer->video)) return 0; |
22021
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
199 mpg_d->last_pts = -1.0; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
200 mpg_d->first_pts = -1.0; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
201 |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
202 //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
|
203 if(demuxer->seekable |
22363
03ba33feaae9
test the continuity of timestamps for STREAMTYPE_VCD, too; patch by Zuxy Meng
nicodvb
parents:
22352
diff
changeset
|
204 && (demuxer->stream->type == STREAMTYPE_FILE |
03ba33feaae9
test the continuity of timestamps for STREAMTYPE_VCD, too; patch by Zuxy Meng
nicodvb
parents:
22352
diff
changeset
|
205 || demuxer->stream->type == STREAMTYPE_VCD) |
22021
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
206 && demuxer->movi_start != demuxer-> movi_end |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
207 ) |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
208 { |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
209 //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
|
210 //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
|
211 //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
|
212 //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
|
213 //of the stream |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
214 |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
215 //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
|
216 off_t pos = stream_tell(s); |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
217 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
|
218 if(first_pts != -1.0) |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
219 { |
22351
1f40a27bd2ad
100000l: average != semidistance, fixed seeking to the middle position; patch by Zuxy meng (zuxy.megn gmail com)
nicodvb
parents:
22170
diff
changeset
|
220 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
|
221 if(middle_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 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
|
224 if(final_pts != -1.0) |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
225 { |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
226 // 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
|
227 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
|
228 // 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
|
229 if((0.5 < proportion) && (proportion < 2)) |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
230 { |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
231 mpg_d->first_pts = first_pts; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
232 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
|
233 mpg_d->has_valid_timestamps = 1; |
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 } |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
237 } |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
238 |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
239 //Cleaning up from seeking in stream |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
240 demuxer->stream->eof=0; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
241 demuxer->video->eof=0; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
242 demuxer->audio->eof=0; |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
243 |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
244 stream_seek(s,pos); |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
245 ds_fill_buffer(demuxer->video); |
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
246 } // if ( demuxer->seekable ) |
16175 | 247 return demuxer; |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
248 } |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
249 |
16175 | 250 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
|
251 mpg_demuxer_t* mpg_d = demuxer->priv; |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32352
diff
changeset
|
252 free(mpg_d); |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
253 } |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
254 |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
255 |
18077
cede662f40a5
timestamps are 33 bits long, so they don't fit in an unsigned int; 10l
nicodvb
parents:
18072
diff
changeset
|
256 static unsigned long long read_mpeg_timestamp(stream_t *s,int c){ |
18381 | 257 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
|
258 unsigned long long pts; |
1 | 259 d=stream_read_word(s); |
260 e=stream_read_word(s); | |
547 | 261 if( ((c&1)!=1) || ((d&1)!=1) || ((e&1)!=1) ){ |
262 ++mpeg_pts_error; | |
263 return 0; // invalid pts | |
264 } | |
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
|
265 pts=(((uint64_t)((c>>1)&7))<<30)|((d>>1)<<15)|(e>>1); |
33841
25667edae85c
cleanup: adjust printf format strings to match parameter types
diego
parents:
33827
diff
changeset
|
266 mp_dbg(MSGT_DEMUX,MSGL_DBG3," pts {%llu}",pts); |
1 | 267 return pts; |
268 } | |
269 | |
15046
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
270 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
|
271 if(!demux->a_streams[aid]){ |
36742 | 272 mpg_demuxer_t *mpg_d=demux->priv; |
15046
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
273 sh_audio_t* sh_a; |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
31414
diff
changeset
|
274 new_sh_audio(demux,aid, NULL); |
36742 | 275 sh_a = 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
|
276 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
|
277 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
|
278 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
|
279 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
|
280 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
|
281 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
|
282 } |
21927
ee422890bca9
in evo files [e]ac3 substreams range from 0xc0 to 0xcf
nicodvb
parents:
21919
diff
changeset
|
283 //evo files |
21934 | 284 if((aid & 0xC0) == 0xC0) sh_a->format=0x2000; |
22170 | 285 else if(aid >= 0x98 && aid <= 0x9f) sh_a->format=0x2001; |
36741 | 286 mpg_d->a_stream_ids[mpg_d->num_a_streams++] = aid; |
15046
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 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
|
289 } |
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
290 |
1 | 291 static int demux_mpg_read_packet(demuxer_t *demux,int id){ |
292 int d; | |
293 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
|
294 int set_pts=0; // !=0 iff pts has been set to a proper value |
1 | 295 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
|
296 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
|
297 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
|
298 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
|
299 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
|
300 double stream_pts = MP_NOPTS_VALUE; |
1 | 301 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
|
302 demux_packet_t* dp; |
36742 | 303 mpg_demuxer_t *priv = demux->priv; |
23723
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
304 |
1567 | 305 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"demux_read_packet: %X\n",id); |
1 | 306 |
536 | 307 // if(id==0x1F0){ |
308 // demux->synced=0; // force resync after 0x1F0 | |
309 // return -1; | |
310 //} | |
501 | 311 |
1 | 312 // 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
|
313 if((id<0x1BC || id>=0x1F0) && id != 0x1FD) return -1; |
1 | 314 if(id==0x1BE) return -1; // padding stream |
315 if(id==0x1BF) return -1; // private2 | |
316 | |
317 len=stream_read_word(demux->stream); | |
1567 | 318 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"PACKET len=%d",len); |
536 | 319 // if(len==62480){ demux->synced=0;return -1;} /* :) */ |
501 | 320 if(len==0 || len>MAX_PS_PACKETSIZE){ |
1567 | 321 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Invalid PS packet len: %d\n",len); |
501 | 322 return -2; // invalid packet !!!!!! |
323 } | |
1 | 324 |
547 | 325 mpeg_pts_error=0; |
326 | |
14923
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
327 if(id==0x1BC) { |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
328 parse_psm(demux, len); |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
329 return 0; |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
330 } |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
331 |
1 | 332 while(len>0){ // Skip stuFFing bytes |
23710
df28abb8fe74
cosmetics: split separate instructions in separate lines
nicodvb
parents:
23709
diff
changeset
|
333 c=stream_read_char(demux->stream); |
df28abb8fe74
cosmetics: split separate instructions in separate lines
nicodvb
parents:
23709
diff
changeset
|
334 --len; |
1 | 335 if(c!=0xFF)break; |
336 } | |
337 if((c>>6)==1){ // Read (skip) STD scale & size value | |
338 // printf(" STD_scale=%d",(c>>5)&1); | |
339 d=((c&0x1F)<<8)|stream_read_char(demux->stream); | |
340 len-=2; | |
341 // printf(" STD_size=%d",d); | |
342 c=stream_read_char(demux->stream); | |
343 } | |
344 // Read System-1 stream timestamps: | |
345 if((c>>4)==2){ | |
346 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
|
347 set_pts=1; |
1 | 348 len-=4; |
349 } else | |
350 if((c>>4)==3){ | |
351 pts=read_mpeg_timestamp(demux->stream,c); | |
352 c=stream_read_char(demux->stream); | |
353 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
|
354 else set_pts = 1; |
1 | 355 dts=read_mpeg_timestamp(demux->stream,c); |
356 len-=4+1+4; | |
357 } else | |
358 if((c>>6)==2){ | |
359 int pts_flags; | |
360 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
|
361 int parse_ext2; |
1 | 362 // System-2 (.VOB) stream: |
23710
df28abb8fe74
cosmetics: split separate instructions in separate lines
nicodvb
parents:
23709
diff
changeset
|
363 c=stream_read_char(demux->stream); |
df28abb8fe74
cosmetics: split separate instructions in separate lines
nicodvb
parents:
23709
diff
changeset
|
364 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
|
365 parse_ext2 = (id == 0x1FD) && ((c & 0x3F) == 1); |
23710
df28abb8fe74
cosmetics: split separate instructions in separate lines
nicodvb
parents:
23709
diff
changeset
|
366 c=stream_read_char(demux->stream); |
df28abb8fe74
cosmetics: split separate instructions in separate lines
nicodvb
parents:
23709
diff
changeset
|
367 hdrlen=c; |
1 | 368 len-=2; |
1567 | 369 mp_dbg(MSGT_DEMUX,MSGL_DBG3," hdrlen=%d (len=%d)",hdrlen,len); |
370 if(hdrlen>len){ mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: invalid header length \n"); return -1;} | |
7671 | 371 if(pts_flags==2 && hdrlen>=5){ |
1 | 372 c=stream_read_char(demux->stream); |
373 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
|
374 set_pts=1; |
1 | 375 len-=5;hdrlen-=5; |
376 } else | |
7671 | 377 if(pts_flags==3 && hdrlen>=10){ |
1 | 378 c=stream_read_char(demux->stream); |
379 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
|
380 set_pts=1; |
1 | 381 c=stream_read_char(demux->stream); |
382 dts=read_mpeg_timestamp(demux->stream,c); | |
383 len-=10;hdrlen-=10; | |
384 } | |
385 len-=hdrlen; | |
23723
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
386 if(parse_ext2 && hdrlen>=3) { |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
387 c=stream_read_char(demux->stream); |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
388 hdrlen--; |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
389 |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
390 if((c & 0x0F) != 0x0F) { |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
391 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
|
392 return -1; |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
393 } |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
394 if(c & 0x80) { //pes_private_data_flag |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
395 if(hdrlen<16) { |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
396 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
|
397 return -1; |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
398 } |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
399 stream_skip(demux->stream, 16); |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
400 hdrlen-=16; |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
401 } |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
402 if(c & 0x40) { //pack_header_field_flag |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
403 int l = stream_read_char(demux->stream); |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
404 if(l < 0) //couldn't read from the stream? |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
405 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
|
406 hdrlen--; |
23723
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
407 if(l < 0 || hdrlen < l) { |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
408 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
|
409 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
|
410 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
|
411 } |
23723
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
412 stream_skip(demux->stream, l); |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
413 hdrlen-=l; |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
414 } |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
415 if(c & 0x20) { //program_packet_sequence_counter_flag |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
416 if(hdrlen < 2) { |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
417 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
|
418 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
|
419 } |
23723
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
420 stream_skip(demux->stream, 2); |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
421 hdrlen-=2; |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
422 } |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
423 if(c & 0x10) { |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
424 //STD |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
425 stream_skip(demux->stream, 2); |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
426 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
|
427 } |
23723
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
428 c=stream_read_char(demux->stream); //pes_extension2 flag |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
429 hdrlen--; |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
430 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
|
431 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
|
432 hdrlen--; |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
433 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
|
434 pes_ext2_subid=c; |
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
435 } |
23722
5c5a3b4c0eb7
unified the skip of header and stuffing bytes after the parsing of pes_extension[12] fields
nicodvb
parents:
23711
diff
changeset
|
436 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
|
437 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
|
438 |
21948
3b9115e57f24
demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents:
21934
diff
changeset
|
439 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
|
440 //==== 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
|
441 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
|
442 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
|
443 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
|
444 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
|
445 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
|
446 if(priv && ds->sh) { |
36742 | 447 sh_video_t *sh = ds->sh; |
21948
3b9115e57f24
demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents:
21934
diff
changeset
|
448 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
|
449 } |
3b9115e57f24
demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents:
21934
diff
changeset
|
450 } |
3b9115e57f24
demux vc1 (stream id 0x1Fd with 0x55 <= substream id <= 0x5F in the pes_extension_2 payload)
nicodvb
parents:
21934
diff
changeset
|
451 } |
1 | 452 //============== DVD Audio sub-stream ====================== |
453 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
|
454 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
|
455 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
|
456 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
|
457 |
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 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
|
459 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
|
460 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
|
461 /// 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
|
462 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
|
463 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
|
464 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
|
465 } |
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 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
|
467 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
|
468 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
|
469 } |
23723
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
470 |
552 | 471 // AID: |
472 // 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
|
473 // 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
|
474 // 0x88..0x8F and 0x98..0x9F DTS audio |
552 | 475 // 0xA0..0xBF PCM audio |
23723
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
476 |
552 | 477 if((aid & 0xE0) == 0x20){ |
478 // subtitle: | |
479 aid&=0x1F; | |
426 | 480 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
481 if(!demux->s_streams[aid]){ |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
31414
diff
changeset
|
482 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
|
483 if (sh) sh->type = 'v'; |
1567 | 484 mp_msg(MSGT_DEMUX,MSGL_V,"==> Found subtitle: %d\n",aid); |
552 | 485 } |
486 | |
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
|
487 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
|
488 demux->sub->id &= 0x1F; |
31610
9e2c61ae171f
Revert and accidentally committed hunk from last commit.
reimar
parents:
31609
diff
changeset
|
489 if(!dvdsub_lang && demux->sub->id == -1) |
9e2c61ae171f
Revert and accidentally committed hunk from last commit.
reimar
parents:
31609
diff
changeset
|
490 demux->sub->id = aid; |
552 | 491 if(demux->sub->id==aid){ |
492 ds=demux->sub; | |
493 } | |
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
|
494 } else if((aid >= 0x80 && aid <= 0x8F) || (aid >= 0x98 && aid <= 0xAF) || (aid >= 0xC0 && aid <= 0xCF)) { |
552 | 495 |
496 // aid=128+(aid&0x7F); | |
497 // aid=0x80..0xBF | |
15046
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
498 new_audio_stream(demux, aid); |
426 | 499 if(demux->audio->id==aid){ |
7671 | 500 int type; |
426 | 501 ds=demux->audio; |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
502 if(!ds->sh) ds->sh=demux->a_streams[aid]; |
1 | 503 // 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
|
504 if(!rawa52) { |
7671 | 505 c=stream_read_char(demux->stream);//num of frames |
506 type=stream_read_char(demux->stream);//startpos hi | |
507 type=(type<<8)|stream_read_char(demux->stream);//startpos lo | |
508 // printf("\r[%02X][%04X]",c,type); | |
1 | 509 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
|
510 } |
7671 | 511 if((aid&0xE0)==0xA0 && len>=3){ |
512 unsigned char* hdr; | |
513 // save audio header as codecdata! | |
514 if(!((sh_audio_t*)(ds->sh))->codecdata_len){ | |
515 ((sh_audio_t*)(ds->sh))->codecdata=malloc(3); | |
516 ((sh_audio_t*)(ds->sh))->codecdata_len=3; | |
517 } | |
518 hdr=((sh_audio_t*)(ds->sh))->codecdata; | |
519 // read LPCM header: | |
520 // emphasis[1], mute[1], rvd[1], frame number[5]: | |
521 hdr[0]=stream_read_char(demux->stream); | |
522 // printf(" [%01X:%02d]",c>>5,c&31); | |
523 // quantization[2],freq[2],rvd[1],channels[3] | |
524 hdr[1]=stream_read_char(demux->stream); | |
525 // printf("[%01X:%01X] ",c>>4,c&15); | |
526 // dynamic range control (0x80=off): | |
527 hdr[2]=stream_read_char(demux->stream); | |
528 // printf("[%02X] ",c); | |
529 len-=3; | |
530 if(len<=0) mp_msg(MSGT_DEMUX,MSGL_V,"End of packet while searching for PCM header\n"); | |
1 | 531 } |
7671 | 532 // printf(" \n"); |
552 | 533 } // if(demux->audio->id==aid) |
534 | |
1567 | 535 } else mp_msg(MSGT_DEMUX,MSGL_V,"Unknown 0x1BD substream: 0x%02X \n",aid); |
552 | 536 } //if(id==0x1BD) |
1 | 537 } else { |
539 | 538 if(c!=0x0f){ |
1567 | 539 mp_msg(MSGT_DEMUX,MSGL_V," {ERROR5,c=%d} \n",c); |
539 | 540 return -1; // invalid packet !!!!!! |
541 } | |
1 | 542 } |
1567 | 543 if(mpeg_pts_error) mp_msg(MSGT_DEMUX,MSGL_V," {PTS_err:%d} \n",mpeg_pts_error); |
544 mp_dbg(MSGT_DEMUX,MSGL_DBG3," => len=%d\n",len); | |
1 | 545 |
501 | 546 // if(len<=0 || len>MAX_PS_PACKETSIZE) return -1; // Invalid packet size |
547 if(len<=0 || len>MAX_PS_PACKETSIZE){ | |
1567 | 548 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Invalid PS data len: %d\n",len); |
501 | 549 return -1; // invalid packet !!!!!! |
550 } | |
23723
148b85340a65
100% cosmetics: reindentation and removal of trailing spaces
nicodvb
parents:
23722
diff
changeset
|
551 |
1 | 552 if(id>=0x1C0 && id<=0x1DF){ |
553 // mpeg audio | |
554 int aid=id-0x1C0; | |
15046
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
555 new_audio_stream(demux, aid); |
1 | 556 if(demux->audio->id==aid){ |
557 ds=demux->audio; | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
558 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
|
559 if(priv && ds->sh) { |
36742 | 560 sh_audio_t *sh = ds->sh; |
14923
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
561 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
|
562 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
|
563 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
|
564 } |
1 | 565 } |
566 } else | |
567 if(id>=0x1E0 && id<=0x1EF){ | |
568 // mpeg video | |
569 int aid=id-0x1E0; | |
1289 | 570 if(!demux->v_streams[aid]) new_sh_video(demux,aid); |
1 | 571 if(demux->video->id==-1) demux->video->id=aid; |
426 | 572 if(demux->video->id==aid){ |
573 ds=demux->video; | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
574 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
|
575 if(priv && ds->sh) { |
36742 | 576 sh_video_t *sh = ds->sh; |
14923
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
577 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
|
578 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
|
579 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
|
580 } |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
581 } |
426 | 582 } |
1 | 583 } |
584 | |
585 if(ds){ | |
1567 | 586 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Read %d data bytes from packet %04X\n",len,id); |
1 | 587 // 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
|
588 |
36112fcf78d6
replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents:
21531
diff
changeset
|
589 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
|
590 if(!dp) { |
36112fcf78d6
replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents:
21531
diff
changeset
|
591 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
|
592 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
|
593 return 0; |
36112fcf78d6
replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents:
21531
diff
changeset
|
594 } |
36112fcf78d6
replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents:
21531
diff
changeset
|
595 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
|
596 if(l<len) |
36112fcf78d6
replace call to ds_read_packet() with the usual stream_read()+ds_add_packet() sequence;
nicodvb
parents:
21531
diff
changeset
|
597 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
|
598 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
|
599 if(set_pts) |
24946 | 600 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
|
601 dp->pos=demux->filepos; |
21789
b266f27109a6
set dp->stream_pts only when feeding the video stream to workaround
nicodvb
parents:
21781
diff
changeset
|
602 /* |
b266f27109a6
set dp->stream_pts only when feeding the video stream to workaround
nicodvb
parents:
21781
diff
changeset
|
603 workaround: |
b266f27109a6
set dp->stream_pts only when feeding the video stream to workaround
nicodvb
parents:
21781
diff
changeset
|
604 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
|
605 (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
|
606 back and forth |
b266f27109a6
set dp->stream_pts only when feeding the video stream to workaround
nicodvb
parents:
21781
diff
changeset
|
607 */ |
24257 | 608 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
|
609 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
|
610 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
|
611 if (demux->priv && set_pts) ((mpg_demuxer_t*)demux->priv)->last_pts = pts/90000.0f; |
554 | 612 // if(ds==demux->sub) parse_dvdsub(ds->last->buffer,ds->last->len); |
1 | 613 return 1; |
614 } | |
1567 | 615 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Skipping %d data bytes from packet %04X\n",len,id); |
536 | 616 if(len<=2356) stream_skip(demux->stream,len); |
1 | 617 return 0; |
618 } | |
619 | |
15670 | 620 static int num_elementary_packets100=0; |
621 static int num_elementary_packets101=0; | |
622 static int num_elementary_packets12x=0; | |
623 static int num_elementary_packets1B6=0; | |
624 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
|
625 static int num_mpeg12_startcode=0; |
15670 | 626 static int num_h264_slice=0; //combined slice |
627 static int num_h264_dpa=0; //DPA Slice | |
628 static int num_h264_dpb=0; //DPB Slice | |
629 static int num_h264_dpc=0; //DPC Slice | |
630 static int num_h264_idr=0; //IDR Slice | |
631 static int num_h264_sps=0; | |
632 static int num_h264_pps=0; | |
633 | |
634 static int num_mp3audio_packets=0; | |
635 | |
22886 | 636 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
|
637 { |
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_packets100=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_packets101=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_packets1B6=0; |
a3d208daed8c
moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents:
22021
diff
changeset
|
641 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
|
642 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
|
643 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
|
644 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
|
645 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
|
646 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
|
647 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
|
648 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
|
649 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
|
650 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
|
651 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
|
652 } |
a3d208daed8c
moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents:
22021
diff
changeset
|
653 |
a3d208daed8c
moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents:
22021
diff
changeset
|
654 //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
|
655 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
|
656 { |
a3d208daed8c
moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents:
22021
diff
changeset
|
657 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
|
658 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
|
659 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
|
660 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
|
661 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
|
662 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
|
663 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
|
664 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
|
665 { |
a3d208daed8c
moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents:
22021
diff
changeset
|
666 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
|
667 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
|
668 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
|
669 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
|
670 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
|
671 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
|
672 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
|
673 } |
a3d208daed8c
moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents:
22021
diff
changeset
|
674 } |
a3d208daed8c
moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents:
22021
diff
changeset
|
675 |
16175 | 676 static int demux_mpg_probe(demuxer_t *demuxer) { |
15670 | 677 int pes=1; |
678 int tmp; | |
679 off_t tmppos; | |
680 int file_format = DEMUXER_TYPE_UNKNOWN; | |
681 | |
682 tmppos=stream_tell(demuxer->stream); | |
683 tmp=stream_read_dword(demuxer->stream); | |
684 if(tmp==0x1E0 || tmp==0x1C0) { | |
685 tmp=stream_read_word(demuxer->stream); | |
686 if(tmp>1 && tmp<=2048) pes=0; // demuxer->synced=3; // PES... | |
687 } | |
688 stream_seek(demuxer->stream,tmppos); | |
689 | |
22034
a3d208daed8c
moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents:
22021
diff
changeset
|
690 clear_stats(); |
9824 | 691 |
15670 | 692 if(demux_mpg_open(demuxer)) |
693 file_format=DEMUXER_TYPE_MPEG_PS; | |
694 else { | |
695 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", | |
696 num_elementary_packets100,num_elementary_packets101, | |
697 num_elementary_packets1B6,num_elementary_packets12x, | |
698 num_h264_slice, num_h264_dpa, | |
699 num_h264_dpb, num_h264_dpc=0, | |
700 num_h264_idr, num_h264_sps=0, | |
701 num_h264_pps, | |
702 num_elementary_packetsPES,num_mp3audio_packets, demuxer->synced); | |
703 | |
704 //MPEG packet stats: p100: 458 p101: 458 PES: 0 MP3: 1103 (.m2v) | |
705 if(num_mp3audio_packets>50 && num_mp3audio_packets>2*num_elementary_packets100 | |
706 && abs(num_elementary_packets100-num_elementary_packets101)>2) | |
707 return file_format; | |
708 | |
709 // 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
|
710 if(num_mpeg12_startcode>=2 && num_elementary_packets100>=2 && num_elementary_packets101>=2 && |
15670 | 711 abs(num_elementary_packets101+8-num_elementary_packets100)<16) { |
712 if(num_elementary_packetsPES>=4 && num_elementary_packetsPES>=num_elementary_packets100-4) { | |
713 return file_format; | |
714 } | |
715 file_format=DEMUXER_TYPE_MPEG_ES; // <-- hack is here :) | |
716 } else | |
717 // fuzzy mpeg4-es detection. do NOT enable without heavy testing of mpeg formats detection! | |
718 if(num_elementary_packets1B6>3 && num_elementary_packets12x>=1 && | |
719 num_elementary_packetsPES==0 && num_elementary_packets100<=num_elementary_packets12x && | |
720 demuxer->synced<2) { | |
721 file_format=DEMUXER_TYPE_MPEG4_ES; | |
722 } else | |
723 // 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
|
724 if((num_h264_slice>3 || (num_h264_dpa>3 && num_h264_dpb>3 && num_h264_dpc>3)) && |
15670 | 725 /* FIXME num_h264_sps>=1 && */ num_h264_pps>=1 && num_h264_idr>=1 && |
726 num_elementary_packets1B6==0 && num_elementary_packetsPES==0 && | |
727 demuxer->synced<2) { | |
728 file_format=DEMUXER_TYPE_H264_ES; | |
729 } else | |
730 { | |
731 if(demuxer->synced==2) | |
732 mp_msg(MSGT_DEMUXER,MSGL_ERR,"MPEG: " MSGTR_MissingVideoStreamBug); | |
733 else | |
33827
277ec491a8a7
Do not translate console messages of verbosity level MSGL_V and above.
diego
parents:
32537
diff
changeset
|
734 mp_msg(MSGT_DEMUXER, MSGL_V, "Not MPEG System Stream format... (maybe Transport Stream?)\n"); |
15670 | 735 } |
736 } | |
22094
e2d1bb1d2c6b
demux_mpg_probe() seek to the initial position before returning - patch by reimar
nicodvb
parents:
22088
diff
changeset
|
737 //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
|
738 stream_seek(demuxer->stream,tmppos); |
15670 | 739 return file_format; |
740 } | |
1 | 741 |
16175 | 742 static int demux_mpg_es_fill_buffer(demuxer_t *demux, demux_stream_t *ds){ |
1 | 743 // Elementary video stream |
744 if(demux->stream->eof) return 0; | |
745 demux->filepos=stream_tell(demux->stream); | |
1735 | 746 ds_read_packet(demux->video,demux->stream,STREAM_BUFFER_SIZE,0,demux->filepos,0); |
1 | 747 return 1; |
748 } | |
749 | |
16369 | 750 /** |
751 * \brief discard until 0x100 header and return a filled buffer | |
752 * \param b buffer-end pointer | |
753 * \param pos current pos in stream, negative since b points to end of buffer | |
754 * \param s stream to read from | |
755 * \return new position, differs from original pos when eof hit and thus | |
756 * b was modified to point to the new end of buffer | |
757 */ | |
758 static int find_end(unsigned char **b, int pos, stream_t *s) { | |
759 register int state = 0xffffffff; | |
760 unsigned char *buf = *b; | |
761 int start = pos; | |
762 int read, unused; | |
763 // search already read part | |
764 while (state != 0x100 && pos) { | |
765 state = state << 8 | buf[pos++]; | |
766 } | |
767 // continue search in stream | |
768 while (state != 0x100) { | |
769 register int c = stream_read_char(s); | |
770 if (c < 0) break; | |
771 state = state << 8 | c; | |
772 } | |
773 // modify previous header (from 0x1bc or 0x1bf to 0x100) | |
774 buf[start++] = 0; | |
775 // copy remaining buffer part to current pos | |
776 memmove(&buf[start], &buf[pos], -pos); | |
777 unused = start + -pos; // -unused bytes in buffer | |
778 read = stream_read(s, &buf[unused], -unused); | |
779 unused += read; | |
780 // fix buffer so it ends at pos == 0 (eof case) | |
781 *b = &buf[unused]; | |
782 start -= unused; | |
783 return start; | |
784 } | |
785 | |
786 /** | |
787 * This format usually uses an insane bitrate, which makes this function | |
788 * performance-critical! | |
789 * Be sure to benchmark any changes with different compiler versions. | |
790 */ | |
16310
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
791 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
|
792 demux_packet_t *pack; |
16369 | 793 int len; |
16310
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
794 demux->filepos = stream_tell(demux->stream); |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
795 pack = new_demux_packet(STREAM_BUFFER_SIZE); |
16369 | 796 len = stream_read(demux->stream, pack->buffer, STREAM_BUFFER_SIZE); |
797 if (len <= 0) | |
17779 | 798 { |
799 free_demux_packet(pack); | |
16369 | 800 return 0; |
17779 | 801 } |
16369 | 802 { |
36762 | 803 register uint32_t state = (uintptr_t)demux->priv; |
16369 | 804 register int pos = -len; |
805 unsigned char *buf = &pack->buffer[len]; | |
806 do { | |
807 state = state << 8 | buf[pos]; | |
808 if (unlikely((state | 3) == 0x1bf)) | |
809 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
|
810 } while (++pos < 0); |
36762 | 811 demux->priv = (void *)(uintptr_t)state; |
16369 | 812 len = buf - pack->buffer; |
16310
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
813 } |
16369 | 814 if (len < STREAM_BUFFER_SIZE) |
815 resize_demux_packet(pack, len); | |
16310
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
816 ds_add_packet(ds, pack); |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
817 return 1; |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
818 } |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
819 |
30570
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
30088
diff
changeset
|
820 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
|
821 { |
1 | 822 unsigned int head=0; |
823 int skipped=0; | |
36854 | 824 int max_packs=2048; |
1 | 825 int ret=0; |
826 | |
827 // System stream | |
828 do{ | |
829 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
|
830 //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
|
831 //(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
|
832 demux->movi_end = demux->stream->end_pos; |
1 | 833 head=stream_read_dword(demux->stream); |
547 | 834 if((head&0xFFFFFF00)!=0x100){ |
835 // sync... | |
836 demux->filepos-=skipped; | |
837 while(1){ | |
536 | 838 int c=stream_read_char(demux->stream); |
839 if(c<0) break; //EOF | |
840 head<<=8; | |
841 if(head!=0x100){ | |
842 head|=c; | |
4711 | 843 if(mp_check_mp3_header(head)) ++num_mp3audio_packets; |
536 | 844 ++skipped; //++demux->filepos; |
845 continue; | |
846 } | |
847 head|=c; | |
848 break; | |
547 | 849 } |
850 demux->filepos+=skipped; | |
1 | 851 } |
852 if(stream_eof(demux->stream)) break; | |
853 // sure: head=0x000001XX | |
1567 | 854 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"*** head=0x%X\n",head); |
1 | 855 if(demux->synced==0){ |
3770 | 856 if(head==0x1BA) demux->synced=1; //else |
857 // if(head==0x1BD || (head>=0x1C0 && head<=0x1EF)) demux->synced=3; // PES? | |
1 | 858 } else |
859 if(demux->synced==1){ | |
929 | 860 if(head==0x1BB || head==0x1BD || (head>=0x1C0 && head<=0x1EF)){ |
1 | 861 demux->synced=2; |
17366 | 862 mp_msg(MSGT_DEMUX,MSGL_V,"system stream synced at 0x%"PRIX64" (%"PRId64")!\n",(int64_t)demux->filepos,(int64_t)demux->filepos); |
536 | 863 num_elementary_packets100=0; // requires for re-sync! |
864 num_elementary_packets101=0; // requires for re-sync! | |
1 | 865 } else demux->synced=0; |
866 } // else | |
3255
ee28577dad02
combined PS/PES sync to allow .VDR playback from stdin
arpi
parents:
2555
diff
changeset
|
867 if(demux->synced>=2){ |
1 | 868 ret=demux_mpg_read_packet(demux,head); |
869 if(!ret) | |
870 if(--max_packs==0){ | |
871 demux->stream->eof=1; | |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1735
diff
changeset
|
872 mp_msg(MSGT_DEMUX,MSGL_ERR,MSGTR_DoesntContainSelectedStream); |
1 | 873 return 0; |
874 } | |
36412 | 875 if(demux->synced == 3) { // PES detect |
876 update_stats(head); | |
877 if (ret < 0) demux->synced = 0; | |
878 else if (ret == 1 && num_elementary_packetsPES > 1 && !mpeg_pts_error) demux->synced = 2; | |
879 else ret = 0; | |
880 } | |
1 | 881 } else { |
22034
a3d208daed8c
moved scoreboarding code to 2 separate functions (update_stats() and clear_stats()) to be reused next
nicodvb
parents:
22021
diff
changeset
|
882 update_stats(head); |
22035 | 883 if(head>=0x100 && head<0x1B0) |
1567 | 884 mp_msg(MSGT_DEMUX,MSGL_DBG3,"Opps... elementary video packet found: %03X\n",head); |
22035 | 885 else if((head>=0x1C0 && head<0x1F0) || head==0x1BD) |
1567 | 886 mp_msg(MSGT_DEMUX,MSGL_DBG3,"Opps... PES packet found: %03X\n",head); |
21919 | 887 |
22035 | 888 if(((num_elementary_packets100>50 && num_elementary_packets101>50) || |
889 (num_elementary_packetsPES>50)) && skipped>4000000){ | |
1567 | 890 mp_msg(MSGT_DEMUX,MSGL_V,"sync_mpeg_ps: seems to be ES/PES stream...\n"); |
1 | 891 demux->stream->eof=1; |
892 break; | |
893 } | |
4711 | 894 if(num_mp3audio_packets>100 && num_elementary_packets100<10){ |
895 mp_msg(MSGT_DEMUX,MSGL_V,"sync_mpeg_ps: seems to be MP3 stream...\n"); | |
896 demux->stream->eof=1; | |
897 break; | |
898 } | |
1 | 899 } |
900 } while(ret!=1); | |
1567 | 901 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"demux: %d bad bytes skipped\n",skipped); |
1 | 902 if(demux->stream->eof){ |
1567 | 903 mp_msg(MSGT_DEMUX,MSGL_V,"MPEG Stream reached EOF\n"); |
1 | 904 return 0; |
905 } | |
906 return 1; | |
907 } | |
908 | |
30570
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
30088
diff
changeset
|
909 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
|
910 float audio_delay, int flags) |
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
30088
diff
changeset
|
911 { |
1466 | 912 demux_stream_t *d_audio=demuxer->audio; |
913 demux_stream_t *d_video=demuxer->video; | |
914 sh_audio_t *sh_audio=d_audio->sh; | |
915 sh_video_t *sh_video=d_video->sh; | |
36742 | 916 mpg_demuxer_t *mpg_d=demuxer->priv; |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
917 int precision = 1; |
14426
3faa873334d7
fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents:
13738
diff
changeset
|
918 float oldpts = 0; |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
919 off_t oldpos = demuxer->filepos; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
920 float newpts = 0; |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25838
diff
changeset
|
921 off_t newpos = (flags & SEEK_ABSOLUTE) ? demuxer->movi_start : oldpos; |
1466 | 922 |
14426
3faa873334d7
fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents:
13738
diff
changeset
|
923 if(mpg_d) |
3faa873334d7
fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents:
13738
diff
changeset
|
924 oldpts = mpg_d->last_pts; |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25838
diff
changeset
|
925 newpts = (flags & SEEK_ABSOLUTE) ? 0.0 : oldpts; |
1466 | 926 //================= seek in MPEG ========================== |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
927 //calculate the pts to seek to |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25838
diff
changeset
|
928 if(flags & SEEK_FACTOR) { |
22021
71d78117fbf0
set has_valid_timestamps and corresponding first and final pts only after
nicodvb
parents:
21979
diff
changeset
|
929 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
|
930 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
|
931 else |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
932 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
|
933 } else |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
934 newpts += rel_seek_secs; |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
935 if (newpts < 0) newpts = 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
936 |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25838
diff
changeset
|
937 if(flags&SEEK_FACTOR){ |
1628
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
938 // float seek 0..1 |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
939 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
|
940 } else { |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
941 // time seek (secs) |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
942 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
|
943 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
|
944 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
|
945 else if (oldpts > 0.0) |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
946 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
|
947 } 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
|
948 newpos+=2324*75*rel_seek_secs; // 174.3 kbyte/sec |
1466 | 949 else |
1628
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
950 newpos+=sh_video->i_bps*rel_seek_secs; |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
951 } |
1466 | 952 |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
953 while (1) { |
4391
6394c1e9e770
DVD start position handling changed (progbar/eta fix)
arpi
parents:
3975
diff
changeset
|
954 if(newpos<demuxer->movi_start){ |
6394c1e9e770
DVD start position handling changed (progbar/eta fix)
arpi
parents:
3975
diff
changeset
|
955 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
|
956 if(newpos<demuxer->movi_start) newpos=demuxer->movi_start; |
6394c1e9e770
DVD start position handling changed (progbar/eta fix)
arpi
parents:
3975
diff
changeset
|
957 } |
1628
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
958 |
1466 | 959 stream_seek(demuxer->stream,newpos); |
960 | |
961 // re-sync video: | |
962 videobuf_code_len=0; // reset ES stream buffer | |
963 | |
964 ds_fill_buffer(d_video); | |
965 if(sh_audio){ | |
966 ds_fill_buffer(d_audio); | |
967 } | |
968 | |
969 while(1){ | |
970 int i; | |
971 if(sh_audio && !d_audio->eof && d_video->pts && d_audio->pts){ | |
972 float a_pts=d_audio->pts; | |
973 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; | |
974 if(d_video->pts>a_pts){ | |
975 skip_audio_frame(sh_audio); // sync audio | |
976 continue; | |
977 } | |
978 } | |
17821 | 979 if(!sh_video) break; |
1466 | 980 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
|
981 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
|
982 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
|
983 break; |
bea181ba1df4
when seeking and the codec is VC1 sync to sequence or entry point headers
nicodvb
parents:
22094
diff
changeset
|
984 } else |
14426
3faa873334d7
fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents:
13738
diff
changeset
|
985 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
|
986 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
|
987 int pos = videobuf_len; |
658fc109eefc
added support for other codecs (mpeg4/h264/aac) in mpeg-ps parsing the PSM
nicodvb
parents:
14502
diff
changeset
|
988 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
|
989 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
|
990 } |
14426
3faa873334d7
fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents:
13738
diff
changeset
|
991 } else if(sh_video->format == 0x10000005){ //h264 |
17289 | 992 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
|
993 } else { //default mpeg1/2 |
3faa873334d7
fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents:
13738
diff
changeset
|
994 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
|
995 } |
1466 | 996 if(!i || !skip_video_packet(d_video)) break; // EOF? |
997 } | |
14426
3faa873334d7
fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents:
13738
diff
changeset
|
998 if(!mpg_d) |
3faa873334d7
fixed broken seeking in mpeg-es files; syncword seeking for all 3 video codecs
nicodvb
parents:
13738
diff
changeset
|
999 break; |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1000 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
|
1001 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
|
1002 mpg_d->has_valid_timestamps = 0; |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1003 break; |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1004 } |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1005 precision--; |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1006 //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
|
1007 if(mpg_d) { |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1008 newpos += (newpts - mpg_d->last_pts) * (newpos - oldpos) / (mpg_d->last_pts - oldpts); |
26927 | 1009 demux_flush(demuxer); |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1010 demuxer->stream->eof=0; // clear eof flag |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1011 d_video->eof=0; |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1012 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
|
1013 } |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1014 } |
1466 | 1015 } |
1016 | |
30570
98dc6ae7ede2
libmpdemux: Mark functions not used outside of their files as static.
diego
parents:
30088
diff
changeset
|
1017 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
|
1018 { |
36742 | 1019 mpg_demuxer_t *mpg_d=demuxer->priv; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1020 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1021 switch(cmd) { |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1022 case DEMUXER_CTRL_GET_TIME_LENGTH: |
24257 | 1023 if(stream_control(demuxer->stream, STREAM_CTRL_GET_TIME_LENGTH, arg) != STREAM_UNSUPPORTED) { |
32352
76f94c00a69f
1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents:
32345
diff
changeset
|
1024 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"\r\nDEMUX_MPG_CTRL, (%.3f)\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
|
1025 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
|
1026 } |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1027 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
|
1028 *((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
|
1029 return DEMUXER_CTRL_OK; |
13738
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1030 } |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1031 return DEMUXER_CTRL_DONTKNOW; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1032 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1033 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
|
1034 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
|
1035 *((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
|
1036 return DEMUXER_CTRL_OK; |
39004f891def
seeking based on the largest timestamp in an mpeg stream
aurel
parents:
13649
diff
changeset
|
1037 } |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14426
diff
changeset
|
1038 return DEMUXER_CTRL_DONTKNOW; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1039 |
15046
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
1040 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
|
1041 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
|
1042 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
|
1043 else { |
15046
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
1044 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
|
1045 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
|
1046 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
|
1047 int i; |
15285
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1048 if (*((int*)arg) < 0) |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1049 { |
15046
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
1050 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
|
1051 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
|
1052 } |
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
1053 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
|
1054 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
|
1055 } |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1056 else { |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1057 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
|
1058 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
|
1059 if (i < mpg_d->num_a_streams) |
36742 | 1060 sh_a = demuxer->a_streams[*((int*)arg)]; |
15285
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1061 } |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1062 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
|
1063 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
|
1064 d_audio->sh = sh_a; |
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
1065 ds_free_packs(d_audio); |
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
1066 } |
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
1067 } |
15285
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1068 *((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
|
1069 return DEMUXER_CTRL_OK; |
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14923
diff
changeset
|
1070 |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1071 default: |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1072 return DEMUXER_CTRL_NOTIMPL; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1073 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1074 } |
16175 | 1075 |
1076 | |
1077 static int demux_mpg_pes_probe(demuxer_t *demuxer) { | |
1078 demuxer->synced = 3; | |
36411 | 1079 return (demux_mpg_probe(demuxer) == DEMUXER_TYPE_MPEG_PS) ? DEMUXER_TYPE_MPEG_PES : DEMUXER_TYPE_UNKNOWN; |
16175 | 1080 } |
1081 | |
1082 | |
1083 static demuxer_t* demux_mpg_es_open(demuxer_t* demuxer) | |
1084 { | |
1085 demuxer->audio->sh = NULL; // ES streams has no audio channel | |
1086 demuxer->video->sh = new_sh_video(demuxer,0); // create dummy video stream header, id=0 | |
36800
f3c835ddce85
demuxers: ensure that stream ids are correctly initialized.
reimar
parents:
36762
diff
changeset
|
1087 demuxer->video->id = 0; |
16175 | 1088 |
1089 return demuxer; | |
1090 } | |
1091 | |
16310
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1092 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
|
1093 demuxer->audio->sh = NULL; |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1094 demuxer->video->sh = new_sh_video(demuxer,0); |
36800
f3c835ddce85
demuxers: ensure that stream ids are correctly initialized.
reimar
parents:
36762
diff
changeset
|
1095 demuxer->video->id = 0; |
16310
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1096 demuxer->priv = (void *) 0xffffffff; |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1097 return demuxer; |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1098 } |
16175 | 1099 |
1100 static demuxer_t* demux_mpg_ps_open(demuxer_t* demuxer) | |
1101 { | |
36810 | 1102 sh_video_t *sh_video = demuxer->video->sh; |
16175 | 1103 |
1104 if(demuxer->audio->id!=-2) { | |
1105 if(!ds_fill_buffer(demuxer->audio)){ | |
1106 mp_msg(MSGT_DEMUXER,MSGL_INFO,"MPEG: " MSGTR_MissingAudioStream); | |
1107 demuxer->audio->sh=NULL; | |
1108 } | |
1109 } | |
1110 | |
36810 | 1111 if(sh_video && !sh_video->format && ps_probe > 0) { |
22088 | 1112 int head; |
22037
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1113 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
|
1114 |
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1115 clear_stats(); |
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1116 do { |
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1117 head=sync_video_packet(demuxer->video); |
22041
f0172904ff02
sanity checks during codec detection; also reset demuxer->stream->eof
nicodvb
parents:
22037
diff
changeset
|
1118 if(!head) break; |
22037
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1119 update_stats(head); |
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1120 skip_video_packet(demuxer->video); |
22041
f0172904ff02
sanity checks during codec detection; also reset demuxer->stream->eof
nicodvb
parents:
22037
diff
changeset
|
1121 } 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
|
1122 |
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1123 ds_free_packs(demuxer->video); |
22041
f0172904ff02
sanity checks during codec detection; also reset demuxer->stream->eof
nicodvb
parents:
22037
diff
changeset
|
1124 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
|
1125 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
|
1126 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
|
1127 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
|
1128 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
|
1129 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
|
1130 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
|
1131 |
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1132 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
|
1133 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
|
1134 sh_video->format = 0x10000004; |
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1135 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
|
1136 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
|
1137 num_elementary_packets1B6==0) |
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1138 sh_video->format = 0x10000005; |
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1139 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
|
1140 } |
489b443a8ecf
added code to scan the video stream to search the actual video codec used;
nicodvb
parents:
22036
diff
changeset
|
1141 |
16175 | 1142 return demuxer; |
1143 } | |
1144 | |
1145 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
24946
diff
changeset
|
1146 const demuxer_desc_t demuxer_desc_mpeg_ps = { |
16175 | 1147 "MPEG PS demuxer", |
1148 "mpegps", | |
1149 "MPEG-PS", | |
1150 "Arpi?", | |
1151 "Mpeg", | |
1152 DEMUXER_TYPE_MPEG_PS, | |
1153 0, // unsafe autodetect | |
1154 demux_mpg_probe, | |
1155 demux_mpg_fill_buffer, | |
1156 demux_mpg_ps_open, | |
1157 demux_close_mpg, | |
1158 demux_seek_mpg, | |
16771
82a56c89b54d
10l, demux_mpg_control was missing from demuxer info struct, causing audio
reimar
parents:
16369
diff
changeset
|
1159 demux_mpg_control, |
16175 | 1160 }; |
1161 | |
1162 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
24946
diff
changeset
|
1163 const demuxer_desc_t demuxer_desc_mpeg_pes = { |
16175 | 1164 "MPEG PES demuxer", |
1165 "mpegpes", | |
1166 "MPEG-PES", | |
1167 "Arpi?", | |
1168 "Mpeg", | |
1169 DEMUXER_TYPE_MPEG_PES, | |
1170 0, // unsafe autodetect | |
1171 demux_mpg_pes_probe, | |
1172 demux_mpg_fill_buffer, | |
16314 | 1173 demux_mpg_ps_open, |
16175 | 1174 demux_close_mpg, |
1175 demux_seek_mpg, | |
16771
82a56c89b54d
10l, demux_mpg_control was missing from demuxer info struct, causing audio
reimar
parents:
16369
diff
changeset
|
1176 demux_mpg_control, |
16175 | 1177 }; |
1178 | |
1179 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
24946
diff
changeset
|
1180 const demuxer_desc_t demuxer_desc_mpeg_gxf = { |
16310
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1181 "MPEG ES in GXF demuxer", |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1182 "mpeggxf", |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1183 "MPEG-ES in GXF", |
22507
a46ab26b2d5e
Source files should not contain non-ASCII characters.
diego
parents:
22363
diff
changeset
|
1184 "Reimar Doeffinger", |
16310
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1185 "Mpeg", |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1186 DEMUXER_TYPE_MPEG_GXF, |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1187 0, // hack autodetection |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1188 NULL, |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1189 demux_mpg_gxf_fill_buffer, |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1190 demux_mpg_gxf_open, |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1191 NULL, |
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 NULL |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1194 }; |
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16175
diff
changeset
|
1195 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
24946
diff
changeset
|
1196 const demuxer_desc_t demuxer_desc_mpeg_es = { |
16175 | 1197 "MPEG ES demuxer", |
1198 "mpeges", | |
1199 "MPEG-ES", | |
1200 "Arpi?", | |
1201 "Mpeg", | |
1202 DEMUXER_TYPE_MPEG_ES, | |
1203 0, // hack autodetection | |
1204 NULL, | |
1205 demux_mpg_es_fill_buffer, | |
1206 demux_mpg_es_open, | |
1207 demux_close_mpg, | |
1208 demux_seek_mpg, | |
16771
82a56c89b54d
10l, demux_mpg_control was missing from demuxer info struct, causing audio
reimar
parents:
16369
diff
changeset
|
1209 demux_mpg_control, |
16175 | 1210 }; |
1211 | |
1212 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
24946
diff
changeset
|
1213 const demuxer_desc_t demuxer_desc_mpeg4_es = { |
16175 | 1214 "MPEG4 ES demuxer", |
1215 "mpeg4es", | |
1216 "MPEG-ES", | |
1217 "Arpi?", | |
1218 "Mpeg", | |
1219 DEMUXER_TYPE_MPEG4_ES, | |
1220 0, // hack autodetection | |
1221 NULL, | |
1222 demux_mpg_es_fill_buffer, | |
1223 demux_mpg_es_open, | |
1224 demux_close_mpg, | |
1225 demux_seek_mpg, | |
16771
82a56c89b54d
10l, demux_mpg_control was missing from demuxer info struct, causing audio
reimar
parents:
16369
diff
changeset
|
1226 demux_mpg_control, |
16175 | 1227 }; |
1228 | |
1229 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
24946
diff
changeset
|
1230 const demuxer_desc_t demuxer_desc_h264_es = { |
16175 | 1231 "H.264 ES demuxer", |
1232 "h264es", | |
1233 "H264-ES", | |
1234 "Arpi?", | |
1235 "Mpeg", | |
1236 DEMUXER_TYPE_H264_ES, | |
1237 0, // hack autodetection | |
1238 NULL, | |
1239 demux_mpg_es_fill_buffer, | |
1240 demux_mpg_es_open, | |
1241 demux_close_mpg, | |
1242 demux_seek_mpg, | |
16771
82a56c89b54d
10l, demux_mpg_control was missing from demuxer info struct, causing audio
reimar
parents:
16369
diff
changeset
|
1243 demux_mpg_control, |
16175 | 1244 }; |