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 dd7cfcf632..64778bc0f3 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) {
-- 
2.40.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to