aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandramohan2013-09-26 07:22:28 -0500
committerChandramohan2013-09-26 07:46:25 -0500
commitada297e4b0dc3601d955cc4f51f131df89010d08 (patch)
tree3e1c379147d28fa5e16976555a623455a927da5a
parent54fc3f29f4373992c1b8405c5fbc6b68d5f4544f (diff)
downloadgst-plugin-ducati-ada297e4b0dc3601d955cc4f51f131df89010d08.tar.gz
gst-plugin-ducati-ada297e4b0dc3601d955cc4f51f131df89010d08.tar.xz
gst-plugin-ducati-ada297e4b0dc3601d955cc4f51f131df89010d08.zip
dmabuffer usage added to gst ducati plugins as per IPC3.x
According to IPC3.x input and output buffers need to be passed as dmabuffer fd and all the output buffers need to be lock/unlock before and after process call.This patch is to add support to dmabuf fd and lock/unlock mechanism. Signed-off-by: Chandramohan <chandramohan.c@ti.com>
-rw-r--r--src/gstducati.h2
-rw-r--r--src/gstducatih264dec.c7
-rw-r--r--src/gstducatividdec.c33
-rw-r--r--src/gstducatividenc.c8
4 files changed, 37 insertions, 13 deletions
diff --git a/src/gstducati.h b/src/gstducati.h
index d552c8f..e54151b 100644
--- a/src/gstducati.h
+++ b/src/gstducati.h
@@ -23,7 +23,7 @@
23#include <stdint.h> 23#include <stdint.h>
24#include <string.h> 24#include <string.h>
25 25
26#include <dce.h> 26#include <libdce.h>
27#include <xdc/std.h> 27#include <xdc/std.h>
28#include <ti/sdo/ce/Engine.h> 28#include <ti/sdo/ce/Engine.h>
29#include <ti/sdo/ce/video3/viddec3.h> 29#include <ti/sdo/ce/video3/viddec3.h>
diff --git a/src/gstducatih264dec.c b/src/gstducatih264dec.c
index eae93e9..0f506ea 100644
--- a/src/gstducatih264dec.c
+++ b/src/gstducatih264dec.c
@@ -141,11 +141,14 @@ gst_ducati_h264dec_allocate_params (GstDucatiVidDec * self, gint params_sz,
141 h264dec->bo_mberror = 141 h264dec->bo_mberror =
142 omap_bo_new (self->device, nmb + SIZE_OF_CONCEALMENT_DATA, 142 omap_bo_new (self->device, nmb + SIZE_OF_CONCEALMENT_DATA,
143 OMAP_BO_WC); 143 OMAP_BO_WC);
144 self->outBufs->descs[2].memType = XDM_MEMTYPE_BO; 144 /* XDM_MemoryType required by drm to allcoate buffer */
145 self->outBufs->descs[2].memType = XDM_MEMTYPE_RAW;
145 self->outBufs->descs[2].buf = 146 self->outBufs->descs[2].buf =
146 (XDAS_Int8 *) omap_bo_handle (h264dec->bo_mberror); 147 (XDAS_Int8 *) omap_bo_dmabuf (h264dec->bo_mberror);
147 self->outBufs->descs[2].bufSize.bytes = nmb + SIZE_OF_CONCEALMENT_DATA; 148 self->outBufs->descs[2].bufSize.bytes = nmb + SIZE_OF_CONCEALMENT_DATA;
148 self->params->metadataType[0] = IVIDEO_METADATAPLANE_MBINFO; 149 self->params->metadataType[0] = IVIDEO_METADATAPLANE_MBINFO;
150 /* need to lock the buffer to get the page pinned */
151 dce_buf_lock(1,(size_t *) &self->outBufs->descs[2].buf);
149 } 152 }
150 } 153 }
151 154
diff --git a/src/gstducatividdec.c b/src/gstducatividdec.c
index db58afb..687b0e5 100644
--- a/src/gstducatividdec.c
+++ b/src/gstducatividdec.c
@@ -216,7 +216,8 @@ codec_create (GstDucatiVidDec * self)
216 self->width * self->height, OMAP_BO_WC); 216 self->width * self->height, OMAP_BO_WC);
217 self->input = omap_bo_map (self->input_bo); 217 self->input = omap_bo_map (self->input_bo);
218 self->inBufs->numBufs = 1; 218 self->inBufs->numBufs = 1;
219 self->inBufs->descs[0].buf = (XDAS_Int8 *) omap_bo_handle (self->input_bo); 219 /* IPC requires dmabuf fd in place of bo handle */
220 self->inBufs->descs[0].buf = (XDAS_Int8 *) omap_bo_dmabuf (self->input_bo);
220 221
221 /* Actual buffers will be set later, as they will be different for every 222 /* Actual buffers will be set later, as they will be different for every
222 frame. We allow derived classes to add their own buffers, however, so 223 frame. We allow derived classes to add their own buffers, however, so
@@ -281,6 +282,7 @@ codec_prepare_outbuf (GstDucatiVidDec * self, GstBuffer ** buf,
281 gboolean force_internal) 282 gboolean force_internal)
282{ 283{
283 GstDucatiBufferPriv *priv = NULL; 284 GstDucatiBufferPriv *priv = NULL;
285 GstDmaBuf *dmabuf = NULL;
284 286
285 if (!force_internal) 287 if (!force_internal)
286 priv = get_buffer_priv (self, *buf); 288 priv = get_buffer_priv (self, *buf);
@@ -298,11 +300,19 @@ codec_prepare_outbuf (GstDucatiVidDec * self, GstBuffer ** buf,
298 300
299 /* There are at least two buffers. Derived classes may add codec specific 301 /* There are at least two buffers. Derived classes may add codec specific
300 buffers (eg, debug info) after these two if they want to. */ 302 buffers (eg, debug info) after these two if they want to. */
301 self->outBufs->descs[0].memType = XDM_MEMTYPE_BO; 303 dmabuf = gst_buffer_get_dma_buf (*buf);
302 self->outBufs->descs[0].buf = (XDAS_Int8 *) omap_bo_handle (priv->bo); 304 /* XDM_MemoryType required by drm to allcoate buffer */
305 self->outBufs->descs[0].memType = XDM_MEMTYPE_RAW;
306 /* IPC requires dmabuf fd in place of bo handle */
307 self->outBufs->descs[0].buf = (XDAS_Int8 *) gst_dma_buf_get_fd (dmabuf);
303 self->outBufs->descs[0].bufSize.bytes = priv->uv_offset; 308 self->outBufs->descs[0].bufSize.bytes = priv->uv_offset;
304 self->outBufs->descs[1].memType = XDM_MEMTYPE_BO_OFFSET; 309 self->outBufs->descs[1].memType = XDM_MEMTYPE_RAW;
305 self->outBufs->descs[1].buf = (XDAS_Int8 *) priv->uv_offset; 310 /* For singleplaner buffer pass a single dmabuf fd for both the outBufs
311 ie: self->outBufs->descs[0].buf and self->outBufs->descs[1].buf
312 should point to a single buffer fd and need to update the
313 descs[0].bufSize.bytes with the size of luminance(Y) data
314 and descs[1].bufSize.bytes with crominance(UV) */
315 self->outBufs->descs[1].buf = (XDAS_Int8 *) self->outBufs->descs[0].buf;
306 self->outBufs->descs[1].bufSize.bytes = priv->size - priv->uv_offset; 316 self->outBufs->descs[1].bufSize.bytes = priv->size - priv->uv_offset;
307 317
308 return (XDAS_Int32) * buf; 318 return (XDAS_Int32) * buf;
@@ -325,9 +335,14 @@ static void
325codec_unlock_outbuf (GstDucatiVidDec * self, XDAS_Int32 id) 335codec_unlock_outbuf (GstDucatiVidDec * self, XDAS_Int32 id)
326{ 336{
327 GstBuffer *buf = (GstBuffer *) id; 337 GstBuffer *buf = (GstBuffer *) id;
338 SizeT fd;
328 339
329 if (buf) { 340 if (buf) {
330 GST_DEBUG_OBJECT (self, "free buffer: %d %p", id, buf); 341 GST_DEBUG_OBJECT (self, "free buffer: %d %p", id, buf);
342 /* Get dmabuf fd of the buffer to unlock */
343 fd = gst_dma_buf_get_fd(gst_buffer_get_dma_buf(buf));
344 /* Must unlock the buffer before free */
345 dce_buf_unlock(1,&fd);
331 g_hash_table_remove (self->passed_in_bufs, buf); 346 g_hash_table_remove (self->passed_in_bufs, buf);
332 } 347 }
333} 348}
@@ -1084,6 +1099,7 @@ gst_ducati_viddec_chain (GstPad * pad, GstBuffer * buf)
1084 GstPad *mypad = NULL; 1099 GstPad *mypad = NULL;
1085 GstPad *peerpad = NULL; 1100 GstPad *peerpad = NULL;
1086 GstElement *peerelement = NULL; 1101 GstElement *peerelement = NULL;
1102 SizeT fd;
1087 1103
1088 GstDucatiVidDec *self = GST_DUCATIVIDDEC (GST_OBJECT_PARENT (pad)); 1104 GstDucatiVidDec *self = GST_DUCATIVIDDEC (GST_OBJECT_PARENT (pad));
1089 GstClockTime ts = GST_BUFFER_TIMESTAMP (buf); 1105 GstClockTime ts = GST_BUFFER_TIMESTAMP (buf);
@@ -1200,6 +1216,10 @@ allocate_buffer:
1200 * things in case we need to renegotiate */ 1216 * things in case we need to renegotiate */
1201 self->inArgs->inputID = 1217 self->inArgs->inputID =
1202 codec_prepare_outbuf (self, &outbuf, self->first_out_buffer); 1218 codec_prepare_outbuf (self, &outbuf, self->first_out_buffer);
1219 /* Get dmabuf fd of the buffer to lock it*/
1220 fd = gst_dma_buf_get_fd(gst_buffer_get_dma_buf((GstBuffer *) self->inArgs->inputID));
1221 /* Must lock all the buffer passed to ducati */
1222 dce_buf_lock(1,&fd);
1203 if (!self->inArgs->inputID) { 1223 if (!self->inArgs->inputID) {
1204 GST_ERROR_OBJECT (self, "could not prepare output buffer"); 1224 GST_ERROR_OBJECT (self, "could not prepare output buffer");
1205 gst_buffer_unref (buf); 1225 gst_buffer_unref (buf);
@@ -1233,7 +1253,8 @@ have_out_buf:
1233 1253
1234 self->inArgs->numBytes = self->in_size; 1254 self->inArgs->numBytes = self->in_size;
1235 self->inBufs->descs[0].bufSize.bytes = self->in_size; 1255 self->inBufs->descs[0].bufSize.bytes = self->in_size;
1236 self->inBufs->descs[0].memType = XDM_MEMTYPE_BO; 1256 /* XDM_MemoryType required by drm to allcoate buffer */
1257 self->inBufs->descs[0].memType = XDM_MEMTYPE_RAW;
1237 1258
1238 err = codec_process (self, TRUE, FALSE, &ret); 1259 err = codec_process (self, TRUE, FALSE, &ret);
1239 if (err) { 1260 if (err) {
diff --git a/src/gstducatividenc.c b/src/gstducatividenc.c
index 83862e3..9f810ad 100644
--- a/src/gstducatividenc.c
+++ b/src/gstducatividenc.c
@@ -611,12 +611,12 @@ have_inbuf:
611 outbuf = GST_BUFFER (gst_drm_buffer_pool_get (self->output_pool, FALSE)); 611 outbuf = GST_BUFFER (gst_drm_buffer_pool_get (self->output_pool, FALSE));
612 priv_out = get_buffer_priv (self, outbuf, state->width, state->height); 612 priv_out = get_buffer_priv (self, outbuf, state->width, state->height);
613 613
614 self->inBufs->planeDesc[0].buf = (XDAS_Int8 *) omap_bo_handle (priv_in->bo); 614 self->inBufs->planeDesc[0].buf = (XDAS_Int8 *) omap_bo_dmabuf (priv_in->bo);
615 self->inBufs->planeDesc[0].memType = XDM_MEMTYPE_BO; 615 self->inBufs->planeDesc[0].memType = XDM_MEMTYPE_RAW;
616 self->inBufs->planeDesc[0].bufSize.tileMem.width = state->width; 616 self->inBufs->planeDesc[0].bufSize.tileMem.width = state->width;
617 self->inBufs->planeDesc[0].bufSize.tileMem.height = state->height; 617 self->inBufs->planeDesc[0].bufSize.tileMem.height = state->height;
618 self->inBufs->planeDesc[1].buf = (XDAS_Int8 *) priv_in->uv_offset; 618 self->inBufs->planeDesc[1].buf = (XDAS_Int8 *) priv_in->uv_offset;
619 self->inBufs->planeDesc[1].memType = XDM_MEMTYPE_BO_OFFSET; 619 self->inBufs->planeDesc[1].memType = XDM_MEMTYPE_RAW;
620 self->inBufs->planeDesc[1].bufSize.tileMem.width = state->width; 620 self->inBufs->planeDesc[1].bufSize.tileMem.width = state->width;
621 self->inBufs->planeDesc[1].bufSize.tileMem.height = state->height / 2; 621 self->inBufs->planeDesc[1].bufSize.tileMem.height = state->height / 2;
622 /* setting imageRegion doesn't seem to be strictly needed if activeFrameRegion 622 /* setting imageRegion doesn't seem to be strictly needed if activeFrameRegion
@@ -637,7 +637,7 @@ have_inbuf:
637 self->outBufs->numBufs = 1; 637 self->outBufs->numBufs = 1;
638 self->outBufs->descs[0].buf = (XDAS_Int8 *) omap_bo_handle (priv_out->bo); 638 self->outBufs->descs[0].buf = (XDAS_Int8 *) omap_bo_handle (priv_out->bo);
639 self->outBufs->descs[0].bufSize.bytes = GST_BUFFER_SIZE (outbuf); 639 self->outBufs->descs[0].bufSize.bytes = GST_BUFFER_SIZE (outbuf);
640 self->outBufs->descs[0].memType = XDM_MEMTYPE_BO; 640 self->outBufs->descs[0].memType = XDM_MEMTYPE_RAW;
641 641
642 self->inArgs->inputID = GPOINTER_TO_INT (inbuf); 642 self->inArgs->inputID = GPOINTER_TO_INT (inbuf);
643 643