fixing frame_rate accuracy

Originally committed as revision 1652 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Michael Niedermayer 22 years ago
parent 8a7b1b18e2
commit 0bf79c2fcd
  1. 11
      libavformat/ffm.c

@ -140,6 +140,8 @@ static int ffm_write_header(AVFormatContext *s)
/* list of streams */ /* list of streams */
for(i=0;i<s->nb_streams;i++) { for(i=0;i<s->nb_streams;i++) {
int gcd;
st = s->streams[i]; st = s->streams[i];
fst = av_mallocz(sizeof(FFMStream)); fst = av_mallocz(sizeof(FFMStream));
if (!fst) if (!fst)
@ -156,7 +158,9 @@ static int ffm_write_header(AVFormatContext *s)
/* specific info */ /* specific info */
switch(codec->codec_type) { switch(codec->codec_type) {
case CODEC_TYPE_VIDEO: case CODEC_TYPE_VIDEO:
put_be32(pb, (codec->frame_rate * 1000) / FRAME_RATE_BASE); gcd= av_gcd(FRAME_RATE_BASE, codec->frame_rate);
put_be32(pb, FRAME_RATE_BASE / gcd);
put_be32(pb, codec->frame_rate / gcd);
put_be16(pb, codec->width); put_be16(pb, codec->width);
put_be16(pb, codec->height); put_be16(pb, codec->height);
put_be16(pb, codec->gop_size); put_be16(pb, codec->gop_size);
@ -390,6 +394,7 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
/* read each stream */ /* read each stream */
for(i=0;i<s->nb_streams;i++) { for(i=0;i<s->nb_streams;i++) {
char rc_eq_buf[128]; char rc_eq_buf[128];
int rate, scale;
st = av_mallocz(sizeof(AVStream)); st = av_mallocz(sizeof(AVStream));
if (!st) if (!st)
@ -411,7 +416,9 @@ static int ffm_read_header(AVFormatContext *s, AVFormatParameters *ap)
/* specific info */ /* specific info */
switch(codec->codec_type) { switch(codec->codec_type) {
case CODEC_TYPE_VIDEO: case CODEC_TYPE_VIDEO:
codec->frame_rate = ((int64_t)get_be32(pb) * FRAME_RATE_BASE) / 1000; scale= get_be32(pb);
rate= get_be32(pb);
codec->frame_rate = (rate * (int64_t)FRAME_RATE_BASE) / scale;
codec->width = get_be16(pb); codec->width = get_be16(pb);
codec->height = get_be16(pb); codec->height = get_be16(pb);
codec->gop_size = get_be16(pb); codec->gop_size = get_be16(pb);

Loading…
Cancel
Save