Mercurial > libavformat.hg
annotate mpeg.c @ 6158:4d1d3e0ba6d7 libavformat
Fix failure in av_read_frame on timestamp rollover.
Patch by Stephen Dredge, sdredge A tpg com au
author | cehoyos |
---|---|
date | Tue, 22 Jun 2010 08:48:28 +0000 |
parents | bd81aaf36a9a |
children | fa244b4fe683 |
rev | line source |
---|---|
0 | 1 /* |
2176
50322a49fa2b
split mpeg ps and variants muxer and demuxer, I'll clean more in a few minutes, lpcm freq tab is left static const in mpeg.h for now until we have more code in common
bcoudurier
parents:
2164
diff
changeset
|
2 * MPEG1/2 demuxer |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
3967
diff
changeset
|
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard |
0 | 4 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
0 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
0 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
885
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
2176
50322a49fa2b
split mpeg ps and variants muxer and demuxer, I'll clean more in a few minutes, lpcm freq tab is left static const in mpeg.h for now until we have more code in common
bcoudurier
parents:
2164
diff
changeset
|
21 |
0 | 22 #include "avformat.h" |
2176
50322a49fa2b
split mpeg ps and variants muxer and demuxer, I'll clean more in a few minutes, lpcm freq tab is left static const in mpeg.h for now until we have more code in common
bcoudurier
parents:
2164
diff
changeset
|
23 #include "mpeg.h" |
0 | 24 |
310 | 25 //#define DEBUG_SEEK |
0 | 26 |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
27 #undef NDEBUG |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
28 #include <assert.h> |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
29 |
0 | 30 /*********************************************/ |
31 /* demux code */ | |
32 | |
33 #define MAX_SYNC_SIZE 100000 | |
34 | |
2697
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
35 static int check_pes(uint8_t *p, uint8_t *end){ |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
36 int pes1; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
37 int pes2= (p[3] & 0xC0) == 0x80 |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
38 && (p[4] & 0xC0) != 0x40 |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
39 &&((p[4] & 0xC0) == 0x00 || (p[4]&0xC0)>>2 == (p[6]&0xF0)); |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
40 |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
41 for(p+=3; p<end && *p == 0xFF; p++); |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
42 if((*p&0xC0) == 0x40) p+=2; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
43 if((*p&0xF0) == 0x20){ |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
44 pes1= p[0]&p[2]&p[4]&1; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
45 }else if((*p&0xF0) == 0x30){ |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
46 pes1= p[0]&p[2]&p[4]&p[5]&p[7]&p[9]&1; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
47 }else |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
48 pes1 = *p == 0x0F; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
49 |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
50 return pes1||pes2; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
51 } |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
52 |
0 | 53 static int mpegps_probe(AVProbeData *p) |
54 { | |
936 | 55 uint32_t code= -1; |
2799 | 56 int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0; |
539 | 57 int i; |
1257 | 58 int score=0; |
49 | 59 |
936 | 60 for(i=0; i<p->buf_size; i++){ |
61 code = (code<<8) + p->buf[i]; | |
165
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
62 if ((code & 0xffffff00) == 0x100) { |
6049
bd81aaf36a9a
Skip pes payload during probing to avoid start code emulation.
cehoyos
parents:
5910
diff
changeset
|
63 int len= p->buf[i+1] << 8 | p->buf[i+2]; |
2698 | 64 int pes= check_pes(p->buf+i, p->buf+p->buf_size); |
2697
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
65 |
1140
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
66 if(code == SYSTEM_HEADER_START_CODE) sys++; |
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
67 else if(code == PACK_START_CODE) pspack++; |
3779 | 68 else if((code & 0xf0) == VIDEO_ID && pes) vid++; |
6049
bd81aaf36a9a
Skip pes payload during probing to avoid start code emulation.
cehoyos
parents:
5910
diff
changeset
|
69 // skip pes payload to avoid start code emulation for private |
bd81aaf36a9a
Skip pes payload during probing to avoid start code emulation.
cehoyos
parents:
5910
diff
changeset
|
70 // and audio streams |
bd81aaf36a9a
Skip pes payload during probing to avoid start code emulation.
cehoyos
parents:
5910
diff
changeset
|
71 else if((code & 0xe0) == AUDIO_ID && pes) {audio++; i+=len;} |
bd81aaf36a9a
Skip pes payload during probing to avoid start code emulation.
cehoyos
parents:
5910
diff
changeset
|
72 else if(code == PRIVATE_STREAM_1 && pes) {priv1++; i+=len;} |
2799 | 73 |
74 else if((code & 0xf0) == VIDEO_ID && !pes) invalid++; | |
75 else if((code & 0xe0) == AUDIO_ID && !pes) invalid++; | |
6049
bd81aaf36a9a
Skip pes payload during probing to avoid start code emulation.
cehoyos
parents:
5910
diff
changeset
|
76 else if(code == PRIVATE_STREAM_1 && !pes) invalid++; |
165
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
77 } |
0 | 78 } |
1257 | 79 |
2799 | 80 if(vid+audio > invalid) /* invalid VDR files nd short PES streams */ |
1257 | 81 score= AVPROBE_SCORE_MAX/4; |
82 | |
5423
beac179b6765
Also print the number of invalid packets in the debug output.
michael
parents:
5422
diff
changeset
|
83 //av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d %d len:%d\n", sys, priv1, pspack,vid, audio, invalid, p->buf_size); |
2799 | 84 if(sys>invalid && sys*9 <= pspack*10) |
5190 | 85 return pspack > 2 ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg |
5422
3e5fefc4b475
Flip the comparission direction of vid+audio+priv1 and pspack, it appears to have
michael
parents:
5321
diff
changeset
|
86 if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9) |
5190 | 87 return pspack > 2 ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; // +1 for .mpg |
88 if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->buf_size>2048 && vid + audio > invalid) /* PES stream */ | |
5189
cfe130ee18f1
Slightly stricter MPEG-PES probing, fixes issue 1383.
reimar
parents:
4888
diff
changeset
|
89 return (audio > 12 || vid > 3) ? AVPROBE_SCORE_MAX/2+2 : AVPROBE_SCORE_MAX/4; |
1257 | 90 |
91 //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1 | |
5189
cfe130ee18f1
Slightly stricter MPEG-PES probing, fixes issue 1383.
reimar
parents:
4888
diff
changeset
|
92 //mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6 |
1257 | 93 return score; |
0 | 94 } |
95 | |
96 | |
97 typedef struct MpegDemuxContext { | |
1332 | 98 int32_t header_state; |
722 | 99 unsigned char psm_es_type[256]; |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
100 int sofdec; |
0 | 101 } MpegDemuxContext; |
102 | |
310 | 103 static int mpegps_read_header(AVFormatContext *s, |
104 AVFormatParameters *ap) | |
105 { | |
106 MpegDemuxContext *m = s->priv_data; | |
2728 | 107 const char *sofdec = "Sofdec"; |
108 int v, i = 0; | |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
109 |
310 | 110 m->header_state = 0xff; |
111 s->ctx_flags |= AVFMTCTX_NOHEADER; | |
112 | |
2728 | 113 m->sofdec = -1; |
114 do { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
115 v = get_byte(s->pb); |
2728 | 116 m->header_state = m->header_state << 8 | v; |
117 m->sofdec++; | |
118 } while (v == sofdec[i] && i++ < 6); | |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
119 |
5321
a4a45f236eec
Improve sofdec dectection to avoid false positives for MP2.
cehoyos
parents:
5190
diff
changeset
|
120 m->sofdec = (m->sofdec == 6) ? 1 : 0; |
a4a45f236eec
Improve sofdec dectection to avoid false positives for MP2.
cehoyos
parents:
5190
diff
changeset
|
121 |
310 | 122 /* no need to do more */ |
123 return 0; | |
124 } | |
125 | |
126 static int64_t get_pts(ByteIOContext *pb, int c) | |
127 { | |
2906
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
128 uint8_t buf[5]; |
310 | 129 |
2906
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
130 buf[0] = c<0 ? get_byte(pb) : c; |
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
131 get_buffer(pb, buf+1, 4); |
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
132 |
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
133 return ff_parse_pes_pts(buf); |
310 | 134 } |
135 | |
885 | 136 static int find_next_start_code(ByteIOContext *pb, int *size_ptr, |
1332 | 137 int32_t *header_state) |
0 | 138 { |
139 unsigned int state, v; | |
140 int val, n; | |
141 | |
142 state = *header_state; | |
143 n = *size_ptr; | |
144 while (n > 0) { | |
145 if (url_feof(pb)) | |
146 break; | |
147 v = get_byte(pb); | |
148 n--; | |
149 if (state == 0x000001) { | |
150 state = ((state << 8) | v) & 0xffffff; | |
151 val = state; | |
152 goto found; | |
153 } | |
154 state = ((state << 8) | v) & 0xffffff; | |
155 } | |
156 val = -1; | |
157 found: | |
158 *header_state = state; | |
159 *size_ptr = n; | |
160 return val; | |
161 } | |
162 | |
683
095009fc2f35
kill warnings patch by (M¸«©ns Rullg¸«©rd <mru inprovide com>)
michael
parents:
674
diff
changeset
|
163 #if 0 /* unused, remove? */ |
310 | 164 /* XXX: optimize */ |
165 static int find_prev_start_code(ByteIOContext *pb, int *size_ptr) | |
0 | 166 { |
310 | 167 int64_t pos, pos_start; |
168 int max_size, start_code; | |
169 | |
170 max_size = *size_ptr; | |
171 pos_start = url_ftell(pb); | |
172 | |
173 /* in order to go faster, we fill the buffer */ | |
174 pos = pos_start - 16386; | |
175 if (pos < 0) | |
176 pos = 0; | |
177 url_fseek(pb, pos, SEEK_SET); | |
178 get_byte(pb); | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
291
diff
changeset
|
179 |
310 | 180 pos = pos_start; |
181 for(;;) { | |
182 pos--; | |
183 if (pos < 0 || (pos_start - pos) >= max_size) { | |
184 start_code = -1; | |
185 goto the_end; | |
186 } | |
187 url_fseek(pb, pos, SEEK_SET); | |
188 start_code = get_be32(pb); | |
189 if ((start_code & 0xffffff00) == 0x100) | |
190 break; | |
191 } | |
192 the_end: | |
193 *size_ptr = pos_start - pos; | |
194 return start_code; | |
0 | 195 } |
683
095009fc2f35
kill warnings patch by (M¸«©ns Rullg¸«©rd <mru inprovide com>)
michael
parents:
674
diff
changeset
|
196 #endif |
0 | 197 |
722 | 198 /** |
199 * Extracts stream types from a program stream map | |
200 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35 | |
885 | 201 * |
722 | 202 * @return number of bytes occupied by PSM in the bitstream |
203 */ | |
204 static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb) | |
205 { | |
206 int psm_length, ps_info_length, es_map_length; | |
207 | |
208 psm_length = get_be16(pb); | |
209 get_byte(pb); | |
210 get_byte(pb); | |
211 ps_info_length = get_be16(pb); | |
212 | |
213 /* skip program_stream_info */ | |
214 url_fskip(pb, ps_info_length); | |
215 es_map_length = get_be16(pb); | |
216 | |
217 /* at least one es available? */ | |
218 while (es_map_length >= 4){ | |
3779 | 219 unsigned char type = get_byte(pb); |
220 unsigned char es_id = get_byte(pb); | |
722 | 221 uint16_t es_info_length = get_be16(pb); |
222 /* remember mapping from stream id to stream type */ | |
223 m->psm_es_type[es_id] = type; | |
224 /* skip program_stream_info */ | |
225 url_fskip(pb, es_info_length); | |
226 es_map_length -= 4 + es_info_length; | |
227 } | |
228 get_be32(pb); /* crc32 */ | |
229 return 2 + psm_length; | |
230 } | |
231 | |
885 | 232 /* read the next PES header. Return its position in ppos |
310 | 233 (if not NULL), and its start code, pts and dts. |
234 */ | |
235 static int mpegps_read_pes_header(AVFormatContext *s, | |
885 | 236 int64_t *ppos, int *pstart_code, |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
237 int64_t *ppts, int64_t *pdts) |
0 | 238 { |
239 MpegDemuxContext *m = s->priv_data; | |
310 | 240 int len, size, startcode, c, flags, header_len; |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
241 int pes_ext, ext2_len, id_ext, skip; |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
242 int64_t pts, dts; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
243 int64_t last_sync= url_ftell(s->pb); |
0 | 244 |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
245 error_redo: |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
246 url_fseek(s->pb, last_sync, SEEK_SET); |
0 | 247 redo: |
310 | 248 /* next start code (should be immediately after) */ |
249 m->header_state = 0xff; | |
250 size = MAX_SYNC_SIZE; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
251 startcode = find_next_start_code(s->pb, &size, &m->header_state); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
252 last_sync = url_ftell(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
253 //printf("startcode=%x pos=0x%"PRIx64"\n", startcode, url_ftell(s->pb)); |
5642
747753995dee
Dont give up after 100kb of zero bytes but returnd EAGAIN
michael
parents:
5621
diff
changeset
|
254 if (startcode < 0){ |
747753995dee
Dont give up after 100kb of zero bytes but returnd EAGAIN
michael
parents:
5621
diff
changeset
|
255 if(url_feof(s->pb)) |
747753995dee
Dont give up after 100kb of zero bytes but returnd EAGAIN
michael
parents:
5621
diff
changeset
|
256 return AVERROR_EOF; |
747753995dee
Dont give up after 100kb of zero bytes but returnd EAGAIN
michael
parents:
5621
diff
changeset
|
257 //FIXME we should remember header_state |
747753995dee
Dont give up after 100kb of zero bytes but returnd EAGAIN
michael
parents:
5621
diff
changeset
|
258 return AVERROR(EAGAIN); |
747753995dee
Dont give up after 100kb of zero bytes but returnd EAGAIN
michael
parents:
5621
diff
changeset
|
259 } |
747753995dee
Dont give up after 100kb of zero bytes but returnd EAGAIN
michael
parents:
5621
diff
changeset
|
260 |
0 | 261 if (startcode == PACK_START_CODE) |
262 goto redo; | |
263 if (startcode == SYSTEM_HEADER_START_CODE) | |
264 goto redo; | |
2728 | 265 if (startcode == PADDING_STREAM) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
266 url_fskip(s->pb, get_be16(s->pb)); |
2728 | 267 goto redo; |
268 } | |
269 if (startcode == PRIVATE_STREAM_2) { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
270 len = get_be16(s->pb); |
2728 | 271 if (!m->sofdec) { |
272 while (len-- >= 6) { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
273 if (get_byte(s->pb) == 'S') { |
2728 | 274 uint8_t buf[5]; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
275 get_buffer(s->pb, buf, sizeof(buf)); |
2728 | 276 m->sofdec = !memcmp(buf, "ofdec", 5); |
277 len -= sizeof(buf); | |
278 break; | |
279 } | |
280 } | |
281 m->sofdec -= !m->sofdec; | |
282 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
283 url_fskip(s->pb, len); |
0 | 284 goto redo; |
285 } | |
722 | 286 if (startcode == PROGRAM_STREAM_MAP) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
287 mpegps_psm_parse(m, s->pb); |
722 | 288 goto redo; |
289 } | |
885 | 290 |
0 | 291 /* find matching stream */ |
292 if (!((startcode >= 0x1c0 && startcode <= 0x1df) || | |
293 (startcode >= 0x1e0 && startcode <= 0x1ef) || | |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
294 (startcode == 0x1bd) || (startcode == 0x1fd))) |
0 | 295 goto redo; |
310 | 296 if (ppos) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
297 *ppos = url_ftell(s->pb) - 4; |
310 | 298 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
299 len = get_be16(s->pb); |
1666 | 300 pts = |
0 | 301 dts = AV_NOPTS_VALUE; |
302 /* stuffing */ | |
303 for(;;) { | |
310 | 304 if (len < 1) |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
305 goto error_redo; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
306 c = get_byte(s->pb); |
0 | 307 len--; |
308 /* XXX: for mpeg1, should test only bit 7 */ | |
885 | 309 if (c != 0xff) |
0 | 310 break; |
311 } | |
312 if ((c & 0xc0) == 0x40) { | |
313 /* buffer scale & size */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
314 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
315 c = get_byte(s->pb); |
0 | 316 len -= 2; |
317 } | |
1667 | 318 if ((c & 0xe0) == 0x20) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
319 dts = pts = get_pts(s->pb, c); |
0 | 320 len -= 4; |
1667 | 321 if (c & 0x10){ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
322 dts = get_pts(s->pb, -1); |
1667 | 323 len -= 5; |
324 } | |
0 | 325 } else if ((c & 0xc0) == 0x80) { |
326 /* mpeg 2 PES */ | |
1126 | 327 #if 0 /* some streams have this field set for no apparent reason */ |
0 | 328 if ((c & 0x30) != 0) { |
310 | 329 /* Encrypted multiplex not handled */ |
330 goto redo; | |
0 | 331 } |
1126 | 332 #endif |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
333 flags = get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
334 header_len = get_byte(s->pb); |
0 | 335 len -= 2; |
336 if (header_len > len) | |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
337 goto error_redo; |
1668 | 338 len -= header_len; |
1667 | 339 if (flags & 0x80) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
340 dts = pts = get_pts(s->pb, -1); |
0 | 341 header_len -= 5; |
1667 | 342 if (flags & 0x40) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
343 dts = get_pts(s->pb, -1); |
1667 | 344 header_len -= 5; |
345 } | |
0 | 346 } |
3109
20e070d8706f
Ignore flags after pts/dts if there are no bytes left.
michael
parents:
2934
diff
changeset
|
347 if (flags & 0x3f && header_len == 0){ |
20e070d8706f
Ignore flags after pts/dts if there are no bytes left.
michael
parents:
2934
diff
changeset
|
348 flags &= 0xC0; |
20e070d8706f
Ignore flags after pts/dts if there are no bytes left.
michael
parents:
2934
diff
changeset
|
349 av_log(s, AV_LOG_WARNING, "Further flags set but no bytes left\n"); |
20e070d8706f
Ignore flags after pts/dts if there are no bytes left.
michael
parents:
2934
diff
changeset
|
350 } |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
351 if (flags & 0x01) { /* PES extension */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
352 pes_ext = get_byte(s->pb); |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
353 header_len--; |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
354 /* Skip PES private data, program packet sequence counter and P-STD buffer */ |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
355 skip = (pes_ext >> 4) & 0xb; |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
356 skip += skip & 0x9; |
3270 | 357 if (pes_ext & 0x40 || skip > header_len){ |
358 av_log(s, AV_LOG_WARNING, "pes_ext %X is invalid\n", pes_ext); | |
359 pes_ext=skip=0; | |
360 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
361 url_fskip(s->pb, skip); |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
362 header_len -= skip; |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
363 |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
364 if (pes_ext & 0x01) { /* PES extension 2 */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
365 ext2_len = get_byte(s->pb); |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
366 header_len--; |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
367 if ((ext2_len & 0x7f) > 0) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
368 id_ext = get_byte(s->pb); |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
369 if ((id_ext & 0x80) == 0) |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
370 startcode = ((startcode & 0xff) << 8) | id_ext; |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
371 header_len--; |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
372 } |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
373 } |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
374 } |
1668 | 375 if(header_len < 0) |
376 goto error_redo; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
377 url_fskip(s->pb, header_len); |
0 | 378 } |
447
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
379 else if( c!= 0xf ) |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
380 goto redo; |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
381 |
722 | 382 if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
383 startcode = get_byte(s->pb); |
0 | 384 len--; |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
385 if (startcode >= 0x80 && startcode <= 0xcf) { |
0 | 386 /* audio: skip header */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
387 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
388 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
389 get_byte(s->pb); |
0 | 390 len -= 3; |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
391 if (startcode >= 0xb0 && startcode <= 0xbf) { |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
392 /* MLP/TrueHD audio has a 4-byte header */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
393 get_byte(s->pb); |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
394 len--; |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
395 } |
0 | 396 } |
397 } | |
1665 | 398 if(len<0) |
399 goto error_redo; | |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
400 if(dts != AV_NOPTS_VALUE && ppos){ |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
401 int i; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
402 for(i=0; i<s->nb_streams; i++){ |
2934 | 403 if(startcode == s->streams[i]->id && |
404 !url_is_streamed(s->pb) /* index useless on streams anyway */) { | |
2932
f5de41d943e2
user specifyable maximum amount of memory to use for the index.
michael
parents:
2906
diff
changeset
|
405 ff_reduce_index(s, i); |
979 | 406 av_add_index_entry(s->streams[i], *ppos, dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */); |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
407 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
408 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
409 } |
885 | 410 |
310 | 411 *pstart_code = startcode; |
412 *ppts = pts; | |
413 *pdts = dts; | |
414 return len; | |
415 } | |
416 | |
417 static int mpegps_read_packet(AVFormatContext *s, | |
418 AVPacket *pkt) | |
419 { | |
722 | 420 MpegDemuxContext *m = s->priv_data; |
310 | 421 AVStream *st; |
3967 | 422 int len, startcode, i, es_type; |
423 enum CodecID codec_id = CODEC_ID_NONE; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
424 enum AVMediaType type; |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
425 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work |
4648
30513a35c94d
Mark dvdaudio_substream_type variable as av_uninit to work around false
diego
parents:
4450
diff
changeset
|
426 uint8_t av_uninit(dvdaudio_substream_type); |
310 | 427 |
428 redo: | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
429 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts); |
310 | 430 if (len < 0) |
431 return len; | |
885 | 432 |
4450
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
433 if(startcode == 0x1bd) { |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
434 dvdaudio_substream_type = get_byte(s->pb); |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
435 url_fskip(s->pb, 3); |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
436 len -= 4; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
437 } |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
438 |
0 | 439 /* now find stream */ |
440 for(i=0;i<s->nb_streams;i++) { | |
441 st = s->streams[i]; | |
442 if (st->id == startcode) | |
443 goto found; | |
444 } | |
722 | 445 |
446 es_type = m->psm_es_type[startcode & 0xff]; | |
4450
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
447 if(es_type > 0 && es_type != STREAM_TYPE_PRIVATE_DATA){ |
722 | 448 if(es_type == STREAM_TYPE_VIDEO_MPEG1){ |
449 codec_id = CODEC_ID_MPEG2VIDEO; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
450 type = AVMEDIA_TYPE_VIDEO; |
722 | 451 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){ |
452 codec_id = CODEC_ID_MPEG2VIDEO; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
453 type = AVMEDIA_TYPE_VIDEO; |
722 | 454 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 || |
455 es_type == STREAM_TYPE_AUDIO_MPEG2){ | |
456 codec_id = CODEC_ID_MP3; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
457 type = AVMEDIA_TYPE_AUDIO; |
722 | 458 } else if(es_type == STREAM_TYPE_AUDIO_AAC){ |
459 codec_id = CODEC_ID_AAC; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
460 type = AVMEDIA_TYPE_AUDIO; |
722 | 461 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){ |
462 codec_id = CODEC_ID_MPEG4; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
463 type = AVMEDIA_TYPE_VIDEO; |
722 | 464 } else if(es_type == STREAM_TYPE_VIDEO_H264){ |
465 codec_id = CODEC_ID_H264; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
466 type = AVMEDIA_TYPE_VIDEO; |
722 | 467 } else if(es_type == STREAM_TYPE_AUDIO_AC3){ |
468 codec_id = CODEC_ID_AC3; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
469 type = AVMEDIA_TYPE_AUDIO; |
722 | 470 } else { |
471 goto skip; | |
472 } | |
473 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) { | |
1146 | 474 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 }; |
475 unsigned char buf[8]; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
476 get_buffer(s->pb, buf, 8); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
477 url_fseek(s->pb, -8, SEEK_CUR); |
1146 | 478 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1)) |
479 codec_id = CODEC_ID_CAVS; | |
480 else | |
3576
270e9f324405
Use CODEC_ID_PROBE when the mpeg-ps demuxer does not know exactly which
michael
parents:
3484
diff
changeset
|
481 codec_id = CODEC_ID_PROBE; |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
482 type = AVMEDIA_TYPE_VIDEO; |
0 | 483 } else if (startcode >= 0x1c0 && startcode <= 0x1df) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
484 type = AVMEDIA_TYPE_AUDIO; |
2728 | 485 codec_id = m->sofdec > 0 ? CODEC_ID_ADPCM_ADX : CODEC_ID_MP2; |
767
cbfea73709bd
fix ac3 and dts detection (patch by Joakim Plate <joakim.plate at ecce.se>)
mru
parents:
722
diff
changeset
|
486 } else if (startcode >= 0x80 && startcode <= 0x87) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
487 type = AVMEDIA_TYPE_AUDIO; |
0 | 488 codec_id = CODEC_ID_AC3; |
3779 | 489 } else if ( ( startcode >= 0x88 && startcode <= 0x8f) |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
490 ||( startcode >= 0x98 && startcode <= 0x9f)) { |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
491 /* 0x90 - 0x97 is reserved for SDDS in DVD specs */ |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
492 type = AVMEDIA_TYPE_AUDIO; |
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
493 codec_id = CODEC_ID_DTS; |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
494 } else if (startcode >= 0xa0 && startcode <= 0xaf) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
495 type = AVMEDIA_TYPE_AUDIO; |
3305
129d36178a10
support dvd pcm 20/24 bits, patch by Lars T¸«£uber, lars.taeuber gmx net
bcoudurier
parents:
3270
diff
changeset
|
496 /* 16 bit form will be handled as CODEC_ID_PCM_S16BE */ |
129d36178a10
support dvd pcm 20/24 bits, patch by Lars T¸«£uber, lars.taeuber gmx net
bcoudurier
parents:
3270
diff
changeset
|
497 codec_id = CODEC_ID_PCM_DVD; |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
498 } else if (startcode >= 0xb0 && startcode <= 0xbf) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
499 type = AVMEDIA_TYPE_AUDIO; |
4750 | 500 codec_id = CODEC_ID_TRUEHD; |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
501 } else if (startcode >= 0xc0 && startcode <= 0xcf) { |
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
502 /* Used for both AC-3 and E-AC-3 in EVOB files */ |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
503 type = AVMEDIA_TYPE_AUDIO; |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
504 codec_id = CODEC_ID_AC3; |
783
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
505 } else if (startcode >= 0x20 && startcode <= 0x3f) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
506 type = AVMEDIA_TYPE_SUBTITLE; |
783
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
507 codec_id = CODEC_ID_DVD_SUBTITLE; |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
508 } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
509 type = AVMEDIA_TYPE_VIDEO; |
1759
9eaf71a70ac1
Revised patch for HD DVD .EVO demuxing by (Ian Caulfield <lowercase name seperated by . place at here gmail place a dot here com>)
michael
parents:
1668
diff
changeset
|
510 codec_id = CODEC_ID_VC1; |
4450
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
511 } else if (startcode == 0x1bd) { |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
512 // check dvd audio substream type |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5642
diff
changeset
|
513 type = AVMEDIA_TYPE_AUDIO; |
4450
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
514 switch(dvdaudio_substream_type & 0xe0) { |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
515 case 0xa0: codec_id = CODEC_ID_PCM_DVD; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
516 break; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
517 case 0x80: if((dvdaudio_substream_type & 0xf8) == 0x88) |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
518 codec_id = CODEC_ID_DTS; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
519 else codec_id = CODEC_ID_AC3; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
520 break; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
521 default: av_log(s, AV_LOG_ERROR, "Unknown 0x1bd sub-stream\n"); |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
522 goto skip; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
523 } |
0 | 524 } else { |
525 skip: | |
526 /* skip packet */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
527 url_fskip(s->pb, len); |
0 | 528 goto redo; |
529 } | |
530 /* no stream found: add a new stream */ | |
531 st = av_new_stream(s, startcode); | |
885 | 532 if (!st) |
0 | 533 goto skip; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
789
diff
changeset
|
534 st->codec->codec_type = type; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
789
diff
changeset
|
535 st->codec->codec_id = codec_id; |
310 | 536 if (codec_id != CODEC_ID_PCM_S16BE) |
2023 | 537 st->need_parsing = AVSTREAM_PARSE_FULL; |
0 | 538 found: |
708 | 539 if(st->discard >= AVDISCARD_ALL) |
652 | 540 goto skip; |
4450
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
541 if ((startcode >= 0xa0 && startcode <= 0xaf) || |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
542 (startcode == 0x1bd && ((dvdaudio_substream_type & 0xe0) == 0xa0))) { |
41 | 543 int b1, freq; |
544 | |
545 /* for LPCM, we just skip the header and consider it is raw | |
546 audio data */ | |
547 if (len <= 3) | |
548 goto skip; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
549 get_byte(s->pb); /* emphasis (1), muse(1), reserved(1), frame number(5) */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
550 b1 = get_byte(s->pb); /* quant (2), freq(2), reserved(1), channels(3) */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
551 get_byte(s->pb); /* dynamic range control (0x80 = off) */ |
41 | 552 len -= 3; |
553 freq = (b1 >> 4) & 3; | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
789
diff
changeset
|
554 st->codec->sample_rate = lpcm_freq_tab[freq]; |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
789
diff
changeset
|
555 st->codec->channels = 1 + (b1 & 7); |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3779
diff
changeset
|
556 st->codec->bits_per_coded_sample = 16 + ((b1 >> 6) & 3) * 4; |
3305
129d36178a10
support dvd pcm 20/24 bits, patch by Lars T¸«£uber, lars.taeuber gmx net
bcoudurier
parents:
3270
diff
changeset
|
557 st->codec->bit_rate = st->codec->channels * |
129d36178a10
support dvd pcm 20/24 bits, patch by Lars T¸«£uber, lars.taeuber gmx net
bcoudurier
parents:
3270
diff
changeset
|
558 st->codec->sample_rate * |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3779
diff
changeset
|
559 st->codec->bits_per_coded_sample; |
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3779
diff
changeset
|
560 if (st->codec->bits_per_coded_sample == 16) |
3305
129d36178a10
support dvd pcm 20/24 bits, patch by Lars T¸«£uber, lars.taeuber gmx net
bcoudurier
parents:
3270
diff
changeset
|
561 st->codec->codec_id = CODEC_ID_PCM_S16BE; |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3779
diff
changeset
|
562 else if (st->codec->bits_per_coded_sample == 28) |
3305
129d36178a10
support dvd pcm 20/24 bits, patch by Lars T¸«£uber, lars.taeuber gmx net
bcoudurier
parents:
3270
diff
changeset
|
563 return AVERROR(EINVAL); |
41 | 564 } |
0 | 565 av_new_packet(pkt, len); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
566 get_buffer(s->pb, pkt->data, pkt->size); |
0 | 567 pkt->pts = pts; |
310 | 568 pkt->dts = dts; |
5621 | 569 pkt->pos = dummy_pos; |
0 | 570 pkt->stream_index = st->index; |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
571 #if 0 |
652 | 572 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n", |
573 pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0, pkt->size); | |
331
4530681af424
suppress PTS in packets when not needed (slightly smaller files), fixed PTS generation in some cases, added provision for DTS generation, slightly better SCR generation (initial patch by Michel Bardiaux)
bellard
parents:
310
diff
changeset
|
574 #endif |
482 | 575 |
0 | 576 return 0; |
577 } | |
578 | |
885 | 579 static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
580 int64_t *ppos, int64_t pos_limit) |
310 | 581 { |
582 int len, startcode; | |
583 int64_t pos, pts, dts; | |
584 | |
585 pos = *ppos; | |
586 #ifdef DEBUG_SEEK | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
587 printf("read_dts: pos=0x%"PRIx64" next=%d -> ", pos, find_next); |
310 | 588 #endif |
3398
3fbe87561b73
Check return of url_fseek in mpeg timestamp reading code.
benoit
parents:
3305
diff
changeset
|
589 if (url_fseek(s->pb, pos, SEEK_SET) < 0) |
3fbe87561b73
Check return of url_fseek in mpeg timestamp reading code.
benoit
parents:
3305
diff
changeset
|
590 return AV_NOPTS_VALUE; |
3fbe87561b73
Check return of url_fseek in mpeg timestamp reading code.
benoit
parents:
3305
diff
changeset
|
591 |
310 | 592 for(;;) { |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
593 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts); |
310 | 594 if (len < 0) { |
595 #ifdef DEBUG_SEEK | |
596 printf("none (ret=%d)\n", len); | |
597 #endif | |
598 return AV_NOPTS_VALUE; | |
599 } | |
885 | 600 if (startcode == s->streams[stream_index]->id && |
310 | 601 dts != AV_NOPTS_VALUE) { |
602 break; | |
603 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
604 url_fskip(s->pb, len); |
310 | 605 } |
606 #ifdef DEBUG_SEEK | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
607 printf("pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n", pos, dts, dts / 90000.0); |
310 | 608 #endif |
609 *ppos = pos; | |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
452
diff
changeset
|
610 return dts; |
310 | 611 } |
612 | |
1167 | 613 AVInputFormat mpegps_demuxer = { |
0 | 614 "mpeg", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3398
diff
changeset
|
615 NULL_IF_CONFIG_SMALL("MPEG-PS format"), |
0 | 616 sizeof(MpegDemuxContext), |
617 mpegps_probe, | |
618 mpegps_read_header, | |
619 mpegps_read_packet, | |
3484 | 620 NULL, |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
621 NULL, //mpegps_read_seek, |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
622 mpegps_read_dts, |
3724
178cc6f9d5ec
Add flag to mark demuxers that can output discontinuous timestamps.
michael
parents:
3576
diff
changeset
|
623 .flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT, |
0 | 624 }; |