| @@ -963,76 +963,75 @@ static int reap_filters(void) | |||
| int i; | |||
| int64_t frame_pts; | |||
| /* TODO reindent */ | |||
| /* 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 (!ost->filter) | |||
| continue; | |||
| /* 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 (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) { | |||
| return AVERROR(ENOMEM); | |||
| } else | |||
| avcodec_get_frame_defaults(ost->filtered_frame); | |||
| filtered_frame = ost->filtered_frame; | |||
| if (!ost->filter) | |||
| continue; | |||
| while (1) { | |||
| ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref, | |||
| AV_BUFFERSINK_FLAG_NO_REQUEST); | |||
| if (ret < 0) { | |||
| if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) { | |||
| char buf[256]; | |||
| av_strerror(ret, buf, sizeof(buf)); | |||
| av_log(NULL, AV_LOG_WARNING, | |||
| "Error in av_buffersink_get_buffer_ref(): %s\n", buf); | |||
| } | |||
| break; | |||
| if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) { | |||
| return AVERROR(ENOMEM); | |||
| } else | |||
| avcodec_get_frame_defaults(ost->filtered_frame); | |||
| filtered_frame = ost->filtered_frame; | |||
| while (1) { | |||
| ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref, | |||
| AV_BUFFERSINK_FLAG_NO_REQUEST); | |||
| if (ret < 0) { | |||
| if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) { | |||
| char buf[256]; | |||
| av_strerror(ret, buf, sizeof(buf)); | |||
| av_log(NULL, AV_LOG_WARNING, | |||
| "Error in av_buffersink_get_buffer_ref(): %s\n", buf); | |||
| } | |||
| frame_pts = AV_NOPTS_VALUE; | |||
| if (picref->pts != AV_NOPTS_VALUE) { | |||
| filtered_frame->pts = frame_pts = av_rescale_q(picref->pts, | |||
| ost->filter->filter->inputs[0]->time_base, | |||
| ost->st->codec->time_base) - | |||
| av_rescale_q(of->start_time, | |||
| AV_TIME_BASE_Q, | |||
| ost->st->codec->time_base); | |||
| if (of->start_time && filtered_frame->pts < 0) { | |||
| avfilter_unref_buffer(picref); | |||
| continue; | |||
| } | |||
| break; | |||
| } | |||
| frame_pts = AV_NOPTS_VALUE; | |||
| if (picref->pts != AV_NOPTS_VALUE) { | |||
| filtered_frame->pts = frame_pts = av_rescale_q(picref->pts, | |||
| ost->filter->filter->inputs[0]->time_base, | |||
| ost->st->codec->time_base) - | |||
| av_rescale_q(of->start_time, | |||
| AV_TIME_BASE_Q, | |||
| ost->st->codec->time_base); | |||
| if (of->start_time && filtered_frame->pts < 0) { | |||
| avfilter_unref_buffer(picref); | |||
| continue; | |||
| } | |||
| //if (ost->source_index >= 0) | |||
| // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold | |||
| switch (ost->filter->filter->inputs[0]->type) { | |||
| case AVMEDIA_TYPE_VIDEO: | |||
| avfilter_copy_buf_props(filtered_frame, picref); | |||
| filtered_frame->pts = frame_pts; | |||
| if (!ost->frame_aspect_ratio) | |||
| ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio; | |||
| } | |||
| //if (ost->source_index >= 0) | |||
| // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold | |||
| do_video_out(of->ctx, ost, filtered_frame, | |||
| same_quant ? ost->last_quality : | |||
| ost->st->codec->global_quality); | |||
| break; | |||
| case AVMEDIA_TYPE_AUDIO: | |||
| avfilter_copy_buf_props(filtered_frame, picref); | |||
| filtered_frame->pts = frame_pts; | |||
| do_audio_out(of->ctx, ost, filtered_frame); | |||
| break; | |||
| default: | |||
| // TODO support subtitle filters | |||
| av_assert0(0); | |||
| } | |||
| avfilter_unref_buffer(picref); | |||
| switch (ost->filter->filter->inputs[0]->type) { | |||
| case AVMEDIA_TYPE_VIDEO: | |||
| avfilter_copy_buf_props(filtered_frame, picref); | |||
| filtered_frame->pts = frame_pts; | |||
| if (!ost->frame_aspect_ratio) | |||
| ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio; | |||
| do_video_out(of->ctx, ost, filtered_frame, | |||
| same_quant ? ost->last_quality : | |||
| ost->st->codec->global_quality); | |||
| break; | |||
| case AVMEDIA_TYPE_AUDIO: | |||
| avfilter_copy_buf_props(filtered_frame, picref); | |||
| filtered_frame->pts = frame_pts; | |||
| do_audio_out(of->ctx, ost, filtered_frame); | |||
| break; | |||
| default: | |||
| // TODO support subtitle filters | |||
| av_assert0(0); | |||
| } | |||
| avfilter_unref_buffer(picref); | |||
| } | |||
| } | |||
| return 0; | |||
| } | |||