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