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