[shmsrc,shmsink] Support TM1 hardware decoder 18/56318/1
authorJeongmo Yang <jm80.yang@samsung.com>
Wed, 6 Jan 2016 09:35:44 +0000 (18:35 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Wed, 6 Jan 2016 09:36:33 +0000 (18:36 +0900)
Change-Id: I5af4c91e0b64c93a5c7cae5cecd075cb8fe81928
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
packaging/gst-plugins-bad.spec
sys/shm/gstshmsink.c
sys/shm/gstshmsrc.c

index 2179a4d..6d35a02 100644 (file)
@@ -4,7 +4,7 @@
 
 Name:           gst-plugins-bad
 Version:        1.6.1
-Release:        2
+Release:        3
 Summary:        GStreamer Streaming-Media Framework Plug-Ins
 License:        LGPL-2.0+
 Group:          Multimedia/Framework
index 44c7595..b759506 100644 (file)
@@ -694,8 +694,10 @@ gst_shm_sink_render (GstBaseSink * bsink, GstBuffer * buf)
   GstBuffer *sendbuf = NULL;
   gsize buf_size = gst_buffer_get_size(buf);
 #ifdef GST_TBM_SUPPORT
-  unsigned key[MM_VIDEO_BUFFER_PLANE_MAX];
+  unsigned int key[MM_VIDEO_BUFFER_PLANE_MAX];
   gsize key_size = sizeof(key);
+  int mm_buf_offset = 0;
+  int key_offset = 0;
 #endif
 
   GST_OBJECT_LOCK (self);
@@ -728,19 +730,26 @@ gst_shm_sink_render (GstBaseSink * bsink, GstBuffer * buf)
 
     memory = gst_buffer_peek_memory (buf, 1);
     gst_memory_map (memory, &map, GST_MAP_READ);
-    mm_video_buf = (MMVideoBuffer *) map.data;
 
+    mm_video_buf = (MMVideoBuffer *) map.data;
     if (mm_video_buf == NULL) {
       GST_ERROR_OBJECT (self, "mm_video_buf is NULL. Skip rendering");
       gst_memory_unmap (memory, &map);
       goto flushing;
     }
+
+    mm_buf_offset = buf_size - map.size;
+    key_offset = buf_size;
+
+    GST_LOG_OBJECT(self, "mm_buf_offset %d, key_offset %d",
+                         mm_buf_offset, key_offset);
+
     /* export bo key */
     if (mm_video_buf->type == MM_VIDEO_BUFFER_TYPE_TBM_BO) {
       int i;
-      GST_DEBUG_OBJECT (self, "GstBuffer size %d, tbm bo key size %d",
-          buf_size, key_size);
-      buf_size += key_size;
+      GST_DEBUG_OBJECT (self, "GstBuffer size %d, tbm bo key size %d, info size %d",
+          buf_size, key_size, sizeof(int));
+      buf_size += (key_size + sizeof(int));
       for(i = 0; i < MM_VIDEO_BUFFER_PLANE_MAX; i++) {
         if(mm_video_buf->handle.bo[i]) {
           key[i] = tbm_bo_export(mm_video_buf->handle.bo[i]);
@@ -803,8 +812,11 @@ gst_shm_sink_render (GstBaseSink * bsink, GstBuffer * buf)
     gst_memory_map (memory, &map, GST_MAP_WRITE);
     gst_buffer_extract (buf, 0, map.data, map.size);
 #ifdef GST_TBM_SUPPORT
-    if(self->use_tbm && gst_buffer_n_memory (buf) > 1)
-      memcpy(map.data + map.size - key_size, key, key_size);
+    if(self->use_tbm && gst_buffer_n_memory (buf) > 1) {
+      memcpy(map.data + key_offset, key, key_size);
+      /* set offset info */
+      *(map.data + key_offset + key_size) = mm_buf_offset;
+    }
 #endif
     gst_memory_unmap (memory, &map);
 
index 577741a..da9b2e9 100644 (file)
@@ -426,19 +426,21 @@ gst_shm_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
     MMVideoBuffer *mm_video_buf = NULL;
     GstMemory *mem_imgb = NULL;
     unsigned key[MM_VIDEO_BUFFER_PLANE_MAX];
-    int offset = rv - sizeof(MMVideoBuffer) - sizeof(key);
+    int offset = *(buf + rv - sizeof(int));
     if(offset < 0) {
       GST_ERROR_OBJECT(self, "offset error %d", offset);
       return GST_FLOW_ERROR;
     }
 
+    GST_LOG_OBJECT(self, "mm_buf offset %d", offset);
+
     mm_video_buf = g_malloc0(sizeof(MMVideoBuffer));
     mem_imgb = gst_memory_new_wrapped(0, mm_video_buf, sizeof(MMVideoBuffer), 0,
         sizeof(MMVideoBuffer), mm_video_buf, free_tbm_buffer);
     gst_buffer_append_memory(*outbuf, mem_imgb);
 
     memcpy(mm_video_buf, buf + offset, sizeof(MMVideoBuffer));
-    memcpy(key, buf + rv - sizeof(key), sizeof(key));
+    memcpy(key, buf + rv - (sizeof(key) + sizeof(int)), sizeof(key));
     if (mm_video_buf->type == MM_VIDEO_BUFFER_TYPE_TBM_BO) {
       int i;
       GST_DEBUG_OBJECT(self, "width %d, height %d", mm_video_buf->width[0],