static int gst_muxer_destroy(MMHandleType pHandle);
static int gst_muxer_set_error_cb(MMHandleType pHandle,
gst_muxer_error_cb callback, void* user_data);
-
-static int __gst_eos_callback(void *user_data);
static int gst_muxer_set_eos_cb(MMHandleType pHandle,
gst_muxer_eos_cb callback, void* user_data);
+static int __gst_eos_callback(void *user_data);
+static void __set_codec_data(mx_gst_track *track, media_packet_h pkt);
+
/* Media Muxer API common */
static media_port_muxer_ops def_mux_ops = {
.n_size = 0,
current->start_feed = 1;
current->stop_feed = 0;
current->caps = NULL;
+ current->codec_data = NULL;
current->next = NULL;
if (mx_handle_gst->track_info.track_head == NULL) {
MX_I("Adding first-ever track");
/* GstMapInfo map; */
int ret = MX_ERROR_NONE;
- /* get codec data and set caps */
- char *pkt_codec_data;
- unsigned int codec_data_size;
if (media_packet_get_buffer_size(out_pkt, &size) != MEDIA_PACKET_ERROR_NONE) {
MX_E("media_packet_get_buffer_size failed");
MX_I("Media packet Buffer capacity: %"PRIu64, size);
- if (media_packet_get_codec_data(out_pkt, (void **)&pkt_codec_data, &codec_data_size)
- == MEDIA_PACKET_ERROR_NONE) {
- GstCaps *appsrc_caps = NULL;
- GstCaps *new_appsrc_caps = NULL;
-
- if (codec_data_size) {
- gchar *codec_data_caps_string = NULL;
-
- g_object_get(G_OBJECT(current->appsrc), "caps", &appsrc_caps, NULL);
-
- codec_data_caps_string = gst_caps_to_string(appsrc_caps);
- MX_I("Appsrc caps is %s", codec_data_caps_string);
- g_free(codec_data_caps_string);
-
- if (appsrc_caps) {
- new_appsrc_caps = gst_caps_copy(appsrc_caps);
- gst_caps_unref(appsrc_caps);
- }
-
- if (new_appsrc_caps) {
- GstBuffer *codec_data_buffer = gst_buffer_new_allocate(NULL,
- codec_data_size, NULL);
- gst_buffer_fill(codec_data_buffer, 0, pkt_codec_data, codec_data_size);
- gst_caps_set_simple(new_appsrc_caps, "codec_data", GST_TYPE_BUFFER, codec_data_buffer, NULL);
- gst_buffer_unref(codec_data_buffer);
-
- codec_data_caps_string = gst_caps_to_string(new_appsrc_caps);
- MX_I("New appsrc caps is %s", codec_data_caps_string);
- g_free(codec_data_caps_string);
-
- g_object_set(G_OBJECT(current->appsrc), "caps", new_appsrc_caps, NULL);
- gst_caps_unref(new_appsrc_caps);
-
- }
- } else {
- MX_W("codec_data_size is zero");
- }
- }
+ __set_codec_data(current, out_pkt);
/* copy data */
data_ptr = (unsigned char *)g_malloc(size);
}
/* Reset the media_format and track_index to default. */
if (current) {
- media_format_unref((media_format_h)current->media_format);
- current->media_format = NULL;
+ if (current->media_format) {
+ media_format_unref((media_format_h)current->media_format);
+ current->media_format = NULL;
+ }
current->track_index = -1;
+ if (current->caps) {
+ gst_caps_unref(current->caps);
+ current->caps = NULL;
+ }
+ if (current->codec_data) {
+ gst_buffer_unref(current->codec_data);
+ current->codec_data = NULL;
+ }
}
MEDIAMUXER_FLEAVE();
return ret;
gst_caps_unref(prev->caps);
prev->caps = NULL;
}
- g_free(prev);
+ if (prev->codec_data) {
+ gst_buffer_unref(prev->codec_data);
+ prev->codec_data = NULL;
+ }
+ MEDIAMUXER_FREEIF(prev);
}
if (gst_handle->pipeline)
MX_E("EOS received, but callback is not set!!!");
return MX_ERROR_NONE;
}
+
+static void __set_codec_data(mx_gst_track *track, media_packet_h pkt)
+{
+ char *pkt_codec_data = NULL;
+ unsigned int codec_data_size = 0;
+ GstCaps *appsrc_caps = NULL;
+ GstCaps *new_appsrc_caps = NULL;
+ gchar *codec_data_caps_string = NULL;
+
+ if (track == NULL || pkt == NULL)
+ return;
+
+ if (media_packet_get_codec_data(pkt, (void **)&pkt_codec_data, &codec_data_size)
+ != MEDIA_PACKET_ERROR_NONE)
+ return;
+
+ if (!codec_data_size)
+ return;
+
+ if (track->codec_data && (gst_buffer_memcmp(track->codec_data, 0, (gconstpointer)pkt_codec_data,
+ codec_data_size) == 0))
+ return;
+
+ g_object_get(G_OBJECT(track->appsrc), "caps", &appsrc_caps, NULL);
+
+ codec_data_caps_string = gst_caps_to_string(appsrc_caps);
+ MX_I("Appsrc caps is %s", codec_data_caps_string);
+ g_free(codec_data_caps_string);
+
+ if (appsrc_caps) {
+ new_appsrc_caps = gst_caps_copy(appsrc_caps);
+ gst_caps_unref(appsrc_caps);
+ }
+
+ if (new_appsrc_caps) {
+ if (track->codec_data)
+ gst_buffer_unref(track->codec_data);
+
+ track->codec_data = gst_buffer_new_allocate(NULL, codec_data_size, NULL);
+ gst_buffer_fill(track->codec_data, 0, pkt_codec_data, codec_data_size);
+ gst_caps_set_simple(new_appsrc_caps, "codec_data", GST_TYPE_BUFFER, track->codec_data, NULL);
+
+ codec_data_caps_string = gst_caps_to_string(new_appsrc_caps);
+ MX_I("New appsrc caps is %s", codec_data_caps_string);
+ g_free(codec_data_caps_string);
+
+ g_object_set(G_OBJECT(track->appsrc), "caps", new_appsrc_caps, NULL);
+
+ gst_caps_unref(new_appsrc_caps);
+ }
+}