annotate avidec.c @ 536:76c47c58064f libavformat

move packet interleaving function into AVOutputFormat, so it can be overriden easily instead of doing reordering twice if the muxer needs some other interleaving then dts based
author michael
date Wed, 29 Sep 2004 23:25:01 +0000
parents 3846c006af2b
children 89bd76208427
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;
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
386 offset_t i;
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
387 void* dstr;
98
cae6ddfadf51 AVI type 1 support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 92
diff changeset
388
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
389 memset(d, -1, sizeof(int)*8);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
390
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
391 if (avi->dv_demux) {
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
392 size = dv_get_packet(avi->dv_demux, pkt);
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
393 if (size >= 0)
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
394 return size;
149
f4de8f9c39bd use custom packet allocation only for DV
bellard
parents: 119
diff changeset
395 }
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
396
92
5a4b5f03d13e OpenDML AVI > 2Gb support patch by (Roman Shaposhnick <rvs at sun dot com>)
michaelni
parents: 91
diff changeset
397 for(i=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 i+= size;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
430 memset(d, -1, sizeof(int)*8);
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
431 //av_log(NULL, AV_LOG_DEBUG, "SKIP\n");
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
432 continue;
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
433 }
510
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
434
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
435 if( d[0] >= '0' && d[0] <= '9'
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
436 && d[1] >= '0' && d[1] <= '9'){
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
437 n= (d[0] - '0') * 10 + (d[1] - '0');
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
438 }else{
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
439 n= 100; //invalid stream id
510
133287132e1d * simplifying OpenDML AVI handling.
romansh
parents: 495
diff changeset
440 }
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
441
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
442 //parse ##dc/##wb
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
443 if(n < s->nb_streams){
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
444 AVStream *st;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
445 AVIStream *ast;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
446 st = s->streams[n];
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
447 ast = st->priv_data;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
448
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
449 if( (ast->prefix_count<5 && d[2]<128 && d[3]<128) ||
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
450 d[2]*256+d[3] == ast->prefix /*||
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
451 (d[2] == 'd' && d[3] == 'c') ||
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
452 (d[2] == 'w' && d[3] == 'b')*/) {
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
453
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
454 //av_log(NULL, AV_LOG_DEBUG, "OK\n");
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
455 if(d[2]*256+d[3] == ast->prefix)
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
456 ast->prefix_count++;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
457 else{
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
458 ast->prefix= d[2]*256+d[3];
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
459 ast->prefix_count= 0;
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
460 }
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
461
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
462 av_new_packet(pkt, size);
149
f4de8f9c39bd use custom packet allocation only for DV
bellard
parents: 119
diff changeset
463 get_buffer(pb, pkt->data, size);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
464 if (size & 1) {
149
f4de8f9c39bd use custom packet allocation only for DV
bellard
parents: 119
diff changeset
465 get_byte(pb);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
466 size++;
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
467 }
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
468
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
469 if (avi->dv_demux) {
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
470 dstr = pkt->destruct;
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
471 size = dv_produce_packet(avi->dv_demux, pkt,
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
472 pkt->data, pkt->size);
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
473 pkt->destruct = dstr;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
474 pkt->flags |= PKT_FLAG_KEY;
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
475 } else {
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
476 /* XXX: how to handle B frames in avi ? */
469
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
477 pkt->dts = ast->frame_offset;
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
478 // pkt->dts += ast->start;
457
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
479 if(ast->sample_size)
469
6a4cc19e8d9b exporting keyframe flags, fixes keyframe stuff with streamcopy
michael
parents: 466
diff changeset
480 pkt->dts /= ast->sample_size;
495
d33ce0cfc81c play more broken files
michael
parents: 472
diff changeset
481 //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
482 pkt->stream_index = n;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
483 /* FIXME: We really should read index for that */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
484 if (st->codec.codec_type == CODEC_TYPE_VIDEO) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
485 if (ast->frame_offset < ast->nb_index_entries) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
486 if (ast->index_entries[ast->frame_offset].flags & AVIIF_INDEX)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
487 pkt->flags |= PKT_FLAG_KEY;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
488 } else {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
489 /* if no index, better to say that all frames
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
490 are key frames */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
491 pkt->flags |= PKT_FLAG_KEY;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
492 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
493 } else {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
494 pkt->flags |= PKT_FLAG_KEY;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
495 }
457
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
496 if(ast->sample_size)
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
497 ast->frame_offset += pkt->size;
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
498 else
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
499 ast->frame_offset++;
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
500 }
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
501 return size;
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
502 }
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
503 }
520
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
504 /* palette changed chunk */
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
505 if ( d[0] >= '0' && d[0] <= '9'
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
506 && d[1] >= '0' && d[1] <= '9'
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
507 && ((d[2] == 'p' && d[3] == 'c'))
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
508 && 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
509
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
510 AVStream *st;
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
511 int first, clr, flags, k, p;
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 st = s->streams[n];
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
514
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
515 first = get_byte(pb);
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
516 clr = get_byte(pb);
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;
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
528 }
5d96fe8f6560 added support for the elusive AVI palette change chunk, courtesy of
melanson
parents: 519
diff changeset
529
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
530 }
519
d59dc270e1f5 various fixes for the main chunk demux loop
michael
parents: 510
diff changeset
531
82
33753bc4869e fixing parsing of opendml avis
michaelni
parents: 80
diff changeset
532 return -1;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
533 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
534
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
535 /* XXX: we make the implicit supposition that the position are sorted
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
536 for each stream */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
537 static int avi_read_idx1(AVFormatContext *s, int size)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
538 {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
539 ByteIOContext *pb = &s->pb;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
540 int nb_index_entries, i;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
541 AVStream *st;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
542 AVIStream *ast;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
543 AVIIndexEntry *ie, *entries;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
544 unsigned int index, tag, flags, pos, len;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
545
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
546 nb_index_entries = size / 16;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
547 if (nb_index_entries <= 0)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
548 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
549
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
550 /* read the entries and sort them in each stream component */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
551 for(i = 0; i < nb_index_entries; i++) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
552 tag = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
553 flags = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
554 pos = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
555 len = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
556 #if defined(DEBUG_SEEK) && 0
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
557 printf("%d: tag=0x%x flags=0x%x pos=0x%x len=%d\n",
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
558 i, tag, flags, pos, len);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
559 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
560 index = ((tag & 0xff) - '0') * 10;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
561 index += ((tag >> 8) & 0xff) - '0';
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
562 if (index >= s->nb_streams)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
563 continue;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
564 st = s->streams[index];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
565 ast = st->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
566
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
567 entries = av_fast_realloc(ast->index_entries,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
568 &ast->index_entries_allocated_size,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
569 (ast->nb_index_entries + 1) *
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
570 sizeof(AVIIndexEntry));
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
571 if (entries) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
572 ast->index_entries = entries;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
573 ie = &entries[ast->nb_index_entries++];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
574 ie->flags = flags;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
575 ie->pos = pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
576 ie->cum_len = ast->cum_len;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
577 ast->cum_len += len;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
578 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
579 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
580 return 0;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
581 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
582
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
583 static int avi_load_index(AVFormatContext *s)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
584 {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
585 AVIContext *avi = s->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
586 ByteIOContext *pb = &s->pb;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
587 uint32_t tag, size;
343
538e6791f4c7 fixing some seek failure issues
michael
parents: 340
diff changeset
588 offset_t pos= url_ftell(pb);
538e6791f4c7 fixing some seek failure issues
michael
parents: 340
diff changeset
589
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
590 url_fseek(pb, avi->movi_end, SEEK_SET);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
591 #ifdef DEBUG_SEEK
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
592 printf("movi_end=0x%llx\n", avi->movi_end);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
593 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
594 for(;;) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
595 if (url_feof(pb))
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
596 break;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
597 tag = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
598 size = get_le32(pb);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
599 #ifdef DEBUG_SEEK
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
600 printf("tag=%c%c%c%c size=0x%x\n",
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
601 tag & 0xff,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
602 (tag >> 8) & 0xff,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
603 (tag >> 16) & 0xff,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
604 (tag >> 24) & 0xff,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
605 size);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
606 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
607 switch(tag) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
608 case MKTAG('i', 'd', 'x', '1'):
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
609 if (avi_read_idx1(s, size) < 0)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
610 goto skip;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
611 else
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
612 goto the_end;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
613 break;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
614 default:
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
615 skip:
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
616 size += (size & 1);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
617 url_fskip(pb, size);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
618 break;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
619 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
620 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
621 the_end:
343
538e6791f4c7 fixing some seek failure issues
michael
parents: 340
diff changeset
622 url_fseek(pb, pos, SEEK_SET);
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
623 return 0;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
624 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
625
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
626 /* return the index entry whose position is immediately >= 'wanted_pos' */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
627 static int locate_frame_in_index(AVIIndexEntry *entries,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
628 int nb_entries, int wanted_pos)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
629 {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
630 int a, b, m, pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
631
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
632 a = 0;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
633 b = nb_entries - 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
634 while (a <= b) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
635 m = (a + b) >> 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
636 pos = entries[m].pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
637 if (pos == wanted_pos)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
638 goto found;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
639 else if (pos > wanted_pos) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
640 b = m - 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
641 } else {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
642 a = m + 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
643 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
644 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
645 m = a;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
646 if (m > 0)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
647 m--;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
648 found:
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
649 return m;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
650 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
651
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
652 static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
653 {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
654 AVIContext *avi = s->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
655 AVStream *st;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
656 AVIStream *ast;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
657 int frame_number, i;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
658 int64_t pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
659
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
660 if (!avi->index_loaded) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
661 /* we only load the index on demand */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
662 avi_load_index(s);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
663 avi->index_loaded = 1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
664 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
665 if (stream_index < 0) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
666 for(i = 0; i < s->nb_streams; i++) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
667 st = s->streams[i];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
668 if (st->codec.codec_type == CODEC_TYPE_VIDEO)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
669 goto found;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
670 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
671 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
672 found:
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
673 stream_index = i;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
674 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
675
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
676 st = s->streams[stream_index];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
677 if (st->codec.codec_type != CODEC_TYPE_VIDEO)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
678 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
679 ast = st->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
680 /* compute the frame number */
466
0dd5b381fc9a 100l (avi seeking)
michael
parents: 465
diff changeset
681 frame_number = timestamp;
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
682 #ifdef DEBUG_SEEK
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
683 printf("timestamp=%0.3f nb_indexes=%d frame_number=%d\n",
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
684 (double)timestamp / AV_TIME_BASE,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
685 ast->nb_index_entries, frame_number);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
686 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
687 /* find a closest key frame before */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
688 if (frame_number >= ast->nb_index_entries)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
689 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
690 while (frame_number >= 0 &&
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
691 !(ast->index_entries[frame_number].flags & AVIIF_INDEX))
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
692 frame_number--;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
693 if (frame_number < 0)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
694 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
695 ast->new_frame_offset = frame_number;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
696
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
697 /* find the position */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
698 pos = ast->index_entries[frame_number].pos;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
699
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
700 #ifdef DEBUG_SEEK
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
701 printf("key_frame_number=%d pos=0x%llx\n",
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
702 frame_number, pos);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
703 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
704
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
705 /* update the frame counters for all the other stream by looking
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
706 at the positions just after the one found */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
707 for(i = 0; i < s->nb_streams; i++) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
708 int j;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
709 if (i != stream_index) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
710 st = s->streams[i];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
711 ast = st->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
712 if (ast->nb_index_entries <= 0)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
713 return -1;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
714 j = locate_frame_in_index(ast->index_entries,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
715 ast->nb_index_entries,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
716 pos);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
717 /* get next frame */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
718 if ((j + 1) < ast->nb_index_entries)
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
719 j++;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
720 /* extract the current frame number */
457
0f5aae2cd43f vbr audio fix
michael
parents: 344
diff changeset
721 if (ast->sample_size==0)
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
722 ast->new_frame_offset = j;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
723 else
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
724 ast->new_frame_offset = ast->index_entries[j].cum_len;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
725 }
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 /* everything is OK now. We can update the frame offsets */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
729 for(i = 0; i < s->nb_streams; i++) {
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
730 st = s->streams[i];
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
731 ast = st->priv_data;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
732 ast->frame_offset = ast->new_frame_offset;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
733 #ifdef DEBUG_SEEK
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
734 printf("%d: frame_offset=%d\n", i,
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
735 ast->frame_offset);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
736 #endif
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
737 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
738 /* do the seek */
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
739 pos += avi->movi_list;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
740 url_fseek(&s->pb, pos, SEEK_SET);
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
741 return 0;
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
742 }
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
743
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
744 static int avi_read_close(AVFormatContext *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
745 {
110
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
746 int i;
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
747 AVIContext *avi = s->priv_data;
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
748
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
749 for(i=0;i<s->nb_streams;i++) {
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
750 AVStream *st = s->streams[i];
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
751 AVIStream *ast = st->priv_data;
340
michael
parents: 339
diff changeset
752 if(ast){
michael
parents: 339
diff changeset
753 av_free(ast->index_entries);
michael
parents: 339
diff changeset
754 av_free(ast);
michael
parents: 339
diff changeset
755 }
110
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
756 av_free(st->codec.extradata);
297
85d558a18134 Make avi and asf demuxer export palette in palctrl
rtognimp
parents: 296
diff changeset
757 av_free(st->codec.palctrl);
110
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
758 }
9fd9b0f9e9d8 memleaks
michaelni
parents: 98
diff changeset
759
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
760 if (avi->dv_demux)
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
761 av_free(avi->dv_demux);
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 227
diff changeset
762
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
763 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
764 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
765
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
766 static int avi_probe(AVProbeData *p)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
767 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
768 /* check file header */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
769 if (p->buf_size <= 32)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
770 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
771 if (p->buf[0] == 'R' && p->buf[1] == 'I' &&
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
772 p->buf[2] == 'F' && p->buf[3] == 'F' &&
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
773 p->buf[8] == 'A' && p->buf[9] == 'V' &&
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
774 p->buf[10] == 'I' && p->buf[11] == ' ')
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
775 return AVPROBE_SCORE_MAX;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
776 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
777 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
778 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
779
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
780 static AVInputFormat avi_iformat = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
781 "avi",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
782 "avi format",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
783 sizeof(AVIContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
784 avi_probe,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
785 avi_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
786 avi_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
787 avi_read_close,
311
e07654b1049c initial seek support
bellard
parents: 300
diff changeset
788 avi_read_seek,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
789 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
790
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
791 int avidec_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
792 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
793 av_register_input_format(&avi_iformat);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
794 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
795 }