mod offset for construct tunnel lib buf

Change-Id: I77fc9f9afdb4234abdb562e79bdd7e535360de93
diff --git a/src/gstamlvideosink.c b/src/gstamlvideosink.c
index 38286e6..f748e00 100644
--- a/src/gstamlvideosink.c
+++ b/src/gstamlvideosink.c
@@ -368,7 +368,7 @@
 {
     GstAmlVideoSink *sink = GST_AML_VIDEO_SINK(bsink);
     GstAmlVideoSinkPrivate *sink_priv = GST_AML_VIDEO_SINK_GET_PRIVATE(sink);
-    gboolean use_dmabuf;
+    // gboolean use_dmabuf;
     gboolean ret = TRUE;
 
     GST_OBJECT_LOCK(sink);
@@ -447,7 +447,7 @@
         goto error;
     }
 
-    if (!render_display_frame(sink_priv->render_device_handle, tunnel_lib_buf_wrap))
+    if (render_display_frame(sink_priv->render_device_handle, tunnel_lib_buf_wrap) == -1)
     {
         GST_ERROR_OBJECT(sink, "render lib: display frame fail");
         goto error;
@@ -608,14 +608,16 @@
 static gboolean gst_aml_video_sink_tunnel_buf(GstAmlVideoSink *vsink, GstBuffer *gst_buf, RenderBuffer *tunnel_lib_buf_wrap)
 {
     // only support dma buf
-    RenderDmaBuffer *dmabuf = tunnel_lib_buf_wrap->dma;
+    RenderDmaBuffer *dmabuf = &tunnel_lib_buf_wrap->dma;
     GstMemory *dma_mem = NULL;
     GstVideoMeta *vmeta = NULL;
     guint n_mem = 0;
+    gboolean ret = TRUE;
 
     if (gst_buf == NULL || tunnel_lib_buf_wrap == NULL || dmabuf == NULL)
     {
         GST_ERROR_OBJECT(vsink, "input params error");
+        ret = FALSE;
         goto error;
     }
     n_mem = gst_buffer_n_memory(gst_buf);
@@ -623,6 +625,7 @@
     if(vmeta == NULL)
     {
         GST_ERROR_OBJECT(vsink, "not found video meta info");
+        ret = FALSE;
         goto error;
     }
     if (n_mem > RENDER_MAX_PLANES || vmeta->n_planes > RENDER_MAX_PLANES || n_mem != vmeta->n_planes)
@@ -635,14 +638,22 @@
     dmabuf->planeCnt = n_mem;
     dmabuf->width = vmeta->width;
     dmabuf->height = vmeta->height;
+
+    GST_DEBUG_OBJECT(vsink, "dbgjxs, vmeta->width:%d, dmabuf->width:%d", vmeta->width, dmabuf->width);
+
     for (guint i = 0; i < n_mem; i++)
     {
         gint dmafd;
         gsize size, offset, maxsize;
         dma_mem = gst_buffer_peek_memory(gst_buf, i);
+        guint mem_idx = 0;
+        guint length = 0;
+        gsize skip = 0;
+
         if (!gst_is_dmabuf_memory(dma_mem))
         {
             GST_ERROR_OBJECT(vsink, "not support non-dma buf");
+            ret = FALSE;
             goto error;
         }
         size = gst_memory_get_sizes(dma_mem, &offset, &maxsize);
@@ -650,17 +661,31 @@
         dmabuf->handle[i] = 0;
         dmabuf->fd[i] = dmafd;
         dmabuf->size[i] = dma_mem->size;
-        dmabuf->offset[i] = vmeta->offset[i];
         dmabuf->stride[i] = vmeta->stride[i];
+        if (gst_buffer_find_memory (gst_buf, vmeta->offset[i], 1, &mem_idx, &length, &skip) && mem_idx == i)
+        {
+            dmabuf->offset[i] = dma_mem->offset + skip;
+            GST_DEBUG_OBJECT(vsink, "get skip from buffer:%d, offset[%d]:%d", skip, i, dmabuf->offset[i]);
+        }
+        else
+        {
+            GST_ERROR_OBJECT(vsink, "get skip from buffer error");
+            ret = FALSE;
+            goto error;
+        }
+
+
         GST_DEBUG_OBJECT(vsink, "dma buffer layer:%d, handle:%d, fd:%d, size:%d, offset:%d, stride:%d", 
                          i, dmabuf->handle[i], dmabuf->fd[i], dmabuf->size[i], dmabuf->offset[i], dmabuf->stride[i]);
     }
     tunnel_lib_buf_wrap->flag = BUFFER_FLAG_EXTER_DMA_BUFFER;
     tunnel_lib_buf_wrap->pts = GST_BUFFER_PTS(gst_buf);
     tunnel_lib_buf_wrap->priv = (void *)gst_buf;
+    
+    return ret;
 
 error:
-    return FALSE;
+    return ret;
 }
 
 static gboolean gst_get_mediasync_instanceid(GstAmlVideoSink *vsink)
@@ -783,12 +808,12 @@
         GST_ERROR_OBJECT(vsink, "tunnel lib: set window size error");
         return FALSE;
     }
-    if (render_set(sink_priv->render_device_handle, KEY_FRAME_SIZE, &frame_size))
+    if (render_set(sink_priv->render_device_handle, KEY_FRAME_SIZE, &frame_size) == -1)
     {
         GST_ERROR_OBJECT(vsink, "tunnel lib: set frame size error");
         return FALSE;
     }
-    if (render_set(sink_priv->render_device_handle, KEY_VIDEO_FORMAT, &format))
+    if (render_set(sink_priv->render_device_handle, KEY_VIDEO_FORMAT, &format) == -1)
     {
         GST_ERROR_OBJECT(vsink, "tunnel lib: set video format error");
         return FALSE;
diff --git a/src/render_lib.h b/src/render_lib.h
index 888dba3..37bc0fb 100755
--- a/src/render_lib.h
+++ b/src/render_lib.h
@@ -9,13 +9,6 @@
 
 #define RENDER_MAX_PLANES 3
 
-typedef struct _RenderBuffer RenderBuffer;
-typedef struct _RenderWindowSize RenderWindowSize;
-typedef struct _RenderFrameSize RenderFrameSize;
-typedef struct _RenderCallback RenderCallback;
-typedef struct _RenderRawBuffer RenderRawBuffer;
-typedef struct _RenderDmaBuffer RenderDmaBuffer;
-
 /*allocate render buffer flag */
 enum _BufferFlag {
     BUFFER_FLAG_NONE       = 0,
@@ -24,23 +17,12 @@
     BUFFER_FLAG_EXTER_DMA_BUFFER    = 1 << 3,
 };
 
-struct _RenderBuffer {
-    int id; //buffer id
-    int flag; /*render buffer flag, see  enum _BufferFlag*/
-    union {
-        RenderDmaBuffer *dma;
-        RenderRawBuffer *raw;
-    };
-    int64_t pts;
-    void *priv;
-};
-
-struct _RenderRawBuffer {
+typedef struct _RenderRawBuffer {
     void *dataPtr;
     int size;
-};
+} RenderRawBuffer;
 
-struct _RenderDmaBuffer {
+typedef struct _RenderDmaBuffer {
     int width;
     int height;
     int planeCnt;
@@ -49,7 +31,18 @@
     uint32_t offset[RENDER_MAX_PLANES];
     uint32_t size[RENDER_MAX_PLANES];
     int fd[RENDER_MAX_PLANES];
-};
+} RenderDmaBuffer;
+
+typedef struct _RenderBuffer {
+    int id; //buffer id
+    int flag; /*render buffer flag, see  enum _BufferFlag*/
+    RenderDmaBuffer dma;
+    RenderRawBuffer raw;
+    int64_t pts;
+    void *priv;
+} RenderBuffer;
+
+
 
 /*render key*/
 enum _RenderKey {
@@ -64,19 +57,19 @@
 
 /*video display window size
  if will be used by PROP_WINDOW_SIZE prop */
-struct _RenderWindowSize {
+typedef struct _RenderWindowSize {
     int x;
     int y;
     int w;
     int h;
-};
+} RenderWindowSize;
 
 /*frame size info
  it will be used by PROP_UPDATE_FRAME_SIZE prop*/
-struct _RenderFrameSize {
+typedef struct _RenderFrameSize {
     int frameWidth;
     int frameHeight;
-};
+} RenderFrameSize;
 
 typedef enum _RenderMsgType {
     MSG_RELEASE_BUFFER = 100,
@@ -114,10 +107,10 @@
  * @param msg the message of sending
  * @return
  */
-struct _RenderCallback {
+typedef struct _RenderCallback {
     onRenderMsgSend doMsgSend;
     onRenderGet doGetValue;
-};
+} RenderCallback;
 
 /**video format*/
 typedef enum {
@@ -333,10 +326,11 @@
  * @param planecnt the dma buffer plane count
  * @param width video width
  * @param height video height
- * @return RenderDmaBuffer point or NULL if fail
+ * @param dmabuffer  output parma,dmabuffer
+ * @return 0 success, -1 if failed
  *
 */
-RenderDmaBuffer *render_accquire_dma_buffer(void *handle, int planecnt, int width, int height);
+int render_accquire_dma_buffer(void *handle, int planecnt, int width, int height, RenderDmaBuffer *dmabuffer);
 
 /**
  * release dma buffer that allocated from render lib