Mercurial > libavformat.hg
annotate mpeg.c @ 3248:7fe0c156ed74 libavformat
minor memleak
author | michael |
---|---|
date | Thu, 24 Apr 2008 23:09:28 +0000 |
parents | 20e070d8706f |
children | 567f8a365db0 |
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 { | |
2906
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
123 uint8_t buf[5]; |
310 | 124 |
2906
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
125 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
|
126 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
|
127 |
e5dfe3c96f3b
Move parsing of MPEG-PES timestamp to mpeg.h (as an inline function) so it
ivo
parents:
2886
diff
changeset
|
128 return ff_parse_pes_pts(buf); |
310 | 129 } |
130 | |
885 | 131 static int find_next_start_code(ByteIOContext *pb, int *size_ptr, |
1332 | 132 int32_t *header_state) |
0 | 133 { |
134 unsigned int state, v; | |
135 int val, n; | |
136 | |
137 state = *header_state; | |
138 n = *size_ptr; | |
139 while (n > 0) { | |
140 if (url_feof(pb)) | |
141 break; | |
142 v = get_byte(pb); | |
143 n--; | |
144 if (state == 0x000001) { | |
145 state = ((state << 8) | v) & 0xffffff; | |
146 val = state; | |
147 goto found; | |
148 } | |
149 state = ((state << 8) | v) & 0xffffff; | |
150 } | |
151 val = -1; | |
152 found: | |
153 *header_state = state; | |
154 *size_ptr = n; | |
155 return val; | |
156 } | |
157 | |
683
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
674
diff
changeset
|
158 #if 0 /* unused, remove? */ |
310 | 159 /* XXX: optimize */ |
160 static int find_prev_start_code(ByteIOContext *pb, int *size_ptr) | |
0 | 161 { |
310 | 162 int64_t pos, pos_start; |
163 int max_size, start_code; | |
164 | |
165 max_size = *size_ptr; | |
166 pos_start = url_ftell(pb); | |
167 | |
168 /* in order to go faster, we fill the buffer */ | |
169 pos = pos_start - 16386; | |
170 if (pos < 0) | |
171 pos = 0; | |
172 url_fseek(pb, pos, SEEK_SET); | |
173 get_byte(pb); | |
293
62cec412a186
make AVFMT_NOHEADER flag dynamic - added av_open_input_stream()
bellard
parents:
291
diff
changeset
|
174 |
310 | 175 pos = pos_start; |
176 for(;;) { | |
177 pos--; | |
178 if (pos < 0 || (pos_start - pos) >= max_size) { | |
179 start_code = -1; | |
180 goto the_end; | |
181 } | |
182 url_fseek(pb, pos, SEEK_SET); | |
183 start_code = get_be32(pb); | |
184 if ((start_code & 0xffffff00) == 0x100) | |
185 break; | |
186 } | |
187 the_end: | |
188 *size_ptr = pos_start - pos; | |
189 return start_code; | |
0 | 190 } |
683
095009fc2f35
kill warnings patch by (M«©ns Rullg«©rd <mru inprovide com>)
michael
parents:
674
diff
changeset
|
191 #endif |
0 | 192 |
722 | 193 /** |
194 * Extracts stream types from a program stream map | |
195 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35 | |
885 | 196 * |
722 | 197 * @return number of bytes occupied by PSM in the bitstream |
198 */ | |
199 static long mpegps_psm_parse(MpegDemuxContext *m, ByteIOContext *pb) | |
200 { | |
201 int psm_length, ps_info_length, es_map_length; | |
202 | |
203 psm_length = get_be16(pb); | |
204 get_byte(pb); | |
205 get_byte(pb); | |
206 ps_info_length = get_be16(pb); | |
207 | |
208 /* skip program_stream_info */ | |
209 url_fskip(pb, ps_info_length); | |
210 es_map_length = get_be16(pb); | |
211 | |
212 /* at least one es available? */ | |
213 while (es_map_length >= 4){ | |
214 unsigned char type = get_byte(pb); | |
215 unsigned char es_id = get_byte(pb); | |
216 uint16_t es_info_length = get_be16(pb); | |
217 /* remember mapping from stream id to stream type */ | |
218 m->psm_es_type[es_id] = type; | |
219 /* skip program_stream_info */ | |
220 url_fskip(pb, es_info_length); | |
221 es_map_length -= 4 + es_info_length; | |
222 } | |
223 get_be32(pb); /* crc32 */ | |
224 return 2 + psm_length; | |
225 } | |
226 | |
885 | 227 /* read the next PES header. Return its position in ppos |
310 | 228 (if not NULL), and its start code, pts and dts. |
229 */ | |
230 static int mpegps_read_pes_header(AVFormatContext *s, | |
885 | 231 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
|
232 int64_t *ppts, int64_t *pdts) |
0 | 233 { |
234 MpegDemuxContext *m = s->priv_data; | |
310 | 235 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
|
236 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
|
237 int64_t pts, dts; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
238 int64_t last_sync= url_ftell(s->pb); |
0 | 239 |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
240 error_redo: |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
241 url_fseek(s->pb, last_sync, SEEK_SET); |
0 | 242 redo: |
310 | 243 /* next start code (should be immediately after) */ |
244 m->header_state = 0xff; | |
245 size = MAX_SYNC_SIZE; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
246 startcode = find_next_start_code(s->pb, &size, &m->header_state); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
247 last_sync = url_ftell(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
248 //printf("startcode=%x pos=0x%"PRIx64"\n", startcode, url_ftell(s->pb)); |
0 | 249 if (startcode < 0) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2177
diff
changeset
|
250 return AVERROR(EIO); |
0 | 251 if (startcode == PACK_START_CODE) |
252 goto redo; | |
253 if (startcode == SYSTEM_HEADER_START_CODE) | |
254 goto redo; | |
2728 | 255 if (startcode == PADDING_STREAM) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
256 url_fskip(s->pb, get_be16(s->pb)); |
2728 | 257 goto redo; |
258 } | |
259 if (startcode == PRIVATE_STREAM_2) { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
260 len = get_be16(s->pb); |
2728 | 261 if (!m->sofdec) { |
262 while (len-- >= 6) { | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
263 if (get_byte(s->pb) == 'S') { |
2728 | 264 uint8_t buf[5]; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
265 get_buffer(s->pb, buf, sizeof(buf)); |
2728 | 266 m->sofdec = !memcmp(buf, "ofdec", 5); |
267 len -= sizeof(buf); | |
268 break; | |
269 } | |
270 } | |
271 m->sofdec -= !m->sofdec; | |
272 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
273 url_fskip(s->pb, len); |
0 | 274 goto redo; |
275 } | |
722 | 276 if (startcode == PROGRAM_STREAM_MAP) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
277 mpegps_psm_parse(m, s->pb); |
722 | 278 goto redo; |
279 } | |
885 | 280 |
0 | 281 /* find matching stream */ |
282 if (!((startcode >= 0x1c0 && startcode <= 0x1df) || | |
283 (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
|
284 (startcode == 0x1bd) || (startcode == 0x1fd))) |
0 | 285 goto redo; |
310 | 286 if (ppos) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
287 *ppos = url_ftell(s->pb) - 4; |
310 | 288 } |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
289 len = get_be16(s->pb); |
1666 | 290 pts = |
0 | 291 dts = AV_NOPTS_VALUE; |
292 /* stuffing */ | |
293 for(;;) { | |
310 | 294 if (len < 1) |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
295 goto error_redo; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
296 c = get_byte(s->pb); |
0 | 297 len--; |
298 /* XXX: for mpeg1, should test only bit 7 */ | |
885 | 299 if (c != 0xff) |
0 | 300 break; |
301 } | |
302 if ((c & 0xc0) == 0x40) { | |
303 /* buffer scale & size */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
304 get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
305 c = get_byte(s->pb); |
0 | 306 len -= 2; |
307 } | |
1667 | 308 if ((c & 0xe0) == 0x20) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
309 dts = pts = get_pts(s->pb, c); |
0 | 310 len -= 4; |
1667 | 311 if (c & 0x10){ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
312 dts = get_pts(s->pb, -1); |
1667 | 313 len -= 5; |
314 } | |
0 | 315 } else if ((c & 0xc0) == 0x80) { |
316 /* mpeg 2 PES */ | |
1126 | 317 #if 0 /* some streams have this field set for no apparent reason */ |
0 | 318 if ((c & 0x30) != 0) { |
310 | 319 /* Encrypted multiplex not handled */ |
320 goto redo; | |
0 | 321 } |
1126 | 322 #endif |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
323 flags = get_byte(s->pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
324 header_len = get_byte(s->pb); |
0 | 325 len -= 2; |
326 if (header_len > len) | |
1664
5e7460a2f209
seperate redo (we dont handle this possibly valid packet) from
michael
parents:
1443
diff
changeset
|
327 goto error_redo; |
1668 | 328 len -= header_len; |
1667 | 329 if (flags & 0x80) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
330 dts = pts = get_pts(s->pb, -1); |
0 | 331 header_len -= 5; |
1667 | 332 if (flags & 0x40) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
333 dts = get_pts(s->pb, -1); |
1667 | 334 header_len -= 5; |
335 } | |
0 | 336 } |
3109
20e070d8706f
Ignore flags after pts/dts if there are no bytes left.
michael
parents:
2934
diff
changeset
|
337 if (flags & 0x3f && header_len == 0){ |
20e070d8706f
Ignore flags after pts/dts if there are no bytes left.
michael
parents:
2934
diff
changeset
|
338 flags &= 0xC0; |
20e070d8706f
Ignore flags after pts/dts if there are no bytes left.
michael
parents:
2934
diff
changeset
|
339 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
|
340 } |
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 if (flags & 0x01) { /* PES extension */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
342 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
|
343 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
|
344 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
|
345 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
|
346 } |
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 /* 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
|
348 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
|
349 skip += skip & 0x9; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
350 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
|
351 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
|
352 |
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 if (pes_ext & 0x01) { /* PES extension 2 */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
354 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
|
355 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
|
356 if ((ext2_len & 0x7f) > 0) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
357 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
|
358 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
|
359 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
|
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 } |
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 } |
1668 | 364 if(header_len < 0) |
365 goto error_redo; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
366 url_fskip(s->pb, header_len); |
0 | 367 } |
447
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
368 else if( c!= 0xf ) |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
369 goto redo; |
94aa265c18b9
Mpeg start codes patch by ("Dmitry Borisov" <jbors at mail dot ru>)
michael
parents:
437
diff
changeset
|
370 |
722 | 371 if (startcode == PRIVATE_STREAM_1 && !m->psm_es_type[startcode & 0xff]) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
372 startcode = get_byte(s->pb); |
0 | 373 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
|
374 if (startcode >= 0x80 && startcode <= 0xcf) { |
0 | 375 /* audio: skip header */ |
2771
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); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
378 get_byte(s->pb); |
0 | 379 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
|
380 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
|
381 /* MLP/TrueHD audio has a 4-byte header */ |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
382 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
|
383 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
|
384 } |
0 | 385 } |
386 } | |
1665 | 387 if(len<0) |
388 goto error_redo; | |
346
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
389 if(dts != AV_NOPTS_VALUE && ppos){ |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
390 int i; |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
391 for(i=0; i<s->nb_streams; i++){ |
2934 | 392 if(startcode == s->streams[i]->id && |
393 !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
|
394 ff_reduce_index(s, i); |
979 | 395 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
|
396 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
397 } |
e154eb1b7149
caching of timestamps for mpeg-ps so seeking is faster
michael
parents:
337
diff
changeset
|
398 } |
885 | 399 |
310 | 400 *pstart_code = startcode; |
401 *ppts = pts; | |
402 *pdts = dts; | |
403 return len; | |
404 } | |
405 | |
406 static int mpegps_read_packet(AVFormatContext *s, | |
407 AVPacket *pkt) | |
408 { | |
722 | 409 MpegDemuxContext *m = s->priv_data; |
310 | 410 AVStream *st; |
722 | 411 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
|
412 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work |
310 | 413 |
414 redo: | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
415 len = mpegps_read_pes_header(s, &dummy_pos, &startcode, &pts, &dts); |
310 | 416 if (len < 0) |
417 return len; | |
885 | 418 |
0 | 419 /* now find stream */ |
420 for(i=0;i<s->nb_streams;i++) { | |
421 st = s->streams[i]; | |
422 if (st->id == startcode) | |
423 goto found; | |
424 } | |
722 | 425 |
426 es_type = m->psm_es_type[startcode & 0xff]; | |
427 if(es_type > 0){ | |
428 if(es_type == STREAM_TYPE_VIDEO_MPEG1){ | |
429 codec_id = CODEC_ID_MPEG2VIDEO; | |
430 type = CODEC_TYPE_VIDEO; | |
431 } else if(es_type == STREAM_TYPE_VIDEO_MPEG2){ | |
432 codec_id = CODEC_ID_MPEG2VIDEO; | |
433 type = CODEC_TYPE_VIDEO; | |
434 } else if(es_type == STREAM_TYPE_AUDIO_MPEG1 || | |
435 es_type == STREAM_TYPE_AUDIO_MPEG2){ | |
436 codec_id = CODEC_ID_MP3; | |
437 type = CODEC_TYPE_AUDIO; | |
438 } else if(es_type == STREAM_TYPE_AUDIO_AAC){ | |
439 codec_id = CODEC_ID_AAC; | |
440 type = CODEC_TYPE_AUDIO; | |
441 } else if(es_type == STREAM_TYPE_VIDEO_MPEG4){ | |
442 codec_id = CODEC_ID_MPEG4; | |
443 type = CODEC_TYPE_VIDEO; | |
444 } else if(es_type == STREAM_TYPE_VIDEO_H264){ | |
445 codec_id = CODEC_ID_H264; | |
446 type = CODEC_TYPE_VIDEO; | |
447 } else if(es_type == STREAM_TYPE_AUDIO_AC3){ | |
448 codec_id = CODEC_ID_AC3; | |
449 type = CODEC_TYPE_AUDIO; | |
450 } else { | |
451 goto skip; | |
452 } | |
453 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) { | |
1146 | 454 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 }; |
455 unsigned char buf[8]; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
456 get_buffer(s->pb, buf, 8); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
457 url_fseek(s->pb, -8, SEEK_CUR); |
1146 | 458 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1)) |
459 codec_id = CODEC_ID_CAVS; | |
460 else | |
461 codec_id = CODEC_ID_MPEG2VIDEO; | |
0 | 462 type = CODEC_TYPE_VIDEO; |
463 } else if (startcode >= 0x1c0 && startcode <= 0x1df) { | |
464 type = CODEC_TYPE_AUDIO; | |
2728 | 465 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
|
466 } else if (startcode >= 0x80 && startcode <= 0x87) { |
0 | 467 type = CODEC_TYPE_AUDIO; |
468 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
|
469 } 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
|
470 ||( 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
|
471 /* 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
|
472 type = CODEC_TYPE_AUDIO; |
112057e05179
libdts support by (Benjamin Zores <ben at geexbox dot org>)
michael
parents:
483
diff
changeset
|
473 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
|
474 } else if (startcode >= 0xa0 && startcode <= 0xaf) { |
41 | 475 type = CODEC_TYPE_AUDIO; |
476 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
|
477 } 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
|
478 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
|
479 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
|
480 } 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
|
481 /* 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
|
482 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
|
483 codec_id = CODEC_ID_AC3; |
783
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
484 } else if (startcode >= 0x20 && startcode <= 0x3f) { |
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
485 type = CODEC_TYPE_SUBTITLE; |
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
486 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
|
487 } 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
|
488 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
|
489 codec_id = CODEC_ID_VC1; |
0 | 490 } else { |
491 skip: | |
492 /* skip packet */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
493 url_fskip(s->pb, len); |
0 | 494 goto redo; |
495 } | |
496 /* no stream found: add a new stream */ | |
497 st = av_new_stream(s, startcode); | |
885 | 498 if (!st) |
0 | 499 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
|
500 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
|
501 st->codec->codec_id = codec_id; |
310 | 502 if (codec_id != CODEC_ID_PCM_S16BE) |
2023 | 503 st->need_parsing = AVSTREAM_PARSE_FULL; |
0 | 504 found: |
708 | 505 if(st->discard >= AVDISCARD_ALL) |
652 | 506 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
|
507 if (startcode >= 0xa0 && startcode <= 0xaf) { |
41 | 508 int b1, freq; |
509 | |
510 /* for LPCM, we just skip the header and consider it is raw | |
511 audio data */ | |
512 if (len <= 3) | |
513 goto skip; | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
514 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
|
515 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
|
516 get_byte(s->pb); /* dynamic range control (0x80 = off) */ |
41 | 517 len -= 3; |
518 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
|
519 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
|
520 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
|
521 st->codec->bit_rate = st->codec->channels * st->codec->sample_rate * 2; |
41 | 522 } |
0 | 523 av_new_packet(pkt, len); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
524 get_buffer(s->pb, pkt->data, pkt->size); |
0 | 525 pkt->pts = pts; |
310 | 526 pkt->dts = dts; |
0 | 527 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
|
528 #if 0 |
652 | 529 av_log(s, AV_LOG_DEBUG, "%d: pts=%0.3f dts=%0.3f size=%d\n", |
530 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
|
531 #endif |
482 | 532 |
0 | 533 return 0; |
534 } | |
535 | |
536 static int mpegps_read_close(AVFormatContext *s) | |
537 { | |
538 return 0; | |
539 } | |
540 | |
885 | 541 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
|
542 int64_t *ppos, int64_t pos_limit) |
310 | 543 { |
544 int len, startcode; | |
545 int64_t pos, pts, dts; | |
546 | |
547 pos = *ppos; | |
548 #ifdef DEBUG_SEEK | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
549 printf("read_dts: pos=0x%"PRIx64" next=%d -> ", pos, find_next); |
310 | 550 #endif |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
551 url_fseek(s->pb, pos, SEEK_SET); |
310 | 552 for(;;) { |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
553 len = mpegps_read_pes_header(s, &pos, &startcode, &pts, &dts); |
310 | 554 if (len < 0) { |
555 #ifdef DEBUG_SEEK | |
556 printf("none (ret=%d)\n", len); | |
557 #endif | |
558 return AV_NOPTS_VALUE; | |
559 } | |
885 | 560 if (startcode == s->streams[stream_index]->id && |
310 | 561 dts != AV_NOPTS_VALUE) { |
562 break; | |
563 } | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2728
diff
changeset
|
564 url_fskip(s->pb, len); |
310 | 565 } |
566 #ifdef DEBUG_SEEK | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
567 printf("pos=0x%"PRIx64" dts=0x%"PRIx64" %0.3f\n", pos, dts, dts / 90000.0); |
310 | 568 #endif |
569 *ppos = pos; | |
463
696f41bc8784
store index for seeking in the native timebase of each stream
michael
parents:
452
diff
changeset
|
570 return dts; |
310 | 571 } |
572 | |
1167 | 573 AVInputFormat mpegps_demuxer = { |
0 | 574 "mpeg", |
575 "MPEG PS format", | |
576 sizeof(MpegDemuxContext), | |
577 mpegps_probe, | |
578 mpegps_read_header, | |
579 mpegps_read_packet, | |
580 mpegps_read_close, | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
581 NULL, //mpegps_read_seek, |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
396
diff
changeset
|
582 mpegps_read_dts, |
783
2e8b5a7d7e02
DVD subtitle parsing - show mpeg component IDs by default
bellard
parents:
767
diff
changeset
|
583 .flags = AVFMT_SHOW_IDS, |
0 | 584 }; |