From: Sejun Park Date: Wed, 7 Dec 2016 04:29:59 +0000 (+0900) Subject: Modify to be set codecdata X-Git-Tag: submit/tizen_3.0/20161213.081002^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F05%2F103005%2F2;p=platform%2Fcore%2Fapi%2Fmediacodec.git Modify to be set codecdata Change-Id: Ib7807e50f3dcec8876fde872e0694458392dcc04 --- diff --git a/include/media_codec_port_gst.h b/include/media_codec_port_gst.h index 56e28f2..64536ad 100755 --- a/include/media_codec_port_gst.h +++ b/include/media_codec_port_gst.h @@ -51,6 +51,7 @@ extern "C" { #define TBM_API_CHANGE #define DEFAULT_DEC_POOL_SIZE 20 #define DEFAULT_ENC_POOL_SIZE 13 +#define CODECDATA_NOT_USE 0x7FFFFFFF #define AAC_CODECDATA_SIZE 16 #define WMA_CODECDATA_SIZE 64 #define VORBIS_CODECDATA_SIZE 4096 diff --git a/src/media_codec_port_gst.c b/src/media_codec_port_gst.c index fedaba5..fc9ddaf 100755 --- a/src/media_codec_port_gst.c +++ b/src/media_codec_port_gst.c @@ -717,53 +717,47 @@ int __mc_set_caps_streamheader(mc_gst_core_t *core, GstMCBuffer*buff, guint stre return ret; } -int __mc_set_caps_codecdata(mc_gst_core_t *core, GstMCBuffer *buff, guint codecdata_size) +int __mc_set_caps_codecdata(mc_gst_core_t *core, GstMCBuffer *buff, guint fixed_size) { int ret = MEDIA_PACKET_ERROR_NONE; - void *buf_data = NULL; - uint64_t buf_size = 0; + void *codec_data = NULL; + unsigned int codec_data_size = 0; GstBuffer *codecdata_buffer; - guint8 *data; + guint8 *data = NULL; GstMapInfo map; - ret = media_packet_get_buffer_size(buff->pkt, &buf_size); - if (ret != MEDIA_PACKET_ERROR_NONE) { - LOGW("buffer size get fail"); - return ret; - } - - ret = media_packet_get_buffer_data_ptr(buff->pkt, &buf_data); - if (ret != MEDIA_PACKET_ERROR_NONE) { - LOGW("buffer size get fail"); - return ret; + media_packet_get_codec_data(buff->pkt, &codec_data, &codec_data_size); + + if (codec_data != NULL) { /* get the codec data from media_packet_get_codec_data() */ + data = g_malloc0(codec_data_size); + memcpy(data, codec_data, codec_data_size); + codecdata_buffer = gst_buffer_new_wrapped(data, codec_data_size); + gst_caps_set_simple(core->caps, "codec_data", GST_TYPE_BUFFER, codecdata_buffer, NULL); + LOGD("set codec data : %" G_GSIZE_FORMAT "", gst_buffer_get_size(codecdata_buffer)); + gst_buffer_unref(codecdata_buffer); + } else { /* get the codec data from media_packet_get_buffer_data_ptr() */ + uint64_t buffer_size; + media_packet_get_buffer_size(buff->pkt, &buffer_size); + media_packet_get_buffer_data_ptr(buff->pkt, &codec_data); + + if (codec_data_size > fixed_size) { + data = g_malloc0(fixed_size); + gst_buffer_map(buff->buffer, &map, GST_MAP_READ); + memcpy(data, map.data, codec_data_size); + codecdata_buffer = gst_buffer_new_wrapped(data, buffer_size); + gst_buffer_unmap(buff->buffer, &map); + gst_caps_set_simple(core->caps, "codec_data", GST_TYPE_BUFFER, codecdata_buffer, NULL); + gst_buffer_unref(codecdata_buffer); + + gst_buffer_replace_memory(buff->buffer, 0, + gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, codec_data + fixed_size , buffer_size - fixed_size, 0, + buffer_size - fixed_size, buff, (GDestroyNotify)gst_mediacodec_buffer_finalize)); + LOGD("set codec data from packet: %" G_GSIZE_FORMAT "", gst_buffer_get_size(buff->buffer)); + } } - - LOGD("Set caps for codec_data in mime : %s and codec_id (0x%x)", core->mime, core->codec_id); - - /* Add the codec_data attribute to caps, if we have it */ - data = g_malloc0(codecdata_size); - gst_buffer_map(buff->buffer, &map, GST_MAP_READ); - memcpy(data, map.data, codecdata_size); - codecdata_buffer = gst_buffer_new_wrapped(data, codecdata_size); - gst_buffer_unmap(buff->buffer, &map); - LOGD("setting codec_data from (packet) buf_data used codecdata_size (%d)", codecdata_size); - - gst_caps_set_simple(core->caps, "codec_data", GST_TYPE_BUFFER, codecdata_buffer, NULL); - gst_buffer_unref(codecdata_buffer); - - /* Update gstbuffer's data ptr and size for using previous codec_data..*/ - LOGD("BEFORE : buff->buffer of size %" G_GSIZE_FORMAT "", gst_buffer_get_size(buff->buffer)); - - gst_buffer_replace_memory(buff->buffer, 0, - gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, buf_data + codecdata_size , buf_size - codecdata_size, 0, - buf_size - codecdata_size, buff, (GDestroyNotify)gst_mediacodec_buffer_finalize)); - - LOGD("AFTER : buff->buffer of size %" G_GSIZE_FORMAT "", gst_buffer_get_size(buff->buffer)); - return ret; } - int _mc_output_media_packet_new(mc_gst_core_t *core, bool video, bool encoder, media_format_mimetype_e out_mime) { if (media_format_create(&core->output_fmt) != MEDIA_FORMAT_ERROR_NONE) { @@ -1019,6 +1013,11 @@ static int _mc_gst_update_caps(mc_gst_core_t *core, media_packet_h pkt, GstMCBuf "width", G_TYPE_INT, dec_info->width, "height", G_TYPE_INT, dec_info->height, NULL); + + ret = __mc_set_caps_codecdata(core, buff, CODECDATA_NOT_USE); + if (ret != MC_ERROR_NONE) { + LOGW("__mc_set_caps_codecdata failed"); + } } } else { if (core->encoder) { @@ -1045,7 +1044,6 @@ static int _mc_gst_update_caps(mc_gst_core_t *core, media_packet_h pkt, GstMCBuf ret = __mc_set_caps_codecdata(core, buff, AAC_CODECDATA_SIZE); if (ret != MC_ERROR_NONE) { LOGW("__mc_set_caps_codecdata failed"); - return ret; } break; case MEDIACODEC_WMAV1: @@ -1055,7 +1053,6 @@ static int _mc_gst_update_caps(mc_gst_core_t *core, media_packet_h pkt, GstMCBuf ret = __mc_set_caps_codecdata(core, buff, WMA_CODECDATA_SIZE); if (ret != MC_ERROR_NONE) { LOGW("__mc_set_caps_codecdata failed"); - return ret; } break; case MEDIACODEC_VORBIS: @@ -1063,7 +1060,6 @@ static int _mc_gst_update_caps(mc_gst_core_t *core, media_packet_h pkt, GstMCBuf ret = __mc_set_caps_streamheader(core, buff, VORBIS_CODECDATA_SIZE); if (ret != MC_ERROR_NONE) { LOGW("__mc_set_caps_streamheader failed"); - return ret; } break; default: