Merge "secmem: support sideband and AV1 [1/1]" into buildroot-gstdrmplugin1.x
diff --git a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c
index 84f7135..d00242f 100644
--- a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c
+++ b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.c
@@ -131,6 +131,19 @@
     return NULL;
 }
 
+gint gst_secmem_check_free_buf_size(GstAllocator * allocator)
+{
+    uint32_t available = 0;
+    g_return_val_if_fail(GST_IS_SECMEM_ALLOCATOR (allocator), -1);
+    GstSecmemAllocator *self = GST_SECMEM_ALLOCATOR (allocator);
+    g_return_val_if_fail(self->sess != NULL, NULL);
+    g_mutex_lock (&self->mutex);
+    g_return_val_if_fail(Secure_V2_GetSecmemSize(self->sess, NULL, &available) == 0, -1);
+    g_mutex_unlock (&self->mutex);
+    return available;
+}
+
+
 void
 gst_secmem_mem_free(GstAllocator *allocator, GstMemory *memory)
 {
@@ -180,7 +193,7 @@
 }
 
 GstAllocator *
-gst_secmem_allocator_new (gboolean is_4k, gboolean is_vp9)
+gst_secmem_allocator_new (gboolean is_4k, uint8_t decoder_format)
 {
     unsigned int ret;
     uint32_t flag;
@@ -192,15 +205,20 @@
 
     GstSecmemAllocator *self = GST_SECMEM_ALLOCATOR (alloc);
     self->is_4k = is_4k;
-    self->is_vp9 = is_vp9;
+    self->is_vp9 = decoder_format == SECMEM_DECODER_VP9 ? TRUE: FALSE;
+    self->is_av1 = decoder_format == SECMEM_DECODER_AV1 ? TRUE : FALSE;
 
 
     ret = Secure_V2_SessionCreate(&self->sess);
     g_return_val_if_fail(ret == 0, alloc);
     flag = is_4k ? 2 : 1;
-    if (is_vp9) {
+    if (self->is_vp9) {
         flag |= 0x09 << 4;
     }
+    else if (self->is_av1)
+    {
+        flag |= 0x0A << 4;
+    }
     ret = Secure_V2_Init(self->sess, 1, flag, 0, 0);
     g_return_val_if_fail(ret == 0, alloc);
     GST_INFO("init success");
@@ -306,6 +324,23 @@
     return TRUE;
 }
 
+gboolean
+gst_secmem_parse_av1(GstMemory *mem)
+{
+    uint32_t ret;
+    uint32_t handle;
+    uint32_t header_size;
+
+    handle = gst_secmem_memory_get_handle(mem);
+    g_return_val_if_fail(handle != 0, FALSE);
+
+    GstSecmemAllocator *self = GST_SECMEM_ALLOCATOR (mem->allocator);
+    ret = Secure_V2_Parse(self->sess, STREAM_TYPE_AV1, handle, NULL, 0, &header_size);
+    g_return_val_if_fail(ret == 0, FALSE);
+    mem->size += header_size;
+    return TRUE;
+}
+
 secmem_handle_t gst_secmem_memory_get_handle (GstMemory *mem)
 {
     g_return_val_if_fail(mem != NULL, 0);
@@ -388,3 +423,18 @@
     gst_buffer_unmap(src, &map);
     return ret;
 }
+
+gboolean gst_buffer_sideband_secmem(GstBuffer *dst)
+{
+    unsigned int ret;
+    GstMapInfo map;
+    GstMemory *mem;
+    uint32_t handle;
+    mem = gst_buffer_peek_memory(dst, 0);
+    g_return_val_if_fail(gst_is_secmem_memory(mem), FALSE);
+    handle = gst_secmem_memory_get_handle(mem);
+    g_return_val_if_fail(handle != 0, FALSE);
+    ret = Secure_SetHandle(handle);
+    g_return_val_if_fail(ret == 0, FALSE);
+    return TRUE;
+}
diff --git a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h
index cfe05ac..1a29749 100644
--- a/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h
+++ b/gst-aml-drm-plugins-1.0/src/secmem/gstsecmemallocator.h
@@ -42,6 +42,7 @@
     void                   *sess;
     gboolean                is_4k;
     gboolean                is_vp9;
+    gboolean                is_av1;
     gsize                   counter;
     GCond                   cond;
     GMutex                  mutex;
@@ -52,8 +53,17 @@
     GstDmaBufAllocatorClass parent_class;
 };
 
+/*Sec decoder definition */
+enum {
+    SECMEM_DECODER_DEFAULT                       = 0,
+    SECMEM_DECODER_VP9,
+    SECMEM_DECODER_AV1,
+    SECMEM_DECODER_AUDIO,
+    SECMEM_MAX_CODEC_NUM,
+};
+
 GType           gst_secmem_allocator_get_type (void);
-GstAllocator *  gst_secmem_allocator_new (gboolean is_4k, gboolean is_vp9);
+GstAllocator *  gst_secmem_allocator_new (gboolean is_4k, uint8_t decoder_format);
 gboolean        gst_is_secmem_memory (GstMemory *mem);
 gboolean        gst_secmem_fill(GstMemory *mem, uint32_t offset, uint8_t *buffer, uint32_t length);
 gboolean        gst_secmem_store_csd(GstMemory *mem, uint8_t *buffer, uint32_t length);
@@ -61,6 +71,8 @@
 gboolean        gst_secmem_parse_avcc(GstMemory *mem, uint8_t *buffer, uint32_t length);
 gboolean        gst_secmem_parse_avc2nalu(GstMemory *mem, uint32_t *flag);
 gboolean        gst_secmem_parse_vp9(GstMemory *mem);
+gboolean        gst_secmem_parse_av1(GstMemory *mem);
+gint            gst_secmem_check_free_buf_size(GstAllocator * allocator);
 gint            gst_secmem_get_free_buf_num(GstMemory *mem);
 gint            gst_secmem_get_free_buf_size(GstMemory *mem);
 secmem_handle_t gst_secmem_memory_get_handle (GstMemory *mem);
@@ -68,6 +80,8 @@
 secmem_handle_t gst_buffer_get_secmem_handle(GstBuffer *buffer);
 secmem_paddr_t  gst_buffer_get_secmem_paddr(GstBuffer *buffer);
 gboolean        gst_buffer_copy_to_secmem(GstBuffer *dst, GstBuffer *src);
+gboolean        gst_buffer_sideband_secmem(GstBuffer *dst);
+
 
 G_END_DECLS