Mercurial > libavformat.hg
annotate mpeg.c @ 5109:293c03f0d47f libavformat
Add handling of EAGAIN at packet boundaries. See "[PATCH] RTSP-MS 14/15:
ASF packet parsing" thread for discussion / reasoning.
author | rbultje |
---|---|
date | Sun, 26 Jul 2009 19:09:35 +0000 |
parents | 1b46fda1e1e0 |
children | cfe130ee18f1 |
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) { |
2698 | 63 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
|
64 |
1140
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
65 if(code == SYSTEM_HEADER_START_CODE) sys++; |
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
66 else if(code == PRIVATE_STREAM_1) priv1++; |
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++; |
69 else if((code & 0xe0) == AUDIO_ID && pes) audio++; | |
2799 | 70 |
71 else if((code & 0xf0) == VIDEO_ID && !pes) invalid++; | |
72 else if((code & 0xe0) == AUDIO_ID && !pes) invalid++; | |
165
e4d2f704bf80
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
michaelni
parents:
65
diff
changeset
|
73 } |
0 | 74 } |
1257 | 75 |
2799 | 76 if(vid+audio > invalid) /* invalid VDR files nd short PES streams */ |
1257 | 77 score= AVPROBE_SCORE_MAX/4; |
78 | |
2311 | 79 //av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d len:%d\n", sys, priv1, pspack,vid, audio, p->buf_size); |
2799 | 80 if(sys>invalid && sys*9 <= pspack*10) |
936 | 81 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg |
2799 | 82 if(priv1 + vid + audio > invalid && (priv1+vid+audio)*9 <= pspack*10) |
940 | 83 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg |
4424
c6e762f417b3
Increase the number of packets required to identify as MPEG PES to keep from
alexc
parents:
4251
diff
changeset
|
84 if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->buf_size>2048) /* PES stream */ |
1140
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
85 return AVPROBE_SCORE_MAX/2+2; |
1257 | 86 |
87 //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1 | |
88 return score; | |
0 | 89 } |
90 | |
91 | |
92 typedef struct MpegDemuxContext { | |
1332 | 93 int32_t header_state; |
722 | 94 unsigned char psm_es_type[256]; |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
95 int sofdec; |
0 | 96 } MpegDemuxContext; |
97 | |
310 | 98 static int mpegps_read_header(AVFormatContext *s, |
99 AVFormatParameters *ap) | |
100 { | |
101 MpegDemuxContext *m = s->priv_data; | |
2728 | 102 const char *sofdec = "Sofdec"; |
103 int v, i = 0; | |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
104 |
310 | 105 m->header_state = 0xff; |
106 s->ctx_flags |= AVFMTCTX_NOHEADER; | |
107 | |
2728 | 108 m->sofdec = -1; |
109 do { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
110 v = get_byte(s->pb); |
2728 | 111 m->header_state = m->header_state << 8 | v; |
112 m->sofdec++; | |
113 } while (v == sofdec[i] && i++ < 6); | |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
114 |
310 | 115 /* no need to do more */ |
116 return 0; | |
117 } | |
118 | |
119 static int64_t get_pts(ByteIOContext *pb, int c) | |
120 { | |
2906
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
121 uint8_t buf[5]; |
310 | 122 |
2906
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
123 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
|
124 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
|
125 |
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
126 return ff_parse_pes_pts(buf); |
310 | 127 } |
128 | |
885 | 129 static int find_next_start_code(ByteIOContext *pb, int *size_ptr, |
1332 | 130 int32_t *header_state) |
0 | 131 { |
132 unsigned int state, v; | |
133 int val, n; | |
134 | |
135 state = *header_state; | |
136 n = *size_ptr; | |
137 while (n > 0) { | |
138 if (url_feof(pb)) | |
139 break; | |
140 v = get_byte(pb); | |
141 n--; | |
142 if (state == 0x000001) { | |
143 state = ((state << 8) | v) & 0xffffff; | |
144 val = state; | |
145 goto found; | |
146 } | |
147 state = ((state << 8) | v) & 0xffffff; | |
148 } | |
149 val = -1; | |
150 found: | |
151 *header_state = state; | |
152 *size_ptr = n; | |
153 return val; | |
154 } | |
155 | |
683
095009fc2f35
kill warnings patch by (M¸«©ns Rullg¸«©rd <mru inprovide com>)
michael
parents:
674
diff
changeset
|
156 #if 0 /* unused, remove? */ |
310 | 157 /* XXX: optimize */ |
158 static int find_prev_start_code(ByteIOContext *pb, int *size_ptr) | |
0 | 159 { |
310 | 160 int64_t pos, pos_start; |
161 int max_size, start_code; | |
162 | |
163 max_size = *size_ptr; | |
164 pos_start = url_ftell(pb); | |
165 | |
166 /* in order to go faster, we fill the buffer */ | |
167 pos = pos_start - 16386; | |
168 if (pos < 0) | |
169 pos = 0; | |
170 url_fseek(pb, pos, SEEK_SET); | |
171 get_byte(pb); | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
291
diff
changeset
|
172 |
310 | 173 pos = pos_start; |
174 for(;;) { | |
175 pos--; | |
176 if (pos < 0 || (pos_start - pos) >= max_size) { | |
177 start_code = -1; | |
178 goto the_end; | |
179 } | |
180 url_fseek(pb, pos, SEEK_SET); | |
181 start_code = get_be32(pb); | |
182 if ((start_code & 0xffffff00) == 0x100) | |
183 break; | |
184 } | |
185 the_end: | |
186 *size_ptr = pos_start - pos; | |
187 return start_code; | |
0 | 188 } |
683
095009fc2f35
kill warnings patch by (M¸«©ns Rullg¸«©rd <mru inprovide com>)
michael
parents:
674
diff
changeset
|
189 #endif |
0 | 190 |
722 | 191 /** |
192 * Extracts stream types from a program stream map | |
193 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35 | |
885 | 194 * |
722 | 195 * @return number of bytes occupied by PSM in the bitstream |
196 */ | |
197 static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb) | |
198 { | |
199 int psm_length, ps_info_length, es_map_length; | |
200 | |
201 psm_length = get_be16(pb); | |
202 get_byte(pb); | |
203 get_byte(pb); | |
204 ps_info_length = get_be16(pb); | |
205 | |
206 /* skip program_stream_info */ | |
207 url_fskip(pb, ps_info_length); | |
208 es_map_length = get_be16(pb); | |
209 | |
210 /* at least one es available? */ | |
211 while (es_map_length >= 4){ | |
3779 | 212 unsigned char type = get_byte(pb); |
213 unsigned char es_id = get_byte(pb); | |
722 | 214 uint16_t es_info_length = get_be16(pb); |
215 /* remember mapping from stream id to stream type */ | |
216 m->psm_es_type[es_id] = type; | |
217 /* skip program_stream_info */ | |
218 url_fskip(pb, es_info_length); | |
219 es_map_length -= 4 + es_info_length; | |
220 } | |
221 get_be32(pb); /* crc32 */ | |
222 return 2 + psm_length; | |
223 } | |
224 | |
885 | 225 /* read the next PES header. Return its position in ppos |
310 | 226 (if not NULL), and its start code, pts and dts. |
227 */ | |
228 static int mpegps_read_pes_header(AVFormatContext *s, | |
885 | 229 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
|
230 int64_t *ppts, int64_t *pdts) |
0 | 231 { |
232 MpegDemuxContext *m = s->priv_data; | |
310 | 233 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
|
234 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
|
235 int64_t pts, dts; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
236 int64_t last_sync= url_ftell(s->pb); |
0 | 237 |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
238 error_redo: |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
239 url_fseek(s->pb, last_sync, SEEK_SET); |
0 | 240 redo: |
310 | 241 /* next start code (should be immediately after) */ |
242 m->header_state = 0xff; | |
243 size = MAX_SYNC_SIZE; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
244 startcode = find_next_start_code(s->pb, &size, &m->header_state); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
245 last_sync = url_ftell(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
246 //printf("startcode=%x pos=0x%"PRIx64"\n", startcode, url_ftell(s->pb)); |
0 | 247 if (startcode < 0) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2177
diff
changeset
|
248 return AVERROR(EIO); |
0 | 249 if (startcode == PACK_START_CODE) |
250 goto redo; | |
251 if (startcode == SYSTEM_HEADER_START_CODE) | |
252 goto redo; | |
2728 | 253 if (startcode == PADDING_STREAM) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
254 url_fskip(s->pb, get_be16(s->pb)); |
2728 | 255 goto redo; |
256 } | |
257 if (startcode == PRIVATE_STREAM_2) { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
258 len = get_be16(s->pb); |
2728 | 259 if (!m->sofdec) { |
260 while (len-- >= 6) { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
261 if (get_byte(s->pb) == 'S') { |
2728 | 262 uint8_t buf[5]; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
263 get_buffer(s->pb, buf, sizeof(buf)); |
2728 | 264 m->sofdec = !memcmp(buf, "ofdec", 5); |
265 len -= sizeof(buf); | |
266 break; | |
267 } | |
268 } | |
269 m->sofdec -= !m->sofdec; | |
270 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
271 url_fskip(s->pb, len); |
0 | 272 goto redo; |
273 } | |
722 | 274 if (startcode == PROGRAM_STREAM_MAP) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
275 mpegps_psm_parse(m, s->pb); |
722 | 276 goto redo; |
277 } | |
885 | 278 |
0 | 279 /* find matching stream */ |
280 if (!((startcode >= 0x1c0 && startcode <= 0x1df) || | |
281 (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
|
282 (startcode == 0x1bd) || (startcode == 0x1fd))) |
0 | 283 goto redo; |
310 | 284 if (ppos) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
285 *ppos = url_ftell(s->pb) - 4; |
310 | 286 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
287 len = get_be16(s->pb); |
1666 | 288 pts = |
0 | 289 dts = AV_NOPTS_VALUE; |
290 /* stuffing */ | |
291 for(;;) { | |
310 | 292 if (len < 1) |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
293 goto error_redo; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
294 c = get_byte(s->pb); |
0 | 295 len--; |
296 /* XXX: for mpeg1, should test only bit 7 */ | |
885 | 297 if (c != 0xff) |
0 | 298 break; |
299 } | |
300 if ((c & 0xc0) == 0x40) { | |
301 /* buffer scale & size */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
302 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
303 c = get_byte(s->pb); |
0 | 304 len -= 2; |
305 } | |
1667 | 306 if ((c & 0xe0) == 0x20) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
307 dts = pts = get_pts(s->pb, c); |
0 | 308 len -= 4; |
1667 | 309 if (c & 0x10){ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
310 dts = get_pts(s->pb, -1); |
1667 | 311 len -= 5; |
312 } | |
0 | 313 } else if ((c & 0xc0) == 0x80) { |
314 /* mpeg 2 PES */ | |
1126 | 315 #if 0 /* some streams have this field set for no apparent reason */ |
0 | 316 if ((c & 0x30) != 0) { |
310 | 317 /* Encrypted multiplex not handled */ |
318 goto redo; | |
0 | 319 } |
1126 | 320 #endif |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
321 flags = get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
322 header_len = get_byte(s->pb); |
0 | 323 len -= 2; |
324 if (header_len > len) | |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
325 goto error_redo; |
1668 | 326 len -= header_len; |
1667 | 327 if (flags & 0x80) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
328 dts = pts = get_pts(s->pb, -1); |
0 | 329 header_len -= 5; |
1667 | 330 if (flags & 0x40) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
331 dts = get_pts(s->pb, -1); |
1667 | 332 header_len -= 5; |
333 } | |
0 | 334 } |
3109
20e070d8706f
Ignore flags after pts/dts if there are no bytes left.
michael
parents:
2934
diff
changeset
|
335 if (flags & 0x3f && header_len == 0){ |
20e070d8706f
Ignore flags after pts/dts if there are no bytes left.
michael
parents:
2934
diff
changeset
|
336 flags &= 0xC0; |
20e070d8706f
Ignore flags after pts/dts if there are no bytes left.
michael
parents:
2934
diff
changeset
|
337 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
|
338 } |
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
|
339 if (flags & 0x01) { /* PES extension */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
340 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
|
341 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
|
342 /* 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
|
343 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
|
344 skip += skip & 0x9; |
3270 | 345 if (pes_ext & 0x40 || skip > header_len){ |
346 av_log(s, AV_LOG_WARNING, "pes_ext %X is invalid\n", pes_ext); | |
347 pes_ext=skip=0; | |
348 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
349 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
|
350 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
|
351 |
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
|
352 if (pes_ext & 0x01) { /* PES extension 2 */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
353 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
|
354 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
|
355 if ((ext2_len & 0x7f) > 0) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
356 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
|
357 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
|
358 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
|
359 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
|
360 } |
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
|
361 } |
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 } |
1668 | 363 if(header_len < 0) |
364 goto error_redo; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
365 url_fskip(s->pb, header_len); |
0 | 366 } |
447
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
367 else if( c!= 0xf ) |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
368 goto redo; |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
369 |
722 | 370 if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
371 startcode = get_byte(s->pb); |
0 | 372 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
|
373 if (startcode >= 0x80 && startcode <= 0xcf) { |
0 | 374 /* audio: skip header */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
375 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
376 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
377 get_byte(s->pb); |
0 | 378 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
|
379 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
|
380 /* MLP/TrueHD audio has a 4-byte header */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
381 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
|
382 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
|
383 } |
0 | 384 } |
385 } | |
1665 | 386 if(len<0) |
387 goto error_redo; | |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
388 if(dts != AV_NOPTS_VALUE && ppos){ |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
389 int i; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
390 for(i=0; i<s->nb_streams; i++){ |
2934 | 391 if(startcode == s->streams[i]->id && |
392 !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
|
393 ff_reduce_index(s, i); |
979 | 394 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
|
395 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
396 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
397 } |
885 | 398 |
310 | 399 *pstart_code = startcode; |
400 *ppts = pts; | |
401 *pdts = dts; | |
402 return len; | |
403 } | |
404 | |
405 static int mpegps_read_packet(AVFormatContext *s, | |
406 AVPacket *pkt) | |
407 { | |
722 | 408 MpegDemuxContext *m = s->priv_data; |
310 | 409 AVStream *st; |
3967 | 410 int len, startcode, i, es_type; |
411 enum CodecID codec_id = CODEC_ID_NONE; | |
412 enum CodecType type; | |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
413 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
|
414 uint8_t av_uninit(dvdaudio_substream_type); |
310 | 415 |
416 redo: | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
417 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts); |
310 | 418 if (len < 0) |
419 return len; | |
885 | 420 |
4450
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
421 if(startcode == 0x1bd) { |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
422 dvdaudio_substream_type = get_byte(s->pb); |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
423 url_fskip(s->pb, 3); |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
424 len -= 4; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
425 } |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
426 |
0 | 427 /* now find stream */ |
428 for(i=0;i<s->nb_streams;i++) { | |
429 st = s->streams[i]; | |
430 if (st->id == startcode) | |
431 goto found; | |
432 } | |
722 | 433 |
434 es_type = m->psm_es_type[startcode & 0xff]; | |
4450
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
435 if(es_type > 0 && es_type != STREAM_TYPE_PRIVATE_DATA){ |
722 | 436 if(es_type == STREAM_TYPE_VIDEO_MPEG1){ |
437 codec_id = CODEC_ID_MPEG2VIDEO; | |
438 type = CODEC_TYPE_VIDEO; | |
439 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){ | |
440 codec_id = CODEC_ID_MPEG2VIDEO; | |
441 type = CODEC_TYPE_VIDEO; | |
442 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 || | |
443 es_type == STREAM_TYPE_AUDIO_MPEG2){ | |
444 codec_id = CODEC_ID_MP3; | |
445 type = CODEC_TYPE_AUDIO; | |
446 } else if(es_type == STREAM_TYPE_AUDIO_AAC){ | |
447 codec_id = CODEC_ID_AAC; | |
448 type = CODEC_TYPE_AUDIO; | |
449 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){ | |
450 codec_id = CODEC_ID_MPEG4; | |
451 type = CODEC_TYPE_VIDEO; | |
452 } else if(es_type == STREAM_TYPE_VIDEO_H264){ | |
453 codec_id = CODEC_ID_H264; | |
454 type = CODEC_TYPE_VIDEO; | |
455 } else if(es_type == STREAM_TYPE_AUDIO_AC3){ | |
456 codec_id = CODEC_ID_AC3; | |
457 type = CODEC_TYPE_AUDIO; | |
458 } else { | |
459 goto skip; | |
460 } | |
461 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) { | |
1146 | 462 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 }; |
463 unsigned char buf[8]; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
464 get_buffer(s->pb, buf, 8); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
465 url_fseek(s->pb, -8, SEEK_CUR); |
1146 | 466 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1)) |
467 codec_id = CODEC_ID_CAVS; | |
468 else | |
3576
270e9f324405
Use CODEC_ID_PROBE when the mpeg-ps demuxer does not know exactly which
michael
parents:
3484
diff
changeset
|
469 codec_id = CODEC_ID_PROBE; |
0 | 470 type = CODEC_TYPE_VIDEO; |
471 } else if (startcode >= 0x1c0 && startcode <= 0x1df) { | |
472 type = CODEC_TYPE_AUDIO; | |
2728 | 473 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
|
474 } else if (startcode >= 0x80 && startcode <= 0x87) { |
0 | 475 type = CODEC_TYPE_AUDIO; |
476 codec_id = CODEC_ID_AC3; | |
3779 | 477 } 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
|
478 ||( 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
|
479 /* 0x90 - 0x97 is reserved for SDDS in DVD specs */ |
496
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
480 type = CODEC_TYPE_AUDIO; |
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
481 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
|
482 } else if (startcode >= 0xa0 && startcode <= 0xaf) { |
41 | 483 type = CODEC_TYPE_AUDIO; |
3305
129d36178a10
support dvd pcm 20/24 bits, patch by Lars T¸«£uber, lars.taeuber gmx net
bcoudurier
parents:
3270
diff
changeset
|
484 /* 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
|
485 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
|
486 } else 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
|
487 type = CODEC_TYPE_AUDIO; |
4750 | 488 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
|
489 } 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
|
490 /* Used for both AC-3 and E-AC-3 in EVOB files */ |
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 type = CODEC_TYPE_AUDIO; |
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
|
492 codec_id = CODEC_ID_AC3; |
783
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
493 } else if (startcode >= 0x20 && startcode <= 0x3f) { |
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
494 type = CODEC_TYPE_SUBTITLE; |
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
495 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
|
496 } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) { |
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
|
497 type = CODEC_TYPE_VIDEO; |
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 codec_id = CODEC_ID_VC1; |
4450
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
499 } else if (startcode == 0x1bd) { |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
500 // check dvd audio substream type |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
501 type = CODEC_TYPE_AUDIO; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
502 switch(dvdaudio_substream_type & 0xe0) { |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
503 case 0xa0: codec_id = CODEC_ID_PCM_DVD; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
504 break; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
505 case 0x80: if((dvdaudio_substream_type & 0xf8) == 0x88) |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
506 codec_id = CODEC_ID_DTS; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
507 else codec_id = CODEC_ID_AC3; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
508 break; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
509 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
|
510 goto skip; |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
511 } |
0 | 512 } else { |
513 skip: | |
514 /* skip packet */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
515 url_fskip(s->pb, len); |
0 | 516 goto redo; |
517 } | |
518 /* no stream found: add a new stream */ | |
519 st = av_new_stream(s, startcode); | |
885 | 520 if (!st) |
0 | 521 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
|
522 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
|
523 st->codec->codec_id = codec_id; |
310 | 524 if (codec_id != CODEC_ID_PCM_S16BE) |
2023 | 525 st->need_parsing = AVSTREAM_PARSE_FULL; |
0 | 526 found: |
708 | 527 if(st->discard >= AVDISCARD_ALL) |
652 | 528 goto skip; |
4450
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
529 if ((startcode >= 0xa0 && startcode <= 0xaf) || |
8f1038d1ee6d
Allow demuxing of audio substreams stored as 0x06 type.
benoit
parents:
4424
diff
changeset
|
530 (startcode == 0x1bd && ((dvdaudio_substream_type & 0xe0) == 0xa0))) { |
41 | 531 int b1, freq; |
532 | |
533 /* for LPCM, we just skip the header and consider it is raw | |
534 audio data */ | |
535 if (len <= 3) | |
536 goto skip; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
537 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
|
538 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
|
539 get_byte(s->pb); /* dynamic range control (0x80 = off) */ |
41 | 540 len -= 3; |
541 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
|
542 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
|
543 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
|
544 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
|
545 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
|
546 st->codec->sample_rate * |
3908
1d3d17de20ba
Bump Major version, this commit is almost just renaming bits_per_sample to
michael
parents:
3779
diff
changeset
|
547 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
|
548 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
|
549 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
|
550 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
|
551 return AVERROR(EINVAL); |
41 | 552 } |
0 | 553 av_new_packet(pkt, len); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
554 get_buffer(s->pb, pkt->data, pkt->size); |
0 | 555 pkt->pts = pts; |
310 | 556 pkt->dts = dts; |
0 | 557 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
|
558 #if 0 |
652 | 559 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n", |
560 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
|
561 #endif |
482 | 562 |
0 | 563 return 0; |
564 } | |
565 | |
885 | 566 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
|
567 int64_t *ppos, int64_t pos_limit) |
310 | 568 { |
569 int len, startcode; | |
570 int64_t pos, pts, dts; | |
571 | |
572 pos = *ppos; | |
573 #ifdef DEBUG_SEEK | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
574 printf("read_dts: pos=0x%"PRIx64" next=%d -> ", pos, find_next); |
310 | 575 #endif |
3398
3fbe87561b73
Check return of url_fseek in mpeg timestamp reading code.
benoit
parents:
3305
diff
changeset
|
576 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
|
577 return AV_NOPTS_VALUE; |
3fbe87561b73
Check return of url_fseek in mpeg timestamp reading code.
benoit
parents:
3305
diff
changeset
|
578 |
310 | 579 for(;;) { |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
580 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts); |
310 | 581 if (len < 0) { |
582 #ifdef DEBUG_SEEK | |
583 printf("none (ret=%d)\n", len); | |
584 #endif | |
585 return AV_NOPTS_VALUE; | |
586 } | |
885 | 587 if (startcode == s->streams[stream_index]->id && |
310 | 588 dts != AV_NOPTS_VALUE) { |
589 break; | |
590 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
591 url_fskip(s->pb, len); |
310 | 592 } |
593 #ifdef DEBUG_SEEK | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
594 printf("pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n", pos, dts, dts / 90000.0); |
310 | 595 #endif |
596 *ppos = pos; | |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
452
diff
changeset
|
597 return dts; |
310 | 598 } |
599 | |
1167 | 600 AVInputFormat mpegps_demuxer = { |
0 | 601 "mpeg", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3398
diff
changeset
|
602 NULL_IF_CONFIG_SMALL("MPEG-PS format"), |
0 | 603 sizeof(MpegDemuxContext), |
604 mpegps_probe, | |
605 mpegps_read_header, | |
606 mpegps_read_packet, | |
3484 | 607 NULL, |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
608 NULL, //mpegps_read_seek, |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
609 mpegps_read_dts, |
3724
178cc6f9d5ec
Add flag to mark demuxers that can output discontinuous timestamps.
michael
parents:
3576
diff
changeset
|
610 .flags = AVFMT_SHOW_IDS|AVFMT_TS_DISCONT, |
0 | 611 }; |