Mercurial > libavformat.hg
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') |