diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 9920f946dc..e2ada7a352 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -1498,12 +1498,13 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo } else if (pkt->duration) { ist->next_dts += av_rescale_q(pkt->duration, pkt->time_base, AV_TIME_BASE_Q); } else if(ist->dec_ctx->framerate.num != 0) { - int ticks = ist->last_pkt_repeat_pict >= 0 ? - ist->last_pkt_repeat_pict + 1 : - ist->dec_ctx->ticks_per_frame; - ist->next_dts += ((int64_t)AV_TIME_BASE * - ist->dec_ctx->framerate.den * ticks) / - ist->dec_ctx->framerate.num / ist->dec_ctx->ticks_per_frame; + int fields = (ist->codec_desc && + (ist->codec_desc->props & AV_CODEC_PROP_FIELDS)) ? + ist->last_pkt_repeat_pict + 1 : 2; + AVRational field_rate = av_mul_q(ist->dec_ctx->framerate, + (AVRational){ 2, 1 }); + + ist->next_dts += av_rescale_q(fields, av_inv_q(field_rate), AV_TIME_BASE_Q); } break; } diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 47358170e7..b0319f0ed0 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -350,6 +350,7 @@ typedef struct InputStream { AVCodecParameters *par; AVCodecContext *dec_ctx; const AVCodec *dec; + const AVCodecDescriptor *codec_desc; AVFrame *decoded_frame; AVPacket *pkt; diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c index 630bb1c26b..1872e87d57 100644 --- a/fftools/ffmpeg_demux.c +++ b/fftools/ffmpeg_demux.c @@ -951,6 +951,8 @@ static void add_input_streams(const OptionsContext *o, Demuxer *d) av_log(ist, AV_LOG_ERROR, "Error initializing the decoder context.\n"); exit_program(1); } + + ist->codec_desc = avcodec_descriptor_get(ist->par->codec_id); } }