Apply tizen allocator to mediacodec 60/187260/2 accepted/tizen/5.0/unified/20181102.014654 accepted/tizen/unified/20180903.062526 submit/tizen/20180831.043334 submit/tizen/20180831.080817 submit/tizen_5.0/20181101.000002
authorSejun Park <sejun79.park@samsung.com>
Tue, 21 Aug 2018 08:58:03 +0000 (17:58 +0900)
committerSejun Park <sejun79.park@samsung.com>
Tue, 21 Aug 2018 09:38:44 +0000 (18:38 +0900)
Change-Id: I4304b314d499fb53d694b330eaf391cccbc54c98

CMakeLists.txt
include/media_codec_port_gst.h
packaging/capi-media-codec.spec
src/media_codec_port_gst.c

index dc41164..217ee07 100755 (executable)
@@ -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})
index 2888192..18010d4 100755 (executable)
@@ -30,6 +30,7 @@
 #include <tbm_bufmgr.h>
 #include <tbm_surface_internal.h>
 #include <gst/video/video-format.h>
+#include <gst/allocators/gsttizenmemory.h>
 
 #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];
index daabadd..6f405a3 100755 (executable)
@@ -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
index 5036d3e..5d09f4b 100755 (executable)
@@ -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)