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) {
"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) {
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:
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:
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: