Mercurial > libavformat.hg
annotate mpeg.c @ 2892:0d82fdf4fa94 libavformat
Split the RTP muxer out of rtp.c, to simplify the RTSP demuxer's dependencies
author | lucabe |
---|---|
date | Fri, 04 Jan 2008 20:09:48 +0000 |
parents | 8fa014a92350 |
children | e5dfe3c96f3b |
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 | |
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 p+=5; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
46 }else if((*p&0xF0) == 0x30){ |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
47 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
|
48 p+=10; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
49 }else |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
50 pes1 = *p == 0x0F; |
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 return pes1||pes2; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
53 } |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
54 |
0 | 55 static int mpegps_probe(AVProbeData *p) |
56 { | |
936 | 57 uint32_t code= -1; |
2799 | 58 int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0; |
539 | 59 int i; |
1257 | 60 int score=0; |
49 | 61 |
936 | 62 for(i=0; i<p->buf_size; i++){ |
63 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
|
64 if ((code & 0xffffff00) == 0x100) { |
2698 | 65 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
|
66 |
1140
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
67 if(code == SYSTEM_HEADER_START_CODE) sys++; |
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
68 else if(code == PRIVATE_STREAM_1) priv1++; |
2cfb5e02b299
detect audio-only program streams and broken files made by VDR
mru
parents:
1138
diff
changeset
|
69 else if(code == PACK_START_CODE) pspack++; |
2697
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
70 else if((code & 0xf0) == VIDEO_ID && pes) vid++; |
afbdd52324e3
fix misdetection of mp3could_not_find_codec_parameters.mp3
michael
parents:
2695
diff
changeset
|
71 else if((code & 0xe0) == AUDIO_ID && pes) audio++; |
2799 | 72 |
73 else if((code & 0xf0) == VIDEO_ID && !pes) invalid++; | |
74 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
|
75 } |
0 | 76 } |
1257 | 77 |
2799 | 78 if(vid+audio > invalid) /* invalid VDR files nd short PES streams */ |
1257 | 79 score= AVPROBE_SCORE_MAX/4; |
80 | |
2311 | 81 //av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d len:%d\n", sys, priv1, pspack,vid, audio, p->buf_size); |
2799 | 82 if(sys>invalid && sys*9 <= pspack*10) |
936 | 83 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg |
2799 | 84 if(priv1 + vid + audio > invalid && (priv1+vid+audio)*9 <= pspack*10) |
940 | 85 return AVPROBE_SCORE_MAX/2+2; // +1 for .mpg |
2312 | 86 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
|
87 return AVPROBE_SCORE_MAX/2+2; |
1257 | 88 |
89 //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1 | |
90 return score; | |
0 | 91 } |
92 | |
93 | |
94 typedef struct MpegDemuxContext { | |
1332 | 95 int32_t header_state; |
722 | 96 unsigned char psm_es_type[256]; |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
97 int sofdec; |
0 | 98 } MpegDemuxContext; |
99 | |
310 | 100 static int mpegps_read_header(AVFormatContext *s, |
101 AVFormatParameters *ap) | |
102 { | |
103 MpegDemuxContext *m = s->priv_data; | |
2728 | 104 const char *sofdec = "Sofdec"; |
105 int v, i = 0; | |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
106 |
310 | 107 m->header_state = 0xff; |
108 s->ctx_flags |= AVFMTCTX_NOHEADER; | |
109 | |
2728 | 110 m->sofdec = -1; |
111 do { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
112 v = get_byte(s->pb); |
2728 | 113 m->header_state = m->header_state << 8 | v; |
114 m->sofdec++; | |
115 } while (v == sofdec[i] && i++ < 6); | |
2718
1bbb4fa1cdcd
correctly set audio codec when demuxing sofdec files
aurel
parents:
2698
diff
changeset
|
116 |
310 | 117 /* no need to do more */ |
118 return 0; | |
119 } | |
120 | |
121 static int64_t get_pts(ByteIOContext *pb, int c) | |
122 { | |
123 int64_t pts; | |
124 int val; | |
125 | |
126 if (c < 0) | |
127 c = get_byte(pb); | |
2886 | 128 pts = (int64_t)(c & 0x0e) << 29; |
310 | 129 val = get_be16(pb); |
130 pts |= (int64_t)(val >> 1) << 15; | |
131 val = get_be16(pb); | |
132 pts |= (int64_t)(val >> 1); | |
133 return pts; | |
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){ | |
219 unsigned char type = get_byte(pb); | |
220 unsigned char es_id = get_byte(pb); | |
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)); |
0 | 254 if (startcode < 0) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2177
diff
changeset
|
255 return AVERROR(EIO); |
0 | 256 if (startcode == PACK_START_CODE) |
257 goto redo; | |
258 if (startcode == SYSTEM_HEADER_START_CODE) | |
259 goto redo; | |
2728 | 260 if (startcode == PADDING_STREAM) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
261 url_fskip(s->pb, get_be16(s->pb)); |
2728 | 262 goto redo; |
263 } | |
264 if (startcode == PRIVATE_STREAM_2) { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
265 len = get_be16(s->pb); |
2728 | 266 if (!m->sofdec) { |
267 while (len-- >= 6) { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
268 if (get_byte(s->pb) == 'S') { |
2728 | 269 uint8_t buf[5]; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
270 get_buffer(s->pb, buf, sizeof(buf)); |
2728 | 271 m->sofdec = !memcmp(buf, "ofdec", 5); |
272 len -= sizeof(buf); | |
273 break; | |
274 } | |
275 } | |
276 m->sofdec -= !m->sofdec; | |
277 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
278 url_fskip(s->pb, len); |
0 | 279 goto redo; |
280 } | |
722 | 281 if (startcode == PROGRAM_STREAM_MAP) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
282 mpegps_psm_parse(m, s->pb); |
722 | 283 goto redo; |
284 } | |
885 | 285 |
0 | 286 /* find matching stream */ |
287 if (!((startcode >= 0x1c0 && startcode <= 0x1df) || | |
288 (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
|
289 (startcode == 0x1bd) || (startcode == 0x1fd))) |
0 | 290 goto redo; |
310 | 291 if (ppos) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
292 *ppos = url_ftell(s->pb) - 4; |
310 | 293 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
294 len = get_be16(s->pb); |
1666 | 295 pts = |
0 | 296 dts = AV_NOPTS_VALUE; |
297 /* stuffing */ | |
298 for(;;) { | |
310 | 299 if (len < 1) |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
300 goto error_redo; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
301 c = get_byte(s->pb); |
0 | 302 len--; |
303 /* XXX: for mpeg1, should test only bit 7 */ | |
885 | 304 if (c != 0xff) |
0 | 305 break; |
306 } | |
307 if ((c & 0xc0) == 0x40) { | |
308 /* buffer scale & size */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
309 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
310 c = get_byte(s->pb); |
0 | 311 len -= 2; |
312 } | |
1667 | 313 if ((c & 0xe0) == 0x20) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
314 dts = pts = get_pts(s->pb, c); |
0 | 315 len -= 4; |
1667 | 316 if (c & 0x10){ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
317 dts = get_pts(s->pb, -1); |
1667 | 318 len -= 5; |
319 } | |
0 | 320 } else if ((c & 0xc0) == 0x80) { |
321 /* mpeg 2 PES */ | |
1126 | 322 #if 0 /* some streams have this field set for no apparent reason */ |
0 | 323 if ((c & 0x30) != 0) { |
310 | 324 /* Encrypted multiplex not handled */ |
325 goto redo; | |
0 | 326 } |
1126 | 327 #endif |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
328 flags = get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
329 header_len = get_byte(s->pb); |
0 | 330 len -= 2; |
331 if (header_len > len) | |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
332 goto error_redo; |
1668 | 333 len -= header_len; |
1667 | 334 if (flags & 0x80) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
335 dts = pts = get_pts(s->pb, -1); |
0 | 336 header_len -= 5; |
1667 | 337 if (flags & 0x40) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
338 dts = get_pts(s->pb, -1); |
1667 | 339 header_len -= 5; |
340 } | |
0 | 341 } |
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
|
342 if (flags & 0x01) { /* PES extension */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
343 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
|
344 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
|
345 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
|
346 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
|
347 } |
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
|
348 /* 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
|
349 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
|
350 skip += skip & 0x9; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
351 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
|
352 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
|
353 |
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 if (pes_ext & 0x01) { /* PES extension 2 */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
355 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
|
356 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
|
357 if ((ext2_len & 0x7f) > 0) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
358 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
|
359 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
|
360 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
|
361 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
|
362 } |
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 } |
1668 | 365 if(header_len < 0) |
366 goto error_redo; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
367 url_fskip(s->pb, header_len); |
0 | 368 } |
447
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
369 else if( c!= 0xf ) |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
370 goto redo; |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
371 |
722 | 372 if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
373 startcode = get_byte(s->pb); |
0 | 374 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
|
375 if (startcode >= 0x80 && startcode <= 0xcf) { |
0 | 376 /* audio: skip header */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
377 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
378 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
379 get_byte(s->pb); |
0 | 380 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
|
381 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
|
382 /* MLP/TrueHD audio has a 4-byte header */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
383 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
|
384 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
|
385 } |
0 | 386 } |
387 } | |
1665 | 388 if(len<0) |
389 goto error_redo; | |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
390 if(dts != AV_NOPTS_VALUE && ppos){ |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
391 int i; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
392 for(i=0; i<s->nb_streams; i++){ |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
393 if(startcode == s->streams[i]->id) { |
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; |
722 | 410 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
|
411 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work |
310 | 412 |
413 redo: | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
414 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts); |
310 | 415 if (len < 0) |
416 return len; | |
885 | 417 |
0 | 418 /* now find stream */ |
419 for(i=0;i<s->nb_streams;i++) { | |
420 st = s->streams[i]; | |
421 if (st->id == startcode) | |
422 goto found; | |
423 } | |
722 | 424 |
425 es_type = m->psm_es_type[startcode & 0xff]; | |
426 if(es_type > 0){ | |
427 if(es_type == STREAM_TYPE_VIDEO_MPEG1){ | |
428 codec_id = CODEC_ID_MPEG2VIDEO; | |
429 type = CODEC_TYPE_VIDEO; | |
430 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){ | |
431 codec_id = CODEC_ID_MPEG2VIDEO; | |
432 type = CODEC_TYPE_VIDEO; | |
433 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 || | |
434 es_type == STREAM_TYPE_AUDIO_MPEG2){ | |
435 codec_id = CODEC_ID_MP3; | |
436 type = CODEC_TYPE_AUDIO; | |
437 } else if(es_type == STREAM_TYPE_AUDIO_AAC){ | |
438 codec_id = CODEC_ID_AAC; | |
439 type = CODEC_TYPE_AUDIO; | |
440 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){ | |
441 codec_id = CODEC_ID_MPEG4; | |
442 type = CODEC_TYPE_VIDEO; | |
443 } else if(es_type == STREAM_TYPE_VIDEO_H264){ | |
444 codec_id = CODEC_ID_H264; | |
445 type = CODEC_TYPE_VIDEO; | |
446 } else if(es_type == STREAM_TYPE_AUDIO_AC3){ | |
447 codec_id = CODEC_ID_AC3; | |
448 type = CODEC_TYPE_AUDIO; | |
449 } else { | |
450 goto skip; | |
451 } | |
452 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) { | |
1146 | 453 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 }; |
454 unsigned char buf[8]; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
455 get_buffer(s->pb, buf, 8); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
456 url_fseek(s->pb, -8, SEEK_CUR); |
1146 | 457 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1)) |
458 codec_id = CODEC_ID_CAVS; | |
459 else | |
460 codec_id = CODEC_ID_MPEG2VIDEO; | |
0 | 461 type = CODEC_TYPE_VIDEO; |
462 } else if (startcode >= 0x1c0 && startcode <= 0x1df) { | |
463 type = CODEC_TYPE_AUDIO; | |
2728 | 464 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
|
465 } else if (startcode >= 0x80 && startcode <= 0x87) { |
0 | 466 type = CODEC_TYPE_AUDIO; |
467 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
|
468 } 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
|
469 ||( 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
|
470 /* 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
|
471 type = CODEC_TYPE_AUDIO; |
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
472 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
|
473 } else if (startcode >= 0xa0 && startcode <= 0xaf) { |
41 | 474 type = CODEC_TYPE_AUDIO; |
475 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
|
476 } 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
|
477 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
|
478 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
|
479 } 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
|
480 /* 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
|
481 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
|
482 codec_id = CODEC_ID_AC3; |
783
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
483 } else if (startcode >= 0x20 && startcode <= 0x3f) { |
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
484 type = CODEC_TYPE_SUBTITLE; |
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
485 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
|
486 } 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
|
487 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
|
488 codec_id = CODEC_ID_VC1; |
0 | 489 } else { |
490 skip: | |
491 /* skip packet */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
492 url_fskip(s->pb, len); |
0 | 493 goto redo; |
494 } | |
495 /* no stream found: add a new stream */ | |
496 st = av_new_stream(s, startcode); | |
885 | 497 if (!st) |
0 | 498 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
|
499 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
|
500 st->codec->codec_id = codec_id; |
310 | 501 if (codec_id != CODEC_ID_PCM_S16BE) |
2023 | 502 st->need_parsing = AVSTREAM_PARSE_FULL; |
0 | 503 found: |
708 | 504 if(st->discard >= AVDISCARD_ALL) |
652 | 505 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
|
506 if (startcode >= 0xa0 && startcode <= 0xaf) { |
41 | 507 int b1, freq; |
508 | |
509 /* for LPCM, we just skip the header and consider it is raw | |
510 audio data */ | |
511 if (len <= 3) | |
512 goto skip; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
513 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
|
514 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
|
515 get_byte(s->pb); /* dynamic range control (0x80 = off) */ |
41 | 516 len -= 3; |
517 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
|
518 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
|
519 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
|
520 st->codec->bit_rate = st->codec->channels * st->codec->sample_rate * 2; |
41 | 521 } |
0 | 522 av_new_packet(pkt, len); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
523 get_buffer(s->pb, pkt->data, pkt->size); |
0 | 524 pkt->pts = pts; |
310 | 525 pkt->dts = dts; |
0 | 526 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
|
527 #if 0 |
652 | 528 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n", |
529 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
|
530 #endif |
482 | 531 |
0 | 532 return 0; |
533 } | |
534 | |
535 static int mpegps_read_close(AVFormatContext *s) | |
536 { | |
537 return 0; | |
538 } | |
539 | |
885 | 540 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
|
541 int64_t *ppos, int64_t pos_limit) |
310 | 542 { |
543 int len, startcode; | |
544 int64_t pos, pts, dts; | |
545 | |
546 pos = *ppos; | |
547 #ifdef DEBUG_SEEK | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
548 printf("read_dts: pos=0x%"PRIx64" next=%d -> ", pos, find_next); |
310 | 549 #endif |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
550 url_fseek(s->pb, pos, SEEK_SET); |
310 | 551 for(;;) { |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
552 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts); |
310 | 553 if (len < 0) { |
554 #ifdef DEBUG_SEEK | |
555 printf("none (ret=%d)\n", len); | |
556 #endif | |
557 return AV_NOPTS_VALUE; | |
558 } | |
885 | 559 if (startcode == s->streams[stream_index]->id && |
310 | 560 dts != AV_NOPTS_VALUE) { |
561 break; | |
562 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
563 url_fskip(s->pb, len); |
310 | 564 } |
565 #ifdef DEBUG_SEEK | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
566 printf("pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n", pos, dts, dts / 90000.0); |
310 | 567 #endif |
568 *ppos = pos; | |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
452
diff
changeset
|
569 return dts; |
310 | 570 } |
571 | |
1167 | 572 AVInputFormat mpegps_demuxer = { |
0 | 573 "mpeg", |
574 "MPEG PS format", | |
575 sizeof(MpegDemuxContext), | |
576 mpegps_probe, | |
577 mpegps_read_header, | |
578 mpegps_read_packet, | |
579 mpegps_read_close, | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
580 NULL, //mpegps_read_seek, |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
581 mpegps_read_dts, |
783
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
582 .flags = AVFMT_SHOW_IDS, |
0 | 583 }; |