Modify to be set codecdata 05/103005/2 accepted/tizen/3.0/common/20161216.123807 accepted/tizen/3.0/ivi/20161216.084329 accepted/tizen/3.0/mobile/20161216.083931 accepted/tizen/3.0/tv/20161216.084053 accepted/tizen/3.0/wearable/20161216.084150 submit/tizen_3.0/20161213.081002 submit/tizen_3.0/20161215.110001
authorSejun Park <sejun79.park@samsung.com>
Wed, 7 Dec 2016 04:29:59 +0000 (13:29 +0900)
committerSejun Park <sejun79.park@samsung.com>
Wed, 7 Dec 2016 04:40:45 +0000 (13:40 +0900)
Change-Id: Ib7807e50f3dcec8876fde872e0694458392dcc04

include/media_codec_port_gst.h
src/media_codec_port_gst.c

index 56e28f2..64536ad 100755 (executable)
@@ -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
index fedaba5..fc9ddaf 100755 (executable)
@@ -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: