Merge commit '674fa49110a661694188a958be13d529b7c8c5dd'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 11 Dec 2013 22:36:10 +0000 (23:36 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 11 Dec 2013 22:36:10 +0000 (23:36 +0100)
* commit '674fa49110a661694188a958be13d529b7c8c5dd':
  avconv: do not call avcodec_get_frame_defaults()

Conflicts:
ffmpeg.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
ffmpeg.c

diff --cc ffmpeg.c
+++ b/ffmpeg.c
@@@ -1057,91 -631,119 +1057,90 @@@ static void do_video_stats(OutputStrea
      }
  }
  
 -/*
 - * Read one frame for lavfi output for ost and encode it.
 - */
 -static int poll_filter(OutputStream *ost)
 -{
 -    OutputFile    *of = output_files[ost->file_index];
 -    AVFrame *filtered_frame = NULL;
 -    int frame_size, ret;
 -
 -    if (!ost->filtered_frame && !(ost->filtered_frame = av_frame_alloc())) {
 -        return AVERROR(ENOMEM);
 -    }
 -    filtered_frame = ost->filtered_frame;
 -
 -    if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
 -        !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
 -        ret = av_buffersink_get_samples(ost->filter->filter, filtered_frame,
 -                                         ost->st->codec->frame_size);
 -    else
 -        ret = av_buffersink_get_frame(ost->filter->filter, filtered_frame);
 -
 -    if (ret < 0)
 -        return ret;
 -
 -    if (filtered_frame->pts != AV_NOPTS_VALUE) {
 -        int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
 -        filtered_frame->pts = av_rescale_q(filtered_frame->pts,
 -                                           ost->filter->filter->inputs[0]->time_base,
 -                                           ost->st->codec->time_base) -
 -                              av_rescale_q(start_time,
 -                                           AV_TIME_BASE_Q,
 -                                           ost->st->codec->time_base);
 -    }
 -
 -    switch (ost->filter->filter->inputs[0]->type) {
 -    case AVMEDIA_TYPE_VIDEO:
 -        if (!ost->frame_aspect_ratio)
 -            ost->st->codec->sample_aspect_ratio = filtered_frame->sample_aspect_ratio;
 -
 -        do_video_out(of->ctx, ost, filtered_frame, &frame_size);
 -        if (vstats_filename && frame_size)
 -            do_video_stats(ost, frame_size);
 -        break;
 -    case AVMEDIA_TYPE_AUDIO:
 -        do_audio_out(of->ctx, ost, filtered_frame);
 -        break;
 -    default:
 -        // TODO support subtitle filters
 -        av_assert0(0);
 -    }
 -
 -    av_frame_unref(filtered_frame);
 -
 -    return 0;
 -}
 -
 -/*
 - * Read as many frames from possible from lavfi and encode them.
 +/**
 + * Get and encode new output from any of the filtergraphs, without causing
 + * activity.
   *
 - * Always read from the active stream with the lowest timestamp. If no frames
 - * are available for it then return EAGAIN and wait for more input. This way we
 - * can use lavfi sources that generate unlimited amount of frames without memory
 - * usage exploding.
 + * @return  0 for success, <0 for severe errors
   */
 -static int poll_filters(void)
 +static int reap_filters(void)
  {
 -    int i, j, ret = 0;
 -
 -    while (ret >= 0 && !received_sigterm) {
 -        OutputStream *ost = NULL;
 -        int64_t min_pts = INT64_MAX;
 +    AVFrame *filtered_frame = NULL;
 +    int i;
 +    int64_t frame_pts;
  
 -        /* choose output stream with the lowest timestamp */
 -        for (i = 0; i < nb_output_streams; i++) {
 -            int64_t pts = output_streams[i]->sync_opts;
 +    /* Reap all buffers present in the buffer sinks */
 +    for (i = 0; i < nb_output_streams; i++) {
 +        OutputStream *ost = output_streams[i];
 +        OutputFile    *of = output_files[ost->file_index];
 +        int ret = 0;
  
 -            if (!output_streams[i]->filter || output_streams[i]->finished)
 -                continue;
 +        if (!ost->filter)
 +            continue;
  
 -            pts = av_rescale_q(pts, output_streams[i]->st->codec->time_base,
 -                               AV_TIME_BASE_Q);
 -            if (pts < min_pts) {
 -                min_pts = pts;
 -                ost = output_streams[i];
 -            }
 +        if (!ost->filtered_frame && !(ost->filtered_frame = av_frame_alloc())) {
 +            return AVERROR(ENOMEM);
-         } else
-             avcodec_get_frame_defaults(ost->filtered_frame);
+         }
 +        filtered_frame = ost->filtered_frame;
 +
 +        while (1) {
 +            ret = av_buffersink_get_frame_flags(ost->filter->filter, filtered_frame,
 +                                               AV_BUFFERSINK_FLAG_NO_REQUEST);
 +            if (ret < 0) {
 +                if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
 +                    av_log(NULL, AV_LOG_WARNING,
 +                           "Error in av_buffersink_get_frame_flags(): %s\n", av_err2str(ret));
 +                }
 +                break;
 +            }
 +            frame_pts = AV_NOPTS_VALUE;
 +            if (filtered_frame->pts != AV_NOPTS_VALUE) {
 +                int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
 +                filtered_frame->pts = frame_pts = av_rescale_q(filtered_frame->pts,
 +                                                ost->filter->filter->inputs[0]->time_base,
 +                                                ost->st->codec->time_base) -
 +                                    av_rescale_q(start_time,
 +                                                AV_TIME_BASE_Q,
 +                                                ost->st->codec->time_base);
 +            }
 +            //if (ost->source_index >= 0)
 +            //    *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
  
 -        if (!ost)
 -            break;
 -
 -        ret = poll_filter(ost);
  
 -        if (ret == AVERROR_EOF) {
 -            OutputFile *of = output_files[ost->file_index];
 -
 -            ost->finished = 1;
 +            switch (ost->filter->filter->inputs[0]->type) {
 +            case AVMEDIA_TYPE_VIDEO:
 +                filtered_frame->pts = frame_pts;
 +                if (!ost->frame_aspect_ratio.num)
 +                    ost->st->codec->sample_aspect_ratio = filtered_frame->sample_aspect_ratio;
  
 -            if (of->shortest) {
 -                for (j = 0; j < of->ctx->nb_streams; j++)
 -                    output_streams[of->ost_index + j]->finished = 1;
 +                do_video_out(of->ctx, ost, filtered_frame);
 +                break;
 +            case AVMEDIA_TYPE_AUDIO:
 +                filtered_frame->pts = frame_pts;
 +                if (!(ost->st->codec->codec->capabilities & CODEC_CAP_PARAM_CHANGE) &&
 +                    ost->st->codec->channels != av_frame_get_channels(filtered_frame)) {
 +                    av_log(NULL, AV_LOG_ERROR,
 +                           "Audio filter graph output is not normalized and encoder does not support parameter changes\n");
 +                    break;
 +                }
 +                do_audio_out(of->ctx, ost, filtered_frame);
 +                break;
 +            default:
 +                // TODO support subtitle filters
 +                av_assert0(0);
              }
  
 -            ret = 0;
 -        } else if (ret == AVERROR(EAGAIN))
 -            return 0;
 +            av_frame_unref(filtered_frame);
 +        }
      }
  
 -    return ret;
 +    return 0;
  }
  
 -static void print_report(int is_last_report, int64_t timer_start)
 +static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
  {
      char buf[1024];
 +    AVBPrint buf_script;
      OutputStream *ost;
      AVFormatContext *oc;
      int64_t total_size;