diff mbox series

[FFmpeg-devel,16/18] fftools/ffmpeg: prepare FrameData for having allocated fields

Message ID 20240306110319.17339-16-anton@khirnov.net
State New
Headers show
Series [FFmpeg-devel,01/18] fftools/cmdutils: fix printing group name in split_commandline() | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Anton Khirnov March 6, 2024, 11:03 a.m. UTC
Will be useful in following commits.
---
 fftools/ffmpeg.c | 41 +++++++++++++++++++++++++++++++----------
 1 file changed, 31 insertions(+), 10 deletions(-)
diff mbox series

Patch

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);
-        fd = (FrameData*)((*dst)->data);
 
-        fd->dec.frame_num = UINT64_MAX;
-        fd->dec.pts       = AV_NOPTS_VALUE;
+        *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);
+        }
 
-        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);
+        if (src) {
+            const FrameData *fd_src = (const FrameData *)src->data;
+
+            memcpy(fd, fd_src, sizeof(*fd));
+
+            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;
+        }
+    }
 
     return 0;
 }