annotate asf.c @ 1700:77bd711c0aed libavformat

adding a few checks to the audio packet descrambling, this should hopefully catch all related out of array accesses note, the original code might have been exploitable
author michael
date Mon, 22 Jan 2007 03:19:00 +0000
parents b959208ba904
children 90be497b752b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
1415
3b00fb8ef8e4 replace coder/decoder file description in libavformat by muxer/demuxer
aurel
parents: 1388
diff changeset
2 * ASF compatible demuxer
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2000, 2001 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
a4ab86a48604 Use common macro PUT_UTF8 in asf.c
gpoirier
parents: 1443
diff changeset
25 #include "common.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26
348
ca519d041ea1 memleak fix
michael
parents: 347
diff changeset
27 #undef NDEBUG
ca519d041ea1 memleak fix
michael
parents: 347
diff changeset
28 #include <assert.h>
ca519d041ea1 memleak fix
michael
parents: 347
diff changeset
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
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33 static const GUID index_guid = {
1687
39cafa2f6060 simplify GUIDs
michael
parents: 1660
diff changeset
34 0x90, 0x08, 0x00, 0x33, 0xb1, 0xe5, 0xcf, 0x11, 0x89, 0xf4, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37 /**********************************/
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38 /* decoding */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 //#define DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 #ifdef DEBUG
69
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
43 #define PRINT_IF_GUID(g,cmp) \
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
44 if (!memcmp(g, &cmp, sizeof(GUID))) \
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
45 printf("(GUID: %s) ", #cmp)
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
46
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47 static void print_guid(const GUID *g)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
48 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 int i;
69
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
50 PRINT_IF_GUID(g, asf_header);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
51 else PRINT_IF_GUID(g, file_header);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
52 else PRINT_IF_GUID(g, stream_header);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
53 else PRINT_IF_GUID(g, audio_stream);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
54 else PRINT_IF_GUID(g, audio_conceal_none);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
55 else PRINT_IF_GUID(g, video_stream);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
56 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
57 else PRINT_IF_GUID(g, command_stream);
69
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
58 else PRINT_IF_GUID(g, comment_header);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
59 else PRINT_IF_GUID(g, codec_comment_header);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
60 else PRINT_IF_GUID(g, codec_comment1_header);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
61 else PRINT_IF_GUID(g, data_header);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
62 else PRINT_IF_GUID(g, index_guid);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
63 else PRINT_IF_GUID(g, head1_guid);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
64 else PRINT_IF_GUID(g, head2_guid);
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
65 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
66 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
67 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
68 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
69 else PRINT_IF_GUID(g, ext_stream_audio_stream);
69
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
70 else
0686eeb0c21b prettier debug output
mmu_man
parents: 65
diff changeset
71 printf("(GUID: unknown) ");
1687
39cafa2f6060 simplify GUIDs
michael
parents: 1660
diff changeset
72 for(i=0;i<16;i++)
39cafa2f6060 simplify GUIDs
michael
parents: 1660
diff changeset
73 printf(" 0x%02x,", (*g)[i]);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74 printf("}\n");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 }
949
0566e2d915ef 10l, fails to compile when debug enabled
alex
parents: 904
diff changeset
76 #undef PRINT_IF_GUID
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 static void get_guid(ByteIOContext *s, GUID *g)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 {
1687
39cafa2f6060 simplify GUIDs
michael
parents: 1660
diff changeset
81 assert(sizeof(*g) == 16);
39cafa2f6060 simplify GUIDs
michael
parents: 1660
diff changeset
82 get_buffer(s, g, sizeof(*g));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 static void get_str16(ByteIOContext *pb, char *buf, int buf_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 int len, c;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 char *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 len = get_le16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 q = buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 while (len > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 c = get_le16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 if ((q - buf) < buf_size - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 *q++ = c;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 len--;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 static void get_str16_nolen(ByteIOContext *pb, int len, char *buf, int buf_size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 {
1503
a4ab86a48604 Use common macro PUT_UTF8 in asf.c
gpoirier
parents: 1443
diff changeset
105 char* q = buf;
a4ab86a48604 Use common macro PUT_UTF8 in asf.c
gpoirier
parents: 1443
diff changeset
106 len /= 2;
a4ab86a48604 Use common macro PUT_UTF8 in asf.c
gpoirier
parents: 1443
diff changeset
107 while (len--) {
a4ab86a48604 Use common macro PUT_UTF8 in asf.c
gpoirier
parents: 1443
diff changeset
108 uint8_t tmp;
a4ab86a48604 Use common macro PUT_UTF8 in asf.c
gpoirier
parents: 1443
diff changeset
109 PUT_UTF8(get_le16(pb), tmp, if (q - buf < buf_size - 1) *q++ = tmp;)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 static int asf_probe(AVProbeData *pd)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 /* check file header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117 if (pd->buf_size <= 32)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119
1687
39cafa2f6060 simplify GUIDs
michael
parents: 1660
diff changeset
120 if (!memcmp(pd->buf, &asf_header, sizeof(GUID)))
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 return AVPROBE_SCORE_MAX;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 ASFContext *asf = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 GUID g;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 ASFStream *asf_st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 int size, i;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 14
diff changeset
134 int64_t gsize;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 get_guid(pb, &g);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 if (memcmp(&g, &asf_header, sizeof(GUID)))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 get_le64(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 memset(&asf->asfid2avid, -1, sizeof(asf->asfid2avid));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 get_guid(pb, &g);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146 gsize = get_le64(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 #ifdef DEBUG
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1415
diff changeset
148 printf("%08"PRIx64": ", url_ftell(pb) - 24);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 print_guid(&g);
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1415
diff changeset
150 printf(" size=0x%"PRIx64"\n", gsize);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 if (gsize < 24)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 if (!memcmp(&g, &file_header, sizeof(GUID))) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 get_guid(pb, &asf->hdr.guid);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
156 asf->hdr.file_size = get_le64(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
157 asf->hdr.create_time = get_le64(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
158 asf->hdr.packets_count = get_le64(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
159 asf->hdr.send_time = get_le64(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
160 asf->hdr.play_time = get_le64(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
161 asf->hdr.preroll = get_le32(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
162 asf->hdr.ignore = get_le32(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
163 asf->hdr.flags = get_le32(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
164 asf->hdr.min_pktsize = get_le32(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
165 asf->hdr.max_pktsize = get_le32(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
166 asf->hdr.max_bitrate = get_le32(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
167 asf->packet_size = asf->hdr.max_pktsize;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168 asf->nb_packets = asf->hdr.packets_count;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
169 } 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
170 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
171 uint64_t total_size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 unsigned int tag1;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 14
diff changeset
173 int64_t pos1, pos2;
904
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
174 int test_for_ext_stream_audio;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
175
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 pos1 = url_ftell(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 136
diff changeset
178 st = av_new_stream(s, 0);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 if (!st)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 goto fail;
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 437
diff changeset
181 av_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
182 asf_st = av_mallocz(sizeof(ASFStream));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
183 if (!asf_st)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
184 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 st->priv_data = asf_st;
743
af4e24d6310c switch to native time bases
michael
parents: 735
diff changeset
186 st->start_time = asf->hdr.preroll;
1552
de18846fa25c Minor modifications to handle mms streaming.
takis
parents: 1503
diff changeset
187 if(!(asf->hdr.flags & 0x01)) { // if we aren't streaming...
de18846fa25c Minor modifications to handle mms streaming.
takis
parents: 1503
diff changeset
188 st->duration = asf->hdr.send_time /
de18846fa25c Minor modifications to handle mms streaming.
takis
parents: 1503
diff changeset
189 (10000000 / 1000) - st->start_time;
de18846fa25c Minor modifications to handle mms streaming.
takis
parents: 1503
diff changeset
190 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 get_guid(pb, &g);
904
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
192
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
193 test_for_ext_stream_audio = 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
194 if (!memcmp(&g, &audio_stream, sizeof(GUID))) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195 type = CODEC_TYPE_AUDIO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196 } else if (!memcmp(&g, &video_stream, sizeof(GUID))) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 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
198 } 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
199 type = CODEC_TYPE_UNKNOWN;
904
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
200 } 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
201 test_for_ext_stream_audio = 1;
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
202 type = CODEC_TYPE_UNKNOWN;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206 get_guid(pb, &g);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
207 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
208 type_specific_size = get_le32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
209 get_le32(pb);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
210 st->id = get_le16(pb) & 0x7f; /* stream id */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211 // 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
212 asf->asfid2avid[st->id] = s->nb_streams - 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 get_le32(pb);
904
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
215
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
216 if (test_for_ext_stream_audio) {
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
217 get_guid(pb, &g);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
218 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
219 type = CODEC_TYPE_AUDIO;
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
220 get_guid(pb, &g);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
221 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
222 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
223 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
224 get_guid(pb, &g);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
225 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
226 }
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
227 }
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
228
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
229 st->codec->codec_type = type;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 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
231 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
232 st->need_parsing = 1;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
233 /* We have to init the frame size at some point .... */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
234 pos2 = url_ftell(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
235 if (gsize > (pos2 + 8 - pos1 + 24)) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
236 asf_st->ds_span = get_byte(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
237 asf_st->ds_packet_size = get_le16(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
238 asf_st->ds_chunk_size = get_le16(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
239 asf_st->ds_data_size = get_le16(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
240 asf_st->ds_silence_data = get_byte(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
241 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
242 //printf("Descrambling: ps:%d cs:%d ds:%d s:%d sd:%d\n",
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
243 // asf_st->ds_packet_size, asf_st->ds_chunk_size,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
244 // asf_st->ds_data_size, asf_st->ds_span, asf_st->ds_silence_data);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
245 if (asf_st->ds_span > 1) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
246 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
247 || (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
248 || asf_st->ds_packet_size % asf_st->ds_chunk_size)
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
249 asf_st->ds_span = 0; // disable descrambling
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
250 }
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 792
diff changeset
251 switch (st->codec->codec_id) {
232
eb90c0a5a1ba CODEC_ID_MP3LAME is obsolete
bellard
parents: 196
diff changeset
252 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
253 st->codec->frame_size = MPA_FRAME_SIZE;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255 case CODEC_ID_PCM_S16LE:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
256 case CODEC_ID_PCM_S16BE:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
257 case CODEC_ID_PCM_U16LE:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258 case CODEC_ID_PCM_U16BE:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 case CODEC_ID_PCM_S8:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 case CODEC_ID_PCM_U8:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
261 case CODEC_ID_PCM_ALAW:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262 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
263 st->codec->frame_size = 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 /* 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
267 st->codec->frame_size = 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
269 }
904
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
270 } else if (type == CODEC_TYPE_VIDEO) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
271 get_le32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
272 get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
273 get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
274 size = get_le16(pb); /* size */
732
1221cba1c069 fixing demuxing of DV5700.asf
michael
parents: 708
diff changeset
275 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
276 st->codec->width = get_le32(pb);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
277 st->codec->height = get_le32(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 /* not available for asf */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
279 get_le16(pb); /* panes */
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
280 st->codec->bits_per_sample = get_le16(pb); /* depth */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 tag1 = get_le32(pb);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
282 url_fskip(pb, 20);
732
1221cba1c069 fixing demuxing of DV5700.asf
michael
parents: 708
diff changeset
283 // av_log(NULL, AV_LOG_DEBUG, "size:%d tsize:%d sizeX:%d\n", size, total_size, sizeX);
1221cba1c069 fixing demuxing of DV5700.asf
michael
parents: 708
diff changeset
284 size= sizeX;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
285 if (size > 40) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
286 st->codec->extradata_size = size - 40;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
287 st->codec->extradata = av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
288 get_buffer(pb, st->codec->extradata, st->codec->extradata_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
289 }
297
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 277
diff changeset
290
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 277
diff changeset
291 /* Extract palette from extradata if bpp <= 8 */
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 277
diff changeset
292 /* This code assumes that extradata contains only palette */
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 277
diff changeset
293 /* 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
294 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
295 st->codec->palctrl = av_mallocz(sizeof(AVPaletteControl));
297
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 277
diff changeset
296 #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
297 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
298 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
299 #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
300 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
301 FFMIN(st->codec->extradata_size, AVPALETTE_SIZE));
297
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 277
diff changeset
302 #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
303 st->codec->palctrl->palette_changed = 1;
297
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 277
diff changeset
304 }
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 277
diff changeset
305
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 792
diff changeset
306 st->codec->codec_tag = tag1;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
307 st->codec->codec_id = codec_get_id(codec_bmp_tags, tag1);
573
b3adf6716dc3 dvr-ms video decoding support
michael
parents: 555
diff changeset
308 if(tag1 == MKTAG('D', 'V', 'R', ' '))
b3adf6716dc3 dvr-ms video decoding support
michael
parents: 555
diff changeset
309 st->need_parsing = 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311 pos2 = url_ftell(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312 url_fskip(pb, gsize - (pos2 - pos1 + 24));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313 } 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
314 asf->data_object_offset = url_ftell(pb);
1552
de18846fa25c Minor modifications to handle mms streaming.
takis
parents: 1503
diff changeset
315 // if not streaming, gsize is not unlimited (how?), and there is enough space in the file..
de18846fa25c Minor modifications to handle mms streaming.
takis
parents: 1503
diff changeset
316 if (!(asf->hdr.flags & 0x01) && gsize != (uint64_t)-1 && gsize >= 24) {
1206
e60bf67d9bf8 The reader ignores the size of the ASF data object and keeps on
gpoirier
parents: 1172
diff changeset
317 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
318 } else {
e60bf67d9bf8 The reader ignores the size of the ASF data object and keeps on
gpoirier
parents: 1172
diff changeset
319 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
320 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
321 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
322 } else if (!memcmp(&g, &comment_header, sizeof(GUID))) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
323 int len1, len2, len3, len4, len5;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
324
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
325 len1 = get_le16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
326 len2 = get_le16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
327 len3 = get_le16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
328 len4 = get_le16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 len5 = get_le16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 get_str16_nolen(pb, len1, s->title, sizeof(s->title));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
331 get_str16_nolen(pb, len2, s->author, sizeof(s->author));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 get_str16_nolen(pb, len3, s->copyright, sizeof(s->copyright));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 get_str16_nolen(pb, len4, s->comment, sizeof(s->comment));
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
334 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
335 } 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
336 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
337
ad2a57c5467a ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 312
diff changeset
338 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
339 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
340 {
1264
3d00cb7b7426 value_num should also be 64bit (1 hunk from the asf seeking patch by DrDivx/Steve Lhomme)
michael
parents: 1263
diff changeset
341 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
342 uint64_t value_num = 0;
341
ad2a57c5467a ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 312
diff changeset
343 char *name, *value;
ad2a57c5467a ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 312
diff changeset
344
ad2a57c5467a ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 312
diff changeset
345 name_len = get_le16(pb);
1688
0ab2495a1815 remove sensless casts
michael
parents: 1687
diff changeset
346 name = av_malloc(name_len * 2);
1503
a4ab86a48604 Use common macro PUT_UTF8 in asf.c
gpoirier
parents: 1443
diff changeset
347 get_str16_nolen(pb, name_len, name, name_len * 2);
341
ad2a57c5467a ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 312
diff changeset
348 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
349 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
350 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
351 {
1688
0ab2495a1815 remove sensless casts
michael
parents: 1687
diff changeset
352 value = av_malloc(value_len * 2);
1503
a4ab86a48604 Use common macro PUT_UTF8 in asf.c
gpoirier
parents: 1443
diff changeset
353 get_str16_nolen(pb, value_len, value,
a4ab86a48604 Use common macro PUT_UTF8 in asf.c
gpoirier
parents: 1443
diff changeset
354 value_len * 2);
643
253b5292946a various security fixes and precautionary checks
michael
parents: 627
diff changeset
355 if (strcmp(name,"WM/AlbumTitle")==0) { pstrcpy(s->album, sizeof(s->album), value); }
1603
26a7d15e4c9d Decode genre on asf/wma files.
aurel
parents: 1552
diff changeset
356 if (strcmp(name,"WM/Genre")==0) { pstrcpy(s->genre, sizeof(s->genre), value); }
341
ad2a57c5467a ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 312
diff changeset
357 av_free(value);
ad2a57c5467a ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 312
diff changeset
358 }
792
michael
parents: 775
diff changeset
359 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
360 {
ad2a57c5467a ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 312
diff changeset
361 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
362 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
363 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
364 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
365 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
366 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
367 }
ad2a57c5467a ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 312
diff changeset
368 av_free(name);
ad2a57c5467a ASF extended header parsing patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 312
diff changeset
369 }
904
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
370 } 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
371 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
372 uint32_t ext_d;
972
d983c2b9333e kill some warnings
mru
parents: 949
diff changeset
373 int64_t pos_ex_st;
904
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
374 pos_ex_st = url_ftell(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
375
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
376 get_le64(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
377 get_le64(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
378 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
379 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
380 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
381 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
382 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
383 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
384 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
385 get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
386 get_le16(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
387 get_le16(pb);
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 stream_ct = get_le16(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
390 payload_ext_ct = get_le16(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
391
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
392 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
393 get_le16(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
394 ext_len = get_le16(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
395 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
396 }
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
397
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
398 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
399 get_guid(pb, &g);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
400 ext_d=get_le16(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
401 ext_len=get_le32(pb);
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
402 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
403 }
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
404
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
405 // 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
406 // if so the next iteration will pick it up
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
407 } else if (!memcmp(&g, &head1_guid, sizeof(GUID))) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
408 int v1, v2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
409 get_guid(pb, &g);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
410 v1 = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
411 v2 = get_le16(pb);
904
5d3dc3a6bbe7 audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
michael
parents: 896
diff changeset
412 #if 0
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
413 } else if (!memcmp(&g, &codec_comment_header, sizeof(GUID))) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
414 int len, v1, n, num;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
415 char str[256], *q;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
416 char tag[16];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
417
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
418 get_guid(pb, &g);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
419 print_guid(&g);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
420
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
421 n = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
422 for(i=0;i<n;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
423 num = get_le16(pb); /* stream number */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
424 get_str16(pb, str, sizeof(str));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
425 get_str16(pb, str, sizeof(str));
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
426 len = get_le16(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
427 q = tag;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
428 while (len > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
429 v1 = get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
430 if ((q - tag) < sizeof(tag) - 1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
431 *q++ = v1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
432 len--;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
433 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
434 *q = '\0';
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
435 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
436 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
437 } else if (url_feof(pb)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
438 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
439 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
440 url_fseek(pb, gsize - 24, SEEK_CUR);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
441 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
442 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
443 get_guid(pb, &g);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
444 get_le64(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
445 get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
446 get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
447 if (url_feof(pb))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
448 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
449 asf->data_offset = url_ftell(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
450 asf->packet_size_left = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
451
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
452 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
453
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
454 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
455 for(i=0;i<s->nb_streams;i++) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
456 AVStream *st = s->streams[i];
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
457 if (st) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
458 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
459 av_free(st->codec->extradata);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
460 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
461 av_free(st);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
462 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
463 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
464 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
465
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
466 #define DO_2BITS(bits, var, defval) \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
467 switch (bits & 3) \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
468 { \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
469 case 3: var = get_le32(pb); rsize += 4; break; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
470 case 2: var = get_le16(pb); rsize += 2; break; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
471 case 1: var = get_byte(pb); rsize++; break; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
472 default: var = defval; break; \
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
473 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
474
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
475 static int asf_get_packet(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
476 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
477 ASFContext *asf = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
478 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
479 uint32_t packet_length, padsize;
353
0778b93924cb header parser fix
michael
parents: 352
diff changeset
480 int rsize = 9;
0778b93924cb header parser fix
michael
parents: 352
diff changeset
481 int c;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
482
353
0778b93924cb header parser fix
michael
parents: 352
diff changeset
483 assert((url_ftell(&s->pb) - s->data_offset) % asf->packet_size == 0);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
484
353
0778b93924cb header parser fix
michael
parents: 352
diff changeset
485 c = get_byte(pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
486 if (c != 0x82) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
487 if (!url_feof(pb))
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
488 av_log(s, AV_LOG_ERROR, "ff asf bad header %x at:%"PRId64"\n", c, url_ftell(pb));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
489 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
490 if ((c & 0x0f) == 2) { // always true for now
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
491 if (get_le16(pb) != 0) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
492 if (!url_feof(pb))
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
493 av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n");
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
494 return AVERROR_IO;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
495 }
353
0778b93924cb header parser fix
michael
parents: 352
diff changeset
496 rsize+=2;
0778b93924cb header parser fix
michael
parents: 352
diff changeset
497 /* }else{
0778b93924cb header parser fix
michael
parents: 352
diff changeset
498 if (!url_feof(pb))
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1415
diff changeset
499 printf("ff asf bad header %x at:%"PRId64"\n", c, url_ftell(pb));
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
500 return AVERROR_IO;*/
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
501 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
502
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
503 asf->packet_flags = get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
504 asf->packet_property = get_byte(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
505
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
506 DO_2BITS(asf->packet_flags >> 5, packet_length, asf->packet_size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
507 DO_2BITS(asf->packet_flags >> 1, padsize, 0); // sequence ignored
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
508 DO_2BITS(asf->packet_flags >> 3, padsize, 0); // padding length
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
509
1333
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
510 //the following checks prevent overflows and infinite loops
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
511 if(packet_length >= (1U<<29)){
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
512 av_log(s, AV_LOG_ERROR, "invalid packet_length %d at:%"PRId64"\n", packet_length, url_ftell(pb));
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
513 return 0; // FIXME this should be -1
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
514 }
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
515 if(padsize >= (1U<<29)){
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
516 av_log(s, AV_LOG_ERROR, "invalid padsize %d at:%"PRId64"\n", padsize, url_ftell(pb));
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
517 return 0; // FIXME this should be -1
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
518 }
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
519
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
520 asf->packet_timestamp = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
521 get_le16(pb); /* duration */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
522 // rsize has at least 11 bytes which have to be present
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
523
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
524 if (asf->packet_flags & 0x01) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
525 asf->packet_segsizetype = get_byte(pb); rsize++;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
526 asf->packet_segments = asf->packet_segsizetype & 0x3f;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
527 } else {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
528 asf->packet_segments = 1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
529 asf->packet_segsizetype = 0x80;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
530 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
531 asf->packet_size_left = packet_length - padsize - rsize;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
532 if (packet_length < asf->hdr.min_pktsize)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
533 padsize += asf->hdr.min_pktsize - packet_length;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
534 asf->packet_padsize = padsize;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
535 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
536 printf("packet: size=%d padsize=%d left=%d\n", asf->packet_size, asf->packet_padsize, asf->packet_size_left);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
537 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
538 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
539 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
540
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
541 static int asf_read_packet(AVFormatContext *s, AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
542 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
543 ASFContext *asf = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
544 ASFStream *asf_st = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
545 ByteIOContext *pb = &s->pb;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
546 //static int pc = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
547 for (;;) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
548 int rsize = 0;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
549 if (asf->packet_size_left < FRAME_HEADER_SIZE
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
550 || asf->packet_segments < 1) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
551 //asf->packet_size_left <= asf->packet_padsize) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
552 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
553 //printf("PacketLeftSize:%d Pad:%d Pos:%"PRId64"\n", asf->packet_size_left, asf->packet_padsize, url_ftell(pb));
828
a5af9ba25343 round pointer up to next packet_size multiple
michael
parents: 820
diff changeset
554 if((url_ftell(&s->pb) + ret - s->data_offset) % asf->packet_size)
a5af9ba25343 round pointer up to next packet_size multiple
michael
parents: 820
diff changeset
555 ret += asf->packet_size - ((url_ftell(&s->pb) + ret - s->data_offset) % asf->packet_size);
1333
a95c384900ab prevent infinite loop with VORC012.WMA
michael
parents: 1332
diff changeset
556 assert(ret>=0);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
557 /* fail safe */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
558 url_fskip(pb, ret);
349
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
559 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
560 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
561 (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
562 return AVERROR_IO; /* Do not exceed the size of the data object */
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
563 ret = asf_get_packet(s);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
564 //printf("READ ASF PACKET %d r:%d c:%d\n", ret, asf->packet_size_left, pc++);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
565 if (ret < 0 || url_feof(pb))
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
566 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
567 asf->packet_time_start = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
568 continue;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
569 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
570 if (asf->packet_time_start == 0) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
571 /* read frame header */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
572 int num = get_byte(pb);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
573 asf->packet_segments--;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
574 rsize++;
1695
9e8904d2007d useless &0x80
michael
parents: 1688
diff changeset
575 asf->packet_key_frame = num >> 7;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
576 asf->stream_index = asf->asfid2avid[num & 0x7f];
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
577 // sequence should be ignored!
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
578 DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
579 DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
580 DO_2BITS(asf->packet_property, asf->packet_replic_size, 0);
349
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
581 //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);
1696
fdea5fc3362f get rid of a few idiotic asserts()
michael
parents: 1695
diff changeset
582 if (asf->packet_replic_size >= 8) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
583 asf->packet_obj_size = get_le32(pb);
1660
e071dbfd4769 fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.wmv
michael
parents: 1603
diff changeset
584 if(asf->packet_obj_size >= (1<<24) || asf->packet_obj_size <= 0){
e071dbfd4769 fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.wmv
michael
parents: 1603
diff changeset
585 av_log(s, AV_LOG_ERROR, "packet_obj_size invalid\n");
e071dbfd4769 fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.wmv
michael
parents: 1603
diff changeset
586 continue;
e071dbfd4769 fix segfault with http://sam.zoy.org/zzuf/lol-ffplay.wmv
michael
parents: 1603
diff changeset
587 }
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
588 asf->packet_frag_timestamp = get_le32(pb); // timestamp
1696
fdea5fc3362f get rid of a few idiotic asserts()
michael
parents: 1695
diff changeset
589 url_fskip(pb, asf->packet_replic_size - 8);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
590 rsize += asf->packet_replic_size; // FIXME - check validity
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
591 } else if (asf->packet_replic_size==1){
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
592 // multipacket - frag_offset is begining timestamp
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
593 asf->packet_time_start = asf->packet_frag_offset;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
594 asf->packet_frag_offset = 0;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
595 asf->packet_frag_timestamp = asf->packet_timestamp;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
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
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
598 rsize++;
1696
fdea5fc3362f get rid of a few idiotic asserts()
michael
parents: 1695
diff changeset
599 }else if(asf->packet_replic_size!=0){
fdea5fc3362f get rid of a few idiotic asserts()
michael
parents: 1695
diff changeset
600 av_log(s, AV_LOG_ERROR, "unexpected packet_replic_size of %d\n", asf->packet_replic_size);
fdea5fc3362f get rid of a few idiotic asserts()
michael
parents: 1695
diff changeset
601 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
602 }
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
603 if (asf->packet_flags & 0x01) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
604 DO_2BITS(asf->packet_segsizetype >> 6, asf->packet_frag_size, 0); // 0 is illegal
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
605 #undef DO_2BITS
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
606 //printf("Fragsize %d\n", asf->packet_frag_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
607 } else {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
608 asf->packet_frag_size = asf->packet_size_left - rsize;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
609 //printf("Using rest %d %d %d\n", asf->packet_frag_size, asf->packet_size_left, rsize);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
610 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
611 if (asf->packet_replic_size == 1) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
612 asf->packet_multi_size = asf->packet_frag_size;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
613 if (asf->packet_multi_size > asf->packet_size_left) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
614 asf->packet_segments = 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
615 continue;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
616 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
617 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
618 asf->packet_size_left -= rsize;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
619 //printf("___objsize____ %d %d rs:%d\n", asf->packet_obj_size, asf->packet_frag_offset, rsize);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
620
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
621 if (asf->stream_index < 0
708
d79164865a7c more fine grained discarding of packets
michael
parents: 652
diff changeset
622 || s->streams[asf->stream_index]->discard >= AVDISCARD_ALL
d79164865a7c more fine grained discarding of packets
michael
parents: 652
diff changeset
623 || (!asf->packet_key_frame && s->streams[asf->stream_index]->discard >= AVDISCARD_NONKEY)
d79164865a7c more fine grained discarding of packets
michael
parents: 652
diff changeset
624 ) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
625 asf->packet_time_start = 0;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
626 /* unhandled packet (should not happen) */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
627 url_fskip(pb, asf->packet_frag_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
628 asf->packet_size_left -= asf->packet_frag_size;
652
b47948262721 support discarding uninterresting packets
michael
parents: 643
diff changeset
629 if(asf->stream_index < 0)
b47948262721 support discarding uninterresting packets
michael
parents: 643
diff changeset
630 av_log(s, AV_LOG_ERROR, "ff asf skip %d %d\n", asf->packet_frag_size, num & 0x7f);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
631 continue;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
632 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
633 asf->asf_st = s->streams[asf->stream_index]->priv_data;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
634 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
635 asf_st = asf->asf_st;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
636
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
637 if ((asf->packet_frag_offset != asf_st->frag_offset
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
638 || (asf->packet_frag_offset
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
639 && asf->packet_seq != asf_st->seq)) // seq should be ignored
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
640 ) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
641 /* cannot continue current packet: free it */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
642 // FIXME better check if packet was already allocated
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
643 av_log(s, AV_LOG_INFO, "ff asf parser skips: %d - %d o:%d - %d %d %d fl:%d\n",
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
644 asf_st->pkt.size,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
645 asf->packet_obj_size,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
646 asf->packet_frag_offset, asf_st->frag_offset,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
647 asf->packet_seq, asf_st->seq, asf->packet_frag_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
648 if (asf_st->pkt.size)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
649 av_free_packet(&asf_st->pkt);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
650 asf_st->frag_offset = 0;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
651 if (asf->packet_frag_offset != 0) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
652 url_fskip(pb, asf->packet_frag_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
653 av_log(s, AV_LOG_INFO, "ff asf parser skipping %db\n", asf->packet_frag_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
654 asf->packet_size_left -= asf->packet_frag_size;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
655 continue;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
656 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
657 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
658 if (asf->packet_replic_size == 1) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
659 // frag_offset is here used as the begining timestamp
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
660 asf->packet_frag_timestamp = asf->packet_time_start;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
661 asf->packet_time_start += asf->packet_time_delta;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
662 asf->packet_obj_size = asf->packet_frag_size = get_byte(pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
663 asf->packet_size_left--;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
664 asf->packet_multi_size--;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
665 if (asf->packet_multi_size < asf->packet_obj_size)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
666 {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
667 asf->packet_time_start = 0;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
668 url_fskip(pb, asf->packet_multi_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
669 asf->packet_size_left -= asf->packet_multi_size;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
670 continue;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
671 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
672 asf->packet_multi_size -= asf->packet_obj_size;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
673 //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);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
674 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
675 if (asf_st->frag_offset == 0) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
676 /* new packet */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
677 av_new_packet(&asf_st->pkt, asf->packet_obj_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
678 asf_st->seq = asf->packet_seq;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
679 asf_st->pkt.pts = asf->packet_frag_timestamp;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
680 asf_st->pkt.stream_index = asf->stream_index;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
681 asf_st->pkt.pos =
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
682 asf_st->packet_pos= asf->packet_pos;
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
683 //printf("new packet: stream:%d key:%d packet_key:%d audio:%d size:%d\n",
349
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
684 //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
685 //s->streams[asf->stream_index]->codec->codec_type == CODEC_TYPE_AUDIO, asf->packet_obj_size);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
686 if (s->streams[asf->stream_index]->codec->codec_type == CODEC_TYPE_AUDIO)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
687 asf->packet_key_frame = 1;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
688 if (asf->packet_key_frame)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
689 asf_st->pkt.flags |= PKT_FLAG_KEY;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
690 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
691
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
692 /* read data */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
693 //printf("READ PACKET s:%d os:%d o:%d,%d l:%d DATA:%p\n",
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
694 // asf->packet_size, asf_st->pkt.size, asf->packet_frag_offset,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
695 // asf_st->frag_offset, asf->packet_frag_size, asf_st->pkt.data);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
696 asf->packet_size_left -= asf->packet_frag_size;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
697 if (asf->packet_size_left < 0)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
698 continue;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
699 get_buffer(pb, asf_st->pkt.data + asf->packet_frag_offset,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
700 asf->packet_frag_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
701 asf_st->frag_offset += asf->packet_frag_size;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
702 /* test if whole packet is read */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
703 if (asf_st->frag_offset == asf_st->pkt.size) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
704 /* return packet */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
705 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
706 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
707 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
708 }else{
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
709 /* packet descrambling */
1332
7474cc6383d4 fix some signedness warnings
mru
parents: 1266
diff changeset
710 uint8_t *newdata = av_malloc(asf_st->pkt.size);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
711 if (newdata) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
712 int offset = 0;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
713 while (offset < asf_st->pkt.size) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
714 int off = offset / asf_st->ds_chunk_size;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
715 int row = off / asf_st->ds_span;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
716 int col = off % asf_st->ds_span;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
717 int idx = row + col * asf_st->ds_packet_size / asf_st->ds_chunk_size;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
718 //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
719
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
720 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
721 assert(idx+1 <= asf_st->pkt.size / asf_st->ds_chunk_size);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
722 memcpy(newdata + offset,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
723 asf_st->pkt.data + idx * asf_st->ds_chunk_size,
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
724 asf_st->ds_chunk_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
725 offset += asf_st->ds_chunk_size;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
726 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
727 av_free(asf_st->pkt.data);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
728 asf_st->pkt.data = newdata;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
729 }
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
730 }
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
731 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
732 asf_st->frag_offset = 0;
1699
b959208ba904 cosmetic
michael
parents: 1697
diff changeset
733 *pkt= asf_st->pkt;
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
734 //printf("packet %d %d\n", asf_st->pkt.size, asf->packet_frag_size);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
735 asf_st->pkt.size = 0;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
736 asf_st->pkt.data = 0;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
737 break; // packet completed
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
738 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
739 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
740 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
741 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
742
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
743 static int asf_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
744 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
745 int i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
746
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
747 for(i=0;i<s->nb_streams;i++) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
748 AVStream *st = s->streams[i];
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
749 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
750 av_free(st->codec->palctrl);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
751 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
752 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
753 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
754
347
2b485a3c5cfb seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 341
diff changeset
755 // 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
756 // 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
757 // 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
758 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
759 {
2b485a3c5cfb seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 341
diff changeset
760 ASFContext *asf = s->priv_data;
349
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
761 ASFStream *asf_st;
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
762 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
763
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_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
765 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
766 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
767 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
768 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
769 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
770 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
771 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
772 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
773 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
774 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
775 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
776 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
777 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
778 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
779 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
780 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
781 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
782 asf->packet_time_start = 0;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
783
349
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
784 for(i=0; i<s->nb_streams; i++){
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
785 asf_st= s->streams[i]->priv_data;
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
786 av_free_packet(&asf_st->pkt);
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
787 asf_st->frag_offset=0;
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
788 asf_st->seq=0;
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
789 }
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
790 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
791 }
2b485a3c5cfb seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 341
diff changeset
792
437
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 373
diff changeset
793 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
794 {
2b485a3c5cfb seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 341
diff changeset
795 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
796 AVPacket pkt1, *pkt = &pkt1;
349
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
797 ASFStream *asf_st;
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
798 int64_t pts;
348
ca519d041ea1 memleak fix
michael
parents: 347
diff changeset
799 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
800 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
801 int64_t start_pos[s->nb_streams];
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
802
354
6770ca07abe2 store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents: 353
diff changeset
803 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
804 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
805 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
806
437
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 373
diff changeset
807 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
808 *ppos= pos;
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 373
diff changeset
809 url_fseek(&s->pb, pos, SEEK_SET);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
810
349
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
811 //printf("asf_read_pts\n");
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
812 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
813 for(;;){
349
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
814 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
815 av_log(s, AV_LOG_INFO, "seek failed\n");
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
816 return AV_NOPTS_VALUE;
349
2bed194f8362 seeking fixes
michael
parents: 348
diff changeset
817 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
818
991
30b54c043135 timebase fix
michael
parents: 979
diff changeset
819 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
820
348
ca519d041ea1 memleak fix
michael
parents: 347
diff changeset
821 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
822 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
823 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
824
6770ca07abe2 store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents: 353
diff changeset
825 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
826
6770ca07abe2 store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents: 353
diff changeset
827 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
828 pos= asf_st->packet_pos;
351
c072833fe7f4 use packet number instead of byte number internally for seeking
michael
parents: 350
diff changeset
829
1266
5b9729f5145c fix fallback if theres no index
michael
parents: 1265
diff changeset
830 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
831 start_pos[i]= asf_st->packet_pos + 1;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
832
354
6770ca07abe2 store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents: 353
diff changeset
833 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
834 break;
6770ca07abe2 store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents: 353
diff changeset
835 }
6770ca07abe2 store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents: 353
diff changeset
836 }
6770ca07abe2 store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents: 353
diff changeset
837
6770ca07abe2 store searched distance in index, so we dont waste time searching for keyframes where we already searched
michael
parents: 353
diff changeset
838 *ppos= pos;
1443
404048ea11bc Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 1415
diff changeset
839 //printf("found keyframe at %"PRId64" stream %d stamp:%"PRId64"\n", *ppos, stream_index, pts);
348
ca519d041ea1 memleak fix
michael
parents: 347
diff changeset
840
ca519d041ea1 memleak fix
michael
parents: 347
diff changeset
841 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
842 }
2b485a3c5cfb seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 341
diff changeset
843
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
844 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
845 {
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
846 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
847 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
848 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
849 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
850 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
851 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
852
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
853 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
854
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
855 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
856 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
857 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
858 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
859 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
860 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
861 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
862 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
863 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
864
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
865 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
866 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
867 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
868 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
869
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
870 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
871 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
872
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
873 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
874 }
1266
5b9729f5145c fix fallback if theres no index
michael
parents: 1265
diff changeset
875 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
876 }
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
877 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
878 }
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
879
555
0a997108f384 use native timebase for seeking
michael
parents: 482
diff changeset
880 static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flags)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
881 {
312
8a04d2e1be2f frame rate should be completely disabled in asf (closer now) - disabled seek
bellard
parents: 300
diff changeset
882 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
883 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
884 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
885 int index;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 881
diff changeset
886
350
michael
parents: 349
diff changeset
887 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
888 return -1;
2b485a3c5cfb seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 341
diff changeset
889
1266
5b9729f5145c fix fallback if theres no index
michael
parents: 1265
diff changeset
890 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
891 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
892
1266
5b9729f5145c fix fallback if theres no index
michael
parents: 1265
diff changeset
893 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
894 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
895 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
896 }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
897 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
898 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
899 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
900
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
901 /* 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
902 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
903 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
904
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
905 // 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
906 // 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
907 // 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
908 // 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
909 // 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
910 // 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
911 // 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
912 // 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
913 // 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
914 // }
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
915 // 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
916 // 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
917 //
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
918 // 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
919 // 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
920 // 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
921 // }
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
922 //
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
923 // 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
924 // }
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
925
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
926 /* do the seek */
1388
3172bf94c066 Use proper PRI?64 macros for %ll? format to fix printf format warnings:
rathann
parents: 1358
diff changeset
927 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
928 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
929 }
347
2b485a3c5cfb seeking in single stream asf patch by ("Kevin Kuphal" <kevin dot kuphal at sitecity dot net>)
michael
parents: 341
diff changeset
930 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
931 return 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
932 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
933
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
934 AVInputFormat asf_demuxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
935 "asf",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
936 "asf format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
937 sizeof(ASFContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
938 asf_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
939 asf_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
940 asf_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
941 asf_read_close,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
942 asf_read_seek,
437
50bae308f71e moving nearly identical binary search code from nut/mpeg/asf to utils.c
michael
parents: 373
diff changeset
943 asf_read_pts,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
944 };