Mercurial > libavformat.hg
annotate mpeg.c @ 2828:ff463ed64256 libavformat
Add FF_OPT_TYPE_BINARY and use it to add a cryptokey option
author | reimar |
---|---|
date | Mon, 17 Dec 2007 17:41:24 +0000 |
parents | 3850229bba07 |
children | 2d7817482abc |
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 |
0 | 3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. |
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 | |
1284 | 35 static int cdxa_probe(AVProbeData *p) |
36 { | |
37 /* check file header */ | |
38 if (p->buf[0] == 'R' && p->buf[1] == 'I' && | |
39 p->buf[2] == 'F' && p->buf[3] == 'F' && | |
40 p->buf[8] == 'C' && p->buf[9] == 'D' && | |
41 p->buf[10] == 'X' && p->buf[11] == 'A') | |
42 return AVPROBE_SCORE_MAX; | |
43 else | |
44 return 0; | |
45 } | |
46 | |
2697
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
47 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
|
48 int pes1; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
49 int pes2= (p[3] & 0xC0) == 0x80 |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
50 && (p[4] & 0xC0) != 0x40 |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
51 &&((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
|
52 |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
53 for(p+=3; p<end && *p == 0xFF; p++); |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
54 if((*p&0xC0) == 0x40) p+=2; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
55 if((*p&0xF0) == 0x20){ |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
56 pes1= p[0]&p[2]&p[4]&1; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
57 p+=5; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
58 }else if((*p&0xF0) == 0x30){ |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
59 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
|
60 p+=10; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
61 }else |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
62 pes1 = *p == 0x0F; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
63 |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
64 return pes1||pes2; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
65 } |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
66 |
0 | 67 static int mpegps_probe(AVProbeData *p) |
68 { | |
936 | 69 uint32_t code= -1; |
2799 | 70 int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0; |
539 | 71 int i; |
1257 | 72 int score=0; |
49 | 73 |
1284 | 74 score = cdxa_probe(p); |
75 if (score > 0) return score; | |
76 | |
77 /* Search for MPEG stream */ | |
936 | 78 for(i=0; i<p->buf_size; i++){ |
79 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
|
80 if ((code & 0xffffff00) == 0x100) { |
2698 | 81 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
|
82 |
1140
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
83 if(code == SYSTEM_HEADER_START_CODE) sys++; |
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
84 else if(code == PRIVATE_STREAM_1) priv1++; |
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
85 else if(code == PACK_START_CODE) pspack++; |
2697
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
86 else if((code & 0xf0) == VIDEO_ID && pes) vid++; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
87 else if((code & 0xe0) == AUDIO_ID && pes) audio++; |
2799 | 88 |
89 else if((code & 0xf0) == VIDEO_ID && !pes) invalid++; | |
90 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
|
91 } |
0 | 92 } |
1257 | 93 |
2799 | 94 if(vid+audio > invalid) /* invalid VDR files nd short PES streams */ |
1257 | 95 score= AVPROBE_SCORE_MAX/4; |
96 | |
2311 | 97 //av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d len:%d\n", sys, priv1, pspack,vid, audio, p->buf_size); |
2799 | 98 if(sys>invalid && sys*9 <= pspack*10) |
936 | 99 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg |
2799 | 100 if(priv1 + vid + audio > invalid && (priv1+vid+audio)*9 <= pspack*10) |
940 | 101 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg |
2312 | 102 if((!!vid ^ !!audio) && (audio+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
|
103 return AVPROBE_SCORE_MAX/2+2; |
1257 | 104 |
105 //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1 | |
106 return score; | |
0 | 107 } |
108 | |
109 | |
110 typedef struct MpegDemuxContext { | |
1332 | 111 int32_t header_state; |
722 | 112 unsigned char psm_es_type[256]; |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
113 int sofdec; |
0 | 114 } MpegDemuxContext; |
115 | |
310 | 116 static int mpegps_read_header(AVFormatContext *s, |
117 AVFormatParameters *ap) | |
118 { | |
119 MpegDemuxContext *m = s->priv_data; | |
2728 | 120 const char *sofdec = "Sofdec"; |
121 int v, i = 0; | |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
122 |
310 | 123 m->header_state = 0xff; |
124 s->ctx_flags |= AVFMTCTX_NOHEADER; | |
125 | |
2728 | 126 m->sofdec = -1; |
127 do { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
128 v = get_byte(s->pb); |
2728 | 129 m->header_state = m->header_state << 8 | v; |
130 m->sofdec++; | |
131 } while (v == sofdec[i] && i++ < 6); | |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
132 |
310 | 133 /* no need to do more */ |
134 return 0; | |
135 } | |
136 | |
137 static int64_t get_pts(ByteIOContext *pb, int c) | |
138 { | |
139 int64_t pts; | |
140 int val; | |
141 | |
142 if (c < 0) | |
143 c = get_byte(pb); | |
144 pts = (int64_t)((c >> 1) & 0x07) << 30; | |
145 val = get_be16(pb); | |
146 pts |= (int64_t)(val >> 1) << 15; | |
147 val = get_be16(pb); | |
148 pts |= (int64_t)(val >> 1); | |
149 return pts; | |
150 } | |
151 | |
885 | 152 static int find_next_start_code(ByteIOContext *pb, int *size_ptr, |
1332 | 153 int32_t *header_state) |
0 | 154 { |
155 unsigned int state, v; | |
156 int val, n; | |
157 | |
158 state = *header_state; | |
159 n = *size_ptr; | |
160 while (n > 0) { | |
161 if (url_feof(pb)) | |
162 break; | |
163 v = get_byte(pb); | |
164 n--; | |
165 if (state == 0x000001) { | |
166 state = ((state << 8) | v) & 0xffffff; | |
167 val = state; | |
168 goto found; | |
169 } | |
170 state = ((state << 8) | v) & 0xffffff; | |
171 } | |
172 val = -1; | |
173 found: | |
174 *header_state = state; | |
175 *size_ptr = n; | |
176 return val; | |
177 } | |
178 | |
683
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
674
diff
changeset
|
179 #if 0 /* unused, remove? */ |
310 | 180 /* XXX: optimize */ |
181 static int find_prev_start_code(ByteIOContext *pb, int *size_ptr) | |
0 | 182 { |
310 | 183 int64_t pos, pos_start; |
184 int max_size, start_code; | |
185 | |
186 max_size = *size_ptr; | |
187 pos_start = url_ftell(pb); | |
188 | |
189 /* in order to go faster, we fill the buffer */ | |
190 pos = pos_start - 16386; | |
191 if (pos < 0) | |
192 pos = 0; | |
193 url_fseek(pb, pos, SEEK_SET); | |
194 get_byte(pb); | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
291
diff
changeset
|
195 |
310 | 196 pos = pos_start; |
197 for(;;) { | |
198 pos--; | |
199 if (pos < 0 || (pos_start - pos) >= max_size) { | |
200 start_code = -1; | |
201 goto the_end; | |
202 } | |
203 url_fseek(pb, pos, SEEK_SET); | |
204 start_code = get_be32(pb); | |
205 if ((start_code & 0xffffff00) == 0x100) | |
206 break; | |
207 } | |
208 the_end: | |
209 *size_ptr = pos_start - pos; | |
210 return start_code; | |
0 | 211 } |
683
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
674
diff
changeset
|
212 #endif |
0 | 213 |
722 | 214 /** |
215 * Extracts stream types from a program stream map | |
216 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35 | |
885 | 217 * |
722 | 218 * @return number of bytes occupied by PSM in the bitstream |
219 */ | |
220 static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb) | |
221 { | |
222 int psm_length, ps_info_length, es_map_length; | |
223 | |
224 psm_length = get_be16(pb); | |
225 get_byte(pb); | |
226 get_byte(pb); | |
227 ps_info_length = get_be16(pb); | |
228 | |
229 /* skip program_stream_info */ | |
230 url_fskip(pb, ps_info_length); | |
231 es_map_length = get_be16(pb); | |
232 | |
233 /* at least one es available? */ | |
234 while (es_map_length >= 4){ | |
235 unsigned char type = get_byte(pb); | |
236 unsigned char es_id = get_byte(pb); | |
237 uint16_t es_info_length = get_be16(pb); | |
238 /* remember mapping from stream id to stream type */ | |
239 m->psm_es_type[es_id] = type; | |
240 /* skip program_stream_info */ | |
241 url_fskip(pb, es_info_length); | |
242 es_map_length -= 4 + es_info_length; | |
243 } | |
244 get_be32(pb); /* crc32 */ | |
245 return 2 + psm_length; | |
246 } | |
247 | |
885 | 248 /* read the next PES header. Return its position in ppos |
310 | 249 (if not NULL), and its start code, pts and dts. |
250 */ | |
251 static int mpegps_read_pes_header(AVFormatContext *s, | |
885 | 252 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
|
253 int64_t *ppts, int64_t *pdts) |
0 | 254 { |
255 MpegDemuxContext *m = s->priv_data; | |
310 | 256 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
|
257 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
|
258 int64_t pts, dts; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
259 int64_t last_sync= url_ftell(s->pb); |
0 | 260 |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
261 error_redo: |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
262 url_fseek(s->pb, last_sync, SEEK_SET); |
0 | 263 redo: |
310 | 264 /* next start code (should be immediately after) */ |
265 m->header_state = 0xff; | |
266 size = MAX_SYNC_SIZE; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
267 startcode = find_next_start_code(s->pb, &size, &m->header_state); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
268 last_sync = url_ftell(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
269 //printf("startcode=%x pos=0x%"PRIx64"\n", startcode, url_ftell(s->pb)); |
0 | 270 if (startcode < 0) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2177
diff
changeset
|
271 return AVERROR(EIO); |
0 | 272 if (startcode == PACK_START_CODE) |
273 goto redo; | |
274 if (startcode == SYSTEM_HEADER_START_CODE) | |
275 goto redo; | |
2728 | 276 if (startcode == PADDING_STREAM) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
277 url_fskip(s->pb, get_be16(s->pb)); |
2728 | 278 goto redo; |
279 } | |
280 if (startcode == PRIVATE_STREAM_2) { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
281 len = get_be16(s->pb); |
2728 | 282 if (!m->sofdec) { |
283 while (len-- >= 6) { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
284 if (get_byte(s->pb) == 'S') { |
2728 | 285 uint8_t buf[5]; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
286 get_buffer(s->pb, buf, sizeof(buf)); |
2728 | 287 m->sofdec = !memcmp(buf, "ofdec", 5); |
288 len -= sizeof(buf); | |
289 break; | |
290 } | |
291 } | |
292 m->sofdec -= !m->sofdec; | |
293 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
294 url_fskip(s->pb, len); |
0 | 295 goto redo; |
296 } | |
722 | 297 if (startcode == PROGRAM_STREAM_MAP) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
298 mpegps_psm_parse(m, s->pb); |
722 | 299 goto redo; |
300 } | |
885 | 301 |
0 | 302 /* find matching stream */ |
303 if (!((startcode >= 0x1c0 && startcode <= 0x1df) || | |
304 (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
|
305 (startcode == 0x1bd) || (startcode == 0x1fd))) |
0 | 306 goto redo; |
310 | 307 if (ppos) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
308 *ppos = url_ftell(s->pb) - 4; |
310 | 309 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
310 len = get_be16(s->pb); |
1666 | 311 pts = |
0 | 312 dts = AV_NOPTS_VALUE; |
313 /* stuffing */ | |
314 for(;;) { | |
310 | 315 if (len < 1) |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
316 goto error_redo; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
317 c = get_byte(s->pb); |
0 | 318 len--; |
319 /* XXX: for mpeg1, should test only bit 7 */ | |
885 | 320 if (c != 0xff) |
0 | 321 break; |
322 } | |
323 if ((c & 0xc0) == 0x40) { | |
324 /* buffer scale & size */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
325 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
326 c = get_byte(s->pb); |
0 | 327 len -= 2; |
328 } | |
1667 | 329 if ((c & 0xe0) == 0x20) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
330 dts = pts = get_pts(s->pb, c); |
0 | 331 len -= 4; |
1667 | 332 if (c & 0x10){ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
333 dts = get_pts(s->pb, -1); |
1667 | 334 len -= 5; |
335 } | |
0 | 336 } else if ((c & 0xc0) == 0x80) { |
337 /* mpeg 2 PES */ | |
1126 | 338 #if 0 /* some streams have this field set for no apparent reason */ |
0 | 339 if ((c & 0x30) != 0) { |
310 | 340 /* Encrypted multiplex not handled */ |
341 goto redo; | |
0 | 342 } |
1126 | 343 #endif |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
344 flags = get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
345 header_len = get_byte(s->pb); |
0 | 346 len -= 2; |
347 if (header_len > len) | |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
348 goto error_redo; |
1668 | 349 len -= header_len; |
1667 | 350 if (flags & 0x80) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
351 dts = pts = get_pts(s->pb, -1); |
0 | 352 header_len -= 5; |
1667 | 353 if (flags & 0x40) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
354 dts = get_pts(s->pb, -1); |
1667 | 355 header_len -= 5; |
356 } | |
0 | 357 } |
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
|
358 if (flags & 0x01) { /* PES extension */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
359 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
|
360 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
|
361 if (pes_ext & 0x40) { /* pack header - should be zero in PS */ |
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 goto error_redo; |
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 /* 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
|
365 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
|
366 skip += skip & 0x9; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
367 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
|
368 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
|
369 |
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 if (pes_ext & 0x01) { /* PES extension 2 */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
371 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
|
372 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
|
373 if ((ext2_len & 0x7f) > 0) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
374 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
|
375 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
|
376 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
|
377 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
|
378 } |
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 } |
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 } |
1668 | 381 if(header_len < 0) |
382 goto error_redo; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
383 url_fskip(s->pb, header_len); |
0 | 384 } |
447
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
385 else if( c!= 0xf ) |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
386 goto redo; |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
387 |
722 | 388 if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
389 startcode = get_byte(s->pb); |
0 | 390 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
|
391 if (startcode >= 0x80 && startcode <= 0xcf) { |
0 | 392 /* audio: skip header */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
393 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
394 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
395 get_byte(s->pb); |
0 | 396 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
|
397 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
|
398 /* MLP/TrueHD audio has a 4-byte header */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
399 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
|
400 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
|
401 } |
0 | 402 } |
403 } | |
1665 | 404 if(len<0) |
405 goto error_redo; | |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
406 if(dts != AV_NOPTS_VALUE && ppos){ |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
407 int i; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
408 for(i=0; i<s->nb_streams; i++){ |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
409 if(startcode == s->streams[i]->id) { |
979 | 410 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
|
411 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
412 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
413 } |
885 | 414 |
310 | 415 *pstart_code = startcode; |
416 *ppts = pts; | |
417 *pdts = dts; | |
418 return len; | |
419 } | |
420 | |
421 static int mpegps_read_packet(AVFormatContext *s, | |
422 AVPacket *pkt) | |
423 { | |
722 | 424 MpegDemuxContext *m = s->priv_data; |
310 | 425 AVStream *st; |
722 | 426 int len, startcode, i, type, codec_id = 0, es_type; |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
427 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work |
310 | 428 |
429 redo: | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
430 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts); |
310 | 431 if (len < 0) |
432 return len; | |
885 | 433 |
0 | 434 /* now find stream */ |
435 for(i=0;i<s->nb_streams;i++) { | |
436 st = s->streams[i]; | |
437 if (st->id == startcode) | |
438 goto found; | |
439 } | |
722 | 440 |
441 es_type = m->psm_es_type[startcode & 0xff]; | |
442 if(es_type > 0){ | |
443 if(es_type == STREAM_TYPE_VIDEO_MPEG1){ | |
444 codec_id = CODEC_ID_MPEG2VIDEO; | |
445 type = CODEC_TYPE_VIDEO; | |
446 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){ | |
447 codec_id = CODEC_ID_MPEG2VIDEO; | |
448 type = CODEC_TYPE_VIDEO; | |
449 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 || | |
450 es_type == STREAM_TYPE_AUDIO_MPEG2){ | |
451 codec_id = CODEC_ID_MP3; | |
452 type = CODEC_TYPE_AUDIO; | |
453 } else if(es_type == STREAM_TYPE_AUDIO_AAC){ | |
454 codec_id = CODEC_ID_AAC; | |
455 type = CODEC_TYPE_AUDIO; | |
456 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){ | |
457 codec_id = CODEC_ID_MPEG4; | |
458 type = CODEC_TYPE_VIDEO; | |
459 } else if(es_type == STREAM_TYPE_VIDEO_H264){ | |
460 codec_id = CODEC_ID_H264; | |
461 type = CODEC_TYPE_VIDEO; | |
462 } else if(es_type == STREAM_TYPE_AUDIO_AC3){ | |
463 codec_id = CODEC_ID_AC3; | |
464 type = CODEC_TYPE_AUDIO; | |
465 } else { | |
466 goto skip; | |
467 } | |
468 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) { | |
1146 | 469 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 }; |
470 unsigned char buf[8]; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
471 get_buffer(s->pb, buf, 8); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
472 url_fseek(s->pb, -8, SEEK_CUR); |
1146 | 473 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1)) |
474 codec_id = CODEC_ID_CAVS; | |
475 else | |
476 codec_id = CODEC_ID_MPEG2VIDEO; | |
0 | 477 type = CODEC_TYPE_VIDEO; |
478 } else if (startcode >= 0x1c0 && startcode <= 0x1df) { | |
479 type = CODEC_TYPE_AUDIO; | |
2728 | 480 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
|
481 } else if (startcode >= 0x80 && startcode <= 0x87) { |
0 | 482 type = CODEC_TYPE_AUDIO; |
483 codec_id = CODEC_ID_AC3; | |
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
|
484 } else if ((startcode >= 0x88 && startcode <= 0x8f) |
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
|
485 ||( 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
|
486 /* 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
|
487 type = CODEC_TYPE_AUDIO; |
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
488 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
|
489 } else if (startcode >= 0xa0 && startcode <= 0xaf) { |
41 | 490 type = CODEC_TYPE_AUDIO; |
491 codec_id = CODEC_ID_PCM_S16BE; | |
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
|
492 } 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
|
493 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
|
494 codec_id = CODEC_ID_MLP; |
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
|
495 } 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
|
496 /* 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
|
497 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
|
498 codec_id = CODEC_ID_AC3; |
783
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
499 } else if (startcode >= 0x20 && startcode <= 0x3f) { |
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
500 type = CODEC_TYPE_SUBTITLE; |
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
501 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
|
502 } 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
|
503 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
|
504 codec_id = CODEC_ID_VC1; |
0 | 505 } else { |
506 skip: | |
507 /* skip packet */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
508 url_fskip(s->pb, len); |
0 | 509 goto redo; |
510 } | |
511 /* no stream found: add a new stream */ | |
512 st = av_new_stream(s, startcode); | |
885 | 513 if (!st) |
0 | 514 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
|
515 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
|
516 st->codec->codec_id = codec_id; |
310 | 517 if (codec_id != CODEC_ID_PCM_S16BE) |
2023 | 518 st->need_parsing = AVSTREAM_PARSE_FULL; |
0 | 519 found: |
708 | 520 if(st->discard >= AVDISCARD_ALL) |
652 | 521 goto 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
|
522 if (startcode >= 0xa0 && startcode <= 0xaf) { |
41 | 523 int b1, freq; |
524 | |
525 /* for LPCM, we just skip the header and consider it is raw | |
526 audio data */ | |
527 if (len <= 3) | |
528 goto skip; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
529 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
|
530 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
|
531 get_byte(s->pb); /* dynamic range control (0x80 = off) */ |
41 | 532 len -= 3; |
533 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
|
534 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
|
535 st->codec->channels = 1 + (b1 & 7); |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
789
diff
changeset
|
536 st->codec->bit_rate = st->codec->channels * st->codec->sample_rate * 2; |
41 | 537 } |
0 | 538 av_new_packet(pkt, len); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
539 get_buffer(s->pb, pkt->data, pkt->size); |
0 | 540 pkt->pts = pts; |
310 | 541 pkt->dts = dts; |
0 | 542 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
|
543 #if 0 |
652 | 544 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n", |
545 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
|
546 #endif |
482 | 547 |
0 | 548 return 0; |
549 } | |
550 | |
551 static int mpegps_read_close(AVFormatContext *s) | |
552 { | |
553 return 0; | |
554 } | |
555 | |
885 | 556 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
|
557 int64_t *ppos, int64_t pos_limit) |
310 | 558 { |
559 int len, startcode; | |
560 int64_t pos, pts, dts; | |
561 | |
562 pos = *ppos; | |
563 #ifdef DEBUG_SEEK | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
564 printf("read_dts: pos=0x%"PRIx64" next=%d -> ", pos, find_next); |
310 | 565 #endif |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
566 url_fseek(s->pb, pos, SEEK_SET); |
310 | 567 for(;;) { |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
568 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts); |
310 | 569 if (len < 0) { |
570 #ifdef DEBUG_SEEK | |
571 printf("none (ret=%d)\n", len); | |
572 #endif | |
573 return AV_NOPTS_VALUE; | |
574 } | |
885 | 575 if (startcode == s->streams[stream_index]->id && |
310 | 576 dts != AV_NOPTS_VALUE) { |
577 break; | |
578 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
579 url_fskip(s->pb, len); |
310 | 580 } |
581 #ifdef DEBUG_SEEK | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
582 printf("pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n", pos, dts, dts / 90000.0); |
310 | 583 #endif |
584 *ppos = pos; | |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
452
diff
changeset
|
585 return dts; |
310 | 586 } |
587 | |
1167 | 588 AVInputFormat mpegps_demuxer = { |
0 | 589 "mpeg", |
590 "MPEG PS format", | |
591 sizeof(MpegDemuxContext), | |
592 mpegps_probe, | |
593 mpegps_read_header, | |
594 mpegps_read_packet, | |
595 mpegps_read_close, | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
596 NULL, //mpegps_read_seek, |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
597 mpegps_read_dts, |
783
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
598 .flags = AVFMT_SHOW_IDS, |
0 | 599 }; |