[FFmpeg-devel] [PATCH v1 1/2] avutil/buffer: support represents dma-buf

Ming Qian ming.qian at nxp.com
Fri Nov 12 10:36:00 EET 2021


add a member dmafd in buffer struct.
we can use it represents dma-buf.

Signed-off-by: Ming Qian <ming.qian at nxp.com>
---
 libavutil/buffer.c          | 12 ++++++++++++
 libavutil/buffer.h          | 14 ++++++++++++++
 libavutil/buffer_internal.h |  1 +
 3 files changed, 27 insertions(+)

diff --git a/libavutil/buffer.c b/libavutil/buffer.c
index 54590be56604..6aacd9c2c08a 100644
--- a/libavutil/buffer.c
+++ b/libavutil/buffer.c
@@ -36,6 +36,7 @@ static AVBufferRef *buffer_create(AVBuffer *buf, uint8_t *data, size_t size,
     buf->size     = size;
     buf->free     = free ? free : av_buffer_default_free;
     buf->opaque   = opaque;
+    buf->dmafd    = -1;
 
     atomic_init(&buf->refcount, 1);
 
@@ -48,6 +49,7 @@ static AVBufferRef *buffer_create(AVBuffer *buf, uint8_t *data, size_t size,
     ref->buffer = buf;
     ref->data   = data;
     ref->size   = size;
+    ref->dmafd  = -1;
 
     return ref;
 }
@@ -180,6 +182,16 @@ int av_buffer_make_writable(AVBufferRef **pbuf)
     return 0;
 }
 
+int av_buffer_set_dma_buf(AVBufferRef *buf, int fd)
+{
+    if (!buf || !buf->buffer)
+        return AVERROR(EINVAL);
+
+    buf->dmafd = buf->buffer->dmafd = fd;
+
+    return 0;
+}
+
 int av_buffer_realloc(AVBufferRef **pbuf, size_t size)
 {
     AVBufferRef *buf = *pbuf;
diff --git a/libavutil/buffer.h b/libavutil/buffer.h
index e1ef5b7f07fc..b86aaf87efc0 100644
--- a/libavutil/buffer.h
+++ b/libavutil/buffer.h
@@ -92,6 +92,11 @@ typedef struct AVBufferRef {
      * Size of data in bytes.
      */
     size_t   size;
+
+    /**
+     * The fd of dma-buf
+     */
+    int dmafd;
 } AVBufferRef;
 
 /**
@@ -181,6 +186,15 @@ int av_buffer_get_ref_count(const AVBufferRef *buf);
  */
 int av_buffer_make_writable(AVBufferRef **buf);
 
+/**
+ * Set dma-buf fd to a given buffer reference.
+ * @param buf buffer reference to set dma-buf,
+ *            it should be create from dma-buf mmapped address.
+ * @param fd  dma-buf fd
+ * @return 0 on success, a negative AVERROR on failure.
+ */
+int av_buffer_set_dma_buf(AVBufferRef *buf, int fd);
+
 /**
  * Reallocate a given buffer.
  *
diff --git a/libavutil/buffer_internal.h b/libavutil/buffer_internal.h
index bdff1b5b32ca..22aa54a246b8 100644
--- a/libavutil/buffer_internal.h
+++ b/libavutil/buffer_internal.h
@@ -39,6 +39,7 @@
 struct AVBuffer {
     uint8_t *data; /**< data described by this buffer */
     size_t size; /**< size of data in bytes */
+    int dmafd;   /**< fd of dma-buf */
 
     /**
      *  number of existing AVBufferRef instances referring to this buffer
-- 
2.33.0



More information about the ffmpeg-devel mailing list