X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffmpeg.c;h=2763db6deebdb0a6afa2c0eceff73783a504cebf;hb=fa838a0c0f42246623c4501c6b197e16ee9713b4;hp=b50b160d59fb16c3a919bf6c45d3608bc4c870cf;hpb=36999606902ce5c53636552ec46df5a38fd3bd6b;p=ffmpeg diff --git a/ffmpeg.c b/ffmpeg.c index b50b160d59f..2763db6deeb 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -193,7 +193,8 @@ static void sub2video_push_ref(InputStream *ist, int64_t pts) av_buffersrc_add_ref(ist->filters[i]->filter, avfilter_ref_buffer(ref, ~0), AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT | - AV_BUFFERSRC_FLAG_NO_COPY); + AV_BUFFERSRC_FLAG_NO_COPY | + AV_BUFFERSRC_FLAG_PUSH); } static void sub2video_update(InputStream *ist, AVSubtitle *sub, int64_t pts) @@ -413,6 +414,7 @@ void av_noreturn exit_program(int ret) av_freep(&output_streams[i]->forced_keyframes); av_freep(&output_streams[i]->avfilter); + av_freep(&output_streams[i]->logfile_prefix); av_freep(&output_streams[i]->filtered_frame); av_freep(&output_streams[i]); } @@ -571,6 +573,18 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost) } } +static void close_output_stream(OutputStream *ost) +{ + OutputFile *of = output_files[ost->file_index]; + + ost->finished = 1; + if (of->shortest) { + int i; + for (i = 0; i < of->ctx->nb_streams; i++) + output_streams[of->ost_index + i]->finished = 1; + } +} + static int check_recording_time(OutputStream *ost) { OutputFile *of = output_files[ost->file_index]; @@ -578,7 +592,7 @@ static int check_recording_time(OutputStream *ost) if (of->recording_time != INT64_MAX && av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time, AV_TIME_BASE_Q) >= 0) { - ost->finished = 1; + close_output_stream(ost); return 0; } return 1; @@ -1046,7 +1060,7 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti AVCodecContext *enc; int frame_number, vid, i; double bitrate; - int64_t pts = INT64_MAX; + int64_t pts = INT64_MIN; static int64_t last_time = -1; static int qp_histogram[52]; int hours, mins, secs, us; @@ -1141,8 +1155,9 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti vid = 1; } /* compute min output value */ - pts = FFMIN(pts, av_rescale_q(ost->st->pts.val, - ost->st->time_base, AV_TIME_BASE_Q)); + if ((is_last_report || !ost->finished) && ost->st->pts.val != AV_NOPTS_VALUE) + pts = FFMAX(pts, av_rescale_q(ost->st->pts.val, + ost->st->time_base, AV_TIME_BASE_Q)); } secs = pts / AV_TIME_BASE; @@ -1312,7 +1327,7 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p if (of->recording_time != INT64_MAX && ist->pts >= of->recording_time + of->start_time) { - ost->finished = 1; + close_output_stream(ost); return; } @@ -1508,7 +1523,8 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) decoded_frame_tb, (AVRational){1, ist->st->codec->sample_rate}); for (i = 0; i < ist->nb_filters; i++) - av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0); + av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, + AV_BUFFERSRC_FLAG_PUSH); decoded_frame->pts = AV_NOPTS_VALUE; @@ -1619,9 +1635,10 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output) buf->refcount++; av_buffersrc_add_ref(ist->filters[i]->filter, fb, AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT | - AV_BUFFERSRC_FLAG_NO_COPY); + AV_BUFFERSRC_FLAG_NO_COPY | + AV_BUFFERSRC_FLAG_PUSH); } else - if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0)<0) { + if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, AV_BUFFERSRC_FLAG_PUSH)<0) { av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n"); exit_program(1); } @@ -2105,7 +2122,7 @@ static int transcode_init(void) } if (ist) - ist->decoding_needed = 1; + ist->decoding_needed++; ost->encoding_needed = 1; if (!ost->filter && @@ -2122,6 +2139,8 @@ static int transcode_init(void) if (codec->codec_type == AVMEDIA_TYPE_VIDEO) { if (ost->filter && !ost->frame_rate.num) ost->frame_rate = av_buffersink_get_frame_rate(ost->filter->filter); + if (ist && !ost->frame_rate.num) + ost->frame_rate = ist->framerate; if (ist && !ost->frame_rate.num) ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1}; // ost->frame_rate = ist->st->avg_frame_rate.num ? ist->st->avg_frame_rate : (AVRational){25, 1}; @@ -2189,7 +2208,8 @@ static int transcode_init(void) FILE *f; snprintf(logfilename, sizeof(logfilename), "%s-%d.log", - pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX, + ost->logfile_prefix ? ost->logfile_prefix : + DEFAULT_PASS_LOGFILENAME_PREFIX, i); if (!strcmp(ost->enc->name, "libx264")) { av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE); @@ -2395,7 +2415,7 @@ static int need_output(void) if (ost->frame_number >= ost->max_frames) { int j; for (j = 0; j < of->ctx->nb_streams; j++) - output_streams[of->ost_index + j]->finished = 1; + close_output_stream(output_streams[of->ost_index + j]); continue; } @@ -2658,18 +2678,6 @@ static void reset_eagain(void) output_streams[i]->unavailable = 0; } -static void close_output_stream(OutputStream *ost) -{ - OutputFile *of = output_files[ost->file_index]; - - ost->finished = 1; - if (of->shortest) { - int i; - for (i = 0; i < of->ctx->nb_streams; i++) - output_streams[of->ost_index + i]->finished = 1; - } -} - /** * @return * - 0 -- one packet was read and processed @@ -2736,15 +2744,16 @@ static int process_input(int file_index) goto discard_packet; if(!ist->wrap_correction_done && input_files[file_index]->ctx->start_time != AV_NOPTS_VALUE && ist->st->pts_wrap_bits < 64){ - uint64_t stime = av_rescale_q(input_files[file_index]->ctx->start_time, AV_TIME_BASE_Q, ist->st->time_base); - uint64_t stime2= stime + (1LL<st->pts_wrap_bits); + int64_t stime = av_rescale_q(input_files[file_index]->ctx->start_time, AV_TIME_BASE_Q, ist->st->time_base); + int64_t stime2= stime + (1ULL<st->pts_wrap_bits); ist->wrap_correction_done = 1; - if(pkt.dts != AV_NOPTS_VALUE && pkt.dts > stime && pkt.dts - stime > stime2 - pkt.dts) { - pkt.dts -= 1LL<st->pts_wrap_bits; + + if(stime2 > stime && pkt.dts != AV_NOPTS_VALUE && pkt.dts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) { + pkt.dts -= 1ULL<st->pts_wrap_bits; ist->wrap_correction_done = 0; } - if(pkt.pts != AV_NOPTS_VALUE && pkt.pts > stime && pkt.pts - stime > stime2 - pkt.pts) { - pkt.pts -= 1LL<st->pts_wrap_bits; + if(stime2 > stime && pkt.pts != AV_NOPTS_VALUE && pkt.pts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) { + pkt.pts -= 1ULL<st->pts_wrap_bits; ist->wrap_correction_done = 0; } } @@ -3082,7 +3091,7 @@ static void parse_cpuflags(int argc, char **argv, const OptionDef *options) { int idx = locate_option(argc, argv, options, "cpuflags"); if (idx && argv[idx + 1]) - opt_cpuflags("cpuflags", argv[idx + 1]); + opt_cpuflags(NULL, "cpuflags", argv[idx + 1]); } int main(int argc, char **argv)