Apply codec_data when codec_data is changed 89/217389/1
authorGilbok Lee <gilbok.lee@samsung.com>
Fri, 1 Nov 2019 06:33:01 +0000 (15:33 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Mon, 11 Nov 2019 07:35:55 +0000 (07:35 +0000)
[Version] 0.1.21
[Issue Type] Update

Change-Id: I271a5ddf09ad588a856bec028c2f5d8b15d78b86
(cherry picked from commit e596816201553dd6fe3002c29085beea09d2a5c7)

include/port_gst/mediamuxer_port_gst.h
packaging/capi-mediamuxer.spec
src/port_gst/mediamuxer_port_gst.c

index aef0271f1d578ea5e9513ca63aaadc90e2bcdb37..b7b6ff9e0eeee5de2770c801be3b09f9cd99ea1f 100644 (file)
@@ -49,6 +49,7 @@ typedef enum {
 typedef struct _mx_gst_track {
        void *media_format;
        GstCaps *caps;
+       GstBuffer *codec_data;
        int track_index;
        int start_feed;
        int stop_feed;
index 4b58b97c93c61b0502195481afd5bd3aeeec263b..b29bdbd28e77c357d006f3f251ac08658e886dce 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-mediamuxer
 Summary:    A Media Muxer library in Tizen Native API
-Version:    0.1.20
+Version:    0.1.21
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
index d391e29463d3b41e3d3e37cb1dfd18959ff69c5f..1568d1598a935c5e0ff32d84f270d5a2bd62f04d 100644 (file)
@@ -46,11 +46,12 @@ static int gst_muxer_unprepare(MMHandleType pHandle);
 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,
@@ -501,6 +502,7 @@ static int gst_muxer_add_track(MMHandleType pHandle,
        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");
@@ -1162,9 +1164,6 @@ static int _gst_copy_media_packet_to_buf(mx_gst_track *current, media_packet_h o
        /* 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");
@@ -1178,44 +1177,7 @@ static int _gst_copy_media_packet_to_buf(mx_gst_track *current, media_packet_h o
 
        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);
@@ -1446,9 +1408,19 @@ static int gst_muxer_close_track(MMHandleType pHandle, int track_index)
        }
        /* 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;
@@ -1539,7 +1511,11 @@ mx_ret_e _gst_destroy_pipeline(mxgst_handle_t *gst_handle)
                        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)
@@ -1646,3 +1622,54 @@ static int __gst_eos_callback(void* user_data)
                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);
+       }
+}