X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffmpeg.c;h=e199a10ef463f43cce21757b44769aae24f16f1a;hb=28bf0d94aaf577e3ff593cfaa831f467cf2568e2;hp=40b96085a19ce3ee0c453b4375ec4922708a7bf4;hpb=8012f93ed8afbf0b45fa378085cd4b000e30057f;p=ffmpeg diff --git a/ffmpeg.c b/ffmpeg.c index 40b96085a19..e199a10ef46 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -454,7 +454,7 @@ static void exit_program(void) /* close files */ for (i = 0; i < nb_output_files; i++) { AVFormatContext *s = output_files[i]->ctx; - if (s && !(s->oformat->flags & AVFMT_NOFILE) && s->pb) + if (s && s->oformat && !(s->oformat->flags & AVFMT_NOFILE) && s->pb) avio_close(s->pb); avformat_free_context(s); av_dict_free(&output_files[i]->opts); @@ -1388,6 +1388,7 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p { OutputFile *of = output_files[ost->file_index]; int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base); + int64_t ist_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ist->st->time_base); AVPicture pict; AVPacket opkt; @@ -1397,9 +1398,15 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p !ost->copy_initial_nonkeyframes) return; - if (!ost->frame_number && ist->pts < of->start_time && - !ost->copy_prior_start) - return; + if (pkt->pts == AV_NOPTS_VALUE) { + if (!ost->frame_number && ist->pts < of->start_time && + !ost->copy_prior_start) + return; + } else { + if (!ost->frame_number && pkt->pts < ist_tb_start_time && + !ost->copy_prior_start) + return; + } if (of->recording_time != INT64_MAX && ist->pts >= of->recording_time + of->start_time) { @@ -1616,6 +1623,8 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output) f = decoded_frame; err = av_buffersrc_add_frame_flags(ist->filters[i]->filter, f, AV_BUFFERSRC_FLAG_PUSH); + if (err == AVERROR_EOF) + err = 0; /* ignore */ if (err < 0) break; } @@ -1719,7 +1728,9 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output) } else f = decoded_frame; ret = av_buffersrc_add_frame_flags(ist->filters[i]->filter, f, AV_BUFFERSRC_FLAG_PUSH); - if (ret < 0) { + if (ret == AVERROR_EOF) { + ret = 0; /* ignore */ + } else if (ret < 0) { av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network: %s\n", av_err2str(ret)); exit(1);