Mercurial > libavformat.hg
annotate asf.c @ 1960:c0289552590f libavformat
Change the vhook code to send real timestamps to the filters instead of the
current time of day, which is useless, and which the filters could just as
easily query for themselves.
patch by Bobby Bingham, uhmmmm gmail com
author | diego |
---|---|
date | Thu, 29 Mar 2007 05:24:35 +0000 |
parents | a57ac127f2e0 |
children | 8c20d8c19e1f |
rev | line source |
---|---|
0 | 1 /* |
1415
3b00fb8ef8e4
replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents:
1388
diff
changeset
|
2 * ASF compatible demuxer |
0 | 3 * Copyright (c) 2000, 2001 Fabrice Bellard. |
4 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1333
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1333
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1333
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:
1333
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:
1333
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:
1333
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:
887
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
21 #include "avformat.h" | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
1169
diff
changeset
|
22 #include "riff.h" |
0 | 23 #include "mpegaudio.h" |
372
2e12cd1b68ed
split asf patch by (Konstantin Andreyev <kandreyev at bcsii dot com>)
michael
parents:
370
diff
changeset
|
24 #include "asf.h" |
1503 | 25 #include "common.h" |
0 | 26 |
348 | 27 #undef NDEBUG |
28 #include <assert.h> | |
29 | |
373
e47d9c8e2054
asf patch by (Konstantin Andreyev <kandreyev at bcsii dot com>)
michael
parents:
372
diff
changeset
|
30 #define FRAME_HEADER_SIZE 17 |
885 | 31 // Fix Me! FRAME_HEADER_SIZE may be different. |
373
e47d9c8e2054
asf patch by (Konstantin Andreyev <kandreyev at bcsii dot com>)
michael
parents:
372
diff
changeset
|
32 |
0 | 33 static const GUID index_guid = { |
1687 | 34 0x90, 0x08, 0x00, 0x33, 0xb1, 0xe5, 0xcf, 0x11, 0x89, 0xf4, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb |
0 | 35 }; |
36 | |
1806
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
37 static const GUID stream_bitrate_guid = { /* (http://get.to/sdp) */ |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
38 0xce, 0x75, 0xf8, 0x7b, 0x8d, 0x46, 0xd1, 0x11, 0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2 |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
39 }; |
0 | 40 /**********************************/ |
41 /* decoding */ | |
42 | |
43 //#define DEBUG | |
44 | |
45 #ifdef DEBUG | |
69 | 46 #define PRINT_IF_GUID(g,cmp) \ |
47 if (!memcmp(g, &cmp, sizeof(GUID))) \ | |
48 printf("(GUID: %s) ", #cmp) | |
49 | |
0 | 50 static void print_guid(const GUID *g) |
51 { | |
52 int i; | |
69 | 53 PRINT_IF_GUID(g, asf_header); |
54 else PRINT_IF_GUID(g, file_header); | |
55 else PRINT_IF_GUID(g, stream_header); | |
56 else PRINT_IF_GUID(g, audio_stream); | |
57 else PRINT_IF_GUID(g, audio_conceal_none); | |
58 else PRINT_IF_GUID(g, video_stream); | |
59 else PRINT_IF_GUID(g, video_conceal_none); | |
831
8e1b338096a0
changes to ignore command media embedded in MS WMV files patch by ("Brown, Mike": mikeb, vibephone com)
michael
parents:
828
diff
changeset
|
60 else PRINT_IF_GUID(g, command_stream); |
69 | 61 else PRINT_IF_GUID(g, comment_header); |
62 else PRINT_IF_GUID(g, codec_comment_header); | |
63 else PRINT_IF_GUID(g, codec_comment1_header); | |
64 else PRINT_IF_GUID(g, data_header); | |
65 else PRINT_IF_GUID(g, index_guid); | |
66 else PRINT_IF_GUID(g, head1_guid); | |
67 else PRINT_IF_GUID(g, head2_guid); | |
68 else PRINT_IF_GUID(g, my_guid); | |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
69 else PRINT_IF_GUID(g, ext_stream_header); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
70 else PRINT_IF_GUID(g, extended_content_header); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
71 else PRINT_IF_GUID(g, ext_stream_embed_stream_header); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
72 else PRINT_IF_GUID(g, ext_stream_audio_stream); |
1750 | 73 else PRINT_IF_GUID(g, metadata_header); |
1806
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
74 else PRINT_IF_GUID(g, stream_bitrate_guid); |
69 | 75 else |
76 printf("(GUID: unknown) "); | |
1687 | 77 for(i=0;i<16;i++) |
78 printf(" 0x%02x,", (*g)[i]); | |
0 | 79 printf("}\n"); |
80 } | |
949 | 81 #undef PRINT_IF_GUID |
0 | 82 #endif |
83 | |
84 static void get_guid(ByteIOContext *s, GUID *g) | |
85 { | |
1687 | 86 assert(sizeof(*g) == 16); |
87 get_buffer(s, g, sizeof(*g)); | |
0 | 88 } |
89 | |
90 #if 0 | |
91 static void get_str16(ByteIOContext *pb, char *buf, int buf_size) | |
92 { | |
93 int len, c; | |
94 char *q; | |
95 | |
96 len = get_le16(pb); | |
97 q = buf; | |
98 while (len > 0) { | |
99 c = get_le16(pb); | |
100 if ((q - buf) < buf_size - 1) | |
101 *q++ = c; | |
102 len--; | |
103 } | |
104 *q = '\0'; | |
105 } | |
106 #endif | |
107 | |
108 static void get_str16_nolen(ByteIOContext *pb, int len, char *buf, int buf_size) | |
109 { | |
1503 | 110 char* q = buf; |
111 len /= 2; | |
112 while (len--) { | |
113 uint8_t tmp; | |
114 PUT_UTF8(get_le16(pb), tmp, if (q - buf < buf_size - 1) *q++ = tmp;) | |
0 | 115 } |
116 *q = '\0'; | |
117 } | |
118 | |
119 static int asf_probe(AVProbeData *pd) | |
120 { | |
121 /* check file header */ | |
122 if (pd->buf_size <= 32) | |
123 return 0; | |
124 | |
1687 | 125 if (!memcmp(pd->buf, &asf_header, sizeof(GUID))) |
0 | 126 return AVPROBE_SCORE_MAX; |
127 else | |
128 return 0; | |
129 } | |
130 | |
1750 | 131 static int get_value(ByteIOContext *pb, int type){ |
132 switch(type){ | |
133 case 2: return get_le32(pb); | |
134 case 3: return get_le32(pb); | |
135 case 4: return get_le64(pb); | |
136 case 5: return get_le16(pb); | |
137 default:return INT_MIN; | |
138 } | |
139 } | |
140 | |
0 | 141 static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
142 { | |
143 ASFContext *asf = s->priv_data; | |
144 GUID g; | |
145 ByteIOContext *pb = &s->pb; | |
146 AVStream *st; | |
147 ASFStream *asf_st; | |
148 int size, i; | |
65 | 149 int64_t gsize; |
1750 | 150 AVRational dar[128]; |
151 | |
152 memset(dar, 0, sizeof(dar)); | |
0 | 153 |
154 get_guid(pb, &g); | |
155 if (memcmp(&g, &asf_header, sizeof(GUID))) | |
156 goto fail; | |
157 get_le64(pb); | |
158 get_le32(pb); | |
159 get_byte(pb); | |
160 get_byte(pb); | |
161 memset(&asf->asfid2avid, -1, sizeof(asf->asfid2avid)); | |
162 for(;;) { | |
163 get_guid(pb, &g); | |
164 gsize = get_le64(pb); | |
165 #ifdef DEBUG | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
166 printf("%08"PRIx64": ", url_ftell(pb) - 24); |
0 | 167 print_guid(&g); |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
168 printf(" size=0x%"PRIx64"\n", gsize); |
0 | 169 #endif |
1896
6d2157d1fc93
fix gsize=0 / -1 case (if(<24) goto fail) before it is not a good idea
michael
parents:
1859
diff
changeset
|
170 if (!memcmp(&g, &data_header, sizeof(GUID))) { |
6d2157d1fc93
fix gsize=0 / -1 case (if(<24) goto fail) before it is not a good idea
michael
parents:
1859
diff
changeset
|
171 asf->data_object_offset = url_ftell(pb); |
6d2157d1fc93
fix gsize=0 / -1 case (if(<24) goto fail) before it is not a good idea
michael
parents:
1859
diff
changeset
|
172 // if not streaming, gsize is not unlimited (how?), and there is enough space in the file.. |
6d2157d1fc93
fix gsize=0 / -1 case (if(<24) goto fail) before it is not a good idea
michael
parents:
1859
diff
changeset
|
173 if (!(asf->hdr.flags & 0x01) && gsize >= 100) { |
6d2157d1fc93
fix gsize=0 / -1 case (if(<24) goto fail) before it is not a good idea
michael
parents:
1859
diff
changeset
|
174 asf->data_object_size = gsize - 24; |
6d2157d1fc93
fix gsize=0 / -1 case (if(<24) goto fail) before it is not a good idea
michael
parents:
1859
diff
changeset
|
175 } else { |
6d2157d1fc93
fix gsize=0 / -1 case (if(<24) goto fail) before it is not a good idea
michael
parents:
1859
diff
changeset
|
176 asf->data_object_size = (uint64_t)-1; |
6d2157d1fc93
fix gsize=0 / -1 case (if(<24) goto fail) before it is not a good idea
michael
parents:
1859
diff
changeset
|
177 } |
6d2157d1fc93
fix gsize=0 / -1 case (if(<24) goto fail) before it is not a good idea
michael
parents:
1859
diff
changeset
|
178 break; |
6d2157d1fc93
fix gsize=0 / -1 case (if(<24) goto fail) before it is not a good idea
michael
parents:
1859
diff
changeset
|
179 } |
0 | 180 if (gsize < 24) |
181 goto fail; | |
182 if (!memcmp(&g, &file_header, sizeof(GUID))) { | |
183 get_guid(pb, &asf->hdr.guid); | |
887 | 184 asf->hdr.file_size = get_le64(pb); |
185 asf->hdr.create_time = get_le64(pb); | |
1701 | 186 asf->nb_packets = get_le64(pb); |
887 | 187 asf->hdr.send_time = get_le64(pb); |
188 asf->hdr.play_time = get_le64(pb); | |
189 asf->hdr.preroll = get_le32(pb); | |
190 asf->hdr.ignore = get_le32(pb); | |
191 asf->hdr.flags = get_le32(pb); | |
192 asf->hdr.min_pktsize = get_le32(pb); | |
193 asf->hdr.max_pktsize = get_le32(pb); | |
194 asf->hdr.max_bitrate = get_le32(pb); | |
195 asf->packet_size = asf->hdr.max_pktsize; | |
0 | 196 } else if (!memcmp(&g, &stream_header, sizeof(GUID))) { |
1263
cf88f6719743
total_size should be 64bit (1 hunk of the asf seeking patch from DrDivx / Steve Lhomme)
michael
parents:
1206
diff
changeset
|
197 int type, type_specific_size, sizeX; |
cf88f6719743
total_size should be 64bit (1 hunk of the asf seeking patch from DrDivx / Steve Lhomme)
michael
parents:
1206
diff
changeset
|
198 uint64_t total_size; |
0 | 199 unsigned int tag1; |
65 | 200 int64_t pos1, pos2; |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
201 int test_for_ext_stream_audio; |
0 | 202 |
203 pos1 = url_ftell(pb); | |
204 | |
188
6c9d6422a2f6
update duration and start_time - add av_new_stream() usage
bellard
parents:
136
diff
changeset
|
205 st = av_new_stream(s, 0); |
0 | 206 if (!st) |
207 goto fail; | |
462
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
437
diff
changeset
|
208 av_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */ |
0 | 209 asf_st = av_mallocz(sizeof(ASFStream)); |
210 if (!asf_st) | |
211 goto fail; | |
212 st->priv_data = asf_st; | |
743 | 213 st->start_time = asf->hdr.preroll; |
1552 | 214 if(!(asf->hdr.flags & 0x01)) { // if we aren't streaming... |
215 st->duration = asf->hdr.send_time / | |
216 (10000000 / 1000) - st->start_time; | |
217 } | |
0 | 218 get_guid(pb, &g); |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
219 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
220 test_for_ext_stream_audio = 0; |
0 | 221 if (!memcmp(&g, &audio_stream, sizeof(GUID))) { |
222 type = CODEC_TYPE_AUDIO; | |
223 } else if (!memcmp(&g, &video_stream, sizeof(GUID))) { | |
224 type = CODEC_TYPE_VIDEO; | |
831
8e1b338096a0
changes to ignore command media embedded in MS WMV files patch by ("Brown, Mike": mikeb, vibephone com)
michael
parents:
828
diff
changeset
|
225 } else if (!memcmp(&g, &command_stream, sizeof(GUID))) { |
8e1b338096a0
changes to ignore command media embedded in MS WMV files patch by ("Brown, Mike": mikeb, vibephone com)
michael
parents:
828
diff
changeset
|
226 type = CODEC_TYPE_UNKNOWN; |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
227 } else if (!memcmp(&g, &ext_stream_embed_stream_header, sizeof(GUID))) { |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
228 test_for_ext_stream_audio = 1; |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
229 type = CODEC_TYPE_UNKNOWN; |
0 | 230 } else { |
231 goto fail; | |
232 } | |
233 get_guid(pb, &g); | |
234 total_size = get_le64(pb); | |
84
0068a6902911
correct AUDIO strf parsing patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents:
74
diff
changeset
|
235 type_specific_size = get_le32(pb); |
0 | 236 get_le32(pb); |
887 | 237 st->id = get_le16(pb) & 0x7f; /* stream id */ |
0 | 238 // mapping of asf ID to AV stream ID; |
188
6c9d6422a2f6
update duration and start_time - add av_new_stream() usage
bellard
parents:
136
diff
changeset
|
239 asf->asfid2avid[st->id] = s->nb_streams - 1; |
0 | 240 |
241 get_le32(pb); | |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
242 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
243 if (test_for_ext_stream_audio) { |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
244 get_guid(pb, &g); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
245 if (!memcmp(&g, &ext_stream_audio_stream, sizeof(GUID))) { |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
246 type = CODEC_TYPE_AUDIO; |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
247 get_guid(pb, &g); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
248 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
249 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
250 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
251 get_guid(pb, &g); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
252 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
253 } |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
254 } |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
255 |
887 | 256 st->codec->codec_type = type; |
0 | 257 if (type == CODEC_TYPE_AUDIO) { |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
258 get_wav_header(pb, st->codec, type_specific_size); |
312
8a04d2e1be2f
frame rate should be completely disabled in asf (closer now) - disabled seek
bellard
parents:
300
diff
changeset
|
259 st->need_parsing = 1; |
887 | 260 /* We have to init the frame size at some point .... */ |
261 pos2 = url_ftell(pb); | |
1859 | 262 if (gsize >= (pos2 + 8 - pos1 + 24)) { |
887 | 263 asf_st->ds_span = get_byte(pb); |
264 asf_st->ds_packet_size = get_le16(pb); | |
265 asf_st->ds_chunk_size = get_le16(pb); | |
1701 | 266 get_le16(pb); //ds_data_size |
267 get_byte(pb); //ds_silence_data | |
887 | 268 } |
269 //printf("Descrambling: ps:%d cs:%d ds:%d s:%d sd:%d\n", | |
270 // asf_st->ds_packet_size, asf_st->ds_chunk_size, | |
271 // asf_st->ds_data_size, asf_st->ds_span, asf_st->ds_silence_data); | |
272 if (asf_st->ds_span > 1) { | |
273 if (!asf_st->ds_chunk_size | |
1700
77bd711c0aed
adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses
michael
parents:
1699
diff
changeset
|
274 || (asf_st->ds_packet_size/asf_st->ds_chunk_size <= 1) |
77bd711c0aed
adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses
michael
parents:
1699
diff
changeset
|
275 || asf_st->ds_packet_size % asf_st->ds_chunk_size) |
887 | 276 asf_st->ds_span = 0; // disable descrambling |
277 } | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
278 switch (st->codec->codec_id) { |
232 | 279 case CODEC_ID_MP3: |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
280 st->codec->frame_size = MPA_FRAME_SIZE; |
0 | 281 break; |
282 case CODEC_ID_PCM_S16LE: | |
283 case CODEC_ID_PCM_S16BE: | |
284 case CODEC_ID_PCM_U16LE: | |
285 case CODEC_ID_PCM_U16BE: | |
286 case CODEC_ID_PCM_S8: | |
287 case CODEC_ID_PCM_U8: | |
288 case CODEC_ID_PCM_ALAW: | |
289 case CODEC_ID_PCM_MULAW: | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
290 st->codec->frame_size = 1; |
0 | 291 break; |
292 default: | |
293 /* This is probably wrong, but it prevents a crash later */ | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
294 st->codec->frame_size = 1; |
0 | 295 break; |
296 } | |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
297 } else if (type == CODEC_TYPE_VIDEO) { |
887 | 298 get_le32(pb); |
0 | 299 get_le32(pb); |
300 get_byte(pb); | |
301 size = get_le16(pb); /* size */ | |
732 | 302 sizeX= get_le32(pb); /* size */ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
303 st->codec->width = get_le32(pb); |
887 | 304 st->codec->height = get_le32(pb); |
0 | 305 /* not available for asf */ |
306 get_le16(pb); /* panes */ | |
887 | 307 st->codec->bits_per_sample = get_le16(pb); /* depth */ |
0 | 308 tag1 = get_le32(pb); |
887 | 309 url_fskip(pb, 20); |
732 | 310 // av_log(NULL, AV_LOG_DEBUG, "size:%d tsize:%d sizeX:%d\n", size, total_size, sizeX); |
311 size= sizeX; | |
887 | 312 if (size > 40) { |
313 st->codec->extradata_size = size - 40; | |
314 st->codec->extradata = av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
315 get_buffer(pb, st->codec->extradata, st->codec->extradata_size); | |
316 } | |
297
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
317 |
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
318 /* Extract palette from extradata if bpp <= 8 */ |
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
319 /* This code assumes that extradata contains only palette */ |
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
320 /* This is true for all paletted codecs implemented in ffmpeg */ |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
321 if (st->codec->extradata_size && (st->codec->bits_per_sample <= 8)) { |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
322 st->codec->palctrl = av_mallocz(sizeof(AVPaletteControl)); |
297
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
323 #ifdef WORDS_BIGENDIAN |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
324 for (i = 0; i < FFMIN(st->codec->extradata_size, AVPALETTE_SIZE)/4; i++) |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
325 st->codec->palctrl->palette[i] = bswap_32(((uint32_t*)st->codec->extradata)[i]); |
297
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
326 #else |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
327 memcpy(st->codec->palctrl->palette, st->codec->extradata, |
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
328 FFMIN(st->codec->extradata_size, AVPALETTE_SIZE)); |
297
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
329 #endif |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
330 st->codec->palctrl->palette_changed = 1; |
297
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
331 } |
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
332 |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
333 st->codec->codec_tag = tag1; |
887 | 334 st->codec->codec_id = codec_get_id(codec_bmp_tags, tag1); |
573 | 335 if(tag1 == MKTAG('D', 'V', 'R', ' ')) |
336 st->need_parsing = 1; | |
0 | 337 } |
338 pos2 = url_ftell(pb); | |
339 url_fskip(pb, gsize - (pos2 - pos1 + 24)); | |
340 } else if (!memcmp(&g, &comment_header, sizeof(GUID))) { | |
341 int len1, len2, len3, len4, len5; | |
342 | |
343 len1 = get_le16(pb); | |
344 len2 = get_le16(pb); | |
345 len3 = get_le16(pb); | |
346 len4 = get_le16(pb); | |
347 len5 = get_le16(pb); | |
1704 | 348 get_str16_nolen(pb, len1, s->title , sizeof(s->title)); |
349 get_str16_nolen(pb, len2, s->author , sizeof(s->author)); | |
0 | 350 get_str16_nolen(pb, len3, s->copyright, sizeof(s->copyright)); |
1704 | 351 get_str16_nolen(pb, len4, s->comment , sizeof(s->comment)); |
887 | 352 url_fskip(pb, len5); |
1806
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
353 } else if (!memcmp(&g, &stream_bitrate_guid, sizeof(GUID))) { |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
354 int stream_count = get_le16(pb); |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
355 int j; |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
356 |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
357 // av_log(NULL, AV_LOG_ERROR, "stream bitrate properties\n"); |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
358 // av_log(NULL, AV_LOG_ERROR, "streams %d\n", streams); |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
359 for(j = 0; j < stream_count; j++) { |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
360 int flags, bitrate, stream_id; |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
361 |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
362 flags= get_le16(pb); |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
363 bitrate= get_le32(pb); |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
364 stream_id= (flags & 0x7f); |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
365 // av_log(NULL, AV_LOG_ERROR, "flags: 0x%x stream id %d, bitrate %d\n", flags, stream_id, bitrate); |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
366 asf->stream_bitrates[stream_id-1]= bitrate; |
bf6a0dd6d7be
Add the stream_bitrate GUID to the asf parsing code, and set stream bitrate
takis
parents:
1776
diff
changeset
|
367 } |
341
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
368 } else if (!memcmp(&g, &extended_content_header, sizeof(GUID))) { |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
369 int desc_count, i; |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
370 |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
371 desc_count = get_le16(pb); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
372 for(i=0;i<desc_count;i++) |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
373 { |
1264
3d00cb7b7426
value_num should also be 64bit (1 hunk from the asf seeking patch by DrDivx/Steve Lhomme)
michael
parents:
1263
diff
changeset
|
374 int name_len,value_type,value_len; |
3d00cb7b7426
value_num should also be 64bit (1 hunk from the asf seeking patch by DrDivx/Steve Lhomme)
michael
parents:
1263
diff
changeset
|
375 uint64_t value_num = 0; |
1703 | 376 char name[1024]; |
341
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
377 |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
378 name_len = get_le16(pb); |
1703 | 379 get_str16_nolen(pb, name_len, name, sizeof(name)); |
341
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
380 value_type = get_le16(pb); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
381 value_len = get_le16(pb); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
382 if ((value_type == 0) || (value_type == 1)) // unicode or byte |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
383 { |
1706 | 384 if (!strcmp(name,"WM/AlbumTitle")) get_str16_nolen(pb, value_len, s->album, sizeof(s->album)); |
385 else if(!strcmp(name,"WM/Genre" )) get_str16_nolen(pb, value_len, s->genre, sizeof(s->genre)); | |
386 else url_fskip(pb, value_len); | |
341
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
387 } |
792 | 388 if ((value_type >= 2) && (value_type <= 5)) // boolean or DWORD or QWORD or WORD |
341
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
389 { |
1750 | 390 value_num= get_value(pb, value_type); |
1704 | 391 if (!strcmp(name,"WM/Track" )) s->track = value_num + 1; |
392 if (!strcmp(name,"WM/TrackNumber")) s->track = value_num; | |
341
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
393 } |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
394 } |
1750 | 395 } else if (!memcmp(&g, &metadata_header, sizeof(GUID))) { |
396 int n, stream_num, name_len, value_len, value_type, value_num; | |
397 n = get_le16(pb); | |
398 | |
399 for(i=0;i<n;i++) { | |
400 char name[1024]; | |
401 | |
402 get_le16(pb); //lang_list_index | |
403 stream_num= get_le16(pb); | |
404 name_len= get_le16(pb); | |
405 value_type= get_le16(pb); | |
406 value_len= get_le32(pb); | |
407 | |
408 get_str16_nolen(pb, name_len, name, sizeof(name)); | |
409 //av_log(NULL, AV_LOG_ERROR, "%d %d %d %d %d <%s>\n", i, stream_num, name_len, value_type, value_len, name); | |
410 value_num= get_le16(pb);//we should use get_value() here but it doesnt work 2 is le16 here but le32 elsewhere | |
411 url_fskip(pb, value_len - 2); | |
412 | |
413 if(stream_num<128){ | |
414 if (!strcmp(name, "AspectRatioX")) dar[stream_num].num= value_num; | |
415 else if(!strcmp(name, "AspectRatioY")) dar[stream_num].den= value_num; | |
416 } | |
417 } | |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
418 } else if (!memcmp(&g, &ext_stream_header, sizeof(GUID))) { |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
419 int ext_len, payload_ext_ct, stream_ct; |
1958
a57ac127f2e0
revert r8538 (set bit rate for asf format) until regression tests issue is stated
bcoudurier
parents:
1957
diff
changeset
|
420 uint32_t ext_d; |
972 | 421 int64_t pos_ex_st; |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
422 pos_ex_st = url_ftell(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
423 |
1740
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
424 get_le64(pb); // starttime |
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
425 get_le64(pb); // endtime |
1958
a57ac127f2e0
revert r8538 (set bit rate for asf format) until regression tests issue is stated
bcoudurier
parents:
1957
diff
changeset
|
426 get_le32(pb); // leak-datarate |
1740
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
427 get_le32(pb); // bucket-datasize |
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
428 get_le32(pb); // init-bucket-fullness |
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
429 get_le32(pb); // alt-leak-datarate |
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
430 get_le32(pb); // alt-bucket-datasize |
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
431 get_le32(pb); // alt-init-bucket-fullness |
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
432 get_le32(pb); // max-object-size |
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
433 get_le32(pb); // flags (reliable,seekable,no_cleanpoints?,resend-live-cleanpoints, rest of bits reserved) |
1958
a57ac127f2e0
revert r8538 (set bit rate for asf format) until regression tests issue is stated
bcoudurier
parents:
1957
diff
changeset
|
434 get_le16(pb); // stream-num |
1740
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
435 get_le16(pb); // stream-language-id-index |
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
436 get_le64(pb); // avg frametime in 100ns units |
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
437 stream_ct = get_le16(pb); //stream-name-count |
5ebac013d792
stealing a few field names from mplayers asf demuxer
michael
parents:
1722
diff
changeset
|
438 payload_ext_ct = get_le16(pb); //payload-extension-system-count |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
439 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
440 for (i=0; i<stream_ct; i++){ |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
441 get_le16(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
442 ext_len = get_le16(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
443 url_fseek(pb, ext_len, SEEK_CUR); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
444 } |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
445 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
446 for (i=0; i<payload_ext_ct; i++){ |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
447 get_guid(pb, &g); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
448 ext_d=get_le16(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
449 ext_len=get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
450 url_fseek(pb, ext_len, SEEK_CUR); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
451 } |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
452 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
453 // there could be a optional stream properties object to follow |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
454 // if so the next iteration will pick it up |
0 | 455 } else if (!memcmp(&g, &head1_guid, sizeof(GUID))) { |
456 int v1, v2; | |
457 get_guid(pb, &g); | |
458 v1 = get_le32(pb); | |
459 v2 = get_le16(pb); | |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
460 #if 0 |
0 | 461 } else if (!memcmp(&g, &codec_comment_header, sizeof(GUID))) { |
462 int len, v1, n, num; | |
463 char str[256], *q; | |
464 char tag[16]; | |
465 | |
466 get_guid(pb, &g); | |
467 print_guid(&g); | |
468 | |
469 n = get_le32(pb); | |
470 for(i=0;i<n;i++) { | |
471 num = get_le16(pb); /* stream number */ | |
472 get_str16(pb, str, sizeof(str)); | |
473 get_str16(pb, str, sizeof(str)); | |
474 len = get_le16(pb); | |
475 q = tag; | |
476 while (len > 0) { | |
477 v1 = get_byte(pb); | |
478 if ((q - tag) < sizeof(tag) - 1) | |
479 *q++ = v1; | |
480 len--; | |
481 } | |
482 *q = '\0'; | |
483 } | |
484 #endif | |
485 } else if (url_feof(pb)) { | |
486 goto fail; | |
487 } else { | |
488 url_fseek(pb, gsize - 24, SEEK_CUR); | |
489 } | |
490 } | |
491 get_guid(pb, &g); | |
492 get_le64(pb); | |
493 get_byte(pb); | |
494 get_byte(pb); | |
495 if (url_feof(pb)) | |
496 goto fail; | |
497 asf->data_offset = url_ftell(pb); | |
498 asf->packet_size_left = 0; | |
499 | |
1750 | 500 |
501 for(i=0; i<128; i++){ | |
502 int stream_num= asf->asfid2avid[i]; | |
1958
a57ac127f2e0
revert r8538 (set bit rate for asf format) until regression tests issue is stated
bcoudurier
parents:
1957
diff
changeset
|
503 if(stream_num>=0 && dar[i].num>0 && dar[i].den>0){ |
1750 | 504 AVCodecContext *codec= s->streams[stream_num]->codec; |
1958
a57ac127f2e0
revert r8538 (set bit rate for asf format) until regression tests issue is stated
bcoudurier
parents:
1957
diff
changeset
|
505 av_reduce(&codec->sample_aspect_ratio.num, |
a57ac127f2e0
revert r8538 (set bit rate for asf format) until regression tests issue is stated
bcoudurier
parents:
1957
diff
changeset
|
506 &codec->sample_aspect_ratio.den, |
a57ac127f2e0
revert r8538 (set bit rate for asf format) until regression tests issue is stated
bcoudurier
parents:
1957
diff
changeset
|
507 dar[i].num, dar[i].den, INT_MAX); |
1750 | 508 //av_log(NULL, AV_LOG_ERROR, "dar %d:%d sar=%d:%d\n", dar[i].num, dar[i].den, codec->sample_aspect_ratio.num, codec->sample_aspect_ratio.den); |
509 } | |
510 } | |
511 | |
0 | 512 return 0; |
513 | |
514 fail: | |
515 for(i=0;i<s->nb_streams;i++) { | |
516 AVStream *st = s->streams[i]; | |
887 | 517 if (st) { |
518 av_free(st->priv_data); | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
519 av_free(st->codec->extradata); |
887 | 520 } |
0 | 521 av_free(st); |
522 } | |
523 return -1; | |
524 } | |
525 | |
526 #define DO_2BITS(bits, var, defval) \ | |
527 switch (bits & 3) \ | |
528 { \ | |
529 case 3: var = get_le32(pb); rsize += 4; break; \ | |
530 case 2: var = get_le16(pb); rsize += 2; break; \ | |
531 case 1: var = get_byte(pb); rsize++; break; \ | |
532 default: var = defval; break; \ | |
533 } | |
534 | |
1716 | 535 /** |
536 * | |
537 * @return <0 in case of an error | |
538 */ | |
0 | 539 static int asf_get_packet(AVFormatContext *s) |
540 { | |
541 ASFContext *asf = s->priv_data; | |
542 ByteIOContext *pb = &s->pb; | |
543 uint32_t packet_length, padsize; | |
353 | 544 int rsize = 9; |
1722
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
545 int c, d, e, off; |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
546 |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
547 off= (url_ftell(&s->pb) - s->data_offset) % asf->packet_size + 3; |
885 | 548 |
1722
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
549 c=d=e=-1; |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
550 while(off-- > 0){ |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
551 c=d; d=e; |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
552 e= get_byte(pb); |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
553 if(c == 0x82 && !d && !e) |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
554 break; |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
555 } |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
556 |
0 | 557 if (c != 0x82) { |
558 if (!url_feof(pb)) | |
887 | 559 av_log(s, AV_LOG_ERROR, "ff asf bad header %x at:%"PRId64"\n", c, url_ftell(pb)); |
0 | 560 } |
561 if ((c & 0x0f) == 2) { // always true for now | |
1722
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
562 if (d || e) { |
0 | 563 if (!url_feof(pb)) |
887 | 564 av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n"); |
1716 | 565 return -1; |
887 | 566 } |
1722
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
567 d= get_byte(pb); |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
568 e= get_byte(pb); |
353 | 569 rsize+=2; |
570 /* }else{ | |
571 if (!url_feof(pb)) | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
572 printf("ff asf bad header %x at:%"PRId64"\n", c, url_ftell(pb)); |
887 | 573 return AVERROR_IO;*/ |
0 | 574 } |
575 | |
1722
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
576 asf->packet_flags = d; |
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
577 asf->packet_property = e; |
0 | 578 |
579 DO_2BITS(asf->packet_flags >> 5, packet_length, asf->packet_size); | |
580 DO_2BITS(asf->packet_flags >> 1, padsize, 0); // sequence ignored | |
581 DO_2BITS(asf->packet_flags >> 3, padsize, 0); // padding length | |
582 | |
1333 | 583 //the following checks prevent overflows and infinite loops |
584 if(packet_length >= (1U<<29)){ | |
585 av_log(s, AV_LOG_ERROR, "invalid packet_length %d at:%"PRId64"\n", packet_length, url_ftell(pb)); | |
1713 | 586 return -1; |
1333 | 587 } |
1715 | 588 if(padsize >= packet_length){ |
1333 | 589 av_log(s, AV_LOG_ERROR, "invalid padsize %d at:%"PRId64"\n", padsize, url_ftell(pb)); |
1713 | 590 return -1; |
1333 | 591 } |
592 | |
0 | 593 asf->packet_timestamp = get_le32(pb); |
594 get_le16(pb); /* duration */ | |
595 // rsize has at least 11 bytes which have to be present | |
596 | |
597 if (asf->packet_flags & 0x01) { | |
887 | 598 asf->packet_segsizetype = get_byte(pb); rsize++; |
0 | 599 asf->packet_segments = asf->packet_segsizetype & 0x3f; |
600 } else { | |
887 | 601 asf->packet_segments = 1; |
0 | 602 asf->packet_segsizetype = 0x80; |
603 } | |
604 asf->packet_size_left = packet_length - padsize - rsize; | |
605 if (packet_length < asf->hdr.min_pktsize) | |
606 padsize += asf->hdr.min_pktsize - packet_length; | |
607 asf->packet_padsize = padsize; | |
608 #ifdef DEBUG | |
609 printf("packet: size=%d padsize=%d left=%d\n", asf->packet_size, asf->packet_padsize, asf->packet_size_left); | |
610 #endif | |
611 return 0; | |
612 } | |
613 | |
1708 | 614 /** |
615 * | |
616 * @return <0 if error | |
617 */ | |
618 static int asf_read_frame_header(AVFormatContext *s){ | |
619 ASFContext *asf = s->priv_data; | |
620 ByteIOContext *pb = &s->pb; | |
621 int rsize = 1; | |
622 int num = get_byte(pb); | |
1776 | 623 int64_t ts0, ts1; |
1708 | 624 |
625 asf->packet_segments--; | |
626 asf->packet_key_frame = num >> 7; | |
627 asf->stream_index = asf->asfid2avid[num & 0x7f]; | |
628 // sequence should be ignored! | |
629 DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0); | |
630 DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0); | |
631 DO_2BITS(asf->packet_property, asf->packet_replic_size, 0); | |
632 //printf("key:%d stream:%d seq:%d offset:%d replic_size:%d\n", asf->packet_key_frame, asf->stream_index, asf->packet_seq, //asf->packet_frag_offset, asf->packet_replic_size); | |
633 if (asf->packet_replic_size >= 8) { | |
634 asf->packet_obj_size = get_le32(pb); | |
635 if(asf->packet_obj_size >= (1<<24) || asf->packet_obj_size <= 0){ | |
636 av_log(s, AV_LOG_ERROR, "packet_obj_size invalid\n"); | |
637 return -1; | |
638 } | |
639 asf->packet_frag_timestamp = get_le32(pb); // timestamp | |
1776 | 640 if(asf->packet_replic_size >= 8+38+4){ |
641 // for(i=0; i<asf->packet_replic_size-8; i++) | |
642 // av_log(s, AV_LOG_DEBUG, "%02X ",get_byte(pb)); | |
643 // av_log(s, AV_LOG_DEBUG, "\n"); | |
644 url_fskip(pb, 10); | |
645 ts0= get_le64(pb); | |
646 ts1= get_le64(pb); | |
647 url_fskip(pb, 12); | |
648 get_le32(pb); | |
649 url_fskip(pb, asf->packet_replic_size - 8 - 38 - 4); | |
650 if(ts0!= -1) asf->packet_frag_timestamp= ts0/10000; | |
651 else asf->packet_frag_timestamp= AV_NOPTS_VALUE; | |
652 }else | |
653 url_fskip(pb, asf->packet_replic_size - 8); | |
1708 | 654 rsize += asf->packet_replic_size; // FIXME - check validity |
655 } else if (asf->packet_replic_size==1){ | |
656 // multipacket - frag_offset is begining timestamp | |
657 asf->packet_time_start = asf->packet_frag_offset; | |
658 asf->packet_frag_offset = 0; | |
659 asf->packet_frag_timestamp = asf->packet_timestamp; | |
660 | |
661 asf->packet_time_delta = get_byte(pb); | |
662 rsize++; | |
663 }else if(asf->packet_replic_size!=0){ | |
664 av_log(s, AV_LOG_ERROR, "unexpected packet_replic_size of %d\n", asf->packet_replic_size); | |
665 return -1; | |
666 } | |
667 if (asf->packet_flags & 0x01) { | |
668 DO_2BITS(asf->packet_segsizetype >> 6, asf->packet_frag_size, 0); // 0 is illegal | |
1712 | 669 if(asf->packet_frag_size > asf->packet_size_left - rsize){ |
670 av_log(s, AV_LOG_ERROR, "packet_frag_size is invalid\n"); | |
671 return -1; | |
672 } | |
1708 | 673 //printf("Fragsize %d\n", asf->packet_frag_size); |
674 } else { | |
675 asf->packet_frag_size = asf->packet_size_left - rsize; | |
676 //printf("Using rest %d %d %d\n", asf->packet_frag_size, asf->packet_size_left, rsize); | |
677 } | |
678 if (asf->packet_replic_size == 1) { | |
679 asf->packet_multi_size = asf->packet_frag_size; | |
680 if (asf->packet_multi_size > asf->packet_size_left) | |
681 return -1; | |
682 } | |
683 asf->packet_size_left -= rsize; | |
684 //printf("___objsize____ %d %d rs:%d\n", asf->packet_obj_size, asf->packet_frag_offset, rsize); | |
685 | |
686 return 0; | |
687 } | |
688 | |
0 | 689 static int asf_read_packet(AVFormatContext *s, AVPacket *pkt) |
690 { | |
691 ASFContext *asf = s->priv_data; | |
692 ASFStream *asf_st = 0; | |
693 ByteIOContext *pb = &s->pb; | |
694 //static int pc = 0; | |
695 for (;;) { | |
1713 | 696 if(url_feof(pb)) |
697 return AVERROR_IO; | |
887 | 698 if (asf->packet_size_left < FRAME_HEADER_SIZE |
699 || asf->packet_segments < 1) { | |
700 //asf->packet_size_left <= asf->packet_padsize) { | |
701 int ret = asf->packet_size_left + asf->packet_padsize; | |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
702 //printf("PacketLeftSize:%d Pad:%d Pos:%"PRId64"\n", asf->packet_size_left, asf->packet_padsize, url_ftell(pb)); |
1333 | 703 assert(ret>=0); |
887 | 704 /* fail safe */ |
705 url_fskip(pb, ret); | |
1707
7e12a19c140f
more correct packet alignment check and correction
michael
parents:
1706
diff
changeset
|
706 |
349 | 707 asf->packet_pos= url_ftell(&s->pb); |
1206
e60bf67d9bf8
The reader ignores the size of the ASF data object and keeps on
gpoirier
parents:
1172
diff
changeset
|
708 if (asf->data_object_size != (uint64_t)-1 && |
e60bf67d9bf8
The reader ignores the size of the ASF data object and keeps on
gpoirier
parents:
1172
diff
changeset
|
709 (asf->packet_pos - asf->data_object_offset >= asf->data_object_size)) |
e60bf67d9bf8
The reader ignores the size of the ASF data object and keeps on
gpoirier
parents:
1172
diff
changeset
|
710 return AVERROR_IO; /* Do not exceed the size of the data object */ |
887 | 711 ret = asf_get_packet(s); |
712 //printf("READ ASF PACKET %d r:%d c:%d\n", ret, asf->packet_size_left, pc++); | |
1713 | 713 if (ret < 0) |
714 assert(asf->packet_size_left < FRAME_HEADER_SIZE || asf->packet_segments < 1); | |
0 | 715 asf->packet_time_start = 0; |
716 continue; | |
887 | 717 } |
718 if (asf->packet_time_start == 0) { | |
1708 | 719 if(asf_read_frame_header(s) < 0){ |
720 asf->packet_segments= 0; | |
1696 | 721 continue; |
352
c5ea5cdb5b58
replic_size==0 fix, needed so that G.726 asf file, so ffmpeg can at least decode the video without segfaulting
michael
parents:
351
diff
changeset
|
722 } |
887 | 723 if (asf->stream_index < 0 |
708 | 724 || s->streams[asf->stream_index]->discard >= AVDISCARD_ALL |
725 || (!asf->packet_key_frame && s->streams[asf->stream_index]->discard >= AVDISCARD_NONKEY) | |
726 ) { | |
0 | 727 asf->packet_time_start = 0; |
887 | 728 /* unhandled packet (should not happen) */ |
729 url_fskip(pb, asf->packet_frag_size); | |
730 asf->packet_size_left -= asf->packet_frag_size; | |
652 | 731 if(asf->stream_index < 0) |
1708 | 732 av_log(s, AV_LOG_ERROR, "ff asf skip %d (unknown stream)\n", asf->packet_frag_size); |
0 | 733 continue; |
887 | 734 } |
735 asf->asf_st = s->streams[asf->stream_index]->priv_data; | |
736 } | |
737 asf_st = asf->asf_st; | |
0 | 738 |
887 | 739 if (asf->packet_replic_size == 1) { |
740 // frag_offset is here used as the begining timestamp | |
741 asf->packet_frag_timestamp = asf->packet_time_start; | |
742 asf->packet_time_start += asf->packet_time_delta; | |
743 asf->packet_obj_size = asf->packet_frag_size = get_byte(pb); | |
744 asf->packet_size_left--; | |
0 | 745 asf->packet_multi_size--; |
887 | 746 if (asf->packet_multi_size < asf->packet_obj_size) |
747 { | |
748 asf->packet_time_start = 0; | |
749 url_fskip(pb, asf->packet_multi_size); | |
750 asf->packet_size_left -= asf->packet_multi_size; | |
0 | 751 continue; |
887 | 752 } |
753 asf->packet_multi_size -= asf->packet_obj_size; | |
754 //printf("COMPRESS size %d %d %d ms:%d\n", asf->packet_obj_size, asf->packet_frag_timestamp, asf->packet_size_left, asf->packet_multi_size); | |
755 } | |
1744 | 756 if ( asf_st->pkt.size != asf->packet_obj_size |
757 || asf_st->frag_offset + asf->packet_frag_size > asf_st->pkt.size) { //FIXME is this condition sufficient? | |
1710
33a16d903dcc
replace nonsense code by something which makes at least some sense
michael
parents:
1709
diff
changeset
|
758 if(asf_st->pkt.data){ |
33a16d903dcc
replace nonsense code by something which makes at least some sense
michael
parents:
1709
diff
changeset
|
759 av_log(s, AV_LOG_INFO, "freeing incomplete packet size %d, new %d\n", asf_st->pkt.size, asf->packet_obj_size); |
33a16d903dcc
replace nonsense code by something which makes at least some sense
michael
parents:
1709
diff
changeset
|
760 asf_st->frag_offset = 0; |
33a16d903dcc
replace nonsense code by something which makes at least some sense
michael
parents:
1709
diff
changeset
|
761 av_free_packet(&asf_st->pkt); |
33a16d903dcc
replace nonsense code by something which makes at least some sense
michael
parents:
1709
diff
changeset
|
762 } |
887 | 763 /* new packet */ |
764 av_new_packet(&asf_st->pkt, asf->packet_obj_size); | |
765 asf_st->seq = asf->packet_seq; | |
766 asf_st->pkt.pts = asf->packet_frag_timestamp; | |
767 asf_st->pkt.stream_index = asf->stream_index; | |
885 | 768 asf_st->pkt.pos = |
769 asf_st->packet_pos= asf->packet_pos; | |
770 //printf("new packet: stream:%d key:%d packet_key:%d audio:%d size:%d\n", | |
349 | 771 //asf->stream_index, asf->packet_key_frame, asf_st->pkt.flags & PKT_FLAG_KEY, |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
772 //s->streams[asf->stream_index]->codec->codec_type == CODEC_TYPE_AUDIO, asf->packet_obj_size); |
887 | 773 if (s->streams[asf->stream_index]->codec->codec_type == CODEC_TYPE_AUDIO) |
774 asf->packet_key_frame = 1; | |
775 if (asf->packet_key_frame) | |
776 asf_st->pkt.flags |= PKT_FLAG_KEY; | |
777 } | |
0 | 778 |
887 | 779 /* read data */ |
780 //printf("READ PACKET s:%d os:%d o:%d,%d l:%d DATA:%p\n", | |
781 // asf->packet_size, asf_st->pkt.size, asf->packet_frag_offset, | |
782 // asf_st->frag_offset, asf->packet_frag_size, asf_st->pkt.data); | |
783 asf->packet_size_left -= asf->packet_frag_size; | |
784 if (asf->packet_size_left < 0) | |
0 | 785 continue; |
1709 | 786 |
787 if( asf->packet_frag_offset >= asf_st->pkt.size | |
788 || asf->packet_frag_size > asf_st->pkt.size - asf->packet_frag_offset){ | |
789 av_log(s, AV_LOG_ERROR, "packet fragment position invalid %u,%u not in %u\n", | |
790 asf->packet_frag_offset, asf->packet_frag_size, asf_st->pkt.size); | |
791 continue; | |
792 } | |
793 | |
887 | 794 get_buffer(pb, asf_st->pkt.data + asf->packet_frag_offset, |
795 asf->packet_frag_size); | |
796 asf_st->frag_offset += asf->packet_frag_size; | |
797 /* test if whole packet is read */ | |
798 if (asf_st->frag_offset == asf_st->pkt.size) { | |
799 /* return packet */ | |
800 if (asf_st->ds_span > 1) { | |
1700
77bd711c0aed
adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses
michael
parents:
1699
diff
changeset
|
801 if(asf_st->pkt.size != asf_st->ds_packet_size * asf_st->ds_span){ |
77bd711c0aed
adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses
michael
parents:
1699
diff
changeset
|
802 av_log(s, AV_LOG_ERROR, "pkt.size != ds_packet_size * ds_span\n"); |
77bd711c0aed
adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses
michael
parents:
1699
diff
changeset
|
803 }else{ |
887 | 804 /* packet descrambling */ |
1332 | 805 uint8_t *newdata = av_malloc(asf_st->pkt.size); |
887 | 806 if (newdata) { |
807 int offset = 0; | |
808 while (offset < asf_st->pkt.size) { | |
809 int off = offset / asf_st->ds_chunk_size; | |
810 int row = off / asf_st->ds_span; | |
811 int col = off % asf_st->ds_span; | |
812 int idx = row + col * asf_st->ds_packet_size / asf_st->ds_chunk_size; | |
813 //printf("off:%d row:%d col:%d idx:%d\n", off, row, col, idx); | |
1700
77bd711c0aed
adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses
michael
parents:
1699
diff
changeset
|
814 |
77bd711c0aed
adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses
michael
parents:
1699
diff
changeset
|
815 assert(offset + asf_st->ds_chunk_size <= asf_st->pkt.size); |
77bd711c0aed
adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses
michael
parents:
1699
diff
changeset
|
816 assert(idx+1 <= asf_st->pkt.size / asf_st->ds_chunk_size); |
887 | 817 memcpy(newdata + offset, |
818 asf_st->pkt.data + idx * asf_st->ds_chunk_size, | |
819 asf_st->ds_chunk_size); | |
820 offset += asf_st->ds_chunk_size; | |
821 } | |
822 av_free(asf_st->pkt.data); | |
823 asf_st->pkt.data = newdata; | |
824 } | |
1700
77bd711c0aed
adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses
michael
parents:
1699
diff
changeset
|
825 } |
887 | 826 } |
827 asf_st->frag_offset = 0; | |
1699 | 828 *pkt= asf_st->pkt; |
887 | 829 //printf("packet %d %d\n", asf_st->pkt.size, asf->packet_frag_size); |
830 asf_st->pkt.size = 0; | |
831 asf_st->pkt.data = 0; | |
832 break; // packet completed | |
833 } | |
0 | 834 } |
835 return 0; | |
836 } | |
837 | |
838 static int asf_read_close(AVFormatContext *s) | |
839 { | |
840 int i; | |
841 | |
842 for(i=0;i<s->nb_streams;i++) { | |
887 | 843 AVStream *st = s->streams[i]; |
844 av_free(st->priv_data); | |
1711 | 845 av_free(st->codec->palctrl); |
0 | 846 } |
847 return 0; | |
848 } | |
849 | |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
850 // Added to support seeking after packets have been read |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
851 // If information is not reset, read_packet fails due to |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
852 // leftover information from previous reads |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
853 static void asf_reset_header(AVFormatContext *s) |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
854 { |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
855 ASFContext *asf = s->priv_data; |
349 | 856 ASFStream *asf_st; |
857 int i; | |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
858 |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
859 asf->packet_nb_frames = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
860 asf->packet_size_left = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
861 asf->packet_segments = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
862 asf->packet_flags = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
863 asf->packet_property = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
864 asf->packet_timestamp = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
865 asf->packet_segsizetype = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
866 asf->packet_segments = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
867 asf->packet_seq = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
868 asf->packet_replic_size = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
869 asf->packet_key_frame = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
870 asf->packet_padsize = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
871 asf->packet_frag_offset = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
872 asf->packet_frag_size = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
873 asf->packet_frag_timestamp = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
874 asf->packet_multi_size = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
875 asf->packet_obj_size = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
876 asf->packet_time_delta = 0; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
877 asf->packet_time_start = 0; |
885 | 878 |
349 | 879 for(i=0; i<s->nb_streams; i++){ |
880 asf_st= s->streams[i]->priv_data; | |
881 av_free_packet(&asf_st->pkt); | |
882 asf_st->frag_offset=0; | |
883 asf_st->seq=0; | |
884 } | |
885 asf->asf_st= NULL; | |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
886 } |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
887 |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
888 static int64_t asf_read_pts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit) |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
889 { |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
890 ASFContext *asf = s->priv_data; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
891 AVPacket pkt1, *pkt = &pkt1; |
349 | 892 ASFStream *asf_st; |
893 int64_t pts; | |
348 | 894 int64_t pos= *ppos; |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
895 int i; |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
896 int64_t start_pos[s->nb_streams]; |
885 | 897 |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
898 for(i=0; i<s->nb_streams; i++){ |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
899 start_pos[i]= pos; |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
900 } |
885 | 901 |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
902 pos= (pos+asf->packet_size-1-s->data_offset)/asf->packet_size*asf->packet_size+ s->data_offset; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
903 *ppos= pos; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
904 url_fseek(&s->pb, pos, SEEK_SET); |
885 | 905 |
349 | 906 //printf("asf_read_pts\n"); |
907 asf_reset_header(s); | |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
908 for(;;){ |
349 | 909 if (av_read_frame(s, pkt) < 0){ |
1714 | 910 av_log(s, AV_LOG_INFO, "asf_read_pts failed\n"); |
887 | 911 return AV_NOPTS_VALUE; |
349 | 912 } |
885 | 913 |
991 | 914 pts= pkt->pts; |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
915 |
348 | 916 av_free_packet(pkt); |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
917 if(pkt->flags&PKT_FLAG_KEY){ |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
918 i= pkt->stream_index; |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
919 |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
920 asf_st= s->streams[i]->priv_data; |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
921 |
1722
cb0dc6abf4d1
make the asf demuxer resistant against insertion/deletion errors
michael
parents:
1716
diff
changeset
|
922 // assert((asf_st->packet_pos - s->data_offset) % asf->packet_size == 0); |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
923 pos= asf_st->packet_pos; |
351
c072833fe7f4
use packet number instead of byte number internally for seeking
michael
parents:
350
diff
changeset
|
924 |
1266 | 925 av_add_index_entry(s->streams[i], pos, pts, pkt->size, pos - start_pos[i] + 1, AVINDEX_KEYFRAME); |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
926 start_pos[i]= asf_st->packet_pos + 1; |
885 | 927 |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
928 if(pkt->stream_index == stream_index) |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
929 break; |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
930 } |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
931 } |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
932 |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
933 *ppos= pos; |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1415
diff
changeset
|
934 //printf("found keyframe at %"PRId64" stream %d stamp:%"PRId64"\n", *ppos, stream_index, pts); |
348 | 935 |
936 return pts; | |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
937 } |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
938 |
1265
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
939 static void asf_build_simple_index(AVFormatContext *s, int stream_index) |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
940 { |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
941 GUID g; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
942 ASFContext *asf = s->priv_data; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
943 int64_t gsize, itime; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
944 int64_t pos, current_pos, index_pts; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
945 int i; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
946 int pct,ict; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
947 |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
948 current_pos = url_ftell(&s->pb); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
949 |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
950 url_fseek(&s->pb, asf->data_object_offset + asf->data_object_size, SEEK_SET); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
951 get_guid(&s->pb, &g); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
952 if (!memcmp(&g, &index_guid, sizeof(GUID))) { |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
953 gsize = get_le64(&s->pb); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
954 get_guid(&s->pb, &g); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
955 itime=get_le64(&s->pb); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
956 pct=get_le32(&s->pb); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
957 ict=get_le32(&s->pb); |
1388
3172bf94c066
Use proper PRI?64 macros for %ll? format to fix printf format warnings:
rathann
parents:
1358
diff
changeset
|
958 av_log(NULL, AV_LOG_DEBUG, "itime:0x%"PRIx64", pct:%d, ict:%d\n",itime,pct,ict); |
1265
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
959 |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
960 for (i=0;i<ict;i++){ |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
961 int pktnum=get_le32(&s->pb); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
962 int pktct =get_le16(&s->pb); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
963 av_log(NULL, AV_LOG_DEBUG, "pktnum:%d, pktct:%d\n", pktnum, pktct); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
964 |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
965 pos=s->data_offset + asf->packet_size*(int64_t)pktnum; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
966 index_pts=av_rescale(itime, i, 10000); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
967 |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
968 av_add_index_entry(s->streams[stream_index], pos, index_pts, asf->packet_size, 0, AVINDEX_KEYFRAME); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
969 } |
1266 | 970 asf->index_read= 1; |
1265
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
971 } |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
972 url_fseek(&s->pb, current_pos, SEEK_SET); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
973 } |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
974 |
555 | 975 static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flags) |
0 | 976 { |
312
8a04d2e1be2f
frame rate should be completely disabled in asf (closer now) - disabled seek
bellard
parents:
300
diff
changeset
|
977 ASFContext *asf = s->priv_data; |
1265
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
978 AVStream *st = s->streams[stream_index]; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
979 int64_t pos; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
980 int index; |
885 | 981 |
350 | 982 if (asf->packet_size <= 0) |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
983 return -1; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
984 |
1266 | 985 if (!asf->index_read) |
1265
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
986 asf_build_simple_index(s, stream_index); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
987 |
1266 | 988 if(!(asf->index_read && st->index_entries)){ |
1265
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
989 if(av_seek_frame_binary(s, stream_index, pts, flags)<0) |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
990 return -1; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
991 }else{ |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
992 index= av_index_search_timestamp(st, pts, flags); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
993 if(index<0) |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
994 return -1; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
995 |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
996 /* find the position */ |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
997 pos = st->index_entries[index].pos; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
998 pts = st->index_entries[index].timestamp; |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
999 |
1265
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1000 // various attempts to find key frame have failed so far |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1001 // asf_reset_header(s); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1002 // url_fseek(&s->pb, pos, SEEK_SET); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1003 // key_pos = pos; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1004 // for(i=0;i<16;i++){ |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1005 // pos = url_ftell(&s->pb); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1006 // if (av_read_frame(s, &pkt) < 0){ |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1007 // av_log(s, AV_LOG_INFO, "seek failed\n"); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1008 // return -1; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1009 // } |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1010 // asf_st = s->streams[stream_index]->priv_data; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1011 // pos += st->parser->frame_offset; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1012 // |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1013 // if (pkt.size > b) { |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1014 // b = pkt.size; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1015 // key_pos = pos; |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1016 // } |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1017 // |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1018 // av_free_packet(&pkt); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1019 // } |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1020 |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1021 /* do the seek */ |
1388
3172bf94c066
Use proper PRI?64 macros for %ll? format to fix printf format warnings:
rathann
parents:
1358
diff
changeset
|
1022 av_log(NULL, AV_LOG_DEBUG, "SEEKTO: %"PRId64"\n", pos); |
1265
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1023 url_fseek(&s->pb, pos, SEEK_SET); |
613fdf995af0
read and use index (based on a patch by John Donaghy on the 23-03-2006 '[Ffmpeg-devel] dvr-ms seek help request')
michael
parents:
1264
diff
changeset
|
1024 } |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
1025 asf_reset_header(s); |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
1026 return 0; |
0 | 1027 } |
1028 | |
1169 | 1029 AVInputFormat asf_demuxer = { |
0 | 1030 "asf", |
1031 "asf format", | |
1032 sizeof(ASFContext), | |
1033 asf_probe, | |
1034 asf_read_header, | |
1035 asf_read_packet, | |
1036 asf_read_close, | |
1037 asf_read_seek, | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
1038 asf_read_pts, |
0 | 1039 }; |