From: Sejun Park Date: Thu, 22 Jun 2017 08:57:28 +0000 (+0900) Subject: 1.flxible memory allocation using external memory X-Git-Tag: submit/tizen_3.0/20170713.103716~1^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4f3a8c1b2a61cd5fee437ee51a48cce804d3ecf1;p=platform%2Fcore%2Fapi%2Fmediacodec.git 1.flxible memory allocation using external memory 2.removed setting extra data with media packet Change-Id: I775cc19791d0b51cb46ae9c379293b9cc8a41e51 --- diff --git a/include/media_codec_port_gst.h b/include/media_codec_port_gst.h index 84ff576..fe5ab65 100644 --- a/include/media_codec_port_gst.h +++ b/include/media_codec_port_gst.h @@ -73,8 +73,8 @@ typedef enum { #ifdef TIZEN_PROFILE_LITE struct _ion_mmu_data_t { - int master_id; - int fd_buffer; + gint master_id; + gint fd_buffer; unsigned long iova_addr; size_t iova_size; }; @@ -82,10 +82,10 @@ struct _ion_mmu_data_t { struct _mc_gst_port_t { mc_gst_core_t *core; - unsigned int num_buffers; - unsigned int buffer_size; - unsigned int index; - bool is_allocated; + guint num_buffers; + guint buffer_size; + guint index; + gboolean is_allocated; media_packet_h *buffers; GQueue *queue; GMutex mutex; @@ -93,8 +93,8 @@ struct _mc_gst_port_t { }; struct _mc_gst_core_t { - int(**vtable)(); - const char *mime; + gint(**vtable)(); + const gchar *mime; gchar *format; GstElement *pipeline; GstElement *appsrc; @@ -105,11 +105,11 @@ struct _mc_gst_core_t { GstElement *codec; GstCaps *caps; tbm_bufmgr bufmgr; - int drm_fd; + gint drm_fd; GMainContext *thread_default; gulong signal_handoff; - gint bus_whatch_id; + gint bus_watch_id; gint probe_id; GMutex eos_mutex; @@ -121,22 +121,22 @@ struct _mc_gst_core_t { GCond eos_cond; GCond eos_waiting_cond; - bool output_allocated; - bool encoder; - bool video; - bool is_hw; - bool eos; - bool eos_waiting; - bool codec_config; - bool need_drain; - bool need_feed; - bool need_codec_data; - bool need_sync_flag; - bool unprepare_flag; - unsigned int prepare_count; - unsigned int num_live_buffers; - unsigned int etb_count; - unsigned int ftb_count; + gboolean output_allocated; + gboolean encoder; + gboolean video; + gboolean is_hw; + gboolean eos; + gboolean eos_waiting; + gboolean codec_config; + gboolean need_drain; + gboolean need_feed; + gboolean need_codec_data; + gboolean need_sync_flag; + gboolean unprepare_flag; + guint prepare_count; + guint num_live_buffers; + guint etb_count; + guint ftb_count; mediacodec_codec_type_e codec_id; media_format_mimetype_e out_mime; @@ -156,25 +156,26 @@ struct _mc_gst_core_t { struct _GstMCBuffer { GstBuffer *buffer; - int buf_size; + gint buf_size; mc_gst_core_t* core; media_packet_h packet; - bool has_imgb; + void *ext_mem; + gboolean has_tbm; }; enum { fill_inbuf, fill_outbuf }; int __mc_fill_input_buffer(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); -int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *out_packet); +int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer); -int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *out_packet); -int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *out_packet); -int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *out_packet); -int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *packet); +int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); +int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); +int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); +int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer); mc_gst_core_t *mc_gst_core_new(); void mc_gst_core_free(mc_gst_core_t *core); diff --git a/packaging/capi-media-codec.spec b/packaging/capi-media-codec.spec index 8b18995..d84b606 100644 --- 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.5 +Version: 0.5.6 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 9e93383..f3a2714 100644 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -53,7 +53,7 @@ static gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h fmt); static GstMCBuffer *_mc_gst_media_packet_to_gstbuffer(mc_gst_core_t *core, media_packet_h packet, bool codec_config); static int _mc_gst_gstbuffer_to_appsrc(mc_gst_core_t *core, GstMCBuffer *mcbuffer); static gchar *__mc_get_gst_input_format(media_packet_h packet, bool is_hw); -static media_packet_h __mc_gst_make_media_packet(mc_gst_core_t *core, unsigned char *data, int size); +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); @@ -175,11 +175,10 @@ int __mc_fill_input_buffer(mc_gst_core_t *core, media_packet_h packet, GstMCBuff int __mc_fill_inbuf_with_mm_video_buffer(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) { - int ret = MC_ERROR_NONE; - + gint ret = MC_ERROR_NONE; + uint64_t buf_size = 0; MMVideoBuffer *mm_vbuffer = NULL; void *buf_data = NULL; - uint64_t buf_size = 0; ret = media_packet_get_buffer_size(packet, &buf_size); if (ret != MEDIA_PACKET_ERROR_NONE) { @@ -213,7 +212,7 @@ int __mc_fill_inbuf_with_mm_video_buffer(mc_gst_core_t *core, media_packet_h pac int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) { - int ret = MC_ERROR_NONE; + gint ret = MC_ERROR_NONE; void *buf_data = NULL; uint64_t buf_size = 0; @@ -241,12 +240,12 @@ int __mc_fill_input_buffer_with_packet(mc_gst_core_t *core, media_packet_h packe int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) { - int ret = MC_ERROR_NONE; - void *buf_data = NULL; + gint ret = MC_ERROR_NONE; uint64_t buf_size = 0; + unsigned int codec_size = 0; bool codec_config = FALSE; + void *buf_data = NULL; void *codec_data = NULL; - unsigned int codec_size = 0; ret = media_packet_get_buffer_size(packet, &buf_size); if (ret != MEDIA_PACKET_ERROR_NONE) { @@ -286,18 +285,17 @@ int __mc_fill_input_buffer_with_adec_packet(mc_gst_core_t *core, media_packet_h int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h packet, GstMCBuffer *mcbuffer) { - int ret = MC_ERROR_NONE; - void *uv_ptr = NULL; - void *y_ptr = NULL; - int buf_size = 0; - int stride_width; - int stride_height; - int width; - int height; + gint ret = MC_ERROR_NONE; + gint i; + gint j; + gint stride = 0; + gint buf_size = 0; + gint stride_width; + gint stride_height; + gint width; + gint height; uint32_t plane_num; - int i; - int j; - int stride = 0; + void *planes[2]; mc_encoder_info_t *enc_info = (mc_encoder_info_t *)core->codec_info; @@ -310,7 +308,7 @@ int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h return MC_ERROR; } - ret = media_packet_get_video_plane_data_ptr(packet, 0, &y_ptr); + ret = media_packet_get_video_plane_data_ptr(packet, 0, &planes[0]); if (ret != MEDIA_PACKET_ERROR_NONE) { LOGW("media_packet_get_video_plane_data_ptr failed"); return MC_ERROR; @@ -333,20 +331,20 @@ int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h mcbuffer->buf_size += stride_width * stride_height; for (i = 1; i < plane_num; i++) { - media_packet_get_video_plane_data_ptr(packet, i, &uv_ptr); + media_packet_get_video_plane_data_ptr(packet, i, &planes[1]); media_packet_get_video_stride_width(packet, i, &stride_width); media_packet_get_video_stride_height(packet, i, &stride_height); buf_size = stride_width * stride_height; - memcpy(y_ptr + mcbuffer->buf_size, uv_ptr, buf_size); + memcpy(planes[0] + mcbuffer->buf_size, planes[1], buf_size); mcbuffer->buf_size += buf_size; LOGD("plane : %d, buf_size : %d, total : %d", i, buf_size, mcbuffer->buf_size); } } else { for (j = 0; j < height; j++) { - memcpy(y_ptr + mcbuffer->buf_size, y_ptr + stride, width); + memcpy(planes[0] + mcbuffer->buf_size, planes[0] + stride, width); mcbuffer->buf_size += width; stride += stride_width; } @@ -354,17 +352,17 @@ int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h stride = 0; for (i = 1; i < plane_num; i++) { - media_packet_get_video_plane_data_ptr(packet, i, &uv_ptr); + media_packet_get_video_plane_data_ptr(packet, i, &planes[1]); media_packet_get_video_stride_width(packet, i, &stride_width); media_packet_get_video_stride_height(packet, i, &stride_height); for (j = 0; j < height>>1; j++) { - memcpy(y_ptr + mcbuffer->buf_size, uv_ptr + stride, width>>1); + memcpy(planes[0] + mcbuffer->buf_size, planes[1] + stride, width>>1); mcbuffer->buf_size += width>>1; stride += stride_width; } - memcpy(y_ptr + mcbuffer->buf_size, uv_ptr, buf_size); + memcpy(planes[0] + mcbuffer->buf_size, planes[1], buf_size); LOGD("plane : %d, buf_size : %d, total : %d", i, buf_size, mcbuffer->buf_size); mcbuffer->buf_size += buf_size; } @@ -382,7 +380,7 @@ int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h } gst_buffer_prepend_memory(mcbuffer->buffer, - gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, y_ptr, mcbuffer->buf_size, 0, + 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; @@ -393,12 +391,12 @@ int __mc_fill_input_buffer_with_venc_packet(mc_gst_core_t *core, media_packet_h * fill_outbuf virtual functions */ -int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *out_packet) +int __mc_fill_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { - return core->vtable[fill_outbuf](core, data, size, out_packet); + return core->vtable[fill_outbuf](core, data, size, mcbuffer); } -int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *packet) +int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { int i; int stride_width; @@ -406,10 +404,11 @@ int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, in uint32_t width; uint32_t height; uint32_t buf_size; - tbm_surface_h tsurf = NULL; tbm_surface_info_s tsurf_info; tbm_bo bo[MM_VIDEO_BUFFER_PLANE_MAX]; tbm_bo_handle thandle; + tbm_surface_h tsurf = NULL; + media_packet_h packet = NULL; g_return_val_if_fail(core != NULL, MC_PARAM_ERROR); @@ -500,41 +499,54 @@ int __mc_fill_vdec_packet_with_output_buffer(mc_gst_core_t *core, void *data, in if (tsurf) { media_packet_create_from_tbm_surface(core->output_fmt, tsurf, - (media_packet_finalize_cb)__mc_output_buffer_finalize_cb, core, packet); + (media_packet_finalize_cb)__mc_output_buffer_finalize_cb, mcbuffer, &packet); + mcbuffer->packet = packet; } return MC_ERROR_NONE; } -int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *out_packet) +int __mc_fill_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { + gint ret = MC_ERROR_NONE; + gchar *ext_mem = NULL; + gint mem_size = 0; void *packet_data = NULL; - int ret = MC_ERROR_NONE; + media_packet_h packet = NULL; + g_return_val_if_fail(core != NULL, MC_PARAM_ERROR); if (core->encoder && core->codec_id == MEDIACODEC_AAC) media_format_set_audio_aac_type(core->output_fmt, FALSE); - ret = media_packet_create_alloc(core->output_fmt, __mc_output_buffer_finalize_cb, core, out_packet); + mem_size = GST_ROUND_UP_4(size); + ext_mem = g_malloc0(mem_size); + + ret = media_packet_create_from_external_memory(core->output_fmt, ext_mem, mem_size, __mc_output_buffer_finalize_cb, mcbuffer, &packet); if (ret != MEDIA_PACKET_ERROR_NONE) { LOGW("media_packet_create_alloc failed"); return MC_ERROR; } + mcbuffer->packet = packet; + mcbuffer->ext_mem = ext_mem; - media_packet_set_buffer_size(*out_packet, size); - media_packet_get_buffer_data_ptr(*out_packet, &packet_data); + media_packet_set_buffer_size(packet, size); + media_packet_get_buffer_data_ptr(packet, &packet_data); memcpy(packet_data, data, size); return MC_ERROR_NONE; } -int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *out_packet) +int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { - void *packet_data = NULL; + gint ret = MC_ERROR_NONE; bool codec_config = FALSE; bool sync_flag = FALSE; bool slice = FALSE; - int ret = MC_ERROR_NONE; + gint mem_size = 0; + gchar *ext_mem = NULL; + void *packet_data = NULL; + media_packet_h packet = NULL; g_return_val_if_fail(core != NULL, MC_PARAM_ERROR); @@ -558,14 +570,19 @@ int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, in } LOGD("codec_config : %d, sync_flag : %d, slice : %d", codec_config, sync_flag, slice); - ret = media_packet_create_alloc(core->output_fmt, __mc_output_buffer_finalize_cb, core, out_packet); + mem_size = GST_ROUND_UP_4(size); + ext_mem = g_malloc0(mem_size); + + ret = media_packet_create_from_external_memory(core->output_fmt, ext_mem, mem_size, __mc_output_buffer_finalize_cb, mcbuffer, &packet); if (ret != MEDIA_PACKET_ERROR_NONE) { LOGW("media_packet_create_alloc failed"); return MC_ERROR; } + mcbuffer->packet = packet; + mcbuffer->ext_mem = ext_mem; - media_packet_set_buffer_size(*out_packet, size); - media_packet_get_buffer_data_ptr(*out_packet, &packet_data); + media_packet_set_buffer_size(packet, size); + media_packet_get_buffer_data_ptr(packet, &packet_data); memcpy(packet_data, data, size); core->need_sync_flag = sync_flag ? 1 : 0; @@ -574,30 +591,38 @@ int __mc_fill_venc_packet_with_output_buffer(mc_gst_core_t *core, void *data, in return ret; } -int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, media_packet_h *out_packet) +int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, int size, GstMCBuffer *mcbuffer) { int ret = MC_ERROR_NONE; + gint mem_size = 0; GstPad *pad; GstCaps *peercaps; - const GValue *codec_data = NULL; - void *packet_data = NULL; GstMapInfo map; guint8 *ptr; gsize len; + gchar *ext_mem = NULL; + const GValue *codec_data = NULL; + void *packet_data = NULL; + media_packet_h packet = NULL; g_return_val_if_fail(core != NULL, MC_PARAM_ERROR); if (core->encoder && core->codec_id == MEDIACODEC_AAC) media_format_set_audio_aac_type(core->output_fmt, FALSE); - ret = media_packet_create_alloc(core->output_fmt, __mc_output_buffer_finalize_cb, core, out_packet); + mem_size = GST_ROUND_UP_4(size); + ext_mem = g_malloc0(mem_size); + + ret = media_packet_create_from_external_memory(core->output_fmt, ext_mem, mem_size, __mc_output_buffer_finalize_cb, mcbuffer, &packet); if (ret != MEDIA_PACKET_ERROR_NONE) { LOGW("media_packet_create_alloc failed"); return MC_ERROR; } + mcbuffer->packet = packet; + mcbuffer->ext_mem = ext_mem; - media_packet_set_buffer_size(*out_packet, size); - media_packet_get_buffer_data_ptr(*out_packet, &packet_data); + media_packet_set_buffer_size(packet, size); + media_packet_get_buffer_data_ptr(packet, &packet_data); memcpy(packet_data, data, size); if (!core->codec_data) { @@ -625,7 +650,7 @@ int __mc_fill_aenc_packet_with_output_buffer(mc_gst_core_t *core, void *data, in gst_buffer_map(core->codec_data, &map, GST_MAP_READ); ptr = map.data; len = map.size; - media_packet_set_codec_data(*out_packet, ptr, len); + media_packet_set_codec_data(packet, ptr, len); gst_buffer_unmap(core->codec_data, &map); } @@ -668,14 +693,14 @@ static GstCaps *__mc_gst_caps_set_buffer_array(GstCaps * caps, const gchar * nam int __mc_set_caps_streamheader(mc_gst_core_t *core, GstMCBuffer *mcbuffer, guint streamheader_size) { - int ret = MEDIA_PACKET_ERROR_NONE; - void *buf_data = NULL; + gint ret = MEDIA_PACKET_ERROR_NONE; uint64_t buf_size = 0; GstBuffer *header1, *header2, *header3; guint hsize1, hsize2, hsize3; GstBuffer *tmp_header; - guint8 *tmp_buf = NULL; GstMapInfo map; + void *buf_data = NULL; + guint8 *tmp_buf = NULL; ret = media_packet_get_buffer_size(mcbuffer->packet, &buf_size); if (ret != MEDIA_PACKET_ERROR_NONE) { @@ -825,12 +850,12 @@ int __mc_set_caps_streamheader(mc_gst_core_t *core, GstMCBuffer *mcbuffer, guint int __mc_set_caps_codecdata(mc_gst_core_t *core, GstMCBuffer *mcbuffer, guint fixed_size) { - int ret = MC_ERROR_NONE; - void *codec_data = NULL; - unsigned int codec_data_size = 0; + gint ret = MC_ERROR_NONE; + uint32_t codec_data_size = 0; + GstMapInfo map; GstBuffer *codecdata_buffer; guint8 *data = NULL; - GstMapInfo map; + void *codec_data = NULL; media_packet_get_codec_data(mcbuffer->packet, &codec_data, &codec_data_size); @@ -1048,9 +1073,9 @@ gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h fmt) mc_decoder_info_t *codec_info = (mc_decoder_info_t *)core->codec_info; if (core->video) { - int width = 0; - int height = 0; - int bitrate = 0; + gint width = 0; + gint height = 0; + gint bitrate = 0; media_format_get_video_info(fmt, NULL, &width, &height, &bitrate, NULL); @@ -1071,10 +1096,10 @@ gboolean _mc_update_packet_info(mc_gst_core_t *core, media_format_h fmt) } } } else { - int channel; - int samplerate; - int bit; - int bitrate; + gint channel; + gint samplerate; + gint bit; + gint bitrate; media_format_get_audio_info(fmt, NULL, &channel, &samplerate, &bit, &bitrate); @@ -1199,17 +1224,18 @@ static int _mc_gst_update_caps(mc_gst_core_t *core, GstMCBuffer *mcbuffer, bool static gpointer feed_task(gpointer data) { - mc_gst_core_t *core = (mc_gst_core_t *)data; - int ret = MC_ERROR_NONE; + gint ret = MC_ERROR_NONE; bool codec_config = FALSE; bool eos = FALSE; + bool initiative = TRUE; media_format_h fmt = NULL; media_packet_h in_buf = NULL; GstMCBuffer *mcbuffer = NULL; - bool initiative = true; MEDIACODEC_FENTER(); + mc_gst_core_t *core = (mc_gst_core_t *)data; + while (g_atomic_int_get(&core->available_queue->running)) { LOGD("waiting for next input...."); in_buf = _mc_get_input_buffer(core); @@ -1561,19 +1587,22 @@ static int _mc_link_vtable(mc_gst_core_t *core, mediacodec_codec_type_e id, gboo /* set caps */ g_object_set(core->appsrc, "caps", core->caps, NULL); + MEDIACODEC_FLEAVE(); + return MC_ERROR_NONE; } -static int _mc_gst_gstbuffer_to_appsrc(mc_gst_core_t *core, GstMCBuffer *mcbuffer) +static gint _mc_gst_gstbuffer_to_appsrc(mc_gst_core_t *core, GstMCBuffer *mcbuffer) { - MEDIACODEC_FENTER(); + gint ret = MC_ERROR_NONE; - int ret = MC_ERROR_NONE; + MEDIACODEC_FENTER(); + ret = gst_app_src_push_buffer(GST_APP_SRC(core->appsrc), mcbuffer->buffer); LOGD("pushed buffer to appsrc : %p, buffer of size %" G_GSIZE_FORMAT "", mcbuffer->buffer, gst_buffer_get_size(mcbuffer->buffer)); - ret = gst_app_src_push_buffer(GST_APP_SRC(core->appsrc), mcbuffer->buffer); + MEDIACODEC_FLEAVE(); return ret; } @@ -1672,6 +1701,8 @@ mc_ret_e mc_gst_prepare(mc_handle_t *mc_handle) } LOGD("initialized... %d", ret); + MEDIACODEC_FLEAVE(); + return ret; } @@ -1730,6 +1761,8 @@ mc_ret_e mc_gst_unprepare(mc_handle_t *mc_handle) } } + MEDIACODEC_FLEAVE(); + return ret; } @@ -1779,14 +1812,13 @@ mc_ret_e mc_gst_process_input(mc_handle_t *mc_handle, media_packet_h inbuf, uint mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint64_t timeOutUs) { - MEDIACODEC_FENTER(); - - int ret = MC_ERROR_NONE; - mc_gst_core_t *core = NULL; - media_packet_h out_packet = NULL; + gint ret = MC_ERROR_NONE; gint64 end_time = -1; gboolean signalled; + mc_gst_core_t *core = NULL; + media_packet_h out_packet = NULL; + MEDIACODEC_FENTER(); end_time = g_get_monotonic_time() + timeOutUs; if (!mc_handle) @@ -1822,11 +1854,11 @@ mc_ret_e mc_gst_get_output(mc_handle_t *mc_handle, media_packet_h *outbuf, uint6 mc_ret_e mc_gst_flush_buffers(mc_handle_t *mc_handle) { - MEDIACODEC_FENTER(); - - int ret = MC_ERROR_NONE; + gint ret = MC_ERROR_NONE; mc_gst_core_t *core = NULL; + MEDIACODEC_FENTER(); + if (!mc_handle) return MC_PARAM_ERROR; @@ -1844,14 +1876,14 @@ static gboolean __mc_gst_init_gstreamer() { MEDIACODEC_FENTER(); + gint i = 0; + gint arg_count = 0; static gboolean initialized = FALSE; static const int max_argc = 50; gint *argc = NULL; gchar **argv = NULL; gchar **argv2 = NULL; GError *err = NULL; - int i = 0; - int arg_count = 0; if (initialized) { LOGD("gstreamer already initialized.\n"); @@ -2015,7 +2047,7 @@ mc_ret_e _mc_gst_create_pipeline(mc_gst_core_t *core, gchar *factory_name) /* connect signals, bus watcher */ bus = gst_pipeline_get_bus(GST_PIPELINE(core->pipeline)); - core->bus_whatch_id = gst_bus_add_watch(bus, __mc_gst_bus_callback, core); + core->bus_watch_id = gst_bus_add_watch(bus, __mc_gst_bus_callback, core); core->thread_default = g_main_context_get_thread_default(); /* set sync handler to get tag synchronously */ @@ -2087,11 +2119,11 @@ mc_ret_e _mc_gst_destroy_pipeline(mc_gst_core_t *core) } } - if (core->bus_whatch_id) { + if (core->bus_watch_id) { GSource *source = NULL; - source = g_main_context_find_source_by_id(core->thread_default, core->bus_whatch_id); + source = g_main_context_find_source_by_id(core->thread_default, core->bus_watch_id); g_source_destroy(source); - LOGD("bus_whatch_id destroy"); + LOGD("bus_watch_id destroy"); } MEDIACODEC_ELEMENT_SET_STATE(core->pipeline, GST_STATE_NULL); @@ -2149,10 +2181,7 @@ void __mc_push_output_to_queue(mc_gst_core_t *core, media_packet_h out_packet) void __mc_gst_buffer_add(GstElement *element, GstBuffer *buffer, GstPad *pad, gpointer data) { - guint n; - GstMemory *mem; - GstMapInfo map = GST_MAP_INFO_INIT; - media_packet_h out_packet = NULL; + GstMCBuffer *mcbuffer = NULL; MEDIACODEC_FENTER(); @@ -2160,34 +2189,25 @@ void __mc_gst_buffer_add(GstElement *element, GstBuffer *buffer, GstPad *pad, gp gst_buffer_ref(buffer); - n = gst_buffer_n_memory(buffer); - - mem = gst_buffer_peek_memory(buffer, n-1); - - gst_memory_map(mem, &map, GST_MAP_READ); - LOGD("n : %d, map.data : %p, map.size : %d", n, map.data, map.size); + mcbuffer = __mc_gst_make_media_packet(core, buffer); - out_packet = __mc_gst_make_media_packet(core, map.data, map.size); + LOGI("@%p(%d) out_packet : %p", core, core->encoder, mcbuffer->packet); - LOGI("@%p(%d) out_packet : %p", core, core->encoder, out_packet); - gst_memory_unmap(mem, &map); - - if (out_packet) { - media_packet_set_extra(out_packet, buffer); - media_packet_set_pts(out_packet, GST_BUFFER_TIMESTAMP(buffer)); - media_packet_set_duration(out_packet, GST_BUFFER_DURATION(buffer)); + if (mcbuffer->packet) { + media_packet_set_pts(mcbuffer->packet, GST_BUFFER_TIMESTAMP(buffer)); + media_packet_set_duration(mcbuffer->packet, GST_BUFFER_DURATION(buffer)); if (core->need_codec_data) { - media_packet_set_flags(out_packet, MEDIA_PACKET_CODEC_CONFIG); + media_packet_set_flags(mcbuffer->packet, MEDIA_PACKET_CODEC_CONFIG); core->need_codec_data = false; } if (core->need_sync_flag) { - media_packet_set_flags(out_packet, MEDIA_PACKET_SYNC_FRAME); + media_packet_set_flags(mcbuffer->packet, MEDIA_PACKET_SYNC_FRAME); core->need_sync_flag = false; } - __mc_push_output_to_queue(core, out_packet); + __mc_push_output_to_queue(core, mcbuffer->packet); } else { gst_buffer_unref(buffer); LOGE("Failed to dequeue output packet"); @@ -2210,7 +2230,8 @@ int __mc_output_buffer_finalize_cb(media_packet_h packet, int error_code, void * MEDIACODEC_FENTER(); - mc_gst_core_t *core = (mc_gst_core_t *)user_data; + GstMCBuffer *mcbuffer = (GstMCBuffer *)user_data; + mc_gst_core_t *core = mcbuffer->core; g_mutex_lock(&core->ports[1]->mutex); @@ -2222,7 +2243,8 @@ int __mc_output_buffer_finalize_cb(media_packet_h packet, int error_code, void * g_mutex_unlock(&core->ports[1]->mutex); g_atomic_int_dec_and_test(&core->ftb_count); - media_packet_get_extra(packet, &buffer); + + buffer = mcbuffer->buffer; n = gst_buffer_n_memory(buffer); @@ -2241,6 +2263,13 @@ int __mc_output_buffer_finalize_cb(media_packet_h packet, int error_code, void * } gst_memory_unmap(mem, &map); } + + if (mcbuffer->ext_mem) { + g_free(mcbuffer->ext_mem); + LOGD("freed external memory"); + mcbuffer->ext_mem = NULL; + } + gst_buffer_unref((GstBuffer *)buffer); LOGD("@v(%d)e(%d)output port filled buffer(%d): %p", core->video, core->encoder, core->ftb_count, packet); @@ -2282,12 +2311,12 @@ gchar *__mc_get_gst_input_format(media_packet_h packet, bool is_hw) GstMCBuffer *_mc_gst_media_packet_to_gstbuffer(mc_gst_core_t *core, media_packet_h packet, bool codec_config) { - int ret = MEDIA_PACKET_ERROR_NONE; - GstMCBuffer *mcbuffer = NULL; - void *buf_data = NULL; + gint ret = MEDIA_PACKET_ERROR_NONE; uint64_t buf_size = 0; uint64_t pts = 0; uint64_t dur = 0; + void *buf_data = NULL; + GstMCBuffer *mcbuffer = NULL; ret = media_packet_get_buffer_size(packet, &buf_size); if (ret != MEDIA_PACKET_ERROR_NONE) { @@ -2332,25 +2361,47 @@ GstMCBuffer *_mc_gst_media_packet_to_gstbuffer(mc_gst_core_t *core, media_packet return mcbuffer; } -media_packet_h __mc_gst_make_media_packet(mc_gst_core_t *core, unsigned char *data, int size) +GstMCBuffer *__mc_gst_make_media_packet(mc_gst_core_t *core, GstBuffer *buffer) { - int ret = MEDIA_PACKET_ERROR_NONE; - media_packet_h packet = NULL; + gint ret = MEDIA_PACKET_ERROR_NONE; + guint n; + GstMemory *mem; + GstMapInfo map = GST_MAP_INFO_INIT; + GstMCBuffer *mcbuffer = NULL; + + mcbuffer = (GstMCBuffer *)g_malloc0(sizeof(*mcbuffer)); + + if (mcbuffer == NULL) { + LOGE("malloc fail"); + return NULL; + } + + n = gst_buffer_n_memory(buffer); - ret = __mc_fill_output_buffer(core, data, size, &packet); + mem = gst_buffer_peek_memory(buffer, n-1); + + gst_memory_map(mem, &map, GST_MAP_READ); + + mcbuffer->buffer = buffer; + mcbuffer->core = core; + mcbuffer->buf_size = map.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); 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 packet; + return mcbuffer; } int __mc_gst_create_eos_packet(media_format_h fmt, media_packet_h *out_packet) { + gint ret = MC_ERROR_NONE; media_packet_h mediabuf = NULL; - int ret = MC_ERROR_NONE; MEDIACODEC_FENTER(); if (media_packet_create(fmt, NULL, NULL, &mediabuf)) { @@ -2398,7 +2449,7 @@ void _mc_gst_handle_input_buffer_used(mc_gst_core_t *core, media_packet_h packet gboolean __mc_gst_bus_callback(GstBus *bus, GstMessage *msg, gpointer data) { - int ret = MC_ERROR_NONE; + gint ret = MC_ERROR_NONE; mc_gst_core_t *core = (mc_gst_core_t *)data; LOGD("@%p v(%d)e(%d)bus message : %s", core, core->video, core->encoder, gst_message_type_get_name(GST_MESSAGE_TYPE(msg))); @@ -2475,11 +2526,11 @@ gboolean __mc_gst_bus_callback(GstBus *bus, GstMessage *msg, gpointer data) static gboolean __mc_gst_check_useful_message(mc_gst_core_t *core, GstMessage *msg) { - gboolean retval = false; + gboolean retval = FALSE; if (!core->pipeline) { LOGE("mediacodec pipeline handle is null"); - return true; + return TRUE; } switch (GST_MESSAGE_TYPE(msg)) { @@ -2487,10 +2538,10 @@ static gboolean __mc_gst_check_useful_message(mc_gst_core_t *core, GstMessage *m case GST_MESSAGE_EOS: case GST_MESSAGE_ERROR: case GST_MESSAGE_WARNING: - retval = true; + retval = TRUE; break; default: - retval = false; + retval = FALSE; break; } @@ -2534,8 +2585,8 @@ static GstBusSyncReply __mc_gst_bus_sync_callback(GstBus *bus, GstMessage *msg, static MMVideoBuffer *__mc_gst_make_tbm_buffer(mc_gst_core_t *core, media_packet_h packet) { - int i; - int num_bos; + gint i; + gint num_bos; tbm_surface_h surface = NULL; tbm_surface_info_s surface_info; tbm_bo_handle handle_bo; @@ -2555,7 +2606,7 @@ static MMVideoBuffer *__mc_gst_make_tbm_buffer(mc_gst_core_t *core, media_packet media_packet_get_tbm_surface(packet, &surface); num_bos = tbm_surface_internal_get_num_bos(surface); - int err = tbm_surface_get_info((tbm_surface_h)surface, &surface_info); + gint 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); @@ -2570,8 +2621,8 @@ static MMVideoBuffer *__mc_gst_make_tbm_buffer(mc_gst_core_t *core, media_packet } #ifdef TIZEN_PROFILE_LITE - int phy_addr = 0; - int phy_size = 0; + gint phy_addr = 0; + gint phy_size = 0; tbm_bo_handle handle_fd = tbm_bo_get_handle(mm_vbuffer->handle.bo[0], TBM_DEVICE_MM); if (handle_fd.ptr == NULL) { LOGE("Invaild bo handle"); @@ -2824,7 +2875,7 @@ INTERNAL_ERROR: return MEDIACODEC_ERROR_INTERNAL; } -static int _mc_gst_flush_buffers(mc_gst_core_t *core) +static gint _mc_gst_flush_buffers(mc_gst_core_t *core) { gboolean ret = FALSE; GstEvent *event = NULL; @@ -2908,11 +2959,11 @@ static void _mc_gst_set_flush_output(mc_gst_core_t *core) } #ifdef TIZEN_PROFILE_LITE -int __tbm_get_physical_addr_bo(tbm_bo_handle handle_bo, int *phy_addr, int *phy_size) +gint __tbm_get_physical_addr_bo(tbm_bo_handle handle_bo, int *phy_addr, int *phy_size) { - int ret = 0; - int open_flags = O_RDWR; - int ion_fd = -1; + gint ret = 0; + gint open_flags = O_RDWR; + gint ion_fd = -1; ion_mmu_data_t mmu_data; struct ion_custom_data custom_data; @@ -2969,13 +3020,13 @@ int __tbm_get_physical_addr_bo(tbm_bo_handle handle_bo, int *phy_addr, int *phy_ * @return * address of tiled data */ -static int __tile_4x2_read(int x_size, int y_size, int x_pos, int y_pos) +static gint __tile_4x2_read(gint x_size, gint y_size, gint x_pos, gint y_pos) { - int pixel_x_m1, pixel_y_m1; - int roundup_x; - int linear_addr0, linear_addr1, bank_addr ; - int x_addr; - int trans_addr; + gint pixel_x_m1, pixel_y_m1; + gint roundup_x; + gint linear_addr0, linear_addr1, bank_addr ; + gint x_addr; + gint trans_addr; pixel_x_m1 = x_size - 1; pixel_y_m1 = y_size - 1; @@ -3040,14 +3091,14 @@ static int __tile_4x2_read(int x_size, int y_size, int x_pos, int y_pos) * @param buttom * Crop size of buttom */ -static void __csc_tiled_to_linear_crop(unsigned char *yuv420_dest, unsigned char *nv12t_src, - int yuv420_width, int yuv420_height, - int left, int top, int right, int buttom) +static void __csc_tiled_to_linear_crop(gchar *yuv420_dest, gchar *nv12t_src, + gint yuv420_width, gint yuv420_height, + gint left, int top, gint right, gint buttom) { - int i, j; - int tiled_offset = 0, tiled_offset1 = 0; - int linear_offset = 0; - int temp1 = 0, temp2 = 0, temp3 = 0, temp4 = 0; + gint i, j; + gint tiled_offset = 0, tiled_offset1 = 0; + gint linear_offset = 0; + gint temp1 = 0, temp2 = 0, temp3 = 0, temp4 = 0; temp3 = yuv420_width-right; temp1 = temp3-left; @@ -3289,7 +3340,7 @@ const gchar * _mc_bit_to_string(int bit) int _mc_get_support_bit_from_format(media_format_mimetype_e format) { - int bit = 0; + gint bit = 0; switch (format) { case MEDIA_FORMAT_PCM_S16LE: @@ -3385,8 +3436,9 @@ int _mc_get_mime(mc_gst_core_t *core) mc_ret_e mc_gst_get_packet_pool(mc_handle_t *mc_handle, media_packet_pool_h *packet_pool) { - int curr_size; - int max_size, min_size; + gint ret = MC_ERROR_NONE; + gint curr_size; + gint max_size, min_size; media_format_mimetype_e mime_format = MEDIA_FORMAT_MAX; media_format_h fmt_handle = NULL; media_packet_pool_h pool = NULL; @@ -3397,8 +3449,7 @@ mc_ret_e mc_gst_get_packet_pool(mc_handle_t *mc_handle, media_packet_pool_h *pac core = (mc_gst_core_t *)mc_handle->core; - int ret = media_packet_pool_create(&pool); - + ret = media_packet_pool_create(&pool); if (ret != MEDIA_PACKET_ERROR_NONE) { LOGE("media_packet_pool_create failed"); return MC_ERROR; diff --git a/test/media_codec_test.c b/test/media_codec_test.c index bb61c69..b0e0bbd 100644 --- a/test/media_codec_test.c +++ b/test/media_codec_test.c @@ -59,7 +59,6 @@ ((state & (expected_state)) == (expected_state)) #define AAC_CODECDATA_SIZE 16 -#define USE_POOL 0 guint8 buf_adts[ADTS_HEADER_SIZE]; @@ -1432,7 +1431,7 @@ void _mediacodec_prepare(App *app, gboolean frame_all) /* set callback */ g_print("supported codec lists\n"); mediacodec_foreach_supported_codec(app->mc_handle[0], (mediacodec_supported_codec_cb)_foreach_cb, app); - mediacodec_set_input_buffer_used_cb(app->mc_handle[0], (mediacodec_input_buffer_used_cb)_mediacodec_inbuf_used_cb, NULL); + mediacodec_set_input_buffer_used_cb(app->mc_handle[0], (mediacodec_input_buffer_used_cb)_mediacodec_inbuf_used_cb, app); mediacodec_set_output_buffer_available_cb(app->mc_handle[0], (mediacodec_output_buffer_available_cb) _mediacodec_outbuf_available_cb, app); if (frame_all) mediacodec_set_buffer_status_cb(app->mc_handle[0], (mediacodec_buffer_status_cb) _mediacodec_buffer_status_cb, app);