Mercurial > libavformat.hg
annotate asf.c @ 1206:e60bf67d9bf8 libavformat
The reader ignores the size of the ASF data object and keeps on
reading even beyond it.
Therefore if the ASF file includes an index object at its end, the
reader will treat the index like data, but of course will fail since
it thinks that the data is corrupted.
When reading an asf file with an index object, ffmpeg will
complain at the end of the file that it read an invalid header.
Patch by Kohn Emil Dan, < emild A cs P technion P ac P il >
Original thead:
Date: Apr 18, 2006 4:11 PM
Subject: [Ffmpeg-devel] Two ASF related bugs and fixes
author | gpoirier |
---|---|
date | Sat, 29 Jul 2006 16:07:19 +0000 |
parents | 6a5e58d2114b |
children | cf88f6719743 |
rev | line source |
---|---|
0 | 1 /* |
372
2e12cd1b68ed
split asf patch by (Konstantin Andreyev <kandreyev at bcsii dot com>)
michael
parents:
370
diff
changeset
|
2 * ASF compatible decoder. |
0 | 3 * Copyright (c) 2000, 2001 Fabrice Bellard. |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
887
diff
changeset
|
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 */ |
19 #include "avformat.h" | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
1169
diff
changeset
|
20 #include "riff.h" |
0 | 21 #include "mpegaudio.h" |
372
2e12cd1b68ed
split asf patch by (Konstantin Andreyev <kandreyev at bcsii dot com>)
michael
parents:
370
diff
changeset
|
22 #include "asf.h" |
0 | 23 |
348 | 24 #undef NDEBUG |
25 #include <assert.h> | |
26 | |
373
e47d9c8e2054
asf patch by (Konstantin Andreyev <kandreyev at bcsii dot com>)
michael
parents:
372
diff
changeset
|
27 #define FRAME_HEADER_SIZE 17 |
885 | 28 // 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
|
29 |
0 | 30 static const GUID index_guid = { |
31 0x33000890, 0xe5b1, 0x11cf, { 0x89, 0xf4, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb }, | |
32 }; | |
33 | |
34 /**********************************/ | |
35 /* decoding */ | |
36 | |
37 //#define DEBUG | |
38 | |
39 #ifdef DEBUG | |
69 | 40 #define PRINT_IF_GUID(g,cmp) \ |
41 if (!memcmp(g, &cmp, sizeof(GUID))) \ | |
42 printf("(GUID: %s) ", #cmp) | |
43 | |
0 | 44 static void print_guid(const GUID *g) |
45 { | |
46 int i; | |
69 | 47 PRINT_IF_GUID(g, asf_header); |
48 else PRINT_IF_GUID(g, file_header); | |
49 else PRINT_IF_GUID(g, stream_header); | |
50 else PRINT_IF_GUID(g, audio_stream); | |
51 else PRINT_IF_GUID(g, audio_conceal_none); | |
52 else PRINT_IF_GUID(g, video_stream); | |
53 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
|
54 else PRINT_IF_GUID(g, command_stream); |
69 | 55 else PRINT_IF_GUID(g, comment_header); |
56 else PRINT_IF_GUID(g, codec_comment_header); | |
57 else PRINT_IF_GUID(g, codec_comment1_header); | |
58 else PRINT_IF_GUID(g, data_header); | |
59 else PRINT_IF_GUID(g, index_guid); | |
60 else PRINT_IF_GUID(g, head1_guid); | |
61 else PRINT_IF_GUID(g, head2_guid); | |
62 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
|
63 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
|
64 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
|
65 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
|
66 else PRINT_IF_GUID(g, ext_stream_audio_stream); |
69 | 67 else |
68 printf("(GUID: unknown) "); | |
0 | 69 printf("0x%08x, 0x%04x, 0x%04x, {", g->v1, g->v2, g->v3); |
70 for(i=0;i<8;i++) | |
71 printf(" 0x%02x,", g->v4[i]); | |
72 printf("}\n"); | |
73 } | |
949 | 74 #undef PRINT_IF_GUID |
0 | 75 #endif |
76 | |
77 static void get_guid(ByteIOContext *s, GUID *g) | |
78 { | |
79 int i; | |
80 | |
81 g->v1 = get_le32(s); | |
82 g->v2 = get_le16(s); | |
83 g->v3 = get_le16(s); | |
84 for(i=0;i<8;i++) | |
85 g->v4[i] = get_byte(s); | |
86 } | |
87 | |
88 #if 0 | |
89 static void get_str16(ByteIOContext *pb, char *buf, int buf_size) | |
90 { | |
91 int len, c; | |
92 char *q; | |
93 | |
94 len = get_le16(pb); | |
95 q = buf; | |
96 while (len > 0) { | |
97 c = get_le16(pb); | |
98 if ((q - buf) < buf_size - 1) | |
99 *q++ = c; | |
100 len--; | |
101 } | |
102 *q = '\0'; | |
103 } | |
104 #endif | |
105 | |
106 static void get_str16_nolen(ByteIOContext *pb, int len, char *buf, int buf_size) | |
107 { | |
108 int c; | |
109 char *q; | |
110 | |
111 q = buf; | |
112 while (len > 0) { | |
113 c = get_le16(pb); | |
114 if ((q - buf) < buf_size - 1) | |
115 *q++ = c; | |
116 len-=2; | |
117 } | |
118 *q = '\0'; | |
119 } | |
120 | |
121 static int asf_probe(AVProbeData *pd) | |
122 { | |
123 GUID g; | |
124 const unsigned char *p; | |
125 int i; | |
126 | |
127 /* check file header */ | |
128 if (pd->buf_size <= 32) | |
129 return 0; | |
130 p = pd->buf; | |
131 g.v1 = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); | |
132 p += 4; | |
133 g.v2 = p[0] | (p[1] << 8); | |
134 p += 2; | |
135 g.v3 = p[0] | (p[1] << 8); | |
136 p += 2; | |
137 for(i=0;i<8;i++) | |
138 g.v4[i] = *p++; | |
139 | |
140 if (!memcmp(&g, &asf_header, sizeof(GUID))) | |
141 return AVPROBE_SCORE_MAX; | |
142 else | |
143 return 0; | |
144 } | |
145 | |
146 static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap) | |
147 { | |
148 ASFContext *asf = s->priv_data; | |
149 GUID g; | |
150 ByteIOContext *pb = &s->pb; | |
151 AVStream *st; | |
152 ASFStream *asf_st; | |
153 int size, i; | |
65 | 154 int64_t gsize; |
0 | 155 |
156 get_guid(pb, &g); | |
157 if (memcmp(&g, &asf_header, sizeof(GUID))) | |
158 goto fail; | |
159 get_le64(pb); | |
160 get_le32(pb); | |
161 get_byte(pb); | |
162 get_byte(pb); | |
163 memset(&asf->asfid2avid, -1, sizeof(asf->asfid2avid)); | |
164 for(;;) { | |
165 get_guid(pb, &g); | |
166 gsize = get_le64(pb); | |
167 #ifdef DEBUG | |
168 printf("%08Lx: ", url_ftell(pb) - 24); | |
169 print_guid(&g); | |
170 printf(" size=0x%Lx\n", gsize); | |
171 #endif | |
172 if (gsize < 24) | |
173 goto fail; | |
174 if (!memcmp(&g, &file_header, sizeof(GUID))) { | |
175 get_guid(pb, &asf->hdr.guid); | |
887 | 176 asf->hdr.file_size = get_le64(pb); |
177 asf->hdr.create_time = get_le64(pb); | |
178 asf->hdr.packets_count = get_le64(pb); | |
179 asf->hdr.send_time = get_le64(pb); | |
180 asf->hdr.play_time = get_le64(pb); | |
181 asf->hdr.preroll = get_le32(pb); | |
182 asf->hdr.ignore = get_le32(pb); | |
183 asf->hdr.flags = get_le32(pb); | |
184 asf->hdr.min_pktsize = get_le32(pb); | |
185 asf->hdr.max_pktsize = get_le32(pb); | |
186 asf->hdr.max_bitrate = get_le32(pb); | |
187 asf->packet_size = asf->hdr.max_pktsize; | |
0 | 188 asf->nb_packets = asf->hdr.packets_count; |
189 } else if (!memcmp(&g, &stream_header, sizeof(GUID))) { | |
732 | 190 int type, total_size, type_specific_size, sizeX; |
0 | 191 unsigned int tag1; |
65 | 192 int64_t pos1, pos2; |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
193 int test_for_ext_stream_audio; |
0 | 194 |
195 pos1 = url_ftell(pb); | |
196 | |
188
6c9d6422a2f6
update duration and start_time - add av_new_stream() usage
bellard
parents:
136
diff
changeset
|
197 st = av_new_stream(s, 0); |
0 | 198 if (!st) |
199 goto fail; | |
462
b69898ffc92a
move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents:
437
diff
changeset
|
200 av_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */ |
0 | 201 asf_st = av_mallocz(sizeof(ASFStream)); |
202 if (!asf_st) | |
203 goto fail; | |
204 st->priv_data = asf_st; | |
743 | 205 st->start_time = asf->hdr.preroll; |
885 | 206 st->duration = asf->hdr.send_time / |
743 | 207 (10000000 / 1000) - st->start_time; |
0 | 208 get_guid(pb, &g); |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
209 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
210 test_for_ext_stream_audio = 0; |
0 | 211 if (!memcmp(&g, &audio_stream, sizeof(GUID))) { |
212 type = CODEC_TYPE_AUDIO; | |
213 } else if (!memcmp(&g, &video_stream, sizeof(GUID))) { | |
214 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
|
215 } 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
|
216 type = CODEC_TYPE_UNKNOWN; |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
217 } 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
|
218 test_for_ext_stream_audio = 1; |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
219 type = CODEC_TYPE_UNKNOWN; |
0 | 220 } else { |
221 goto fail; | |
222 } | |
223 get_guid(pb, &g); | |
224 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
|
225 type_specific_size = get_le32(pb); |
0 | 226 get_le32(pb); |
887 | 227 st->id = get_le16(pb) & 0x7f; /* stream id */ |
0 | 228 // 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
|
229 asf->asfid2avid[st->id] = s->nb_streams - 1; |
0 | 230 |
231 get_le32(pb); | |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
232 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
233 if (test_for_ext_stream_audio) { |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
234 get_guid(pb, &g); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
235 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
|
236 type = CODEC_TYPE_AUDIO; |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
237 get_guid(pb, &g); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
238 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
239 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
240 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
241 get_guid(pb, &g); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
242 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
243 } |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
244 } |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
245 |
887 | 246 st->codec->codec_type = type; |
0 | 247 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
|
248 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
|
249 st->need_parsing = 1; |
887 | 250 /* We have to init the frame size at some point .... */ |
251 pos2 = url_ftell(pb); | |
252 if (gsize > (pos2 + 8 - pos1 + 24)) { | |
253 asf_st->ds_span = get_byte(pb); | |
254 asf_st->ds_packet_size = get_le16(pb); | |
255 asf_st->ds_chunk_size = get_le16(pb); | |
256 asf_st->ds_data_size = get_le16(pb); | |
257 asf_st->ds_silence_data = get_byte(pb); | |
258 } | |
259 //printf("Descrambling: ps:%d cs:%d ds:%d s:%d sd:%d\n", | |
260 // asf_st->ds_packet_size, asf_st->ds_chunk_size, | |
261 // asf_st->ds_data_size, asf_st->ds_span, asf_st->ds_silence_data); | |
262 if (asf_st->ds_span > 1) { | |
263 if (!asf_st->ds_chunk_size | |
264 || (asf_st->ds_packet_size/asf_st->ds_chunk_size <= 1)) | |
265 asf_st->ds_span = 0; // disable descrambling | |
266 } | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
792
diff
changeset
|
267 switch (st->codec->codec_id) { |
232 | 268 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
|
269 st->codec->frame_size = MPA_FRAME_SIZE; |
0 | 270 break; |
271 case CODEC_ID_PCM_S16LE: | |
272 case CODEC_ID_PCM_S16BE: | |
273 case CODEC_ID_PCM_U16LE: | |
274 case CODEC_ID_PCM_U16BE: | |
275 case CODEC_ID_PCM_S8: | |
276 case CODEC_ID_PCM_U8: | |
277 case CODEC_ID_PCM_ALAW: | |
278 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
|
279 st->codec->frame_size = 1; |
0 | 280 break; |
281 default: | |
282 /* 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
|
283 st->codec->frame_size = 1; |
0 | 284 break; |
285 } | |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
286 } else if (type == CODEC_TYPE_VIDEO) { |
887 | 287 get_le32(pb); |
0 | 288 get_le32(pb); |
289 get_byte(pb); | |
290 size = get_le16(pb); /* size */ | |
732 | 291 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
|
292 st->codec->width = get_le32(pb); |
887 | 293 st->codec->height = get_le32(pb); |
0 | 294 /* not available for asf */ |
295 get_le16(pb); /* panes */ | |
887 | 296 st->codec->bits_per_sample = get_le16(pb); /* depth */ |
0 | 297 tag1 = get_le32(pb); |
887 | 298 url_fskip(pb, 20); |
732 | 299 // av_log(NULL, AV_LOG_DEBUG, "size:%d tsize:%d sizeX:%d\n", size, total_size, sizeX); |
300 size= sizeX; | |
887 | 301 if (size > 40) { |
302 st->codec->extradata_size = size - 40; | |
303 st->codec->extradata = av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
304 get_buffer(pb, st->codec->extradata, st->codec->extradata_size); | |
305 } | |
297
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
306 |
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
307 /* Extract palette from extradata if bpp <= 8 */ |
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
308 /* This code assumes that extradata contains only palette */ |
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
309 /* 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
|
310 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
|
311 st->codec->palctrl = av_mallocz(sizeof(AVPaletteControl)); |
297
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
312 #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
|
313 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
|
314 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
|
315 #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
|
316 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
|
317 FFMIN(st->codec->extradata_size, AVPALETTE_SIZE)); |
297
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
318 #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
|
319 st->codec->palctrl->palette_changed = 1; |
297
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
320 } |
85d558a18134
Make avi and asf demuxer export palette in palctrl
rtognimp
parents:
277
diff
changeset
|
321 |
820
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->codec_tag = tag1; |
887 | 323 st->codec->codec_id = codec_get_id(codec_bmp_tags, tag1); |
573 | 324 if(tag1 == MKTAG('D', 'V', 'R', ' ')) |
325 st->need_parsing = 1; | |
0 | 326 } |
327 pos2 = url_ftell(pb); | |
328 url_fskip(pb, gsize - (pos2 - pos1 + 24)); | |
329 } else if (!memcmp(&g, &data_header, sizeof(GUID))) { | |
1206
e60bf67d9bf8
The reader ignores the size of the ASF data object and keeps on
gpoirier
parents:
1172
diff
changeset
|
330 asf->data_object_offset = url_ftell(pb); |
e60bf67d9bf8
The reader ignores the size of the ASF data object and keeps on
gpoirier
parents:
1172
diff
changeset
|
331 if (gsize != (uint64_t)-1 && gsize >= 24) { |
e60bf67d9bf8
The reader ignores the size of the ASF data object and keeps on
gpoirier
parents:
1172
diff
changeset
|
332 asf->data_object_size = gsize - 24; |
e60bf67d9bf8
The reader ignores the size of the ASF data object and keeps on
gpoirier
parents:
1172
diff
changeset
|
333 } else { |
e60bf67d9bf8
The reader ignores the size of the ASF data object and keeps on
gpoirier
parents:
1172
diff
changeset
|
334 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
|
335 } |
0 | 336 break; |
337 } else if (!memcmp(&g, &comment_header, sizeof(GUID))) { | |
338 int len1, len2, len3, len4, len5; | |
339 | |
340 len1 = get_le16(pb); | |
341 len2 = get_le16(pb); | |
342 len3 = get_le16(pb); | |
343 len4 = get_le16(pb); | |
344 len5 = get_le16(pb); | |
345 get_str16_nolen(pb, len1, s->title, sizeof(s->title)); | |
346 get_str16_nolen(pb, len2, s->author, sizeof(s->author)); | |
347 get_str16_nolen(pb, len3, s->copyright, sizeof(s->copyright)); | |
348 get_str16_nolen(pb, len4, s->comment, sizeof(s->comment)); | |
887 | 349 url_fskip(pb, len5); |
341
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
350 } 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
|
351 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
|
352 |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
353 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
|
354 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
|
355 { |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
356 int name_len,value_type,value_len,value_num = 0; |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
357 char *name, *value; |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
358 |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
359 name_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
|
360 name = (char *)av_mallocz(name_len); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
361 get_str16_nolen(pb, name_len, name, name_len); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
362 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
|
363 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
|
364 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
|
365 { |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
366 value = (char *)av_mallocz(value_len); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
367 get_str16_nolen(pb, value_len, value, value_len); |
643 | 368 if (strcmp(name,"WM/AlbumTitle")==0) { pstrcpy(s->album, sizeof(s->album), value); } |
341
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
369 av_free(value); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
370 } |
792 | 371 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
|
372 { |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
373 if (value_type==2) value_num = get_le32(pb); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
374 if (value_type==3) value_num = get_le32(pb); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
375 if (value_type==4) value_num = get_le64(pb); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
376 if (value_type==5) value_num = get_le16(pb); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
377 if (strcmp(name,"WM/Track")==0) s->track = value_num + 1; |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
378 if (strcmp(name,"WM/TrackNumber")==0) s->track = value_num; |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
379 } |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
380 av_free(name); |
ad2a57c5467a
ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
312
diff
changeset
|
381 } |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
382 } 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
|
383 int ext_len, payload_ext_ct, stream_ct; |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
384 uint32_t ext_d; |
972 | 385 int64_t pos_ex_st; |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
386 pos_ex_st = url_ftell(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
387 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
388 get_le64(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
389 get_le64(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
390 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
391 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
392 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
393 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
394 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
395 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
396 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
397 get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
398 get_le16(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
399 get_le16(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
400 get_le64(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
401 stream_ct = get_le16(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
402 payload_ext_ct = get_le16(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
403 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
404 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
|
405 get_le16(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
406 ext_len = get_le16(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
407 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
|
408 } |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
409 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
410 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
|
411 get_guid(pb, &g); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
412 ext_d=get_le16(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
413 ext_len=get_le32(pb); |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
414 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
|
415 } |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
416 |
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
417 // 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
|
418 // if so the next iteration will pick it up |
0 | 419 } else if (!memcmp(&g, &head1_guid, sizeof(GUID))) { |
420 int v1, v2; | |
421 get_guid(pb, &g); | |
422 v1 = get_le32(pb); | |
423 v2 = get_le16(pb); | |
904
5d3dc3a6bbe7
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents:
896
diff
changeset
|
424 #if 0 |
0 | 425 } else if (!memcmp(&g, &codec_comment_header, sizeof(GUID))) { |
426 int len, v1, n, num; | |
427 char str[256], *q; | |
428 char tag[16]; | |
429 | |
430 get_guid(pb, &g); | |
431 print_guid(&g); | |
432 | |
433 n = get_le32(pb); | |
434 for(i=0;i<n;i++) { | |
435 num = get_le16(pb); /* stream number */ | |
436 get_str16(pb, str, sizeof(str)); | |
437 get_str16(pb, str, sizeof(str)); | |
438 len = get_le16(pb); | |
439 q = tag; | |
440 while (len > 0) { | |
441 v1 = get_byte(pb); | |
442 if ((q - tag) < sizeof(tag) - 1) | |
443 *q++ = v1; | |
444 len--; | |
445 } | |
446 *q = '\0'; | |
447 } | |
448 #endif | |
449 } else if (url_feof(pb)) { | |
450 goto fail; | |
451 } else { | |
452 url_fseek(pb, gsize - 24, SEEK_CUR); | |
453 } | |
454 } | |
455 get_guid(pb, &g); | |
456 get_le64(pb); | |
457 get_byte(pb); | |
458 get_byte(pb); | |
459 if (url_feof(pb)) | |
460 goto fail; | |
461 asf->data_offset = url_ftell(pb); | |
462 asf->packet_size_left = 0; | |
463 | |
464 return 0; | |
465 | |
466 fail: | |
467 for(i=0;i<s->nb_streams;i++) { | |
468 AVStream *st = s->streams[i]; | |
887 | 469 if (st) { |
470 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
|
471 av_free(st->codec->extradata); |
887 | 472 } |
0 | 473 av_free(st); |
474 } | |
475 return -1; | |
476 } | |
477 | |
478 #define DO_2BITS(bits, var, defval) \ | |
479 switch (bits & 3) \ | |
480 { \ | |
481 case 3: var = get_le32(pb); rsize += 4; break; \ | |
482 case 2: var = get_le16(pb); rsize += 2; break; \ | |
483 case 1: var = get_byte(pb); rsize++; break; \ | |
484 default: var = defval; break; \ | |
485 } | |
486 | |
487 static int asf_get_packet(AVFormatContext *s) | |
488 { | |
489 ASFContext *asf = s->priv_data; | |
490 ByteIOContext *pb = &s->pb; | |
491 uint32_t packet_length, padsize; | |
353 | 492 int rsize = 9; |
493 int c; | |
885 | 494 |
353 | 495 assert((url_ftell(&s->pb) - s->data_offset) % asf->packet_size == 0); |
885 | 496 |
353 | 497 c = get_byte(pb); |
0 | 498 if (c != 0x82) { |
499 if (!url_feof(pb)) | |
887 | 500 av_log(s, AV_LOG_ERROR, "ff asf bad header %x at:%"PRId64"\n", c, url_ftell(pb)); |
0 | 501 } |
502 if ((c & 0x0f) == 2) { // always true for now | |
887 | 503 if (get_le16(pb) != 0) { |
0 | 504 if (!url_feof(pb)) |
887 | 505 av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n"); |
506 return AVERROR_IO; | |
507 } | |
353 | 508 rsize+=2; |
509 /* }else{ | |
510 if (!url_feof(pb)) | |
887 | 511 printf("ff asf bad header %x at:%lld\n", c, url_ftell(pb)); |
512 return AVERROR_IO;*/ | |
0 | 513 } |
514 | |
515 asf->packet_flags = get_byte(pb); | |
516 asf->packet_property = get_byte(pb); | |
517 | |
518 DO_2BITS(asf->packet_flags >> 5, packet_length, asf->packet_size); | |
519 DO_2BITS(asf->packet_flags >> 1, padsize, 0); // sequence ignored | |
520 DO_2BITS(asf->packet_flags >> 3, padsize, 0); // padding length | |
521 | |
522 asf->packet_timestamp = get_le32(pb); | |
523 get_le16(pb); /* duration */ | |
524 // rsize has at least 11 bytes which have to be present | |
525 | |
526 if (asf->packet_flags & 0x01) { | |
887 | 527 asf->packet_segsizetype = get_byte(pb); rsize++; |
0 | 528 asf->packet_segments = asf->packet_segsizetype & 0x3f; |
529 } else { | |
887 | 530 asf->packet_segments = 1; |
0 | 531 asf->packet_segsizetype = 0x80; |
532 } | |
533 asf->packet_size_left = packet_length - padsize - rsize; | |
534 if (packet_length < asf->hdr.min_pktsize) | |
535 padsize += asf->hdr.min_pktsize - packet_length; | |
536 asf->packet_padsize = padsize; | |
537 #ifdef DEBUG | |
538 printf("packet: size=%d padsize=%d left=%d\n", asf->packet_size, asf->packet_padsize, asf->packet_size_left); | |
539 #endif | |
540 return 0; | |
541 } | |
542 | |
543 static int asf_read_packet(AVFormatContext *s, AVPacket *pkt) | |
544 { | |
545 ASFContext *asf = s->priv_data; | |
546 ASFStream *asf_st = 0; | |
547 ByteIOContext *pb = &s->pb; | |
548 //static int pc = 0; | |
549 for (;;) { | |
887 | 550 int rsize = 0; |
551 if (asf->packet_size_left < FRAME_HEADER_SIZE | |
552 || asf->packet_segments < 1) { | |
553 //asf->packet_size_left <= asf->packet_padsize) { | |
554 int ret = asf->packet_size_left + asf->packet_padsize; | |
555 //printf("PacketLeftSize:%d Pad:%d Pos:%Ld\n", asf->packet_size_left, asf->packet_padsize, url_ftell(pb)); | |
828 | 556 if((url_ftell(&s->pb) + ret - s->data_offset) % asf->packet_size) |
557 ret += asf->packet_size - ((url_ftell(&s->pb) + ret - s->data_offset) % asf->packet_size); | |
887 | 558 /* fail safe */ |
559 url_fskip(pb, ret); | |
349 | 560 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
|
561 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
|
562 (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
|
563 return AVERROR_IO; /* Do not exceed the size of the data object */ |
887 | 564 ret = asf_get_packet(s); |
565 //printf("READ ASF PACKET %d r:%d c:%d\n", ret, asf->packet_size_left, pc++); | |
566 if (ret < 0 || url_feof(pb)) | |
567 return AVERROR_IO; | |
0 | 568 asf->packet_time_start = 0; |
569 continue; | |
887 | 570 } |
571 if (asf->packet_time_start == 0) { | |
572 /* read frame header */ | |
0 | 573 int num = get_byte(pb); |
887 | 574 asf->packet_segments--; |
575 rsize++; | |
576 asf->packet_key_frame = (num & 0x80) >> 7; | |
577 asf->stream_index = asf->asfid2avid[num & 0x7f]; | |
578 // sequence should be ignored! | |
579 DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0); | |
580 DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0); | |
581 DO_2BITS(asf->packet_property, asf->packet_replic_size, 0); | |
349 | 582 //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); |
887 | 583 if (asf->packet_replic_size > 1) { |
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
|
584 assert(asf->packet_replic_size >= 8); |
0 | 585 // it should be always at least 8 bytes - FIXME validate |
887 | 586 asf->packet_obj_size = get_le32(pb); |
587 asf->packet_frag_timestamp = get_le32(pb); // timestamp | |
588 if (asf->packet_replic_size > 8) | |
589 url_fskip(pb, asf->packet_replic_size - 8); | |
590 rsize += asf->packet_replic_size; // FIXME - check validity | |
591 } else if (asf->packet_replic_size==1){ | |
592 // multipacket - frag_offset is begining timestamp | |
593 asf->packet_time_start = asf->packet_frag_offset; | |
0 | 594 asf->packet_frag_offset = 0; |
887 | 595 asf->packet_frag_timestamp = asf->packet_timestamp; |
0 | 596 |
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
|
597 asf->packet_time_delta = get_byte(pb); |
887 | 598 rsize++; |
599 }else{ | |
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
|
600 assert(asf->packet_replic_size==0); |
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
|
601 } |
887 | 602 if (asf->packet_flags & 0x01) { |
603 DO_2BITS(asf->packet_segsizetype >> 6, asf->packet_frag_size, 0); // 0 is illegal | |
0 | 604 #undef DO_2BITS |
887 | 605 //printf("Fragsize %d\n", asf->packet_frag_size); |
606 } else { | |
607 asf->packet_frag_size = asf->packet_size_left - rsize; | |
608 //printf("Using rest %d %d %d\n", asf->packet_frag_size, asf->packet_size_left, rsize); | |
609 } | |
610 if (asf->packet_replic_size == 1) { | |
611 asf->packet_multi_size = asf->packet_frag_size; | |
612 if (asf->packet_multi_size > asf->packet_size_left) { | |
613 asf->packet_segments = 0; | |
0 | 614 continue; |
887 | 615 } |
616 } | |
617 asf->packet_size_left -= rsize; | |
618 //printf("___objsize____ %d %d rs:%d\n", asf->packet_obj_size, asf->packet_frag_offset, rsize); | |
0 | 619 |
887 | 620 if (asf->stream_index < 0 |
708 | 621 || s->streams[asf->stream_index]->discard >= AVDISCARD_ALL |
622 || (!asf->packet_key_frame && s->streams[asf->stream_index]->discard >= AVDISCARD_NONKEY) | |
623 ) { | |
0 | 624 asf->packet_time_start = 0; |
887 | 625 /* unhandled packet (should not happen) */ |
626 url_fskip(pb, asf->packet_frag_size); | |
627 asf->packet_size_left -= asf->packet_frag_size; | |
652 | 628 if(asf->stream_index < 0) |
629 av_log(s, AV_LOG_ERROR, "ff asf skip %d %d\n", asf->packet_frag_size, num & 0x7f); | |
0 | 630 continue; |
887 | 631 } |
632 asf->asf_st = s->streams[asf->stream_index]->priv_data; | |
633 } | |
634 asf_st = asf->asf_st; | |
0 | 635 |
887 | 636 if ((asf->packet_frag_offset != asf_st->frag_offset |
637 || (asf->packet_frag_offset | |
638 && asf->packet_seq != asf_st->seq)) // seq should be ignored | |
639 ) { | |
640 /* cannot continue current packet: free it */ | |
641 // FIXME better check if packet was already allocated | |
642 av_log(s, AV_LOG_INFO, "ff asf parser skips: %d - %d o:%d - %d %d %d fl:%d\n", | |
643 asf_st->pkt.size, | |
644 asf->packet_obj_size, | |
645 asf->packet_frag_offset, asf_st->frag_offset, | |
646 asf->packet_seq, asf_st->seq, asf->packet_frag_size); | |
647 if (asf_st->pkt.size) | |
648 av_free_packet(&asf_st->pkt); | |
649 asf_st->frag_offset = 0; | |
650 if (asf->packet_frag_offset != 0) { | |
651 url_fskip(pb, asf->packet_frag_size); | |
652 av_log(s, AV_LOG_INFO, "ff asf parser skipping %db\n", asf->packet_frag_size); | |
653 asf->packet_size_left -= asf->packet_frag_size; | |
654 continue; | |
655 } | |
656 } | |
657 if (asf->packet_replic_size == 1) { | |
658 // frag_offset is here used as the begining timestamp | |
659 asf->packet_frag_timestamp = asf->packet_time_start; | |
660 asf->packet_time_start += asf->packet_time_delta; | |
661 asf->packet_obj_size = asf->packet_frag_size = get_byte(pb); | |
662 asf->packet_size_left--; | |
0 | 663 asf->packet_multi_size--; |
887 | 664 if (asf->packet_multi_size < asf->packet_obj_size) |
665 { | |
666 asf->packet_time_start = 0; | |
667 url_fskip(pb, asf->packet_multi_size); | |
668 asf->packet_size_left -= asf->packet_multi_size; | |
0 | 669 continue; |
887 | 670 } |
671 asf->packet_multi_size -= asf->packet_obj_size; | |
672 //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); | |
673 } | |
674 if (asf_st->frag_offset == 0) { | |
675 /* new packet */ | |
676 av_new_packet(&asf_st->pkt, asf->packet_obj_size); | |
677 asf_st->seq = asf->packet_seq; | |
678 asf_st->pkt.pts = asf->packet_frag_timestamp; | |
679 asf_st->pkt.stream_index = asf->stream_index; | |
885 | 680 asf_st->pkt.pos = |
681 asf_st->packet_pos= asf->packet_pos; | |
682 //printf("new packet: stream:%d key:%d packet_key:%d audio:%d size:%d\n", | |
349 | 683 //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
|
684 //s->streams[asf->stream_index]->codec->codec_type == CODEC_TYPE_AUDIO, asf->packet_obj_size); |
887 | 685 if (s->streams[asf->stream_index]->codec->codec_type == CODEC_TYPE_AUDIO) |
686 asf->packet_key_frame = 1; | |
687 if (asf->packet_key_frame) | |
688 asf_st->pkt.flags |= PKT_FLAG_KEY; | |
689 } | |
0 | 690 |
887 | 691 /* read data */ |
692 //printf("READ PACKET s:%d os:%d o:%d,%d l:%d DATA:%p\n", | |
693 // asf->packet_size, asf_st->pkt.size, asf->packet_frag_offset, | |
694 // asf_st->frag_offset, asf->packet_frag_size, asf_st->pkt.data); | |
695 asf->packet_size_left -= asf->packet_frag_size; | |
696 if (asf->packet_size_left < 0) | |
0 | 697 continue; |
887 | 698 get_buffer(pb, asf_st->pkt.data + asf->packet_frag_offset, |
699 asf->packet_frag_size); | |
700 asf_st->frag_offset += asf->packet_frag_size; | |
701 /* test if whole packet is read */ | |
702 if (asf_st->frag_offset == asf_st->pkt.size) { | |
703 /* return packet */ | |
704 if (asf_st->ds_span > 1) { | |
705 /* packet descrambling */ | |
706 char* newdata = av_malloc(asf_st->pkt.size); | |
707 if (newdata) { | |
708 int offset = 0; | |
709 while (offset < asf_st->pkt.size) { | |
710 int off = offset / asf_st->ds_chunk_size; | |
711 int row = off / asf_st->ds_span; | |
712 int col = off % asf_st->ds_span; | |
713 int idx = row + col * asf_st->ds_packet_size / asf_st->ds_chunk_size; | |
714 //printf("off:%d row:%d col:%d idx:%d\n", off, row, col, idx); | |
715 memcpy(newdata + offset, | |
716 asf_st->pkt.data + idx * asf_st->ds_chunk_size, | |
717 asf_st->ds_chunk_size); | |
718 offset += asf_st->ds_chunk_size; | |
719 } | |
720 av_free(asf_st->pkt.data); | |
721 asf_st->pkt.data = newdata; | |
722 } | |
723 } | |
724 asf_st->frag_offset = 0; | |
725 memcpy(pkt, &asf_st->pkt, sizeof(AVPacket)); | |
726 //printf("packet %d %d\n", asf_st->pkt.size, asf->packet_frag_size); | |
727 asf_st->pkt.size = 0; | |
728 asf_st->pkt.data = 0; | |
729 break; // packet completed | |
730 } | |
0 | 731 } |
732 return 0; | |
733 } | |
734 | |
735 static int asf_read_close(AVFormatContext *s) | |
736 { | |
737 int i; | |
738 | |
739 for(i=0;i<s->nb_streams;i++) { | |
887 | 740 AVStream *st = s->streams[i]; |
741 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
|
742 av_free(st->codec->palctrl); |
0 | 743 } |
744 return 0; | |
745 } | |
746 | |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
747 // 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
|
748 // 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
|
749 // 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
|
750 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
|
751 { |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
752 ASFContext *asf = s->priv_data; |
349 | 753 ASFStream *asf_st; |
754 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
|
755 |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
756 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
|
757 asf->packet_timestamp_start = -1; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
758 asf->packet_timestamp_end = -1; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
759 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
|
760 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
|
761 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
|
762 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
|
763 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
|
764 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
|
765 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
|
766 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
|
767 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
|
768 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
|
769 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
|
770 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
|
771 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
|
772 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
|
773 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
|
774 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
|
775 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
|
776 asf->packet_time_start = 0; |
885 | 777 |
349 | 778 for(i=0; i<s->nb_streams; i++){ |
779 asf_st= s->streams[i]->priv_data; | |
780 av_free_packet(&asf_st->pkt); | |
781 asf_st->frag_offset=0; | |
782 asf_st->seq=0; | |
783 } | |
784 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
|
785 } |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
786 |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
787 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
|
788 { |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
789 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
|
790 AVPacket pkt1, *pkt = &pkt1; |
349 | 791 ASFStream *asf_st; |
792 int64_t pts; | |
348 | 793 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
|
794 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
|
795 int64_t start_pos[s->nb_streams]; |
885 | 796 |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
797 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
|
798 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
|
799 } |
885 | 800 |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
801 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
|
802 *ppos= pos; |
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
803 url_fseek(&s->pb, pos, SEEK_SET); |
885 | 804 |
349 | 805 //printf("asf_read_pts\n"); |
806 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
|
807 for(;;){ |
349 | 808 if (av_read_frame(s, pkt) < 0){ |
370
845f9de2c883
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
355
diff
changeset
|
809 av_log(s, AV_LOG_INFO, "seek failed\n"); |
887 | 810 return AV_NOPTS_VALUE; |
349 | 811 } |
885 | 812 |
991 | 813 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
|
814 |
348 | 815 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
|
816 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
|
817 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
|
818 |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
819 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
|
820 |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
821 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
|
822 pos= asf_st->packet_pos; |
351
c072833fe7f4
use packet number instead of byte number internally for seeking
michael
parents:
350
diff
changeset
|
823 |
979 | 824 av_add_index_entry(s->streams[i], pos, pkt->size, pts, 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
|
825 start_pos[i]= asf_st->packet_pos + 1; |
885 | 826 |
354
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
827 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
|
828 break; |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
829 } |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
830 } |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
831 |
6770ca07abe2
store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents:
353
diff
changeset
|
832 *ppos= pos; |
349 | 833 //printf("found keyframe at %Ld stream %d stamp:%Ld\n", *ppos, stream_index, pts); |
348 | 834 |
835 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
|
836 } |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
837 |
555 | 838 static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flags) |
0 | 839 { |
312
8a04d2e1be2f
frame rate should be completely disabled in asf (closer now) - disabled seek
bellard
parents:
300
diff
changeset
|
840 ASFContext *asf = s->priv_data; |
885 | 841 |
350 | 842 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
|
843 return -1; |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
844 |
555 | 845 if(av_seek_frame_binary(s, stream_index, pts, flags)<0) |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
846 return -1; |
347
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
847 |
2b485a3c5cfb
seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents:
341
diff
changeset
|
848 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
|
849 return 0; |
0 | 850 } |
851 | |
1169 | 852 AVInputFormat asf_demuxer = { |
0 | 853 "asf", |
854 "asf format", | |
855 sizeof(ASFContext), | |
856 asf_probe, | |
857 asf_read_header, | |
858 asf_read_packet, | |
859 asf_read_close, | |
860 asf_read_seek, | |
437
50bae308f71e
moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents:
373
diff
changeset
|
861 asf_read_pts, |
0 | 862 }; |