[FFmpeg-cvslog] fftools/ffmpeg: prepare FrameData for having allocated fields

Anton Khirnov git at videolan.org
Wed Mar 13 09:27:22 EET 2024


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Thu Feb 15 08:57:07 2024 +0100| [b98af440c575c1f9a706bd57ee5f1dd8b9ff82cc] | committer: Anton Khirnov

fftools/ffmpeg: prepare FrameData for having allocated fields

Will be useful in following commits.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b98af440c575c1f9a706bd57ee5f1dd8b9ff82cc
---

 fftools/ffmpeg.c | 41 +++++++++++++++++++++++++++++++----------
 1 file changed, 31 insertions(+), 10 deletions(-)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 2f01a01e2d..ffd25f4c5b 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -402,23 +402,44 @@ InputStream *ist_iter(InputStream *prev)
     return NULL;
 }
 
+static void frame_data_free(void *opaque, uint8_t *data)
+{
+    av_free(data);
+}
+
 static int frame_data_ensure(AVBufferRef **dst, int writable)
 {
-    if (!*dst) {
+    AVBufferRef *src = *dst;
+
+    if (!src || (writable && !av_buffer_is_writable(src))) {
         FrameData *fd;
 
-        *dst = av_buffer_allocz(sizeof(*fd));
-        if (!*dst)
+        fd = av_mallocz(sizeof(*fd));
+        if (!fd)
+            return AVERROR(ENOMEM);
+
+        *dst = av_buffer_create((uint8_t *)fd, sizeof(*fd),
+                                frame_data_free, NULL, 0);
+        if (!*dst) {
+            av_buffer_unref(&src);
+            av_freep(&fd);
             return AVERROR(ENOMEM);
-        fd = (FrameData*)((*dst)->data);
+        }
+
+        if (src) {
+            const FrameData *fd_src = (const FrameData *)src->data;
+
+            memcpy(fd, fd_src, sizeof(*fd));
 
-        fd->dec.frame_num = UINT64_MAX;
-        fd->dec.pts       = AV_NOPTS_VALUE;
+            av_buffer_unref(&src);
+        } else {
+            fd->dec.frame_num = UINT64_MAX;
+            fd->dec.pts       = AV_NOPTS_VALUE;
 
-        for (unsigned i = 0; i < FF_ARRAY_ELEMS(fd->wallclock); i++)
-            fd->wallclock[i] = INT64_MIN;
-    } else if (writable)
-        return av_buffer_make_writable(dst);
+            for (unsigned i = 0; i < FF_ARRAY_ELEMS(fd->wallclock); i++)
+                fd->wallclock[i] = INT64_MIN;
+        }
+    }
 
     return 0;
 }



More information about the ffmpeg-cvslog mailing list