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