static GstTizenMemory *
_tizen_video_mem_new3 (GstAllocator * allocator, GstMemory * parent, GstVideoInfo * vinfo,
tbm_surface_info_s * tsinfo, int fd[GST_TIZEN_MEMORY_MAX_FD], int fd_count,
+ gboolean is_secured, gsize maxsize, gsize size,
gpointer user_data, GDestroyNotify notify)
{
int i = 0;
- tbm_bo bos[GST_TIZEN_MEMORY_MAX_FD] = {NULL, };
+ tbm_bo bos[GST_TIZEN_MEMORY_MAX_FD] = {NULL, NULL, NULL, NULL};
tbm_surface_h surface = NULL;
GstTizenMemory *tmem;
GstTizenAllocator *tallocator = GST_TIZEN_ALLOCATOR (allocator);
- if (!vinfo || !tsinfo || fd_count < 1 || fd_count > GST_TIZEN_MEMORY_MAX_FD) {
- GST_ERROR ("invalid param[vinfo:%p,tsinfo:%p, fd_count:%d]", vinfo, tsinfo, fd_count);
+ if (!vinfo || fd_count < 1 || fd_count > GST_TIZEN_MEMORY_MAX_FD) {
+ GST_ERROR ("invalid param[vinfo:%p,fd_count:%d]", vinfo, fd_count);
return NULL;
}
return NULL;
}
- for (i = 0 ; i < fd_count ; i++) {
- bos[i] = tbm_bo_import_fd (tallocator->bufmgr, fd[i]);
- if (!bos[i]) {
- GST_ERROR ("failed to import fd[%d]", fd[i]);
- goto _TIZEN_VIDEO_MEM_NEW3_FAILED;
+ tmem = g_slice_new0 (GstTizenMemory);
+
+ if (is_secured) {
+ gst_memory_init (GST_MEMORY_CAST (tmem), 0,
+ allocator, parent, maxsize, 0, 0, size);
+ } else if (tsinfo) {
+ gst_memory_init (GST_MEMORY_CAST (tmem), 0,
+ allocator, parent, tsinfo->size, 0, 0, tsinfo->size);
+
+ for (i = 0 ; i < fd_count ; i++) {
+ bos[i] = tbm_bo_import_fd (tallocator->bufmgr, fd[i]);
+ if (!bos[i]) {
+ GST_ERROR ("failed to import fd[%d]", fd[i]);
+ goto _TIZEN_VIDEO_MEM_NEW3_FAILED;
+ }
}
- }
- surface = tbm_surface_internal_create_with_bos (tsinfo, bos, fd_count);
- if (!surface) {
- GST_ERROR ("failed to create surface");
+ surface = tbm_surface_internal_create_with_bos (tsinfo, bos, fd_count);
+ if (!surface) {
+ GST_ERROR ("failed to create surface");
+ goto _TIZEN_VIDEO_MEM_NEW3_FAILED;
+ }
+ } else {
+ GST_ERROR ("not secured, but NULL tsinfo");
goto _TIZEN_VIDEO_MEM_NEW3_FAILED;
}
- tmem = g_slice_new0 (GstTizenMemory);
-
- gst_memory_init (GST_MEMORY_CAST (tmem), 0,
- allocator, parent, tsinfo->size, 0, 0, tsinfo->size);
-
- /* bos[] will be kept in tbm surface and released when surface is released finally. */
for (i = 0 ; i < fd_count ; i++) {
- tbm_bo_unref (bos[i]);
- bos[i] = NULL;
tmem->fd[i] = fd[i];
+
+ if (bos[i]) {
+ /* bos[] will be kept in tbm surface and released when surface is released finally. */
+ tbm_bo_unref (bos[i]);
+ }
}
tmem->surface = surface;
tmem->notify = notify;
tmem->user_data = user_data;
tmem->is_fd_exported = FALSE;
+ tmem->is_secured = is_secured;
GST_VIDEO_INFO_SIZE (tmem->info) = tsinfo->size;
for (i = 0 ; i < fd_count && bos[i] ; i++)
tbm_bo_unref (bos[i]);
+ gst_memory_unref (GST_MEMORY_CAST (tmem));
+
return NULL;
}
{
g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (allocator), NULL);
- return (GstMemory *)_tizen_video_mem_new (allocator, NULL, vinfo, NULL, NULL, NULL);
+ return GST_MEMORY_CAST (_tizen_video_mem_new (allocator, NULL, vinfo, NULL, NULL, NULL));
}
/**
{
g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (allocator), NULL);
- return (GstMemory *)_tizen_video_mem_new (allocator, NULL, vinfo, surface, user_data, notify);
+ return GST_MEMORY_CAST (_tizen_video_mem_new (allocator, NULL, vinfo, surface, user_data, notify));
}
/**
{
g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (allocator), NULL);
- return (GstMemory *)_tizen_video_mem_new2 (allocator, NULL, vinfo, bo, size, user_data, notify);
+ return GST_MEMORY_CAST (_tizen_video_mem_new2 (allocator, NULL, vinfo, bo, size, user_data, notify));
}
/**
tbm_surface_info_s * tsinfo, int fd[GST_TIZEN_MEMORY_MAX_FD], int fd_count,
gpointer user_data, GDestroyNotify notify)
{
+ GstTizenMemory *tmem = NULL;
+
g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (allocator), NULL);
- return (GstMemory *)_tizen_video_mem_new3 (allocator, NULL, vinfo, tsinfo, fd, fd_count, user_data, notify);
+ tmem = _tizen_video_mem_new3 (allocator, NULL, vinfo,
+ tsinfo, fd, fd_count,
+ FALSE, 0, 0,
+ user_data, notify);
+
+ return GST_MEMORY_CAST (tmem);
+}
+
+GstMemory *
+gst_tizen_allocator_alloc_secure_fd (GstAllocator * allocator, GstVideoInfo * vinfo,
+ int fd[GST_TIZEN_MEMORY_MAX_FD], int fd_count, gsize maxsize, gsize size,
+ gpointer user_data, GDestroyNotify notify)
+{
+ GstTizenMemory *tmem = NULL;
+
+ g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (allocator), NULL);
+
+ tmem = _tizen_video_mem_new3 (allocator, NULL, vinfo,
+ NULL, fd, fd_count,
+ TRUE, maxsize, size,
+ user_data, notify);
+
+ return GST_MEMORY_CAST (tmem);
}
gboolean
return tmem->fd[index];
}
+gboolean
+gst_tizen_memory_is_secured (GstMemory * mem)
+{
+ GstTizenMemory *tmem = (GstTizenMemory *)mem;
+
+ g_return_val_if_fail (mem != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (mem->allocator), FALSE);
+
+ GST_DEBUG ("mem[%p]: is_secured[%d]", tmem, tmem->is_secured);
+
+ return tmem->is_secured;
+}
+
static void
cached_tizen_disposed_cb (GstTizenAllocator * allocator, GstMiniObject *obj)
{
GstBuffer *buffer = meta->buffer;
GstTizenMemory *tmem = (GstTizenMemory *) gst_buffer_peek_memory (buffer, 0);
- g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (((GstMemory *) tmem)->allocator), FALSE);
+ g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (GST_MEMORY_CAST (tmem)->allocator), FALSE);
if (!tmem->surface || plane >= GST_VIDEO_MAX_PLANES) {
GST_ERROR ("invalid param[surface:%p,plane:%u]", tmem->surface, plane);
GstBuffer *buffer = meta->buffer;
GstTizenMemory *tmem = (GstTizenMemory *) gst_buffer_peek_memory (buffer, 0);
- g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (((GstMemory *) tmem)->allocator), FALSE);
+ g_return_val_if_fail (GST_IS_TIZEN_ALLOCATOR (GST_MEMORY_CAST (tmem)->allocator), FALSE);
if (!tmem->surface) {
GST_ERROR ("no surface");