comparison avidec.c @ 75:78bec272ce3a libavformat

read BITMAPINFOHEADER extra stuff (huffyuv decoding fixed) fixed framerate encoding & decoding hopefully, this should fix av sync on long AVIs
author michaelni
date Sat, 08 Mar 2003 10:57:44 +0000
parents d40ddc73858a
children d03c70b7b50d
comparison
equal deleted inserted replaced
74:4b501fe1539c 75:78bec272ce3a
48 static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) 48 static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
49 { 49 {
50 AVIContext *avi = s->priv_data; 50 AVIContext *avi = s->priv_data;
51 ByteIOContext *pb = &s->pb; 51 ByteIOContext *pb = &s->pb;
52 uint32_t tag, tag1; 52 uint32_t tag, tag1;
53 int codec_type, stream_index, frame_period, bit_rate; 53 int codec_type, stream_index, frame_period, bit_rate, scale, rate;
54 unsigned int size; 54 unsigned int size;
55 int i; 55 int i;
56 AVStream *st; 56 AVStream *st;
57 57
58 /* check RIFF header */ 58 /* check RIFF header */
115 stream_index++; 115 stream_index++;
116 tag1 = get_le32(pb); 116 tag1 = get_le32(pb);
117 switch(tag1) { 117 switch(tag1) {
118 case MKTAG('v', 'i', 'd', 's'): 118 case MKTAG('v', 'i', 'd', 's'):
119 codec_type = CODEC_TYPE_VIDEO; 119 codec_type = CODEC_TYPE_VIDEO;
120
121 if (stream_index >= s->nb_streams) {
122 url_fskip(pb, size - 4);
123 break;
124 }
125
126 st = s->streams[stream_index];
127
120 get_le32(pb); /* codec tag */ 128 get_le32(pb); /* codec tag */
121 get_le32(pb); /* flags */ 129 get_le32(pb); /* flags */
122 get_le16(pb); /* priority */ 130 get_le16(pb); /* priority */
123 get_le16(pb); /* language */ 131 get_le16(pb); /* language */
124 get_le32(pb); /* XXX: initial frame ? */ 132 get_le32(pb); /* XXX: initial frame ? */
125 get_le32(pb); /* scale */ 133 scale= get_le32(pb); /* scale */
126 get_le32(pb); /* rate */ 134 rate= get_le32(pb); /* rate */
135
136 if(scale && rate)
137 st->codec.frame_rate= (rate * (uint64_t)FRAME_RATE_BASE + scale/2) / scale;
138 else if(frame_period)
139 st->codec.frame_rate = (1000000LL * FRAME_RATE_BASE + frame_period/2) / frame_period;
140 else
141 st->codec.frame_rate = 25 * FRAME_RATE_BASE;
142
127 url_fskip(pb, size - 7 * 4); 143 url_fskip(pb, size - 7 * 4);
128 break; 144 break;
129 case MKTAG('a', 'u', 'd', 's'): 145 case MKTAG('a', 'u', 'd', 's'):
130 codec_type = CODEC_TYPE_AUDIO; 146 codec_type = CODEC_TYPE_AUDIO;
131 /* nothing really useful */ 147 /* nothing really useful */
144 switch(codec_type) { 160 switch(codec_type) {
145 case CODEC_TYPE_VIDEO: 161 case CODEC_TYPE_VIDEO:
146 get_le32(pb); /* size */ 162 get_le32(pb); /* size */
147 st->codec.width = get_le32(pb); 163 st->codec.width = get_le32(pb);
148 st->codec.height = get_le32(pb); 164 st->codec.height = get_le32(pb);
149 if (frame_period)
150 st->codec.frame_rate = (int64_t_C(1000000) * FRAME_RATE_BASE) / frame_period;
151 else
152 st->codec.frame_rate = 25 * FRAME_RATE_BASE;
153 get_le16(pb); /* panes */ 165 get_le16(pb); /* panes */
154 get_le16(pb); /* depth */ 166 st->codec.bits_per_sample= get_le16(pb); /* depth */
155 tag1 = get_le32(pb); 167 tag1 = get_le32(pb);
168 get_le32(pb); /* ImageSize */
169 get_le32(pb); /* XPelsPerMeter */
170 get_le32(pb); /* YPelsPerMeter */
171 get_le32(pb); /* ClrUsed */
172 get_le32(pb); /* ClrImportant */
173
174 st->codec.extradata_size= size - 10*4;
175 st->codec.extradata= av_malloc(st->codec.extradata_size); //FIXME where should we free this?
176 get_buffer(pb, st->codec.extradata, st->codec.extradata_size);
177
156 #ifdef DEBUG 178 #ifdef DEBUG
157 print_tag("video", tag1, 0); 179 print_tag("video", tag1, 0);
158 #endif 180 #endif
159 st->codec.codec_type = CODEC_TYPE_VIDEO; 181 st->codec.codec_type = CODEC_TYPE_VIDEO;
160 st->codec.codec_tag = tag1; 182 st->codec.codec_tag = tag1;
161 st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1); 183 st->codec.codec_id = codec_get_id(codec_bmp_tags, tag1);
162 url_fskip(pb, size - 5 * 4); 184 // url_fskip(pb, size - 5 * 4);
163 break; 185 break;
164 case CODEC_TYPE_AUDIO: 186 case CODEC_TYPE_AUDIO:
165 get_wav_header(pb, &st->codec, (size >= 18)); 187 get_wav_header(pb, &st->codec, (size >= 18));
166 if (size%2) /* 2-aligned (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */ 188 if (size%2) /* 2-aligned (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */
167 url_fskip(pb, 1); 189 url_fskip(pb, 1);
195 static int avi_read_packet(AVFormatContext *s, AVPacket *pkt) 217 static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
196 { 218 {
197 AVIContext *avi = s->priv_data; 219 AVIContext *avi = s->priv_data;
198 ByteIOContext *pb = &s->pb; 220 ByteIOContext *pb = &s->pb;
199 int n, d1, d2, size; 221 int n, d1, d2, size;
200 222
201 find_next: 223 find_next:
202 if (url_feof(pb) || url_ftell(pb) >= avi->movi_end) 224 if (url_feof(pb) || url_ftell(pb) >= avi->movi_end)
203 return -1; 225 return -1;
204 d1 = get_byte(pb); 226 d1 = get_byte(pb);
205 if (d1 < '0' || d1 > '9') 227 if (d1 < '0' || d1 > '9')