annotate avidec.c @ 584:4e3bab6555ae libavformat

When playing ftp://ftp.mplayerhq.hu/MPlayer/samples/V-codecs/QPEG/VWbig6.avi with my decoder (should appear soon) it hadn't changed palette even there are palette change chunks in that AVI. Here is small patch to make it work (zero number of colors to change in that chunk actually means to change ALL colors). patch by (Kostya <cannonball>at<bw-team>dot<com>)
author michael
date Fri, 12 Nov 2004 01:32:35 +0000
parents aca10aa7686f
children fe24632a577b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * AVI decoder.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 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
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
19 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20 #include "avi.h"
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
21 #include "dv.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 //#define DEBUG
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
24 //#define DEBUG_SEEK
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
25
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
26 typedef struct AVIIndexEntry {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
27 unsigned int flags;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
28 unsigned int pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
29 unsigned int cum_len; /* sum of all lengths before this packet */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
30 } AVIIndexEntry;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
31
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
32 typedef struct AVIStream {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
33 AVIIndexEntry *index_entries;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
34 int nb_index_entries;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
35 int index_entries_allocated_size;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
36 int frame_offset; /* current frame (video) or byte (audio) counter
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
37 (used to compute the pts) */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
38 int scale;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
39 int rate;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
40 int sample_size; /* audio only data */
457
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
41 int start;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
42
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
43 int new_frame_offset; /* temporary storage (used during seek) */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
44 int cum_len; /* temporary storage (used during seek) */
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
45
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
46 int prefix; ///< normally 'd'<<8 + 'c' or 'w'<<8 + 'b'
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
47 int prefix_count;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
48 } AVIStream;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 typedef struct {
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
51 int64_t riff_end;
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
52 int64_t movi_end;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53 offset_t movi_list;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
54 int index_loaded;
510
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
55 int is_odml;
296
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
56 DVDemuxContext* dv_demux;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
57 } AVIContext;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
58
469
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
59 static int avi_load_index(AVFormatContext *s);
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
60
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
61 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62 static void print_tag(const char *str, unsigned int tag, int size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 printf("%s: tag=%c%c%c%c size=0x%x\n",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65 str, tag & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
66 (tag >> 8) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67 (tag >> 16) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
68 (tag >> 24) & 0xff,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72
92
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
73 static int get_riff(AVIContext *avi, ByteIOContext *pb)
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
74 {
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
75 uint32_t tag;
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
76 /* check RIFF header */
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
77 tag = get_le32(pb);
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
78
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
79 if (tag != MKTAG('R', 'I', 'F', 'F'))
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
80 return -1;
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
81 avi->riff_end = get_le32(pb); /* RIFF chunk size */
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
82 avi->riff_end += url_ftell(pb); /* RIFF chunk end */
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
83 tag = get_le32(pb);
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
84 if (tag != MKTAG('A', 'V', 'I', ' ') && tag != MKTAG('A', 'V', 'I', 'X'))
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
85 return -1;
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
86
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
87 return 0;
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
88 }
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
89
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
90 static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 AVIContext *avi = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 ByteIOContext *pb = &s->pb;
98
cae6ddfadf51 AVI type 1 support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 92
diff changeset
94 uint32_t tag, tag1, handler;
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
95 int codec_type, stream_index, frame_period, bit_rate, scale, rate;
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
96 unsigned int size, nb_frames;
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
97 int i, n;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 AVStream *st;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
99 AVIStream *ast;
227
b0d2d719ae41 hacks to support Xan AVI files
tmmm
parents: 188
diff changeset
100 int xan_video = 0; /* hack to support Xan A/V */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101
92
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
102 if (get_riff(avi, pb) < 0)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 /* first list tag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 stream_index = -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 codec_type = -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108 frame_period = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 if (url_feof(pb))
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 tag = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 size = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 print_tag("tag", tag, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 switch(tag) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
119 case MKTAG('L', 'I', 'S', 'T'):
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 /* ignored, except when start of video packets */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 tag1 = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 print_tag("list", tag1, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 if (tag1 == MKTAG('m', 'o', 'v', 'i')) {
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
126 avi->movi_list = url_ftell(pb) - 4;
495
d33ce0cfc81c play more broken files
michael
parents: 472
diff changeset
127 if(size) avi->movi_end = avi->movi_list + size;
d33ce0cfc81c play more broken files
michael
parents: 472
diff changeset
128 else avi->movi_end = url_filesize(url_fileno(pb));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 printf("movi end=%Lx\n", avi->movi_end);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 goto end_of_header;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 break;
510
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
135 case MKTAG('d', 'm', 'l', 'h'):
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
136 avi->is_odml = 1;
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
137 url_fskip(pb, size + (size & 1));
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
138 break;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 case MKTAG('a', 'v', 'i', 'h'):
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 /* avi header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 /* using frame_period is bad idea */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 frame_period = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 bit_rate = get_le32(pb) * 8;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 url_fskip(pb, 4 * 4);
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
145 n = get_le32(pb);
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
146 for(i=0;i<n;i++) {
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
147 AVIStream *ast;
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
148 st = av_new_stream(s, i);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 if (!st)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 goto fail;
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 457
diff changeset
151
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
152 ast = av_mallocz(sizeof(AVIStream));
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
153 if (!ast)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
154 goto fail;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
155 st->priv_data = ast;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 url_fskip(pb, size - 7 * 4);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 case MKTAG('s', 't', 'r', 'h'):
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 /* stream header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 stream_index++;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 tag1 = get_le32(pb);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
163 handler = get_le32(pb); /* codec tag */
471
8b7a8dccde70 skip subtitle streams instead of perishing
michael
parents: 469
diff changeset
164 #ifdef DEBUG
8b7a8dccde70 skip subtitle streams instead of perishing
michael
parents: 469
diff changeset
165 print_tag("strh", tag1, -1);
8b7a8dccde70 skip subtitle streams instead of perishing
michael
parents: 469
diff changeset
166 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
167 switch(tag1) {
98
cae6ddfadf51 AVI type 1 support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 92
diff changeset
168 case MKTAG('i', 'a', 'v', 's'):
cae6ddfadf51 AVI type 1 support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 92
diff changeset
169 case MKTAG('i', 'v', 'a', 's'):
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
170 /*
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
171 * After some consideration -- I don't think we
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
172 * have to support anything but DV in a type1 AVIs.
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
173 */
98
cae6ddfadf51 AVI type 1 support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 92
diff changeset
174 if (s->nb_streams != 1)
cae6ddfadf51 AVI type 1 support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 92
diff changeset
175 goto fail;
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
176
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
177 if (handler != MKTAG('d', 'v', 's', 'd') &&
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
178 handler != MKTAG('d', 'v', 'h', 'd') &&
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
179 handler != MKTAG('d', 'v', 's', 'l'))
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
180 goto fail;
296
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
181
526
c5743d66c5ca * fix for a DV regression introduced with the last round of avi_read_packet
romansh
parents: 520
diff changeset
182 ast = s->streams[0]->priv_data;
296
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
183 av_freep(&s->streams[0]->codec.extradata);
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
184 av_freep(&s->streams[0]);
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
185 s->nb_streams = 0;
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
186 avi->dv_demux = dv_init_demux(s);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
187 if (!avi->dv_demux)
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
188 goto fail;
526
c5743d66c5ca * fix for a DV regression introduced with the last round of avi_read_packet
romansh
parents: 520
diff changeset
189 s->streams[0]->priv_data = ast;
c5743d66c5ca * fix for a DV regression introduced with the last round of avi_read_packet
romansh
parents: 520
diff changeset
190 url_fskip(pb, 3 * 4);
c5743d66c5ca * fix for a DV regression introduced with the last round of avi_read_packet
romansh
parents: 520
diff changeset
191 ast->scale = get_le32(pb);
c5743d66c5ca * fix for a DV regression introduced with the last round of avi_read_packet
romansh
parents: 520
diff changeset
192 ast->rate = get_le32(pb);
296
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
193 stream_index = s->nb_streams - 1;
526
c5743d66c5ca * fix for a DV regression introduced with the last round of avi_read_packet
romansh
parents: 520
diff changeset
194 url_fskip(pb, size - 7*4);
296
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
195 break;
98
cae6ddfadf51 AVI type 1 support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 92
diff changeset
196 case MKTAG('v', 'i', 'd', 's'):
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 codec_type = CODEC_TYPE_VIDEO;
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
198
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
199 if (stream_index >= s->nb_streams) {
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
200 url_fskip(pb, size - 8);
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
201 break;
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
202 }
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
203
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
204 st = s->streams[stream_index];
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
205 ast = st->priv_data;
339
a07c42730632 forgot ...
michael
parents: 311
diff changeset
206 st->codec.stream_codec_tag= handler;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
207
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208 get_le32(pb); /* flags */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
209 get_le16(pb); /* priority */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 get_le16(pb); /* language */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211 get_le32(pb); /* XXX: initial frame ? */
98
cae6ddfadf51 AVI type 1 support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 92
diff changeset
212 scale = get_le32(pb); /* scale */
cae6ddfadf51 AVI type 1 support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 92
diff changeset
213 rate = get_le32(pb); /* rate */
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
214
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 84
diff changeset
215 if(scale && rate){
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 84
diff changeset
216 }else if(frame_period){
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
217 rate = 1000000;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
218 scale = frame_period;
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 84
diff changeset
219 }else{
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
220 rate = 25;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
221 scale = 1;
85
25062c9b1f86 per context frame_rate_base, this should finally fix frame_rate related av sync issues
michaelni
parents: 84
diff changeset
222 }
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
223 ast->rate = rate;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
224 ast->scale = scale;
463
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
225 av_set_pts_info(st, 64, scale, rate);
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
226 st->codec.frame_rate = rate;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
227 st->codec.frame_rate_base = scale;
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
228 get_le32(pb); /* start */
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
229 nb_frames = get_le32(pb);
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
230 st->start_time = 0;
465
83eb268d3b89 100l (AVStream.duration)
michael
parents: 463
diff changeset
231 st->duration = av_rescale(nb_frames,
83eb268d3b89 100l (AVStream.duration)
michael
parents: 463
diff changeset
232 st->codec.frame_rate_base * AV_TIME_BASE,
83eb268d3b89 100l (AVStream.duration)
michael
parents: 463
diff changeset
233 st->codec.frame_rate);
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
234 url_fskip(pb, size - 9 * 4);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 case MKTAG('a', 'u', 'd', 's'):
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
237 {
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
238 unsigned int length;
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
239
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
240 codec_type = CODEC_TYPE_AUDIO;
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
241
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
242 if (stream_index >= s->nb_streams) {
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
243 url_fskip(pb, size - 8);
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
244 break;
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
245 }
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
246 st = s->streams[stream_index];
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
247 ast = st->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
248
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
249 get_le32(pb); /* flags */
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
250 get_le16(pb); /* priority */
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
251 get_le16(pb); /* language */
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
252 get_le32(pb); /* initial frame */
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
253 ast->scale = get_le32(pb); /* scale */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
254 ast->rate = get_le32(pb);
463
696f41bc8784 store index for seeking in the native timebase of each stream
michael
parents: 462
diff changeset
255 av_set_pts_info(st, 64, ast->scale, ast->rate);
457
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
256 ast->start= get_le32(pb); /* start */
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
257 length = get_le32(pb); /* length, in samples or bytes */
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
258 get_le32(pb); /* buffer size */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
259 get_le32(pb); /* quality */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
260 ast->sample_size = get_le32(pb); /* sample ssize */
457
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
261 //av_log(NULL, AV_LOG_DEBUG, "%d %d %d %d\n", ast->scale, ast->rate, ast->sample_size, ast->start);
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
262 st->start_time = 0;
465
83eb268d3b89 100l (AVStream.duration)
michael
parents: 463
diff changeset
263 if (ast->rate != 0)
83eb268d3b89 100l (AVStream.duration)
michael
parents: 463
diff changeset
264 st->duration = (int64_t)length * AV_TIME_BASE / ast->rate;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
265 url_fskip(pb, size - 12 * 4);
188
6c9d6422a2f6 update duration and start_time - add av_new_stream() usage
bellard
parents: 149
diff changeset
266 }
73
d40ddc73858a reversing not yet reversed changes from r1.7 -> r1.8 except the static/const stuff
michaelni
parents: 65
diff changeset
267 break;
471
8b7a8dccde70 skip subtitle streams instead of perishing
michael
parents: 469
diff changeset
268 case MKTAG('t', 'x', 't', 's'):
8b7a8dccde70 skip subtitle streams instead of perishing
michael
parents: 469
diff changeset
269 //FIXME
8b7a8dccde70 skip subtitle streams instead of perishing
michael
parents: 469
diff changeset
270 codec_type = CODEC_TYPE_DATA; //CODEC_TYPE_SUB ? FIXME
8b7a8dccde70 skip subtitle streams instead of perishing
michael
parents: 469
diff changeset
271 url_fskip(pb, size - 8);
8b7a8dccde70 skip subtitle streams instead of perishing
michael
parents: 469
diff changeset
272 break;
534
3846c006af2b pads stream
michael
parents: 526
diff changeset
273 case MKTAG('p', 'a', 'd', 's'):
3846c006af2b pads stream
michael
parents: 526
diff changeset
274 codec_type = CODEC_TYPE_UNKNOWN;
3846c006af2b pads stream
michael
parents: 526
diff changeset
275 url_fskip(pb, size - 8);
3846c006af2b pads stream
michael
parents: 526
diff changeset
276 stream_index--;
3846c006af2b pads stream
michael
parents: 526
diff changeset
277 break;
73
d40ddc73858a reversing not yet reversed changes from r1.7 -> r1.8 except the static/const stuff
michaelni
parents: 65
diff changeset
278 default:
534
3846c006af2b pads stream
michael
parents: 526
diff changeset
279 av_log(s, AV_LOG_ERROR, "unknown stream type %X\n", tag1);
73
d40ddc73858a reversing not yet reversed changes from r1.7 -> r1.8 except the static/const stuff
michaelni
parents: 65
diff changeset
280 goto fail;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
282 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
283 case MKTAG('s', 't', 'r', 'f'):
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284 /* stream header */
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
285 if (stream_index >= s->nb_streams || avi->dv_demux) {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 url_fskip(pb, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
288 st = s->streams[stream_index];
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 switch(codec_type) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
290 case CODEC_TYPE_VIDEO:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291 get_le32(pb); /* size */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
292 st->codec.width = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
293 st->codec.height = get_le32(pb);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
294 get_le16(pb); /* panes */
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
295 st->codec.bits_per_sample= get_le16(pb); /* depth */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
296 tag1 = get_le32(pb);
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
297 get_le32(pb); /* ImageSize */
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
298 get_le32(pb); /* XPelsPerMeter */
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
299 get_le32(pb); /* YPelsPerMeter */
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
300 get_le32(pb); /* ClrUsed */
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
301 get_le32(pb); /* ClrImportant */
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
302
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
303 st->codec.extradata_size= size - 10*4;
110
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
304 st->codec.extradata= av_malloc(st->codec.extradata_size);
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
305 get_buffer(pb, st->codec.extradata, st->codec.extradata_size);
76
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
306
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
307 if(st->codec.extradata_size & 1) //FIXME check if the encoder really did this correctly
d03c70b7b50d huffyuv encoding fixed
michaelni
parents: 75
diff changeset
308 get_byte(pb);
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
309
297
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
310 /* Extract palette from extradata if bpp <= 8 */
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
311 /* This code assumes that extradata contains only palette */
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
312 /* This is true for all paletted codecs implemented in ffmpeg */
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
313 if (st->codec.extradata_size && (st->codec.bits_per_sample <= 8)) {
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
314 st->codec.palctrl = av_mallocz(sizeof(AVPaletteControl));
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
315 #ifdef WORDS_BIGENDIAN
300
6ee1b02f9b2a * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 297
diff changeset
316 for (i = 0; i < FFMIN(st->codec.extradata_size, AVPALETTE_SIZE)/4; i++)
6ee1b02f9b2a * fixes for broken builds on Solaris, OS2 and all bingendian
romansh
parents: 297
diff changeset
317 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: 296
diff changeset
318 #else
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
319 memcpy(st->codec.palctrl->palette, st->codec.extradata,
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
320 FFMIN(st->codec.extradata_size, AVPALETTE_SIZE));
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
321 #endif
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
322 st->codec.palctrl->palette_changed = 1;
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
323 }
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
324
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
325 #ifdef DEBUG
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
326 print_tag("video", tag1, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
327 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
328 st->codec.codec_type = CODEC_TYPE_VIDEO;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 st->codec.codec_tag = tag1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1);
227
b0d2d719ae41 hacks to support Xan AVI files
tmmm
parents: 188
diff changeset
331 if (st->codec.codec_id == CODEC_ID_XAN_WC4)
b0d2d719ae41 hacks to support Xan AVI files
tmmm
parents: 188
diff changeset
332 xan_video = 1;
75
78bec272ce3a read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed)
michaelni
parents: 73
diff changeset
333 // url_fskip(pb, size - 5 * 4);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
334 break;
73
d40ddc73858a reversing not yet reversed changes from r1.7 -> r1.8 except the static/const stuff
michaelni
parents: 65
diff changeset
335 case CODEC_TYPE_AUDIO:
84
0068a6902911 correct AUDIO strf parsing patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 82
diff changeset
336 get_wav_header(pb, &st->codec, size);
13
8a5285a0ca2f Fix for odd strf tag in Stargate SG-1 - 3x18 - Shades of Grey.avi
mmu_man
parents: 5
diff changeset
337 if (size%2) /* 2-aligned (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */
8a5285a0ca2f Fix for odd strf tag in Stargate SG-1 - 3x18 - Shades of Grey.avi
mmu_man
parents: 5
diff changeset
338 url_fskip(pb, 1);
227
b0d2d719ae41 hacks to support Xan AVI files
tmmm
parents: 188
diff changeset
339 /* special case time: To support Xan DPCM, hardcode
b0d2d719ae41 hacks to support Xan AVI files
tmmm
parents: 188
diff changeset
340 * the format if Xxan is the video codec */
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
341 st->need_parsing = 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
342 /* force parsing as several audio frames can be in
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
343 one packet */
227
b0d2d719ae41 hacks to support Xan AVI files
tmmm
parents: 188
diff changeset
344 if (xan_video)
b0d2d719ae41 hacks to support Xan AVI files
tmmm
parents: 188
diff changeset
345 st->codec.codec_id = CODEC_ID_XAN_DPCM;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347 default:
472
michael
parents: 471
diff changeset
348 st->codec.codec_type = CODEC_TYPE_DATA;
michael
parents: 471
diff changeset
349 st->codec.codec_id= CODEC_ID_NONE;
michael
parents: 471
diff changeset
350 st->codec.codec_tag= 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
351 url_fskip(pb, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
352 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
354 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
355 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
356 default:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
357 /* skip tag */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
358 size += (size & 1);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
359 url_fskip(pb, size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
360 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
361 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
362 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
363 end_of_header:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
364 /* check stream number */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
365 if (stream_index != s->nb_streams - 1) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
366 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
367 for(i=0;i<s->nb_streams;i++) {
80
michaelni
parents: 78
diff changeset
368 av_freep(&s->streams[i]->codec.extradata);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
369 av_freep(&s->streams[i]);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
370 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
371 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
372 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
373
469
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
374 assert(!avi->index_loaded);
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
375 avi_load_index(s);
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
376 avi->index_loaded = 1;
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
377
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
378 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
379 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
380
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
381 static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
382 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
383 AVIContext *avi = s->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
384 ByteIOContext *pb = &s->pb;
510
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
385 int n, d[8], size;
569
aca10aa7686f fixing demuxing of vc2_intro.avi
michael
parents: 562
diff changeset
386 offset_t i, sync;
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
387 void* dstr;
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
388
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
389 if (avi->dv_demux) {
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
390 size = dv_get_packet(avi->dv_demux, pkt);
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
391 if (size >= 0)
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
392 return size;
149
f4de8f9c39bd use custom packet allocation only for DV
bellard
parents: 119
diff changeset
393 }
569
aca10aa7686f fixing demuxing of vc2_intro.avi
michael
parents: 562
diff changeset
394
aca10aa7686f fixing demuxing of vc2_intro.avi
michael
parents: 562
diff changeset
395 resync:
aca10aa7686f fixing demuxing of vc2_intro.avi
michael
parents: 562
diff changeset
396 memset(d, -1, sizeof(int)*8);
aca10aa7686f fixing demuxing of vc2_intro.avi
michael
parents: 562
diff changeset
397 for(i=sync=url_ftell(pb); !url_feof(pb); i++) {
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
398 int j;
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
399
510
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
400 if (i >= avi->movi_end) {
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
401 if (avi->is_odml) {
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
402 url_fskip(pb, avi->riff_end - i);
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
403 avi->riff_end = avi->movi_end = url_filesize(url_fileno(pb));
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
404 } else
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
405 break;
92
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
406 }
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
407
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
408 for(j=0; j<7; j++)
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
409 d[j]= d[j+1];
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
410 d[7]= get_byte(pb);
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
411
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
412 size= d[4] + (d[5]<<8) + (d[6]<<16) + (d[7]<<24);
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
413
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
414 if( d[2] >= '0' && d[2] <= '9'
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
415 && d[3] >= '0' && d[3] <= '9'){
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
416 n= (d[2] - '0') * 10 + (d[3] - '0');
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
417 }else{
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
418 n= 100; //invalid stream id
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
419 }
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
420 //av_log(NULL, AV_LOG_DEBUG, "%X %X %X %X %X %X %X %X %lld %d %d\n", d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], i, size, n);
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
421 if(i + size > avi->movi_end || d[0]<0)
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
422 continue;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
423
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
424 //parse ix##
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
425 if( (d[0] == 'i' && d[1] == 'x' && n < s->nb_streams)
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
426 //parse JUNK
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
427 ||(d[0] == 'J' && d[1] == 'U' && d[2] == 'N' && d[3] == 'K')){
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
428 url_fskip(pb, size);
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
429 //av_log(NULL, AV_LOG_DEBUG, "SKIP\n");
569
aca10aa7686f fixing demuxing of vc2_intro.avi
michael
parents: 562
diff changeset
430 goto resync;
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
431 }
510
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
432
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
433 if( d[0] >= '0' && d[0] <= '9'
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
434 && d[1] >= '0' && d[1] <= '9'){
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
435 n= (d[0] - '0') * 10 + (d[1] - '0');
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
436 }else{
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
437 n= 100; //invalid stream id
510
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
438 }
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
439
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
440 //parse ##dc/##wb
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
441 if(n < s->nb_streams){
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
442 AVStream *st;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
443 AVIStream *ast;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
444 st = s->streams[n];
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
445 ast = st->priv_data;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
446
569
aca10aa7686f fixing demuxing of vc2_intro.avi
michael
parents: 562
diff changeset
447 if( ((ast->prefix_count<5 || sync+9 > i) && d[2]<128 && d[3]<128) ||
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
448 d[2]*256+d[3] == ast->prefix /*||
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
449 (d[2] == 'd' && d[3] == 'c') ||
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
450 (d[2] == 'w' && d[3] == 'b')*/) {
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
451
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
452 //av_log(NULL, AV_LOG_DEBUG, "OK\n");
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
453 if(d[2]*256+d[3] == ast->prefix)
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
454 ast->prefix_count++;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
455 else{
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
456 ast->prefix= d[2]*256+d[3];
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
457 ast->prefix_count= 0;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
458 }
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
459
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
460 av_new_packet(pkt, size);
149
f4de8f9c39bd use custom packet allocation only for DV
bellard
parents: 119
diff changeset
461 get_buffer(pb, pkt->data, size);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
462 if (size & 1) {
149
f4de8f9c39bd use custom packet allocation only for DV
bellard
parents: 119
diff changeset
463 get_byte(pb);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
464 size++;
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
465 }
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
466
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
467 if (avi->dv_demux) {
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
468 dstr = pkt->destruct;
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
469 size = dv_produce_packet(avi->dv_demux, pkt,
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
470 pkt->data, pkt->size);
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
471 pkt->destruct = dstr;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
472 pkt->flags |= PKT_FLAG_KEY;
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
473 } else {
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
474 /* XXX: how to handle B frames in avi ? */
469
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
475 pkt->dts = ast->frame_offset;
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
476 // pkt->dts += ast->start;
457
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
477 if(ast->sample_size)
469
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
478 pkt->dts /= ast->sample_size;
495
d33ce0cfc81c play more broken files
michael
parents: 472
diff changeset
479 //av_log(NULL, AV_LOG_DEBUG, "dts:%Ld offset:%d %d/%d smpl_siz:%d base:%d st:%d size:%d\n", pkt->dts, ast->frame_offset, ast->scale, ast->rate, ast->sample_size, AV_TIME_BASE, n, size);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
480 pkt->stream_index = n;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
481 /* FIXME: We really should read index for that */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
482 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
483 if (ast->frame_offset < ast->nb_index_entries) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
484 if (ast->index_entries[ast->frame_offset].flags & AVIIF_INDEX)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
485 pkt->flags |= PKT_FLAG_KEY;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
486 } else {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
487 /* if no index, better to say that all frames
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
488 are key frames */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
489 pkt->flags |= PKT_FLAG_KEY;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
490 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
491 } else {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
492 pkt->flags |= PKT_FLAG_KEY;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
493 }
457
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
494 if(ast->sample_size)
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
495 ast->frame_offset += pkt->size;
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
496 else
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
497 ast->frame_offset++;
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
498 }
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
499 return size;
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
500 }
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
501 }
520
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
502 /* palette changed chunk */
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
503 if ( d[0] >= '0' && d[0] <= '9'
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
504 && d[1] >= '0' && d[1] <= '9'
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
505 && ((d[2] == 'p' && d[3] == 'c'))
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
506 && n < s->nb_streams && i + size <= avi->movi_end) {
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
507
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
508 AVStream *st;
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
509 int first, clr, flags, k, p;
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
510
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
511 st = s->streams[n];
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
512
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
513 first = get_byte(pb);
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
514 clr = get_byte(pb);
584
4e3bab6555ae When playing
michael
parents: 569
diff changeset
515 if(!clr) /* all 256 colors used */
4e3bab6555ae When playing
michael
parents: 569
diff changeset
516 clr = 256;
520
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
517 flags = get_le16(pb);
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
518 p = 4;
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
519 for (k = first; k < clr + first; k++) {
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
520 int r, g, b;
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
521 r = get_byte(pb);
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
522 g = get_byte(pb);
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
523 b = get_byte(pb);
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
524 get_byte(pb);
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
525 st->codec.palctrl->palette[k] = b + (g << 8) + (r << 16);
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
526 }
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
527 st->codec.palctrl->palette_changed = 1;
569
aca10aa7686f fixing demuxing of vc2_intro.avi
michael
parents: 562
diff changeset
528 goto resync;
520
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
529 }
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
530
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
531 }
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
532
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
533 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
534 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
535
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
536 /* XXX: we make the implicit supposition that the position are sorted
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
537 for each stream */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
538 static int avi_read_idx1(AVFormatContext *s, int size)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
539 {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
540 ByteIOContext *pb = &s->pb;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
541 int nb_index_entries, i;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
542 AVStream *st;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
543 AVIStream *ast;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
544 AVIIndexEntry *ie, *entries;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
545 unsigned int index, tag, flags, pos, len;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
546
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
547 nb_index_entries = size / 16;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
548 if (nb_index_entries <= 0)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
549 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
550
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
551 /* read the entries and sort them in each stream component */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
552 for(i = 0; i < nb_index_entries; i++) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
553 tag = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
554 flags = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
555 pos = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
556 len = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
557 #if defined(DEBUG_SEEK) && 0
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
558 printf("%d: tag=0x%x flags=0x%x pos=0x%x len=%d\n",
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
559 i, tag, flags, pos, len);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
560 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
561 index = ((tag & 0xff) - '0') * 10;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
562 index += ((tag >> 8) & 0xff) - '0';
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
563 if (index >= s->nb_streams)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
564 continue;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
565 st = s->streams[index];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
566 ast = st->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
567
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
568 entries = av_fast_realloc(ast->index_entries,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
569 &ast->index_entries_allocated_size,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
570 (ast->nb_index_entries + 1) *
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
571 sizeof(AVIIndexEntry));
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
572 if (entries) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
573 ast->index_entries = entries;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
574 ie = &entries[ast->nb_index_entries++];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
575 ie->flags = flags;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
576 ie->pos = pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
577 ie->cum_len = ast->cum_len;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
578 ast->cum_len += len;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
579 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
580 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
581 return 0;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
582 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
583
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
584 static int avi_load_index(AVFormatContext *s)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
585 {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
586 AVIContext *avi = s->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
587 ByteIOContext *pb = &s->pb;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
588 uint32_t tag, size;
343
538e6791f4c7 fixing some seek failure issues
michael
parents: 340
diff changeset
589 offset_t pos= url_ftell(pb);
538e6791f4c7 fixing some seek failure issues
michael
parents: 340
diff changeset
590
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
591 url_fseek(pb, avi->movi_end, SEEK_SET);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
592 #ifdef DEBUG_SEEK
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
593 printf("movi_end=0x%llx\n", avi->movi_end);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
594 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
595 for(;;) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
596 if (url_feof(pb))
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
597 break;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
598 tag = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
599 size = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
600 #ifdef DEBUG_SEEK
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
601 printf("tag=%c%c%c%c size=0x%x\n",
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
602 tag & 0xff,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
603 (tag >> 8) & 0xff,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
604 (tag >> 16) & 0xff,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
605 (tag >> 24) & 0xff,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
606 size);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
607 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
608 switch(tag) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
609 case MKTAG('i', 'd', 'x', '1'):
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
610 if (avi_read_idx1(s, size) < 0)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
611 goto skip;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
612 else
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
613 goto the_end;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
614 break;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
615 default:
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
616 skip:
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
617 size += (size & 1);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
618 url_fskip(pb, size);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
619 break;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
620 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
621 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
622 the_end:
343
538e6791f4c7 fixing some seek failure issues
michael
parents: 340
diff changeset
623 url_fseek(pb, pos, SEEK_SET);
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
624 return 0;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
625 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
626
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
627 /* return the index entry whose position is immediately >= 'wanted_pos' */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
628 static int locate_frame_in_index(AVIIndexEntry *entries,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
629 int nb_entries, int wanted_pos)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
630 {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
631 int a, b, m, pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
632
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
633 a = 0;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
634 b = nb_entries - 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
635 while (a <= b) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
636 m = (a + b) >> 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
637 pos = entries[m].pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
638 if (pos == wanted_pos)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
639 goto found;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
640 else if (pos > wanted_pos) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
641 b = m - 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
642 } else {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
643 a = m + 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
644 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
645 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
646 m = a;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
647 if (m > 0)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
648 m--;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
649 found:
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
650 return m;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
651 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
652
558
89bd76208427 100l (forgoten seeking functions)
michael
parents: 534
diff changeset
653 static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
654 {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
655 AVIContext *avi = s->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
656 AVStream *st;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
657 AVIStream *ast;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
658 int frame_number, i;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
659 int64_t pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
660
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
661 if (!avi->index_loaded) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
662 /* we only load the index on demand */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
663 avi_load_index(s);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
664 avi->index_loaded = 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
665 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
666 if (stream_index < 0) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
667 for(i = 0; i < s->nb_streams; i++) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
668 st = s->streams[i];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
669 if (st->codec.codec_type == CODEC_TYPE_VIDEO)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
670 goto found;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
671 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
672 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
673 found:
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
674 stream_index = i;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
675 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
676
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
677 st = s->streams[stream_index];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
678 if (st->codec.codec_type != CODEC_TYPE_VIDEO)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
679 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
680 ast = st->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
681 /* compute the frame number */
466
0dd5b381fc9a 100l (avi seeking)
michael
parents: 465
diff changeset
682 frame_number = timestamp;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
683 #ifdef DEBUG_SEEK
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
684 printf("timestamp=%0.3f nb_indexes=%d frame_number=%d\n",
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
685 (double)timestamp / AV_TIME_BASE,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
686 ast->nb_index_entries, frame_number);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
687 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
688 /* find a closest key frame before */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
689 if (frame_number >= ast->nb_index_entries)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
690 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
691 while (frame_number >= 0 &&
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
692 !(ast->index_entries[frame_number].flags & AVIIF_INDEX))
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
693 frame_number--;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
694 if (frame_number < 0)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
695 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
696 ast->new_frame_offset = frame_number;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
697
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
698 /* find the position */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
699 pos = ast->index_entries[frame_number].pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
700
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
701 #ifdef DEBUG_SEEK
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
702 printf("key_frame_number=%d pos=0x%llx\n",
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
703 frame_number, pos);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
704 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
705
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
706 /* update the frame counters for all the other stream by looking
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
707 at the positions just after the one found */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
708 for(i = 0; i < s->nb_streams; i++) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
709 int j;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
710 if (i != stream_index) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
711 st = s->streams[i];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
712 ast = st->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
713 if (ast->nb_index_entries <= 0)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
714 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
715 j = locate_frame_in_index(ast->index_entries,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
716 ast->nb_index_entries,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
717 pos);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
718 /* get next frame */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
719 if ((j + 1) < ast->nb_index_entries)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
720 j++;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
721 /* extract the current frame number */
457
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
722 if (ast->sample_size==0)
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
723 ast->new_frame_offset = j;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
724 else
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
725 ast->new_frame_offset = ast->index_entries[j].cum_len;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
726 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
727 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
728
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
729 /* everything is OK now. We can update the frame offsets */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
730 for(i = 0; i < s->nb_streams; i++) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
731 st = s->streams[i];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
732 ast = st->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
733 ast->frame_offset = ast->new_frame_offset;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
734 #ifdef DEBUG_SEEK
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
735 printf("%d: frame_offset=%d\n", i,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
736 ast->frame_offset);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
737 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
738 }
562
bf3231dd1d7c * static allocation for audio packets. This will make it a little bit
romansh
parents: 558
diff changeset
739 if (avi->dv_demux)
bf3231dd1d7c * static allocation for audio packets. This will make it a little bit
romansh
parents: 558
diff changeset
740 dv_flush_audio_packets(avi->dv_demux);
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
741 /* do the seek */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
742 pos += avi->movi_list;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
743 url_fseek(&s->pb, pos, SEEK_SET);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
744 return 0;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
745 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
746
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
747 static int avi_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
748 {
110
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
749 int i;
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
750 AVIContext *avi = s->priv_data;
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
751
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
752 for(i=0;i<s->nb_streams;i++) {
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
753 AVStream *st = s->streams[i];
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
754 AVIStream *ast = st->priv_data;
340
michael
parents: 339
diff changeset
755 if(ast){
michael
parents: 339
diff changeset
756 av_free(ast->index_entries);
michael
parents: 339
diff changeset
757 av_free(ast);
michael
parents: 339
diff changeset
758 }
110
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
759 av_free(st->codec.extradata);
297
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
760 av_free(st->codec.palctrl);
110
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
761 }
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
762
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
763 if (avi->dv_demux)
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
764 av_free(avi->dv_demux);
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
765
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
766 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
767 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
768
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
769 static int avi_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
770 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
771 /* check file header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
772 if (p->buf_size <= 32)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
773 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
774 if (p->buf[0] == 'R' && p->buf[1] == 'I' &&
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
775 p->buf[2] == 'F' && p->buf[3] == 'F' &&
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
776 p->buf[8] == 'A' && p->buf[9] == 'V' &&
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
777 p->buf[10] == 'I' && p->buf[11] == ' ')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
778 return AVPROBE_SCORE_MAX;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
779 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
780 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
781 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
782
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
783 static AVInputFormat avi_iformat = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
784 "avi",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
785 "avi format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
786 sizeof(AVIContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
787 avi_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
788 avi_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
789 avi_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
790 avi_read_close,
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
791 avi_read_seek,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
792 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
793
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
794 int avidec_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
795 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
796 av_register_input_format(&avi_iformat);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
797 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
798 }