From 4d06742b93394b6265fb32640ee7bb36f4fe1a06 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 7 Jul 2023 11:02:15 +0200 Subject: [PATCH] fftools/ffmpeg: add more structure to FrameData It now contains data from multiple sources, so group those items that always come from the decoder. Also, initialize them to invalid values, so that frames that did not originate from a decoder can be distinguished. --- fftools/ffmpeg.c | 8 +++++++- fftools/ffmpeg.h | 10 +++++++--- fftools/ffmpeg_dec.c | 6 +++--- fftools/ffmpeg_enc.c | 6 +++--- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 3e8d2a4c89..cbeddab125 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -434,9 +434,15 @@ InputStream *ist_iter(InputStream *prev) FrameData *frame_data(AVFrame *frame) { if (!frame->opaque_ref) { - frame->opaque_ref = av_buffer_allocz(sizeof(FrameData)); + FrameData *fd; + + frame->opaque_ref = av_buffer_allocz(sizeof(*fd)); if (!frame->opaque_ref) return NULL; + fd = (FrameData*)frame->opaque_ref->data; + + fd->dec.frame_num = UINT64_MAX; + fd->dec.pts = AV_NOPTS_VALUE; } return (FrameData*)frame->opaque_ref->data; diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index bd6b0ed6d1..97aa4d716e 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -626,9 +626,13 @@ typedef struct OutputFile { // optionally attached as opaque_ref to decoded AVFrames typedef struct FrameData { - uint64_t idx; - int64_t pts; - AVRational tb; + // properties that come from the decoder + struct { + uint64_t frame_num; + + int64_t pts; + AVRational tb; + } dec; AVRational frame_rate_filter; diff --git a/fftools/ffmpeg_dec.c b/fftools/ffmpeg_dec.c index a1d811f512..5c1b8888e9 100644 --- a/fftools/ffmpeg_dec.c +++ b/fftools/ffmpeg_dec.c @@ -612,9 +612,9 @@ static int packet_decode(InputStream *ist, const AVPacket *pkt, AVFrame *frame) av_frame_unref(frame); return AVERROR(ENOMEM); } - fd->pts = frame->pts; - fd->tb = dec->pkt_timebase; - fd->idx = dec->frame_num - 1; + fd->dec.pts = frame->pts; + fd->dec.tb = dec->pkt_timebase; + fd->dec.frame_num = dec->frame_num - 1; fd->bits_per_raw_sample = dec->bits_per_raw_sample; frame->time_base = dec->pkt_timebase; diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c index 88c62124a9..0e2285c5a2 100644 --- a/fftools/ffmpeg_enc.c +++ b/fftools/ffmpeg_enc.c @@ -569,8 +569,8 @@ void enc_stats_write(OutputStream *ost, EncStats *es, if ((frame && frame->opaque_ref) || (pkt && pkt->opaque_ref)) { fd = (const FrameData*)(frame ? frame->opaque_ref->data : pkt->opaque_ref->data); - tbi = fd->tb; - ptsi = fd->pts; + tbi = fd->dec.tb; + ptsi = fd->dec.pts; } for (size_t i = 0; i < es->nb_components; i++) { @@ -588,7 +588,7 @@ void enc_stats_write(OutputStream *ost, EncStats *es, case ENC_STATS_PTS_TIME_IN: avio_printf(io, "%g", ptsi == INT64_MAX ? INFINITY : ptsi * av_q2d(tbi)); continue; case ENC_STATS_FRAME_NUM: avio_printf(io, "%"PRIu64, frame_num); continue; - case ENC_STATS_FRAME_NUM_IN: avio_printf(io, "%"PRIu64, fd ? fd->idx : -1); continue; + case ENC_STATS_FRAME_NUM_IN: avio_printf(io, "%"PRIu64, fd ? fd->dec.frame_num : -1); continue; } if (frame) {