diff mbox series

[FFmpeg-devel,3/7,v4] avutil/frame: use the same data pointer as the source entry when cloning side data

Message ID 20240328031210.21407-3-jamrial@gmail.com
State New
Headers show
Series [FFmpeg-devel,1/7,v4] avutil/frame: add a flag to allow overwritting existing entries | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

James Almer March 28, 2024, 3:12 a.m. UTC
src->data does not need to match src->buf->data

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavutil/frame.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

Comments

Anton Khirnov March 28, 2024, 11:29 a.m. UTC | #1
Quoting James Almer (2024-03-28 04:12:06)
> src->data does not need to match src->buf->data

When does it not?
James Almer March 28, 2024, 11:33 a.m. UTC | #2
On 3/28/2024 8:29 AM, Anton Khirnov wrote:
> Quoting James Almer (2024-03-28 04:12:06)
>> src->data does not need to match src->buf->data
> 
> When does it not?

It always matches for side data allocated by us within the libraries, 
but those are not the only callers, so this function should honor the 
data and size values in the source.
Anton Khirnov March 28, 2024, 11:37 a.m. UTC | #3
Quoting James Almer (2024-03-28 12:33:47)
> On 3/28/2024 8:29 AM, Anton Khirnov wrote:
> > Quoting James Almer (2024-03-28 04:12:06)
> >> src->data does not need to match src->buf->data
> > 
> > When does it not?
> 
> It always matches for side data allocated by us within the libraries, 
> but those are not the only callers, so this function should honor the 
> data and size values in the source.

Okay then
diff mbox series

Patch

diff --git a/libavutil/frame.c b/libavutil/frame.c
index a165e56a64..d27998d1f4 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -744,13 +744,11 @@  AVBufferRef *av_frame_get_plane_buffer(const AVFrame *frame, int plane)
 static AVFrameSideData *add_side_data_from_buf(AVFrameSideData ***sd,
                                                int *nb_sd,
                                                enum AVFrameSideDataType type,
-                                               AVBufferRef *buf)
+                                               AVBufferRef *buf, uint8_t *data,
+                                               size_t size)
 {
     AVFrameSideData *ret, **tmp;
 
-    if (!buf)
-        return NULL;
-
     // *nb_sd + 1 needs to fit into an int and a size_t.
     if ((unsigned)*nb_sd >= FFMIN(INT_MAX, SIZE_MAX))
         return NULL;
@@ -765,8 +763,8 @@  static AVFrameSideData *add_side_data_from_buf(AVFrameSideData ***sd,
         return NULL;
 
     ret->buf = buf;
-    ret->data = ret->buf->data;
-    ret->size = buf->size;
+    ret->data = data;
+    ret->size = size;
     ret->type = type;
 
     (*sd)[(*nb_sd)++] = ret;
@@ -778,9 +776,13 @@  AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
                                                  enum AVFrameSideDataType type,
                                                  AVBufferRef *buf)
 {
+    if (!buf)
+        return NULL;
+
     return
         add_side_data_from_buf(
-            &frame->side_data, &frame->nb_side_data, type, buf);
+            &frame->side_data, &frame->nb_side_data, type, buf,
+            buf->data, buf->size);
 }
 
 AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
@@ -827,7 +829,9 @@  AVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,
     }
 
     buf = av_buffer_alloc(size);
-    ret = add_side_data_from_buf(sd, nb_sd, type, buf);
+    if (!buf)
+        return NULL;
+    ret = add_side_data_from_buf(sd, nb_sd, type, buf, buf->data, size);
     if (!ret)
         av_buffer_unref(&buf);
 
@@ -873,8 +877,10 @@  AVFrameSideData *av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd,
 
     buf = (flags & AV_FRAME_SIDE_DATA_FLAG_NEW_REF) ?
            av_buffer_ref(*pbuf) : *pbuf;
+    if (!buf)
+        return NULL;
 
-    sd_dst = add_side_data_from_buf(sd, nb_sd, type, buf);
+    sd_dst = add_side_data_from_buf(sd, nb_sd, type, buf, buf->data, buf->size);
     if (!sd_dst) {
         if (flags & AV_FRAME_SIDE_DATA_FLAG_NEW_REF)
             av_buffer_unref(&buf);
@@ -933,7 +939,7 @@  int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd,
     if (!buf)
         return AVERROR(ENOMEM);
 
-    sd_dst = add_side_data_from_buf(sd, nb_sd, src->type, buf);
+    sd_dst = add_side_data_from_buf(sd, nb_sd, src->type, buf, src->data, src->size);
     if (!sd_dst) {
         av_buffer_unref(&buf);
         return AVERROR(ENOMEM);