From 40784902baada12295340f66f82df0d2397d53a3 Mon Sep 17 00:00:00 2001 From: Sejun Park Date: Tue, 21 Aug 2018 17:58:03 +0900 Subject: [PATCH] Apply tizen allocator to mediacodec Change-Id: I4304b314d499fb53d694b330eaf391cccbc54c98 --- CMakeLists.txt | 4 +- include/media_codec_port_gst.h | 2 + packaging/capi-media-codec.spec | 2 +- src/media_codec_port_gst.c | 214 ++++++++++------------------------------ 4 files changed, 55 insertions(+), 167 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dc41164..217ee07 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR include) INCLUDE_DIRECTORIES(${INC_DIR}) -SET(dependents "dlog glib-2.0 mm-common libtbm capi-media-tool iniparser gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 capi-system-info mm-resource-manager" ) -SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 mm-resource-manager" ) +SET(dependents "dlog glib-2.0 mm-common libtbm capi-media-tool iniparser gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 capi-system-info mm-resource-manager gstreamer-allocators-1.0" ) +SET(pc_dependents "capi-base-common capi-media-tool gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 mm-resource-manager gstreamer-allocators-1.0" ) INCLUDE(FindPkgConfig) pkg_check_modules(${fw_name} REQUIRED ${dependents}) diff --git a/include/media_codec_port_gst.h b/include/media_codec_port_gst.h index 2888192..18010d4 100755 --- a/include/media_codec_port_gst.h +++ b/include/media_codec_port_gst.h @@ -30,6 +30,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { @@ -151,6 +152,7 @@ struct _mc_gst_core_t { GstBuffer *codec_data; GstCaps* (*mc_caps_new)(mc_gst_core_t *, mediacodec_codec_type_e, gint); + GstAllocator *allocator; void* user_cb[_MEDIACODEC_EVENT_TYPE_NUM]; void* user_data[_MEDIACODEC_EVENT_TYPE_NUM]; diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index daabadd..6f405a3 100755 --- a/packaging/capi-media-codec.spec +++ b/packaging/capi-media-codec.spec @@ -4,7 +4,7 @@ Name: capi-media-codec Summary: A Media Codec library in Tizen Native API -Version: 0.5.13 +Version: 0.6.0 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index 5036d3e..5d09f4b 100755 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -48,7 +48,7 @@ static gchar *__mc_get_gst_input_format(media_format_mimetype_e mimetype, bool i static GstMCBuffer *__mc_gst_make_media_packet(mc_gst_core_t *core, GstBuffer *buffer); static gboolean __mc_gst_bus_callback(GstBus *bus, GstMessage *msg, gpointer data); static GstBusSyncReply __mc_gst_bus_sync_callback(GstBus *bus, GstMessage *msg, gpointer data); -static MMVideoBuffer *__mc_gst_make_tbm_buffer(mc_gst_core_t *core, media_packet_h packet); +static GstMemory *__mc_gst_make_tbm_buffer(mc_gst_core_t *core, GstMCBuffer *mcbuffer); static GstMCBuffer *gst_mediacodec_buffer_new(mc_gst_core_t *core, media_packet_h packet, uint64_t size); static void __mc_input_buffer_finalize_cb(GstMCBuffer *buffer); static int __mc_set_caps_streamheader(mc_gst_core_t *core, GstMCBuffer *mcbuffer, guint streamheader_size); @@ -168,7 +168,7 @@ int __mc_fill_inbuf_with_mm_video_buffer(mc_gst_core_t *core, media_packet_h pac { gint ret = MC_ERROR_NONE; uint64_t buf_size = 0; - MMVideoBuffer *mm_vbuffer = NULL; + GstMemory *mem; void *buf_data = NULL; ret = media_packet_get_buffer_size(packet, &buf_size); @@ -183,21 +183,15 @@ int __mc_fill_inbuf_with_mm_video_buffer(mc_gst_core_t *core, media_packet_h pac return MC_ERROR; } - mm_vbuffer = __mc_gst_make_tbm_buffer(core, mcbuffer->packet); - - if (mm_vbuffer != NULL) { - gst_buffer_prepend_memory(mcbuffer->buffer, - gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, mm_vbuffer, sizeof(*mm_vbuffer), 0, - sizeof(*mm_vbuffer), mm_vbuffer, free)); - LOGD("mm_vbuffer appended, %d, %d", sizeof(*mm_vbuffer), gst_buffer_n_memory(mcbuffer->buffer)); + mem = __mc_gst_make_tbm_buffer(core, mcbuffer); + if (mem == NULL) { + LOGW("Failed to make tizen memory"); + return MC_ERROR; } - if (buf_data != NULL) { - gst_buffer_prepend_memory(mcbuffer->buffer, - gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, buf_data, buf_size, 0, - buf_size, mcbuffer, (GDestroyNotify)__mc_input_buffer_finalize_cb)); - LOGD("packet data apended, %d, %d", buf_size, gst_buffer_n_memory(mcbuffer->buffer)); - } + gst_buffer_append_memory(mcbuffer->buffer, mem); + LOGD("tizen memory appended"); + return ret; } @@ -359,21 +353,17 @@ int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h } } } else { - MMVideoBuffer *mm_video_buffer = NULL; - - mm_video_buffer = __mc_gst_make_tbm_buffer(core, packet); + GstMemory *mem = NULL; - gst_buffer_prepend_memory(mcbuffer->buffer, - gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, mm_video_buffer, sizeof(MMVideoBuffer), 0, - sizeof(MMVideoBuffer), mm_video_buffer, free)); + mem = __mc_gst_make_tbm_buffer(core, mcbuffer); + if (mem == NULL) { + LOGW("Failed to make tizen memory"); + return MC_ERROR; + } - LOGD("mm_video_buffer appended, %d, %d", sizeof(MMVideoBuffer), gst_buffer_n_memory(mcbuffer->buffer)); + gst_buffer_append_memory(mcbuffer->buffer, mem); + LOGD("tizen memory appended"); } - - gst_buffer_prepend_memory(mcbuffer->buffer, - gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, planes[0], mcbuffer->buf_size, 0, - mcbuffer->buf_size, mcbuffer, (GDestroyNotify)__mc_input_buffer_finalize_cb)); - return ret; } @@ -447,45 +437,7 @@ int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, in tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, bo, 1); } else { - int bo_num = 0; - MMVideoBuffer *mm_vbuffer = NULL; - mm_vbuffer = (MMVideoBuffer *)data; - - if (mm_vbuffer->type == MM_VIDEO_BUFFER_TYPE_TBM_BO) { - tbm_surface_info_s tsurf_info; - memset(&tsurf_info, 0x0, sizeof(tbm_surface_info_s)); - - /* create tbm surface */ - for (i = 0; i < MM_VIDEO_BUFFER_PLANE_MAX; i++) { - if (mm_vbuffer->handle.bo[i]) { - bo_num++; - tsurf_info.planes[i].stride = mm_vbuffer->stride_width[i]; - } - } - - if (bo_num > 0) { - tsurf_info.width = port_def->info.video.width; - tsurf_info.height = port_def->info.video.height; - tsurf_info.format = TBM_FORMAT_NV12; /* bo_format */ - tsurf_info.bpp = tbm_surface_internal_get_bpp(TBM_FORMAT_NV12); - tsurf_info.num_planes = tbm_surface_internal_get_num_planes(TBM_FORMAT_NV12); - tsurf_info.size = 0; - - for (i = 0; i < tsurf_info.num_planes; i++) { - tsurf_info.planes[i].stride = mm_vbuffer->stride_width[i]; - tsurf_info.planes[i].size = mm_vbuffer->stride_width[i] * mm_vbuffer->stride_height[i]; - - if (i < bo_num) - tsurf_info.planes[i].offset = 0; - else - tsurf_info.planes[i].offset = tsurf_info.planes[i-1].offset + tsurf_info.planes[i - 1].size; - - tsurf_info.size += tsurf_info.planes[i].size; - LOGD("%d plane stride : %d, size : %d", i, tsurf_info.planes[i].stride, tsurf_info.planes[i].size); - } - tsurf = tbm_surface_internal_create_with_bos(&tsurf_info, (tbm_bo *)mm_vbuffer->handle.bo, bo_num); - } - } + tsurf = (tbm_surface_h)data; } if (tsurf) { @@ -966,6 +918,7 @@ mc_gst_core_t *mc_gst_core_new() g_atomic_int_set(&core->available_queue->running, 1); core->available_queue->thread = g_thread_new("feed thread", &feed_task, core); + core->allocator = gst_tizen_allocator_new(); core->bufmgr = NULL; core->drm_fd = -1; @@ -999,6 +952,11 @@ void mc_gst_core_free(mc_gst_core_t *core) mc_async_queue_free(async_queue->input); g_free(async_queue); + if (core->allocator) { + gst_object_unref(core->allocator); + core->allocator = NULL; + } + if (core->codec_data) gst_buffer_unref(core->codec_data); @@ -2328,36 +2286,11 @@ void __mc_gst_buffer_add(GstElement *element, GstBuffer *buffer, GstPad *pad, gp int __mc_output_buffer_finalize_cb(media_packet_h packet, int error_code, void *user_data) { - int i = 0; - guint n; - GstMemory *mem; - GstMapInfo map = GST_MAP_INFO_INIT; - MMVideoBuffer *mm_video_buf = NULL; - MEDIACODEC_FENTER(); GstMCBuffer *mcbuffer = (GstMCBuffer *)user_data; - if (mcbuffer->buffer) { - n = gst_buffer_n_memory(mcbuffer->buffer); - - if (n > 1) { - mem = gst_buffer_peek_memory(mcbuffer->buffer, n-1); - gst_memory_map(mem, &map, GST_MAP_READ); - mm_video_buf = (MMVideoBuffer *)map.data; - - if (!mm_video_buf) { - LOGW("gstbuffer map.data is null"); - } else { - for (i = 0; i < MM_VIDEO_BUFFER_PLANE_MAX; i++) { - if (mm_video_buf->handle.bo[i]) - tbm_bo_unref(mm_video_buf->handle.bo[i]); - } - } - gst_memory_unmap(mem, &map); - } - gst_buffer_unref((GstBuffer *)mcbuffer->buffer); - } + gst_buffer_unref((GstBuffer *)mcbuffer->buffer); if (mcbuffer->ext_mem) { g_free(mcbuffer->ext_mem); @@ -2462,10 +2395,12 @@ GstMCBuffer *_mc_gst_media_packet_to_gstbuffer(mc_gst_core_t *core, media_packet GstMCBuffer *__mc_gst_make_media_packet(mc_gst_core_t *core, GstBuffer *buffer) { gint ret = MEDIA_PACKET_ERROR_NONE; - guint n; GstMemory *mem; GstMapInfo map = GST_MAP_INFO_INIT; GstMCBuffer *mcbuffer = NULL; + void *data = NULL; + gint size = 0; + mcbuffer = (GstMCBuffer *)g_malloc0(sizeof(*mcbuffer)); @@ -2474,24 +2409,27 @@ GstMCBuffer *__mc_gst_make_media_packet(mc_gst_core_t *core, GstBuffer *buffer) return NULL; } - n = gst_buffer_n_memory(buffer); + mem = gst_buffer_peek_memory(buffer, 0); - mem = gst_buffer_peek_memory(buffer, n-1); - - gst_memory_map(mem, &map, GST_MAP_READ); + if (gst_is_tizen_memory(mem)) { + data = (void *)gst_tizen_memory_get_surface(mem); + size = tbm_surface_internal_get_size((tbm_surface_h)data); + } else { + gst_memory_map(mem, &map, GST_MAP_READ); + data = map.data; + size = map.size; + gst_memory_unmap(mem, &map); + } mcbuffer->buffer = buffer; mcbuffer->core = core; - mcbuffer->buf_size = map.size; + mcbuffer->buf_size = size; - LOGD("n : %d, map.data : %p, map.size : %d", n, map.data, map.size); - ret = __mc_fill_output_buffer(core, map.data, map.size, mcbuffer); + ret = __mc_fill_output_buffer(core, data, mcbuffer->buf_size, mcbuffer); if (ret != MC_ERROR_NONE) { LOGW("failed to fill outbuf: %s (ox%08x)", _mc_error_to_string(ret), ret); - gst_memory_unmap(mem, &map); return NULL; } - gst_memory_unmap(mem, &map); return mcbuffer; } @@ -2689,85 +2627,33 @@ static GstBusSyncReply __mc_gst_bus_sync_callback(GstBus *bus, GstMessage *msg, return reply; } -static MMVideoBuffer *__mc_gst_make_tbm_buffer(mc_gst_core_t *core, media_packet_h packet) +static GstMemory *__mc_gst_make_tbm_buffer(mc_gst_core_t *core, GstMCBuffer *mcbuffer) { - gint i; - gint num_bos; - gint err; int ret = MEDIA_PACKET_ERROR_NONE; tbm_surface_h surface = NULL; - tbm_surface_info_s surface_info; - tbm_bo_handle handle_bo; + GstVideoInfo vinfo; + GstMemory *mem = NULL; - if (!packet) { + if (!mcbuffer->packet) { LOGE("output is null"); return NULL; } - MMVideoBuffer *mm_vbuffer = NULL; - mm_vbuffer = (MMVideoBuffer *)malloc(sizeof(MMVideoBuffer)); - if (!mm_vbuffer) { - LOGE("Failed to alloc MMVideoBuffer"); - return NULL; - } - memset(mm_vbuffer, 0x00, sizeof(MMVideoBuffer)); - - ret = media_packet_get_tbm_surface(packet, &surface); + ret = media_packet_get_tbm_surface(mcbuffer->packet, &surface); if (ret != MEDIA_PACKET_ERROR_NONE) { LOGE("Failed to get tbm surface"); - free(mm_vbuffer); return NULL; } - num_bos = tbm_surface_internal_get_num_bos(surface); - err = tbm_surface_get_info((tbm_surface_h)surface, &surface_info); - if (err != TBM_SURFACE_ERROR_NONE) { - LOGE("get tbm surface is failed"); - free(mm_vbuffer); + if (!gst_video_info_from_caps(&vinfo, core->caps)) { + LOGE("Failed to get video info"); return NULL; } - for (i = 0; i < num_bos; i++) { - mm_vbuffer->handle.bo[i] = tbm_surface_internal_get_bo(surface, i); - LOGD("mm_vbuffer->handle.bo[%d] : %p", i, mm_vbuffer->handle.bo[i]); - tbm_bo_map(mm_vbuffer->handle.bo[i], TBM_DEVICE_CPU, TBM_OPTION_READ); - tbm_bo_unmap(mm_vbuffer->handle.bo[i]); - } - - mm_vbuffer->type = MM_VIDEO_BUFFER_TYPE_TBM_BO; - mm_vbuffer->width[0] = surface_info.width; - mm_vbuffer->height[0] = surface_info.height; - mm_vbuffer->width[1] = surface_info.width; - mm_vbuffer->height[1] = surface_info.height>>1; - mm_vbuffer->size[0] = surface_info.planes[0].size; - mm_vbuffer->size[1] = surface_info.planes[1].size; - mm_vbuffer->stride_width[0] = surface_info.planes[0].stride; - mm_vbuffer->stride_height[0] = surface_info.planes[0].size / surface_info.planes[0].stride; - mm_vbuffer->stride_width[1] = surface_info.planes[1].stride; - mm_vbuffer->stride_height[1] = surface_info.planes[1].size / surface_info.planes[1].stride; - - if (mm_vbuffer->handle.bo[0]) { - handle_bo = tbm_bo_get_handle(mm_vbuffer->handle.bo[0], TBM_DEVICE_CPU); - mm_vbuffer->data[0] = handle_bo.ptr; - - handle_bo = tbm_bo_get_handle(mm_vbuffer->handle.bo[0], TBM_DEVICE_MM); - mm_vbuffer->handle.dmabuf_fd[0] = handle_bo.u32; - } - - if (mm_vbuffer->handle.bo[1]) { - handle_bo = tbm_bo_get_handle(mm_vbuffer->handle.bo[1], TBM_DEVICE_CPU); - mm_vbuffer->data[1] = handle_bo.ptr; - - handle_bo = tbm_bo_get_handle(mm_vbuffer->handle.bo[1], TBM_DEVICE_MM); - mm_vbuffer->handle.dmabuf_fd[1] = handle_bo.u32; - } else { - mm_vbuffer->data[1] = mm_vbuffer->data[0] + mm_vbuffer->stride_width[0] * mm_vbuffer->stride_height[0]; - } - mm_vbuffer->plane_num = 2; - - LOGD("size[0] : %d, size[1] : %d, bo[0] :%p, bo[1] :%p", mm_vbuffer->size[0], mm_vbuffer->size[1], mm_vbuffer->handle.bo[0], mm_vbuffer->handle.bo[1]); + mem = gst_tizen_allocator_alloc_surface(core->allocator, + &vinfo, surface, mcbuffer, (GDestroyNotify)__mc_input_buffer_finalize_cb); - return mm_vbuffer; + return mem; } static void __mc_input_buffer_finalize_cb(GstMCBuffer *mcbuffer) -- 2.7.4