annotate asf.c @ 1206:e60bf67d9bf8 libavformat

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