On 06/15/2011 12:09 PM, Anton Khirnov wrote:

> It's broken with multiple files or video streams.
> ---
>  ffmpeg.c |   22 +++++++++++++---------
>  1 files changed, 13 insertions(+), 9 deletions(-)
> 
> diff --git a/ffmpeg.c b/ffmpeg.c
> index 10811da..82f2b6c 100644
> --- a/ffmpeg.c
> +++ b/ffmpeg.c
> @@ -271,6 +271,7 @@ typedef struct AVOutputStream {
>      int resample_height;
>      int resample_width;
>      int resample_pix_fmt;
> +    AVRational frame_rate;
>  
>      float frame_aspect_ratio;
>  
> @@ -2226,6 +2227,14 @@ static int transcode(AVFormatContext **output_files,
>                  ost->encoding_needed = 1;
>                  ist->decoding_needed = 1;
>  
> +                if (!ost->frame_rate.num)
> +                    ost->frame_rate = ist->st->r_frame_rate.num ? 
> ist->st->r_frame_rate : (AVRational){25,1};
> +                if (codec->codec && codec->codec->supported_framerates && 
> !force_fps) {
> +                    int idx = av_find_nearest_q_idx(ost->frame_rate, 
> codec->codec->supported_framerates);
> +                    ost->frame_rate = 
> codec->codec->supported_framerates[idx];
> +                }
> +                codec->time_base = (AVRational){ost->frame_rate.den, 
> ost->frame_rate.num};
> +
>  #if CONFIG_AVFILTER
>                  if (configure_video_filters(ist, ost)) {
>                      fprintf(stderr, "Error opening filters!\n");
> @@ -3308,9 +3317,6 @@ static int opt_input_file(const char *opt, const char 
> *filename)
>  
>                      (float)rfps / rfps_base, rfps, rfps_base);
>              }
> -            /* update the current frame rate to match the stream frame rate 
> */
> -            frame_rate.num = rfps;
> -            frame_rate.den = rfps_base;
>  
>              if(video_disable)
>                  st->discard= AVDISCARD_ALL;
> @@ -3342,6 +3348,7 @@ static int opt_input_file(const char *opt, const char 
> *filename)
>      input_files[nb_input_files - 1].ist_index  = nb_input_streams - 
> ic->nb_streams;
>  
>      video_channel = 0;
> +    frame_rate    = (AVRational){0, 0};
>      audio_sample_rate = 0;
>      audio_channels    = 0;
>  
> @@ -3455,16 +3462,12 @@ static void new_video_stream(AVFormatContext *oc, int 
> file_idx)
>      } else {
>          const char *p;
>          int i;
> -        AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
>  
> +        if (frame_rate.num)
> +            ost->frame_rate = frame_rate;
>          video_enc->codec_id = codec_id;
>          set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], 
> AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
>  
> -        if (codec && codec->supported_framerates && !force_fps)
> -            fps = codec->supported_framerates[av_find_nearest_q_idx(fps, 
> codec->supported_framerates)];
> -        video_enc->time_base.den = fps.num;
> -        video_enc->time_base.num = fps.den;
> -
>          video_enc->width = frame_width;
>          video_enc->height = frame_height;
>          video_enc->pix_fmt = frame_pix_fmt;
> @@ -3895,6 +3898,7 @@ static void opt_output_file(const char *filename)
>  
>      set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
>  
> +    frame_rate    = (AVRational){0, 0};
>      audio_sample_rate = 0;
>      audio_channels    = 0;
>  


patch looks ok.

-Justin

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to