comparison ffm.c @ 79:8bdaec4e3e4b libavformat

fixing frame_rate accuracy
author michaelni
date Sat, 08 Mar 2003 14:29:12 +0000
parents a58a8a53eb46
children 25062c9b1f86
comparison
equal deleted inserted replaced
78:f1ea9a26edca 79:8bdaec4e3e4b
138 } 138 }
139 put_be32(pb, bit_rate); 139 put_be32(pb, bit_rate);
140 140
141 /* list of streams */ 141 /* list of streams */
142 for(i=0;i<s->nb_streams;i++) { 142 for(i=0;i<s->nb_streams;i++) {
143 int gcd;
144
143 st = s->streams[i]; 145 st = s->streams[i];
144 fst = av_mallocz(sizeof(FFMStream)); 146 fst = av_mallocz(sizeof(FFMStream));
145 if (!fst) 147 if (!fst)
146 goto fail; 148 goto fail;
147 st->priv_data = fst; 149 st->priv_data = fst;
154 put_be32(pb, st->quality); 156 put_be32(pb, st->quality);
155 put_be32(pb, codec->flags); 157 put_be32(pb, codec->flags);
156 /* specific info */ 158 /* specific info */
157 switch(codec->codec_type) { 159 switch(codec->codec_type) {
158 case CODEC_TYPE_VIDEO: 160 case CODEC_TYPE_VIDEO:
159 put_be32(pb, (codec->frame_rate * 1000) / FRAME_RATE_BASE); 161 gcd= av_gcd(FRAME_RATE_BASE, codec->frame_rate);
162 put_be32(pb, FRAME_RATE_BASE / gcd);
163 put_be32(pb, codec->frame_rate / gcd);
160 put_be16(pb, codec->width); 164 put_be16(pb, codec->width);
161 put_be16(pb, codec->height); 165 put_be16(pb, codec->height);
162 put_be16(pb, codec->gop_size); 166 put_be16(pb, codec->gop_size);
163 put_byte(pb, codec->qmin); 167 put_byte(pb, codec->qmin);
164 put_byte(pb, codec->qmax); 168 put_byte(pb, codec->qmax);
388 s->nb_streams = get_be32(pb); 392 s->nb_streams = get_be32(pb);
389 get_be32(pb); /* total bitrate */ 393 get_be32(pb); /* total bitrate */
390 /* read each stream */ 394 /* read each stream */
391 for(i=0;i<s->nb_streams;i++) { 395 for(i=0;i<s->nb_streams;i++) {
392 char rc_eq_buf[128]; 396 char rc_eq_buf[128];
397 int rate, scale;
393 398
394 st = av_mallocz(sizeof(AVStream)); 399 st = av_mallocz(sizeof(AVStream));
395 if (!st) 400 if (!st)
396 goto fail; 401 goto fail;
397 avcodec_get_context_defaults(&st->codec); 402 avcodec_get_context_defaults(&st->codec);
409 st->quality = get_be32(pb); 414 st->quality = get_be32(pb);
410 codec->flags = get_be32(pb); 415 codec->flags = get_be32(pb);
411 /* specific info */ 416 /* specific info */
412 switch(codec->codec_type) { 417 switch(codec->codec_type) {
413 case CODEC_TYPE_VIDEO: 418 case CODEC_TYPE_VIDEO:
414 codec->frame_rate = ((int64_t)get_be32(pb) * FRAME_RATE_BASE) / 1000; 419 scale= get_be32(pb);
420 rate= get_be32(pb);
421 codec->frame_rate = (rate * (int64_t)FRAME_RATE_BASE) / scale;
415 codec->width = get_be16(pb); 422 codec->width = get_be16(pb);
416 codec->height = get_be16(pb); 423 codec->height = get_be16(pb);
417 codec->gop_size = get_be16(pb); 424 codec->gop_size = get_be16(pb);
418 codec->qmin = get_byte(pb); 425 codec->qmin = get_byte(pb);
419 codec->qmax = get_byte(pb); 426 codec->qmax = get_byte(pb);