Modify to set up gst_caps usig media_format in media_packet 90/82290/9 accepted/tizen/3.0/ivi/20161011.055355 accepted/tizen/common/20160928.163952 accepted/tizen/ivi/20160930.040756 accepted/tizen/mobile/20160930.040438 accepted/tizen/tv/20160930.040606 accepted/tizen/wearable/20160930.040702 submit/tizen/20160928.043825 submit/tizen_3.0_ivi/20161010.000005
authorGilbok Lee <gilbok.lee@samsung.com>
Tue, 2 Aug 2016 11:44:37 +0000 (20:44 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Wed, 28 Sep 2016 06:01:41 +0000 (15:01 +0900)
Add testcode for using mediamuxer

Change-Id: I953db0d7e1cc3150340e3f4c7970f4c9b13bcb3a

CMakeLists.txt
include/mediamuxer_private.h
include/port_gst/mediamuxer_port_gst.h
packaging/capi-mediamuxer.spec
src/mediamuxer.c
src/port_gst/mediamuxer_port_gst.c
test/mediamuxer_test.c
test/mediamuxer_test_with_demuxer.c [new file with mode: 0644]

index 49ce305..8342a53 100755 (executable)
@@ -13,7 +13,7 @@ SET(INC_PORT_CUSTOM_DIR include/port_custom)
 SET(INC_PORT_FFMPEG_DIR include/port_ffmpeg)
 INCLUDE_DIRECTORIES(${INC_DIR} ${INC_PORT_GST_DIR} ${INC_PORT_CUSTOM_DIR} ${INC_PORT_FFMPEG_DIR})
 
-SET(dependents "dlog glib-2.0 mm-common capi-media-tool iniparser gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 capi-media-codec")
+SET(dependents "dlog glib-2.0 mm-common capi-media-tool iniparser gstreamer-1.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 capi-media-codec capi-mediademuxer")
 SET(pc_dependents "capi-base-common capi-media-tool")
 
 INCLUDE(FindPkgConfig)
index f2fa12b..9761db0 100755 (executable)
@@ -81,15 +81,8 @@ typedef enum {
 
 typedef struct _mediamuxer_s {
        MMHandleType mx_handle;
-       const void *user_cb[MEDIAMUXER_EVENT_TYPE_NUM];
-       void *user_data[MEDIAMUXER_EVENT_TYPE_NUM];
-       void *display_handle;
-       int state;
-       bool is_set_pixmap_cb;
+       mediamuxer_state_e state;
        bool is_stopped;
-       bool is_display_visible;
-       bool is_progressive_download;
-       pthread_t prepare_async_thread;
        mediamuxer_error_cb error_cb;
        void* error_cb_userdata;
        mediamuxer_state_e muxer_state;
index e7a3ed7..ea1da7e 100755 (executable)
@@ -25,6 +25,7 @@
 
 #define MAX_STRING_LENGTH 25
 #define NO_OF_TRACK_TYPES 3    /* Audio, Video and Subtitle */
+#define ADTS_HEADER_SIZE 7
 
 #define MEDIAMUXER_ELEMENT_SET_STATE(x_element, x_state) \
        MX_I("setting state [%s:%d] to [%s]\n", #x_state, x_state, GST_ELEMENT_NAME(x_element)); \
@@ -47,7 +48,7 @@ typedef enum {
 /* GST port Private data */
 typedef struct _mx_gst_track {
        void *media_format;
-       char *caps;
+       GstCaps *caps;
        int track_index;
        int start_feed;
        int stop_feed;
@@ -91,7 +92,7 @@ typedef struct _mxgst_handle_t {
  * @see mediamuxer_set_error_cb()
  * @see mediamuxer_unset_error_cb()
  */
-typedef void (*gst_error_cb)(mediamuxer_error_e error, void *user_data);
+typedef void (*gst_muxer_error_cb)(mediamuxer_error_e error, void *user_data);
 
 #ifdef __cplusplus
 }
index 6ce0fa4..def0330 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       capi-mediamuxer
 Summary:    A Media Muxer library in Tizen Native API
-Version:    0.1.3
+Version:    0.1.4
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
@@ -18,6 +18,7 @@ BuildRequires:  pkgconfig(gstreamer-video-1.0)
 BuildRequires:  pkgconfig(gstreamer-app-1.0)
 BuildRequires:  pkgconfig(iniparser)
 BuildRequires:  pkgconfig(capi-media-codec)
+BuildRequires:  pkgconfig(capi-mediademuxer)
 
 %description
 
index b928d82..31690bd 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <dlog.h>
+
 #include <mediamuxer_port.h>
 #include <mediamuxer.h>
 #include <mediamuxer_private.h>
-#include <dlog.h>
 
 #ifndef USE_TASK_QUEUE
 #define USE_TASK_QUEUE
@@ -38,7 +39,7 @@ int mediamuxer_create(mediamuxer_h *muxer)
        MUXER_INSTANCE_CHECK(muxer);
 
        mediamuxer_s *handle;
-       handle = (mediamuxer_s *) malloc(sizeof(mediamuxer_s));
+       handle = (mediamuxer_s *)g_malloc(sizeof(mediamuxer_s));
        if (handle != NULL) {
                memset(handle, 0, sizeof(mediamuxer_s));
                handle->muxer_state = MEDIAMUXER_STATE_NONE;
@@ -52,11 +53,11 @@ int mediamuxer_create(mediamuxer_h *muxer)
        if (ret != MEDIAMUXER_ERROR_NONE) {
                MX_E("[CoreAPI][%s] MUXER_ERROR_INVALID_OPERATION(0x%08x)\n",
                     __FUNCTION__, MEDIAMUXER_ERROR_INVALID_OPERATION);
-               free(handle);
+               g_free(handle);
                handle = NULL;
                return MEDIAMUXER_ERROR_INVALID_OPERATION;
        } else {
-               *muxer = (mediamuxer_h) handle;
+               *muxer = (mediamuxer_h)handle;
                handle->is_stopped = false;
                MX_I("[CoreAPI][%s] new handle : %p", __FUNCTION__, *muxer);
 
index d2f1ed1..4a1a4e8 100755 (executable)
@@ -40,8 +40,9 @@ static int gst_muxer_resume(MMHandleType pHandle);
 static int gst_muxer_stop(MMHandleType pHandle);
 static int gst_muxer_unprepare(MMHandleType pHandle);
 static int gst_muxer_destroy(MMHandleType pHandle);
-static int gst_set_error_cb(MMHandleType pHandle,
-                       gst_error_cb callback, void* user_data);
+static int gst_muxer_set_error_cb(MMHandleType pHandle,
+                       gst_muxer_error_cb callback, void* user_data);
+static void _generate_header_aac_adts(unsigned char *buffer, int packetLen, int samplerate, int channel);
 
 /* Media Muxer API common */
 static media_port_muxer_ops def_mux_ops = {
@@ -58,7 +59,7 @@ static media_port_muxer_ops def_mux_ops = {
        .stop = gst_muxer_stop,
        .unprepare = gst_muxer_unprepare,
        .destroy = gst_muxer_destroy,
-       .set_error_cb = gst_set_error_cb,
+       .set_error_cb = gst_muxer_set_error_cb,
 };
 
 int gst_mediamuxer_port_register(media_port_muxer_ops *pOps)
@@ -102,6 +103,9 @@ static int gst_muxer_init(MMHandleType *pHandle)
 
        new_mediamuxer->eos_flg = false;
        *pHandle = (MMHandleType) new_mediamuxer;
+
+       gst_init(NULL, NULL);
+
        MEDIAMUXER_FLEAVE();
        return ret;
 ERROR:
@@ -119,12 +123,259 @@ static int gst_muxer_set_data_sink(MMHandleType pHandle,
        mxgst_handle_t *mx_handle_gst = (mxgst_handle_t *) pHandle;
 
        /* Set desired parameters */
-       mx_handle_gst->output_uri = uri;
+       MEDIAMUXER_FREEIF(mx_handle_gst->output_uri);
+       mx_handle_gst->output_uri = g_strdup((const gchar *)uri);
        mx_handle_gst->muxed_format = format;
        MEDIAMUXER_FLEAVE();
        return ret;
 }
 
+static GstCaps * __gst_codec_specific_caps(media_format_mimetype_e mimetype)
+{
+       MEDIAMUXER_FENTER();
+       GstCaps *new_caps = NULL;
+       switch (mimetype) {
+       /* video */
+       case MEDIA_FORMAT_H261:
+               break;
+       case MEDIA_FORMAT_H263:
+       case MEDIA_FORMAT_H263P:
+               new_caps = gst_caps_new_simple("video/x-h263",
+                       "variant", G_TYPE_STRING, "itu", NULL);
+               if (!new_caps) {
+                       MX_E("Fail to make simple caps");
+                       return NULL;
+               }
+               break;
+       case MEDIA_FORMAT_H264_SP:
+       case MEDIA_FORMAT_H264_MP:
+       case MEDIA_FORMAT_H264_HP:
+               new_caps = gst_caps_new_simple("video/x-h264",
+                       "stream-format", G_TYPE_STRING, "byte-stream", NULL);
+               if (!new_caps) {
+                       MX_E("Fail to make simple caps");
+                       return NULL;
+               }
+               break;
+       case MEDIA_FORMAT_MJPEG:
+               break;
+       case MEDIA_FORMAT_MPEG1:
+               break;
+       case MEDIA_FORMAT_MPEG2_SP:
+               break;
+       case MEDIA_FORMAT_MPEG2_MP:
+               break;
+       case MEDIA_FORMAT_MPEG2_HP:
+               break;
+       case MEDIA_FORMAT_MPEG4_SP:
+               new_caps = gst_caps_new_simple("video/mpeg",
+                       "mpegversion", G_TYPE_INT, 4, NULL);
+               if (!new_caps) {
+                       MX_E("Fail to make simple caps");
+                       return NULL;
+               }
+               break;
+       case MEDIA_FORMAT_MPEG4_ASP:
+               break;
+       case MEDIA_FORMAT_HEVC:
+               break;
+       case MEDIA_FORMAT_VP8:
+               break;
+       case MEDIA_FORMAT_VP9:
+               break;
+       case MEDIA_FORMAT_VC1:
+               break;
+       case MEDIA_FORMAT_I420:
+               break;
+       case MEDIA_FORMAT_NV12:
+               break;
+       case MEDIA_FORMAT_NV12T:
+               break;
+       case MEDIA_FORMAT_YV12:
+               break;
+       case MEDIA_FORMAT_NV21:
+               break;
+       case MEDIA_FORMAT_NV16:
+               break;
+       case MEDIA_FORMAT_YUYV:
+               break;
+       case MEDIA_FORMAT_UYVY:
+               break;
+       case MEDIA_FORMAT_422P:
+               break;
+       case MEDIA_FORMAT_RGB565:
+               break;
+       case MEDIA_FORMAT_RGB888:
+               break;
+       case MEDIA_FORMAT_RGBA:
+               break;
+       case MEDIA_FORMAT_ARGB:
+               break;
+               /* audio */
+       case MEDIA_FORMAT_L16:
+               break;
+       case MEDIA_FORMAT_ALAW:
+               break;
+       case MEDIA_FORMAT_ULAW:
+               break;
+       case MEDIA_FORMAT_AMR_NB:
+               new_caps = gst_caps_new_empty_simple("audio/x-amr-nb-sh");
+               if (!new_caps) {
+                       MX_E("Fail to make simple caps");
+                       return NULL;
+               }
+               break;
+       case MEDIA_FORMAT_AMR_WB:
+               new_caps = gst_caps_new_empty_simple("audio/x-amr-wb-sh");
+               if (!new_caps) {
+                       MX_E("Fail to make simple caps");
+                       return NULL;
+               }
+               break;
+       case MEDIA_FORMAT_G729:
+               break;
+       case MEDIA_FORMAT_AAC_LC:
+               new_caps = gst_caps_new_simple("audio/mpeg",
+                       "mpegversion", G_TYPE_INT, 4, NULL);
+               if (!new_caps) {
+                       MX_E("Fail to make simple caps");
+                       return NULL;
+               }
+               break;
+       case MEDIA_FORMAT_AAC_HE:
+               new_caps = gst_caps_new_simple("audio/mpeg",
+                       "mpegversion", G_TYPE_INT, 4, NULL);
+               if (!new_caps) {
+                       MX_E("Fail to make simple caps");
+                       return NULL;
+               }
+               break;
+       case MEDIA_FORMAT_AAC_HE_PS:
+               new_caps = gst_caps_new_simple("audio/mpeg",
+                       "mpegversion", G_TYPE_INT, 4, NULL);
+               if (!new_caps) {
+                       MX_E("Fail to make simple caps");
+                       return NULL;
+               }
+               break;
+       case MEDIA_FORMAT_MP3:
+               break;
+       case MEDIA_FORMAT_VORBIS:
+               break;
+       case MEDIA_FORMAT_PCM:
+               break;
+       case MEDIA_FORMAT_PCMA:
+               break;
+       case MEDIA_FORMAT_PCMU:
+               break;
+       default:
+               MX_E("Unknown media mimeype %d. Assuming H264\n", mimetype);
+               break;
+       }
+       MEDIAMUXER_FLEAVE();
+       return new_caps;
+}
+
+int _gst_set_caps(MMHandleType pHandle, media_format_h format, int track_index)
+{
+       MEDIAMUXER_FENTER();
+       gint ret = MX_ERROR_NONE;
+       GstCaps *new_caps;
+       mxgst_handle_t *gst_handle = (mxgst_handle_t *) pHandle;
+       media_format_type_e formattype;
+       mx_gst_track *current = NULL;
+       media_format_mimetype_e current_mime;
+
+       /* Reach that track index and set the codec data */
+       for (current = gst_handle->track_info.track_head; current; current = current->next)
+               if (current->track_index == track_index)
+                       break;
+
+       if ((!current) || (current->track_index != track_index)) {
+               ret = MX_ERROR_COMMON_INVALID_ARGUMENT;
+               goto ERROR;
+       }
+
+       if (media_format_get_type(format, &formattype)) {
+               MX_E("media_format_get_type failed\n");
+               goto ERROR;
+       }
+
+       switch (formattype) {
+       case MEDIA_FORMAT_AUDIO:
+               /* Following check is safe but not mandatory. */
+               if ((current->track_index)%NO_OF_TRACK_TYPES != 1) {
+                       MX_E("This is not an audio track_index. Track_index is not in 3*n+1 format\n");
+                       goto ERROR;
+               }
+
+               /* return if track_mime is different to current_mime */
+               if (media_format_get_audio_info(format, &current_mime, NULL, NULL, NULL, NULL)
+                               != MEDIA_FORMAT_ERROR_NONE) {
+                       MX_E("cant read audio mime in packet. returning\n");
+                       return MX_ERROR_INVALID_ARGUMENT;
+               }
+
+               if (current->caps == NULL) {
+
+                       new_caps = __gst_codec_specific_caps(current_mime);
+
+                       if (new_caps == NULL) {
+                               MX_E("Setting Audio caps failed\n");
+                               ret = MX_ERROR_UNKNOWN;
+                               break;
+                       }
+                       gchar *caps_string = NULL;
+                       caps_string = gst_caps_to_string(new_caps);
+                       MX_I("New cap is = %s\n", caps_string);
+                       if (caps_string)
+                               g_free(caps_string);
+                       current->caps = new_caps;
+               }
+               break;
+       case MEDIA_FORMAT_VIDEO:
+               /* Following check is safe but not mandatory. */
+               if ((current->track_index)%NO_OF_TRACK_TYPES != 0) {
+                       MX_E("This is not an video track_index. Video track_index is not in 3*n format\n");
+                       goto ERROR;
+               }
+
+               /* return if track_mime is different to current_mime */
+               if (media_format_get_video_info(format, &current_mime, NULL, NULL, NULL, NULL)
+                               != MEDIA_FORMAT_ERROR_NONE) {
+                       MX_E("cant read video mime. returning\n");
+                       return MX_ERROR_INVALID_ARGUMENT;
+               }
+
+               if (current->caps == NULL) {
+                       new_caps = __gst_codec_specific_caps(current_mime);
+                       if (new_caps == NULL) {
+                               MX_E("Setting Audio caps failed\n");
+                               ret = MX_ERROR_UNKNOWN;
+                               break;
+                       }
+                       gchar *caps_string = NULL;
+                       caps_string = gst_caps_to_string(new_caps);
+                       MX_I("New cap is = %s\n", caps_string);
+                       if (caps_string)
+                               g_free(caps_string);
+                       current->caps = new_caps;
+               }
+               break;
+
+       case MEDIA_FORMAT_CONTAINER:
+       case MEDIA_FORMAT_UNKNOWN:
+       default:
+               MX_E("Unknown format type\n");
+       }
+       MEDIAMUXER_FLEAVE();
+       return ret;
+ERROR:
+       ret = MX_ERROR_UNKNOWN;
+       MEDIAMUXER_FLEAVE();
+       return ret;
+}
+
 static int gst_muxer_add_track(MMHandleType pHandle,
                        media_format_h media_format, int *track_index)
 {
@@ -149,6 +400,7 @@ static int gst_muxer_add_track(MMHandleType pHandle,
        }
        MX_I("Memory allocated to track = %p\n", current);
        current->media_format = (void *)media_format;
+       media_format_ref((media_format_h)current->media_format);
        current->start_feed = 1;
        current->stop_feed = 0;
        current->caps = NULL;
@@ -165,8 +417,8 @@ static int gst_muxer_add_track(MMHandleType pHandle,
                last->next = current;
        }
 
-       if (media_format_get_video_info(media_format, &mimetype, NULL, NULL, NULL, NULL)
-               == MEDIA_FORMAT_ERROR_NONE) {
+       if (media_format_get_video_info((media_format_h)current->media_format,
+               &mimetype, NULL, NULL, NULL, NULL) == MEDIA_FORMAT_ERROR_NONE) {
                if ((mx_handle_gst->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_MP4
                                && (mimetype == MEDIA_FORMAT_H264_SP  || mimetype == MEDIA_FORMAT_H264_MP || mimetype == MEDIA_FORMAT_H264_HP
                                || mimetype == MEDIA_FORMAT_H263
@@ -185,8 +437,8 @@ static int gst_muxer_add_track(MMHandleType pHandle,
                }  else {
                        MX_E("Unsupported/Mismatched video MIME Type: %x\n", mimetype);
                }
-       } else if (media_format_get_audio_info(media_format, &mimetype, NULL, NULL, NULL, NULL) ==
-               MEDIA_FORMAT_ERROR_NONE) {
+       } else if (media_format_get_audio_info((media_format_h)current->media_format,
+               &mimetype, NULL, NULL, NULL, NULL) == MEDIA_FORMAT_ERROR_NONE) {
                if ((mx_handle_gst->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_MP4
                                && (mimetype == MEDIA_FORMAT_AAC_LC || mimetype == MEDIA_FORMAT_AAC_HE || mimetype == MEDIA_FORMAT_AAC_HE_PS))
                        || (mx_handle_gst->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_3GP
@@ -211,8 +463,8 @@ static int gst_muxer_add_track(MMHandleType pHandle,
                } else {
                        MX_E("Unsupported/Mismatched audio MIME Type: %x\n", mimetype);
                }
-       } else if (media_format_get_text_info(media_format, &mimetype, &text_type_e)
-               == MEDIA_FORMAT_ERROR_NONE) {
+       } else if (media_format_get_text_info((media_format_h)current->media_format,
+               &mimetype, &text_type_e) == MEDIA_FORMAT_ERROR_NONE) {
                if ((mimetype == MEDIA_FORMAT_TEXT_MP4)
                        && (mx_handle_gst->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_MP4
                        || mx_handle_gst->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_3GP)) {
@@ -231,6 +483,11 @@ static int gst_muxer_add_track(MMHandleType pHandle,
        } else {
                MX_E("Unsupported A/V/Subs MIME Type: %x\n", mimetype);
        }
+       ret = _gst_set_caps(mx_handle_gst, (media_format_h)current->media_format, *track_index);
+       if (ret != MX_ERROR_NONE) {
+               MX_E("Set caps error");
+               return ret;
+       }
        MEDIAMUXER_FLEAVE();
        return ret;
 }
@@ -346,7 +603,8 @@ static gboolean _mx_gst_bus_call(GstBus *bus, GstMessage *msg, gpointer data)
                                else
                                        MX_I("Unknown GStreamer callback error\n");
                                /* Update the user callback with ret value */
-                               ((gst_error_cb)gst_handle->user_cb[_GST_EVENT_TYPE_ERROR])(error_val, (void*)error->message);
+                               ((gst_muxer_error_cb)gst_handle->user_cb[_GST_EVENT_TYPE_ERROR])
+                                       (error_val, gst_handle->user_data[_GST_EVENT_TYPE_ERROR]);
 
                                return ret;
                        }
@@ -452,7 +710,6 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle)
 
        /* Initialize GStreamer */
        /* Note: Replace the arguments of gst_init to pass the command line args to GStreamer. */
-       gst_init(NULL, NULL);
 
        /* Create the empty pipeline */
        gst_handle->pipeline = gst_pipeline_new("Muxer Gst pipeline");
@@ -471,7 +728,7 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle)
                goto ERROR;
        } else {
                if (gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_MP4)
-                       gst_handle->muxer = gst_element_factory_make("qtmux", "qtmux");
+                       gst_handle->muxer = gst_element_factory_make("mp4mux", "mp4mux");
                        /* gst_element_factory_make("mp4mux", "mp4mux"); */
                else if (gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_3GP)
                        gst_handle->muxer = gst_element_factory_make("3gppmux", "3gppmux");
@@ -540,6 +797,11 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle)
                                        gst_app_src_set_stream_type((GstAppSrc *)current->appsrc,
                                                GST_APP_STREAM_TYPE_STREAM);
 #endif
+                                       if (current->caps)
+                                               g_object_set(current->appsrc, "caps", current->caps, NULL);
+
+                                       g_object_set(current->appsrc, "max-bytes", (guint64)3 * 1024 * 1024, NULL);
+
                                        gst_element_link(current->appsrc, current->parser);
 
                                        /* Link videoparse to muxer_video_pad.   Request for muxer A/V pads. */
@@ -613,6 +875,11 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle)
                                        gst_app_src_set_stream_type((GstAppSrc *)current->appsrc,
                                                GST_APP_STREAM_TYPE_STREAM);
 #endif
+                                       if (current->caps)
+                                               g_object_set(current->appsrc, "caps", current->caps, NULL);
+
+                                       g_object_set(current->appsrc, "max-bytes", 3 * 1024 * 1024, NULL);
+
                                        /* For wav, wavenc is muxer */
                                        if (gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_WAV
                                                || gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_AAC_ADTS
@@ -656,7 +923,8 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle)
                                        gst_bin_add_many(GST_BIN(gst_handle->pipeline), current->appsrc, NULL);
 
                                        /* Set subtitle_caps for corresponding src elements */
-                                       g_object_set(current->appsrc, "caps", gst_caps_from_string(current->caps), NULL);
+                                       if (current->caps)
+                                               g_object_set(current->appsrc, "caps", current->caps, NULL);
                                        g_object_set(current->appsrc, "format", GST_FORMAT_TIME, NULL);
 
 #ifdef ASYCHRONOUS_WRITE
@@ -756,462 +1024,82 @@ STATE_CHANGE_FAILED:
        return ret;
 }
 
-int __gst_codec_specific_caps(GstCaps *new_cap,
-                               media_format_mimetype_e mimetype)
+static int _gst_copy_media_packet_to_buf(mx_gst_track *current, media_packet_h out_pkt,
+                                               GstBuffer *buffer)
 {
+       void *pkt_data;
+       uint64_t size;
+       unsigned char *data_ptr = NULL;
        MEDIAMUXER_FENTER();
-       GValue val = G_VALUE_INIT;
-       switch (mimetype) {
-       /* video */
-       case MEDIA_FORMAT_H261:
-               break;
-       case MEDIA_FORMAT_H263:
-               break;
-       case MEDIA_FORMAT_H263P:
-               break;
-       case MEDIA_FORMAT_H264_SP:
-               break;
-       case MEDIA_FORMAT_H264_MP:
-               break;
-       case MEDIA_FORMAT_H264_HP:
-               break;
-       case MEDIA_FORMAT_MJPEG:
-               break;
-       case MEDIA_FORMAT_MPEG1:
-               break;
-       case MEDIA_FORMAT_MPEG2_SP:
-               break;
-       case MEDIA_FORMAT_MPEG2_MP:
-               break;
-       case MEDIA_FORMAT_MPEG2_HP:
-               break;
-       case MEDIA_FORMAT_MPEG4_SP:
-               break;
-       case MEDIA_FORMAT_MPEG4_ASP:
-               break;
-       case MEDIA_FORMAT_HEVC:
-               break;
-       case MEDIA_FORMAT_VP8:
-               break;
-       case MEDIA_FORMAT_VP9:
-               break;
-       case MEDIA_FORMAT_VC1:
-               break;
-       case MEDIA_FORMAT_I420:
-               break;
-       case MEDIA_FORMAT_NV12:
-               break;
-       case MEDIA_FORMAT_NV12T:
-               break;
-       case MEDIA_FORMAT_YV12:
-               break;
-       case MEDIA_FORMAT_NV21:
-               break;
-       case MEDIA_FORMAT_NV16:
-               break;
-       case MEDIA_FORMAT_YUYV:
-               break;
-       case MEDIA_FORMAT_UYVY:
-               break;
-       case MEDIA_FORMAT_422P:
-               break;
-       case MEDIA_FORMAT_RGB565:
-               break;
-       case MEDIA_FORMAT_RGB888:
-               break;
-       case MEDIA_FORMAT_RGBA:
-               break;
-       case MEDIA_FORMAT_ARGB:
-               break;
-               /* audio */
-       case MEDIA_FORMAT_L16:
-               break;
-       case MEDIA_FORMAT_ALAW:
-               break;
-       case MEDIA_FORMAT_ULAW:
-               break;
-       case MEDIA_FORMAT_AMR_NB:
-               break;
-       case MEDIA_FORMAT_AMR_WB:
-               break;
-       case MEDIA_FORMAT_G729:
-               break;
-       case MEDIA_FORMAT_AAC_LC:
-               g_value_init(&val, G_TYPE_INT);
-               g_value_set_int(&val, 4);
-               gst_caps_set_value(new_cap, "mpegversion", &val);
-               break;
-       case MEDIA_FORMAT_AAC_HE:
-               g_value_init(&val, G_TYPE_INT);
-               g_value_set_int(&val, 4);
-               gst_caps_set_value(new_cap, "mpegversion", &val);
-               break;
-       case MEDIA_FORMAT_AAC_HE_PS:
-               g_value_init(&val, G_TYPE_INT);
-               g_value_set_int(&val, 4);
-               gst_caps_set_value(new_cap, "mpegversion", &val);
-               break;
-       case MEDIA_FORMAT_MP3:
-               break;
-       case MEDIA_FORMAT_VORBIS:
-               break;
-       case MEDIA_FORMAT_PCM:
-               break;
-       case MEDIA_FORMAT_PCMA:
-               break;
-       case MEDIA_FORMAT_PCMU:
-               break;
-       default:
-               MX_E("Unknown media mimeype %d. Assuming H264\n", mimetype);
-               break;
-       }
-       MEDIAMUXER_FLEAVE();
-       return 0;
-}
-
+       MEDIAMUXER_CHECK_NULL(out_pkt);
+       /* GstMapInfo map; */
+       int ret = MX_ERROR_NONE;
 
-int _gst_set_caps(MMHandleType pHandle, media_packet_h packet, int track_index)
-{
-       MEDIAMUXER_FENTER();
-       gint ret = MX_ERROR_NONE;
-       GstCaps *new_cap;
-       media_format_h format;
-       mxgst_handle_t *gst_handle = (mxgst_handle_t *) pHandle;
-       media_format_type_e formattype;
-       char *codec_data;
+#if 0
+       /* get codec data and set caps */
+       char *pkt_codec_data;
        unsigned int codec_data_size;
-       mx_gst_track *current = NULL;
-       media_format_mimetype_e track_mime;
-       media_format_mimetype_e current_mime;
-
-       /* Reach that track index and set the codec data */
-       for (current = gst_handle->track_info.track_head; current; current = current->next)
-               if (current->track_index == track_index)
-                       break;
-
-       if ((!current) || (current->track_index != track_index)) {
-               ret = MX_ERROR_COMMON_INVALID_ARGUMENT;
-               goto ERROR;
-       }
-
-       if (media_packet_get_format(packet, &format)) {
-               MX_E("media_format_get_formati call failed \n");
-               goto ERROR;
-       }
 
-       if (media_format_get_type(format, &formattype)) {
-               MX_E("media_format_get_type failed\n");
-               goto ERROR;
+       if (media_packet_get_codec_data(out_pkt, (void **)&pkt_codec_data, &codec_data_size) == 0) {
+               GstCaps *appsrc_caps = NULL;
+               GstCaps *new_appsrc_caps = NULL;
+               GstBuffer *codec_data_buffer = NULL;
+               codec_data_buffer = gst_buffer_new();
+               gchar *codec_data_caps_string = NULL;
+               gst_buffer_append_memory(codec_data_buffer,
+                               gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, pkt_codec_data, codec_data_size, 0,
+                                       codec_data_size, pkt_codec_data, NULL));
+
+               g_object_get(G_OBJECT(current->appsrc), "caps", &appsrc_caps, NULL);
+               codec_data_caps_string = gst_caps_to_string(appsrc_caps);
+               MX_I("[LGB] 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);
+
+               if (new_appsrc_caps)
+                       gst_caps_set_simple(new_appsrc_caps, "codec_data", GST_TYPE_BUFFER, codec_data_buffer, NULL);
+
+               codec_data_caps_string = gst_caps_to_string(new_appsrc_caps);
+               MX_I("[LGB] 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(appsrc_caps);
+               gst_caps_unref(new_appsrc_caps);
+               gst_buffer_unref(codec_data_buffer);
+               MX_I("codec data is %p, codec_data_size %u", pkt_codec_data, codec_data_size);
        }
-
-       switch (formattype) {
-       case MEDIA_FORMAT_AUDIO:
-               /* Following check is safe but not mandatory. */
-               if ((current->track_index)%NO_OF_TRACK_TYPES != 1) {
-                       MX_E("This is not an audio track_index. Track_index is not in 3*n+1 format\n");
-                       goto ERROR;
-               }
-
-               /* return if track_mime is different to current_mime */
-               if (media_format_get_audio_info((media_format_h)(current->media_format), &track_mime, NULL, NULL, NULL, NULL)
-                       == MEDIA_FORMAT_ERROR_NONE) {
-                       if (media_format_get_audio_info((media_format_h)(format), &current_mime, NULL, NULL, NULL, NULL)
-                               == MEDIA_FORMAT_ERROR_NONE) {
-                               if (track_mime != current_mime) {
-                                       MX_E("audio track_mime is not matching with packet mime. returning\n");
-                                       return MX_ERROR_INVALID_ARGUMENT;
-                               }
-                       } else {
-                               MX_E("cant read audio mime in packet. returning\n");
-                               return MX_ERROR_INVALID_ARGUMENT;
-                       }
-               } else {
-                       MX_E("cant read audio mime, set during add_track. returning\n");
-                       return MX_ERROR_INVALID_ARGUMENT;
-               }
-
-               if (media_packet_get_extra(packet,
-                               (void **)&codec_data)) {
-                       MX_E("media_packet_get_extra call failed\n");
-                       ret = MX_ERROR_UNKNOWN;
-                       break;
-               }
-               codec_data_size = strlen(codec_data) + 1;
-
-               if ((strlen(codec_data)+1) != codec_data_size) {
-                       MX_E("strlen(codec_data)+1 is not matching with codec_data_size. They are supposed to be equal.\n");
-                       return MX_ERROR_INVALID_ARGUMENT;
-               }
-               MX_I("Extracted codec data is =%s size is %d\n", codec_data, codec_data_size);
-
-               if (current->caps == NULL ||
-                       g_strcmp0(codec_data, current->caps) != 0) {
-
-#ifdef SEND_FULL_CAPS_VIA_CODEC_DATA
-                       /* Debugging purpose. The whole caps filter can be sent via codec_data */
-                       new_cap = gst_caps_from_string(codec_data);
-                       MX_I("codec  cap is=%s\n", codec_data);
-                       g_object_set(current->appsrc, "caps", new_cap, NULL);
-                       if (current->caps == NULL) {
-                               current->caps = (char *)g_malloc(codec_data_size);
-                               if (current->caps == NULL) {
-                                       MX_E("[%s][%d] memory allocation failed\n", __func__, __LINE__);
-                                       gst_caps_unref(new_cap);
-                                       ret = MX_ERROR_UNKNOWN;
-                                       break;
-                               }
-                       }
-                       g_stpcpy(current->caps, codec_data);
-#else
-                       gchar *caps_string = NULL;
-                       int channel = 0;
-                       int samplerate = 0;
-                       int bit = 0;
-                       int avg_bps = 0;
-                       media_format_mimetype_e mimetype = MEDIA_FORMAT_MAX;
-                       if (media_format_get_audio_info(format,
-                               &mimetype, &channel, &samplerate,
-                               &bit, &avg_bps)) {
-                               MX_E("media_format_get_audio_info call failed\n");
-                               ret = MX_ERROR_UNKNOWN;
-                               break;
-                       }
-                       if (current->caps == NULL) {
-                               current->caps = (char *)g_malloc(codec_data_size);
-                               if (current->caps == NULL) {
-                                       MX_E("[%s][%d]memory allocation failed\n", __func__, __LINE__);
-                                       ret = MX_ERROR_UNKNOWN;
-                                       break;
-                               }
-                       }
-                       new_cap = gst_caps_from_string(codec_data);
-                       if (__gst_codec_specific_caps(new_cap, mimetype)) {
-                               MX_E("Setting Audio caps failed\n");
-                               gst_caps_unref(new_cap);
-                               ret = MX_ERROR_UNKNOWN;
-                               break;
-                       }
-                       caps_string = gst_caps_to_string(new_cap);
-                       MX_I("New cap set by codec data is = %s\n",
-                            caps_string);
-                       if (caps_string)
-                               g_free(caps_string);
-                       g_object_set(current->appsrc, "caps", new_cap, NULL);
-                       MX_I("copying   current->caps = codec_data\n");
-                       g_stpcpy(current->caps, codec_data);
 #endif
-                       gst_caps_unref(new_cap);
-               }
-               break;
-       case MEDIA_FORMAT_VIDEO:
-               /* Following check is safe but not mandatory. */
-               if ((current->track_index)%NO_OF_TRACK_TYPES != 0) {
-                       MX_E("This is not an video track_index. Video track_index is not in 3*n format\n");
-                       goto ERROR;
-               }
-
-               /* return if track_mime is different to current_mime */
-               if (media_format_get_video_info((media_format_h)(current->media_format), &track_mime, NULL, NULL, NULL, NULL)
-                       == MEDIA_FORMAT_ERROR_NONE) {
-                       if (media_format_get_video_info((media_format_h)(format), &current_mime, NULL, NULL, NULL, NULL)
-                               == MEDIA_FORMAT_ERROR_NONE) {
-                               if (track_mime != current_mime) {
-                                       MX_E("video track_mime is not matching with packet mime. returning\n");
-                                       return MX_ERROR_INVALID_ARGUMENT;
-                               }
-                       } else {
-                               MX_E("cant read video mime. returning\n");
-                               return MX_ERROR_INVALID_ARGUMENT;
-                       }
-               } else {
-                       MX_E("cant read video mime in packet. returning\n");
-                       return MX_ERROR_INVALID_ARGUMENT;
-               }
-
-               if (media_packet_get_extra(packet,
-                       (void **)&codec_data)) {
-                       MX_E("media_packet_get_extra call failed\n");
-                       ret = MX_ERROR_UNKNOWN;
-                       break;
-               }
-               codec_data_size = strlen(codec_data) + 1;
+       media_packet_get_buffer_size(out_pkt, &size);
+       MX_I("Media packet Buffer capacity: %llu\n", size);
 
-               if ((strlen(codec_data)+1) != codec_data_size) {
-                       MX_E("strlen(codec_data)+1 is not matching with codec_data_size. They are supposed to be equal.\n");
-                       return MX_ERROR_INVALID_ARGUMENT;
-               }
-               MX_I("codec data is =%s size is %d\n", codec_data, codec_data_size);
-               if (current->caps == NULL ||
-                   g_strcmp0(codec_data, current->caps) != 0) {
-#ifdef SEND_FULL_CAPS_VIA_CODEC_DATA
-                       /* Debugging purpose. The whole caps filter can be sent via codec_data */
-                       codec_data_size = strlen(codec_data) + 1;
-                       MX_I("extracted codec data is =%s\n", codec_data);
-                       new_cap = gst_caps_from_string(codec_data);
-                       MX_I("New cap is=%s\n", codec_data);
-                       g_object_set(current->appsrc, "caps", new_cap, NULL);
-                       if (current->caps == NULL) {
-                               current->caps = (char *)g_malloc(codec_data_size);
-                               if (current->caps == NULL) {
-                                       MX_E("[%s][%d] memory allocation failed\n", __func__, __LINE__);
-                                       gst_caps_unref(new_cap);
-                                       ret = MX_ERROR_UNKNOWN;
-                                       break;
-                               }
-                       }
-                       g_stpcpy(current->caps, codec_data);
-#else
-                        gchar *caps_string = NULL;
-                       GValue val = G_VALUE_INIT;
-                       int numerator = 1;
-                       int denominator = 1;
-                       int width = 0;
-                       int height = 0;
-                       int avg_bps = 0;
-                       int max_bps = 0;
-                       media_format_mimetype_e mimetype = MEDIA_FORMAT_MAX;
-
-                       if (media_format_get_video_info(format,
-                               &mimetype, &width, &height,
-                               &avg_bps, &max_bps)) {
-                               MX_E("media_format_get_video_info call failed\n");
-                               ret = MX_ERROR_UNKNOWN;
-                               break;
-                       }
-                       if (current->caps == NULL) {
-                               current->caps = (char *)g_malloc(codec_data_size);
-                               if (current->caps == NULL) {
-                                       MX_E("[%s][%d] memory allocation failed\n", __func__, __LINE__);
-                                       ret = MX_ERROR_UNKNOWN;
-                                       break;
+       /* Check adts header */
+       media_format_h format = NULL;
+       unsigned char buf_adts[ADTS_HEADER_SIZE] = {0, };
+       bool is_adts = TRUE;
+       if (media_packet_get_format(out_pkt, &format) == MEDIA_PACKET_ERROR_NONE) {
+               media_format_mimetype_e a_mime;
+               int channel = 0;
+               int samplerate = 0;
+               int bit = 0;
+               if (media_format_get_audio_info(format, &a_mime, &channel, &samplerate,
+                       &bit, NULL) == MEDIA_FORMAT_ERROR_NONE) {
+                       if (a_mime == MEDIA_FORMAT_AAC_LC) {
+                               media_format_get_audio_aac_type(format, &is_adts);
+                               if (is_adts == FALSE) {
+                                       /* generator adts header */
+                                       size = size + ADTS_HEADER_SIZE;
+                                       _generate_header_aac_adts(buf_adts, size, samplerate, channel);
+                                       MX_I("Add adts header");
                                }
                        }
-                       new_cap = gst_caps_from_string(codec_data);
-                       MX_I("New cap set by codec data is=%s\n", codec_data);
-                       if (__gst_codec_specific_caps(new_cap, mimetype)) {
-                               MX_E("Setting Video caps failed\n");
-                               gst_caps_unref(new_cap);
-                               ret = MX_ERROR_UNKNOWN;
-                               break;
-                       }
-                       g_stpcpy(current->caps, codec_data);
-
-                       if (media_format_get_video_frame_rate(format, &numerator))
-                               MX_E("media_format_get_video_info call failed\n");
-                       g_value_init(&val, GST_TYPE_FRACTION);
-                       gst_value_set_fraction(&val, numerator, denominator);
-                       gst_caps_set_value(new_cap, "framerate", &val);
-                       caps_string = gst_caps_to_string(new_cap);
-                       MX_I("New cap set by codec data is = %s\n",
-                            caps_string);
-                       if (caps_string)
-                               g_free(caps_string);
-                       g_object_set(current->appsrc, "caps", new_cap, NULL);
-#endif
-                       gst_caps_unref(new_cap);
                }
-               break;
-       case MEDIA_FORMAT_TEXT:
-               /* Following check is safe but not mandatory. */
-               if ((current->track_index)%NO_OF_TRACK_TYPES != 2) {
-                       MX_E("Subtitle track_index is not in 3*n+2 format\n");
-                       goto ERROR;
-               }
-               if (media_packet_get_codec_data(packet,
-                       (void **)&codec_data, &codec_data_size)) {
-                       MX_E("media_packet_get_codec_data call failed\n");
-                       ret = MX_ERROR_UNKNOWN;
-                       break;
-               }
-               MX_I("codec data for subtitle = %s size is %d\n", codec_data, codec_data_size);
-               if (current->caps == NULL ||
-                   g_strcmp0(codec_data, current->caps) != 0) {
-
-#ifdef SEND_FULL_CAPS_VIA_CODEC_DATA
-                       /* Debugging purpose. The whole caps filter can be sent via codec_data */
-                       media_packet_get_codec_data(packet, (void **)&codec_data,
-                                               &codec_data_size);
-                       MX_I("extracted codec data is =%s\n", codec_data);
-                       new_cap = gst_caps_from_string(codec_data);
-                       MX_I("New cap is=%s\n", codec_data);
-                       g_object_set(current->appsrc, "caps", new_cap, NULL);
-                       if (current->caps == NULL) {
-                               current->caps = (char *)g_malloc(codec_data_size);
-                               if (current->caps == NULL) {
-                                       MX_E("[%s][%d] memory allocation failed\n", __func__, __LINE__);
-                                       gst_caps_unref(new_cap);
-                                       ret = MX_ERROR_UNKNOWN;
-                                       break;
-                               }
-                       }
-                       g_stpcpy(current->caps, codec_data);
-#else
-               media_format_mimetype_e mimetype = -1;
-               media_format_text_type_e text_type_e = -1;
-               if (media_format_get_text_info(format,
-                               &mimetype, &text_type)) {
-                               MX_E("media_format_get_text_info call failed\n");
-                               ret = MX_ERROR_UNKNOWN;
-                               break;
-                       }
-                       if (current->caps == NULL) {
-                               current->caps = (char *)g_malloc(codec_data_size);
-                               if (current->caps == NULL) {
-                                       MX_E("[%s][%d] memory allocation failed\n", __func__, __LINE__);
-                                       ret = MX_ERROR_UNKNOWN;
-                                       break;
-                               }
-                       }
-                       new_cap = gst_caps_from_string(codec_data);
-                       MX_I("New cap set by codec data is=%s\n", codec_data);
-                       if (__gst_codec_specific_caps(new_cap, mimetype)) {
-                               MX_E("Setting Subtitle caps failed\n");
-                               gst_caps_unref(new_cap);
-                               ret = MX_ERROR_UNKNOWN;
-                               break;
-                       }
-                       g_stpcpy(current->caps, codec_data);
-                       caps_string = gst_caps_to_string(new_cap);
-                       MX_I("New cap set by codec data is = %s\n",
-                            caps_string);
-                       if (caps_string)
-                               g_free(caps_string);
-                       g_object_set(current->appsrc, "caps", new_cap, NULL);
-#endif
-                       gst_caps_unref(new_cap);
-               } else if (current != NULL) {
-                       MX_I("appsrc caps already set to %s\n", current->caps);
-               }
-               break;
-
-       case MEDIA_FORMAT_CONTAINER:
-       case MEDIA_FORMAT_UNKNOWN:
-       default:
-               MX_E("Unknown format type\n");
+               media_format_unref(format);
        }
-       MEDIAMUXER_FLEAVE();
-       return ret;
-ERROR:
-       ret = MX_ERROR_UNKNOWN;
-       MEDIAMUXER_FLEAVE();
-       return ret;
-}
 
-static int _gst_copy_media_packet_to_buf(media_packet_h out_pkt,
-                                               GstBuffer *buffer)
-{
-       MEDIAMUXER_FENTER();
-       void *pkt_data;
-       uint64_t size;
-       unsigned char *data_ptr;
-       MEDIAMUXER_FENTER();
-       MEDIAMUXER_CHECK_NULL(out_pkt);
-       /* GstMapInfo map; */
-       int ret = MX_ERROR_NONE;
        /* copy data */
-       media_packet_get_buffer_size(out_pkt, &size);
-       MX_I("Media packet Buffer capacity: %llu\n", size);
-       data_ptr = (unsigned char *) g_malloc(size);
+       data_ptr = (unsigned char *)g_malloc(size);
        if (!data_ptr) {
                MX_E("Memory allocation failed in %s \n", __FUNCTION__);
                ret = MX_MEMORY_ERROR;
@@ -1224,13 +1112,15 @@ static int _gst_copy_media_packet_to_buf(media_packet_h out_pkt,
                ret = MX_ERROR_UNKNOWN;
                goto ERROR;
        }
-       /* if (!gst_buffer_map (buffer, &map, GST_MAP_READ)) {
-               MX_E("gst_buffer_map failed\n");
-               ret = MX_ERROR_UNKNOWN;
-               goto ERROR;
-       } */
+
+       if (is_adts == FALSE) {
+               memcpy(data_ptr, (char *)buf_adts, ADTS_HEADER_SIZE);
+               memcpy(data_ptr + ADTS_HEADER_SIZE, (char *)pkt_data, size - ADTS_HEADER_SIZE);
+       } else {
+               memcpy(data_ptr, (char *)pkt_data, size);
+       }
+
        uint64_t info;
-       memcpy(data_ptr, (char *)pkt_data, size);
        gst_buffer_insert_memory(buffer, -1,
                gst_memory_new_wrapped(0, data_ptr, size, 0,
                size, data_ptr, g_free));
@@ -1293,18 +1183,13 @@ static int gst_muxer_write_sample(MMHandleType pHandle, int track_index,
                goto ERROR;
        }
 
-       if (_gst_set_caps(pHandle, inbuf, track_index) != MX_ERROR_NONE) {
-               ret = MX_ERROR_INVALID_ARGUMENT;
-               goto ERROR;
-       }
-
        MX_I("Track_index passed = %d, working-with_track_index = %d\n", track_index, current->track_index);
 
        GstBuffer *gst_inbuf2 = NULL;
        gst_inbuf2 = gst_buffer_new();
        /* ToDo: Add functionality to the following function */
        /* MX_I("\nBefore  buff=%x\n", gst_inbuf2); */
-       _gst_copy_media_packet_to_buf(inbuf, gst_inbuf2);
+       _gst_copy_media_packet_to_buf(current, inbuf, gst_inbuf2);
 
        if (track_index%NO_OF_TRACK_TYPES == 0) {  /* NO_OF_TRACK_TYPES*n for video */
                MX_I("Waiting till start_feed of current video track, index=%d is active\n", current->track_index);
@@ -1402,6 +1287,7 @@ 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;
                current->track_index = -1;
        }
@@ -1477,8 +1363,7 @@ mx_ret_e _gst_destroy_pipeline(mxgst_handle_t *gst_handle)
        gst_element_set_state(gst_handle->pipeline, GST_STATE_NULL);
 
        /* Free resources & set unused pointers to NULL */
-       if (gst_handle->output_uri != NULL)
-               gst_handle->output_uri = NULL;
+       MEDIAMUXER_FREEIF(gst_handle->output_uri);
 
        current = gst_handle->track_info.track_head;
        while (current) {
@@ -1487,10 +1372,14 @@ mx_ret_e _gst_destroy_pipeline(mxgst_handle_t *gst_handle)
                current = current->next; /* Update current */
 
                /* Free prev & its contents */
-               if (prev->media_format)
+               if (prev->media_format) {
+                       media_format_unref((media_format_h)prev->media_format);
                        prev->media_format = NULL;
-               if (prev->caps)
-                       g_free(prev->caps);
+               }
+               if (prev->caps) {
+                       gst_caps_unref(prev->caps);
+                       prev->caps = NULL;
+               }
                g_free(prev);
        }
 
@@ -1523,12 +1412,13 @@ static int gst_muxer_destroy(MMHandleType pHandle)
        mxgst_handle_t *new_mediamuxer = (mxgst_handle_t *) pHandle;
 
        MX_I("__gst_muxer_destroy deallocating new_mediamuxer:%p\n",  new_mediamuxer);
+       MEDIAMUXER_FREEIF(new_mediamuxer->output_uri);
        g_free(new_mediamuxer);
        MEDIAMUXER_FLEAVE();
        return ret;
 }
 
-int gst_set_error_cb(MMHandleType pHandle, gst_error_cb callback, void* user_data)
+int gst_muxer_set_error_cb(MMHandleType pHandle, gst_muxer_error_cb callback, void* user_data)
 {
        MEDIAMUXER_FENTER();
        int ret = MX_ERROR_NONE;
@@ -1553,7 +1443,7 @@ int gst_set_error_cb(MMHandleType pHandle, gst_error_cb callback, void* user_dat
        }
 
        MX_I("Set event handler callback(cb = %p, data = %p)\n", callback, user_data);
-       gst_handle->user_cb[_GST_EVENT_TYPE_ERROR] = (gst_error_cb) callback;
+       gst_handle->user_cb[_GST_EVENT_TYPE_ERROR] = (gst_muxer_error_cb) callback;
        gst_handle->user_data[_GST_EVENT_TYPE_ERROR] = user_data;
        MEDIAMUXER_FLEAVE();
        return MX_ERROR_NONE;
@@ -1561,3 +1451,48 @@ ERROR:
        MEDIAMUXER_FLEAVE();
        return ret;
 }
+
+static void _generate_header_aac_adts(unsigned char *buffer, int packetLen, int samplerate, int channel)
+{
+       int profile = 2;        /* AAC LC (0x01) */
+       int freqIdx = 4;        /* 44KHz (0x04) */
+       int chanCfg = 1;        /* CPE (0x01) */
+
+       if (samplerate == 96000)
+               freqIdx = 0;
+       else if (samplerate == 88200)
+               freqIdx = 1;
+       else if (samplerate == 64000)
+               freqIdx = 2;
+       else if (samplerate == 48000)
+               freqIdx = 3;
+       else if (samplerate == 44100)
+               freqIdx = 4;
+       else if (samplerate == 32000)
+               freqIdx = 5;
+       else if (samplerate == 24000)
+               freqIdx = 6;
+       else if (samplerate == 22050)
+               freqIdx = 7;
+       else if (samplerate == 16000)
+               freqIdx = 8;
+       else if (samplerate == 12000)
+               freqIdx = 9;
+       else if (samplerate == 11025)
+               freqIdx = 10;
+       else if (samplerate == 8000)
+               freqIdx = 11;
+
+       if ((channel == 1) || (channel == 2))
+               chanCfg = channel;
+
+       /* Make ADTS header */
+       buffer[0] = (char)0xFF;
+       buffer[1] = (char)0xF1;
+       buffer[2] = (char)(((profile - 1) << 6) + (freqIdx << 2) + (chanCfg >> 2));
+       buffer[3] = (char)(((chanCfg & 3) << 6) + (packetLen >> 11));
+       buffer[4] = (char)((packetLen & 0x7FF) >> 3);
+       buffer[5] = (char)(((packetLen & 7) << 5) + 0x1F);
+       buffer[6] = (char)0xFC;
+}
+
index 6d68b6b..2140754 100644 (file)
 #include <mediamuxer.h>
 #include <mediamuxer_private.h>
 #include <media_packet_internal.h>
-
+#include <media_format.h>
 #include <media_codec.h>
+#include <mediademuxer.h>
+
 #define DUMP_OUTBUF 1
 /*-----------------------------------------------------------------------
 |    GLOBAL VARIABLE DEFINITIONS:                                       |
@@ -63,6 +65,8 @@ enum {
        CURRENT_STATUS_RAW_AUDIO_FILENAME,
        CURRENT_STATUS_SET_VENC_INFO,
        CURRENT_STATUS_SET_AENC_INFO,
+       CURRENT_STATUS_FILENAME,
+       CURRENT_STATUS_PREPARE_DEMUXER,
 };
 
 mediamuxer_h myMuxer = 0;
@@ -94,6 +98,7 @@ static int bitrate = DEFAULT_BITRATE;
 int iseos_codec = 0;
 bool validate_with_codec = false;
 bool validate_multitrack = false;
+bool validate_with_demux = false;
 char media_file[MAX_INPUT_SIZE];
 char data_sink[MAX_INPUT_SIZE];
 bool have_mp4 = false;
@@ -106,6 +111,11 @@ int track_index_aud2 = -1;
 int track_index_text = -1;
 int g_menu_state = CURRENT_STATUS_MAINMENU;
 
+int demuxer_index_vid = -1;
+int demuxer_index_aud = -1;
+bool is_video = false;
+bool is_audio = false;
+
 int demux_mp4();
 int demux_audio();
 static void display_sub_basic();
@@ -116,6 +126,16 @@ void mediacodec_config_set_venc_info(int width, int height, float fps, int targe
 void mediacodec_config_prepare(void);
 void mediacodec_config_set_aenc_info(int samplerate, int chnnel, int bit, int bitrate);
 
+int test_mediademuxer_create();
+int test_mediademuxer_set_data_source(const char *path);
+int test_mediademuxer_prepare();
+int test_mediademuxer_get_track_count(int *track_num);
+int test_mediademuxer_select_track(int track_num);
+int test_mediademuxer_start();
+int test_mediademuxer_stop();
+int test_mediademuxer_get_track_info(int track_num, media_format_h *format, bool *is_video, bool *is_audio);
+void test_mediademuxer_process_all(bool is_video, bool is_audio);
+
 /*-----------------------------------------------------------------------
 |    LOCAL FUNCTION                                                     |
 -----------------------------------------------------------------------*/
@@ -183,114 +203,128 @@ int test_mediamuxer_add_track_video()
        int avg_bps = 0;
        int max_bps = 0;
 
-       g_print("test_mediamuxer_add_track_video\n");
-       media_format_create(&media_format);
-
-       /* MEDIA_FORMAT_H264_SP  MEDIA_FORMAT_H264_MP  MEDIA_FORMAT_H264_HP */
-       if (strncmp(data_sink, "11", 2) == 0) {
-               if (media_format_set_video_mime(media_format, MEDIA_FORMAT_H264_SP) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation\n");
-       } else if (strncmp(data_sink, "12", 2) == 0) {
-               if (media_format_set_video_mime(media_format, MEDIA_FORMAT_H263) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation\n");
-       }  else if (strncmp(data_sink, "13", 2) == 0) {
-               if (media_format_set_video_mime(media_format, MEDIA_FORMAT_MPEG4_SP) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation\n");
-       } else if (strncmp(data_sink, "21", 2) == 0 || strncmp(data_sink, "23", 2) == 0) {
-               if (media_format_set_video_mime(media_format, MEDIA_FORMAT_H264_SP) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation\n");
-       } else if (strncmp(data_sink, "22", 2) == 0 || strncmp(data_sink, "24", 2) == 0) {
-               if (media_format_set_video_mime(media_format, MEDIA_FORMAT_H263) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation\n");
-       } else if (strncmp(data_sink, "31", 2) == 0
-               || strncmp(data_sink, "41", 2) == 0 || strncmp(data_sink, "42", 2) == 0
-               || strncmp(data_sink, "51", 2) == 0) {
-               g_print("Add video track is invalid for wav/amr\n");
-               return 1;
-       }
+       if (!validate_with_demux) {
+
+               g_print("test_mediamuxer_add_track_video\n");
+               media_format_create(&media_format);
+
+               /* MEDIA_FORMAT_H264_SP  MEDIA_FORMAT_H264_MP  MEDIA_FORMAT_H264_HP */
+               if (strncmp(data_sink, "11", 2) == 0) {
+                       if (media_format_set_video_mime(media_format, MEDIA_FORMAT_H264_SP) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation\n");
+               } else if (strncmp(data_sink, "12", 2) == 0) {
+                       if (media_format_set_video_mime(media_format, MEDIA_FORMAT_H263) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation\n");
+               }  else if (strncmp(data_sink, "13", 2) == 0) {
+                       if (media_format_set_video_mime(media_format, MEDIA_FORMAT_MPEG4_SP) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation\n");
+               } else if (strncmp(data_sink, "21", 2) == 0 || strncmp(data_sink, "23", 2) == 0) {
+                       if (media_format_set_video_mime(media_format, MEDIA_FORMAT_H264_SP) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation\n");
+               } else if (strncmp(data_sink, "22", 2) == 0 || strncmp(data_sink, "24", 2) == 0) {
+                       if (media_format_set_video_mime(media_format, MEDIA_FORMAT_H263) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation\n");
+               } else if (strncmp(data_sink, "31", 2) == 0
+                       || strncmp(data_sink, "41", 2) == 0 || strncmp(data_sink, "42", 2) == 0
+                       || strncmp(data_sink, "51", 2) == 0) {
+                       g_print("Add video track is invalid for wav/amr\n");
+                       return 1;
+               }
 
-       if (validate_with_codec) {
-               media_format_set_video_width(media_format, width);
-               media_format_set_video_height(media_format, height);
-       } else {
-               media_format_set_video_width(media_format, 640);
-               media_format_set_video_height(media_format, 480);
-       }
-       media_format_set_video_avg_bps(media_format, 256000);
-       media_format_set_video_max_bps(media_format, 256000);
+               if (validate_with_codec) {
+                       media_format_set_video_width(media_format, width);
+                       media_format_set_video_height(media_format, height);
+               } else {
+                       media_format_set_video_width(media_format, 640);
+                       media_format_set_video_height(media_format, 480);
+               }
+               media_format_set_video_avg_bps(media_format, 256000);
+               media_format_set_video_max_bps(media_format, 256000);
 
-       media_format_get_video_info(media_format, &mimetype, &width, &height, &avg_bps, &max_bps);
+               media_format_get_video_info(media_format, &mimetype, &width, &height, &avg_bps, &max_bps);
 
-       g_print("Video Mimetype trying to set: %x (H264 : %x)\n", (int)(mimetype), (int)(MEDIA_FORMAT_H264_SP));
-       g_print("Video param trying to set: (width, height, avg_bps, max_bps): %d %d %d %d  \n",
-                       width, height, avg_bps, max_bps);
+               g_print("Video Mimetype trying to set: %x (H264 : %x)\n", (int)(mimetype), (int)(MEDIA_FORMAT_H264_SP));
+               g_print("Video param trying to set: (width, height, avg_bps, max_bps): %d %d %d %d  \n",
+                               width, height, avg_bps, max_bps);
 
-       /* To add video track */
-       mediamuxer_add_track(myMuxer, media_format, &track_index_vid);
-       g_print("Video Track index is returned : %d\n", track_index_vid);
+               /* To add video track */
+               mediamuxer_add_track(myMuxer, media_format, &track_index_vid);
+               g_print("Video Track index is returned : %d\n", track_index_vid);
+       } else {
+               mediamuxer_add_track(myMuxer, media_format, &track_index_vid);
+               g_print("Video Track index returned is: %d\n", track_index_vid);
+               test_mediademuxer_select_track(demuxer_index_vid);
+       }
        return 0;
 }
 
 int test_mediamuxer_add_track_audio()
 {
        media_format_mimetype_e mimetype;
-       int avg_bps = 128000;
 
-       g_print("test_mediamuxer_add_track_audio\n");
-       media_format_create(&media_format_a);
-
-       if (strncmp(data_sink, "11", 2) == 0 || strncmp(data_sink, "12", 2) == 0 || strncmp(data_sink, "13", 2) == 0) {
-               /* MEDIA_FORMAT_AAC_LC  MEDIA_FORMAT_AAC_HE  MEDIA_FORMAT_AAC_HE_PS */
-               if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AAC_LC) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation, for AAC in MP4\n");
-       } else if (strncmp(data_sink, "21", 2) == 0 || strncmp(data_sink, "22", 2) == 0) {
-               if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AAC_LC) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation, for AAC in 3GP\n");
-       } else if (strncmp(data_sink, "23", 2) == 0 || strncmp(data_sink, "24", 2) == 0) {
-               if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AMR_NB) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation for AMR_NB in 3GP\n");
-       } else if (strncmp(data_sink, "31", 2) == 0) {
-               if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_PCM) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation for PCM in WAV\n");
-       } else if (strncmp(data_sink, "41", 2) == 0) {
-               if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AMR_NB) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation for amr-nb audio\n");
-       } else if (strncmp(data_sink, "42", 2) == 0) {
-               if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AMR_WB) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation for amr-wb audio\n");
-       } else if (strncmp(data_sink, "51", 2) == 0) {
-               if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AAC) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_mime operation for aac-adts audio\n");
-       }
+       if (!validate_with_demux) {
+               int avg_bps = 128000;
+
+               g_print("test_mediamuxer_add_track_audio\n");
+               media_format_create(&media_format_a);
+
+               if (strncmp(data_sink, "11", 2) == 0 || strncmp(data_sink, "12", 2) == 0 || strncmp(data_sink, "13", 2) == 0) {
+                       /* MEDIA_FORMAT_AAC_LC  MEDIA_FORMAT_AAC_HE  MEDIA_FORMAT_AAC_HE_PS */
+                       if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AAC_LC) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation, for AAC in MP4\n");
+               } else if (strncmp(data_sink, "21", 2) == 0 || strncmp(data_sink, "22", 2) == 0) {
+                       if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AAC_LC) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation, for AAC in 3GP\n");
+               } else if (strncmp(data_sink, "23", 2) == 0 || strncmp(data_sink, "24", 2) == 0) {
+                       if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AMR_NB) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation for AMR_NB in 3GP\n");
+               } else if (strncmp(data_sink, "31", 2) == 0) {
+                       if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_PCM) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation for PCM in WAV\n");
+               } else if (strncmp(data_sink, "41", 2) == 0) {
+                       if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AMR_NB) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation for amr-nb audio\n");
+               } else if (strncmp(data_sink, "42", 2) == 0) {
+                       if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AMR_WB) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation for amr-wb audio\n");
+               } else if (strncmp(data_sink, "51", 2) == 0) {
+                       if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AAC) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_mime operation for aac-adts audio\n");
+               }
 
-       if (validate_with_codec) {
-               if (media_format_set_audio_channel(media_format_a, channel) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_channel operation\n");
-               media_format_set_audio_samplerate(media_format_a, samplerate);
-               media_format_set_audio_bit(media_format_a, bit);
-               media_format_set_audio_avg_bps(media_format_a, bitrate);
-       } else {
-               if (media_format_set_audio_channel(media_format_a, 2) != MEDIA_FORMAT_ERROR_NONE)
-                       g_print("Problem during media_format_set_audio_channel operation\n");
-               media_format_set_audio_samplerate(media_format_a, 44100);
-               media_format_set_audio_bit(media_format_a, 16);
-               media_format_set_audio_avg_bps(media_format_a, 128000);
-       }
+               if (validate_with_codec) {
+                       if (media_format_set_audio_channel(media_format_a, channel) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_channel operation\n");
+                       media_format_set_audio_samplerate(media_format_a, samplerate);
+                       media_format_set_audio_bit(media_format_a, bit);
+                       media_format_set_audio_avg_bps(media_format_a, bitrate);
+               } else {
+                       if (media_format_set_audio_channel(media_format_a, 2) != MEDIA_FORMAT_ERROR_NONE)
+                               g_print("Problem during media_format_set_audio_channel operation\n");
+                       media_format_set_audio_samplerate(media_format_a, 44100);
+                       media_format_set_audio_bit(media_format_a, 16);
+                       media_format_set_audio_avg_bps(media_format_a, 128000);
+               }
 
-       media_format_set_audio_aac_type(media_format_a, true);
-       media_format_get_audio_info(media_format_a, &mimetype, &channel, &samplerate, &bit, &avg_bps);
+               media_format_set_audio_aac_type(media_format_a, true);
+               media_format_get_audio_info(media_format_a, &mimetype, &channel, &samplerate, &bit, &avg_bps);
 
-       g_print("Audio Mimetype trying to set: %x (AAC : %x)\n", (int)(mimetype), (int)(MEDIA_FORMAT_AAC_LC));
-       g_print("Audio Param trying to set: (ch, samplert, bt, avg_bps) %d %d %d %d \n",
-               channel, samplerate, bit, avg_bps);
+               g_print("Audio Mimetype trying to set: %x (AAC : %x)\n", (int)(mimetype), (int)(MEDIA_FORMAT_AAC_LC));
+               g_print("Audio Param trying to set: (ch, samplert, bt, avg_bps) %d %d %d %d \n",
+                       channel, samplerate, bit, avg_bps);
 
-       /* To add audio track */
-       mediamuxer_add_track(myMuxer, media_format_a, &track_index_aud);
-       g_print("Audio Track index returned is: %d\n", track_index_aud);
+               /* To add audio track */
+               mediamuxer_add_track(myMuxer, media_format_a, &track_index_aud);
+               g_print("Audio Track index returned is: %d\n", track_index_aud);
 
-       if (validate_multitrack) {
-               mediamuxer_add_track(myMuxer, media_format_a, &track_index_aud2);
-               g_print("Audio Multi-Track index returned is: %d\n", track_index_aud2);
+               if (validate_multitrack) {
+                       mediamuxer_add_track(myMuxer, media_format_a, &track_index_aud2);
+                       g_print("Audio Multi-Track index returned is: %d\n", track_index_aud2);
+               }
+       } else {
+               mediamuxer_add_track(myMuxer, media_format_a, &track_index_aud);
+               g_print("Audio Track index returned is: %d\n", track_index_aud);
+               test_mediademuxer_select_track(demuxer_index_aud);
        }
        return 0;
 }
@@ -344,12 +378,21 @@ int test_mediamuxer_write_sample()
        if (validate_with_codec) {
                /* Test muxer with codec */
                mediacodec_process_all();
+       } else if (validate_with_demux) {
+               bool sel_vid = false;
+               bool sel_aud = false;
+               test_mediademuxer_start();
+               if (track_index_vid != -1)
+                       sel_vid = true;
+               if (track_index_aud != -1)
+                       sel_aud = true;
+               g_print("is_video: %d, is_audio: %d\n", sel_vid, sel_aud);
+               test_mediademuxer_process_all(sel_vid, sel_aud);
        } else if (strncmp(data_sink, "31", 2) == 0 || strncmp(data_sink, "wav", 3) == 0
                || strncmp(data_sink, "41", 2) == 0
                || strncmp(data_sink, "42", 2) == 0 || strncmp(data_sink, "amr", 3) == 0) {
                demux_audio();
        } else {
-
                demux_mp4();
        }
        return 0;
@@ -377,6 +420,8 @@ int test_mediamuxer_resume()
 int test_mediamuxer_stop()
 {
        g_print("test_mediamuxer_stop\n");
+       if (validate_with_demux)
+               test_mediademuxer_stop();
        mediamuxer_stop(myMuxer);
        return 0;
 }
@@ -413,6 +458,40 @@ int test_mediamuxer_set_error_cb()
        return ret;
 }
 
+int test_mediamuxer_with_demuxer_prepare()
+{
+       int tracks_num = 0;
+       int i = 0;
+       if (test_mediademuxer_create())
+               g_print("mediademuxer create fail");
+       if (test_mediademuxer_set_data_source((const char *)media_file))
+               g_print("mediademuxer set_data_source fail");
+       if (test_mediademuxer_prepare())
+               g_print("mediademuxer prepare fail");
+       if (test_mediademuxer_get_track_count(&tracks_num))
+               g_print("mediademuxer get_track_count fail");
+       for (i = 0; i < tracks_num; i++) {
+               media_format_h format;
+               bool video = false;
+               bool audio = false;
+               test_mediademuxer_get_track_info(i, &format, &video, &audio);
+               if (video) {
+                       demuxer_index_vid = i;
+                       media_format = format;
+                       is_video = video;
+                       g_print("mediademuxer video track id = %d\n", demuxer_index_vid);
+               } else if (audio) {
+                       demuxer_index_aud = i;
+                       media_format_a = format;
+                       is_audio = audio;
+                       g_print("mediademuxer audio track id = %d\n", demuxer_index_aud);
+               }
+       }
+
+       return 0;
+
+}
+
 /*-----------------------------------------------------------------------
 |    TEST  FUNCTION                                                                 |
 -----------------------------------------------------------------------*/
@@ -456,7 +535,12 @@ void _interpret_main_menu(char *cmd)
                                        have_mp4 = true;
                                }
                        }
+
+                       if (validate_with_demux)
+                               g_menu_state = CURRENT_STATUS_MAINMENU;
+
                        test_mediamuxer_add_track_audio();
+
                } else if (strncmp(cmd, "v", 1) == 0) {
                        if (!validate_with_codec) {
                                if (strncmp(data_sink, "11", 2) == 0 || strncmp(data_sink, "12", 2) == 0 || strncmp(data_sink, "13", 2) == 0
@@ -468,11 +552,15 @@ void _interpret_main_menu(char *cmd)
                                        }
                                }
                        }
+                       if (validate_with_demux)
+                               g_menu_state = CURRENT_STATUS_MAINMENU;
+
                        if ((strncmp(data_sink, "11", 2) == 0 || strncmp(data_sink, "12", 2) == 0 || strncmp(data_sink, "13", 2) == 0
                                || strncmp(data_sink, "21", 2) == 0 || strncmp(data_sink, "22", 2) == 0)  || strncmp(data_sink, "23", 2) == 0 || strncmp(data_sink, "24", 2) == 0)
                                test_mediamuxer_add_track_video();
                        else
                                g_print("Ignoring, data_sink=%s doesnt need video track testing\n", data_sink);
+
                } else if (strncmp(cmd, "x", 1) == 0) {
                        if (!validate_with_codec) {
                                have_text_track = true;
@@ -508,6 +596,11 @@ void _interpret_main_menu(char *cmd)
                    g_menu_state = CURRENT_STATUS_RAW_AUDIO_FILENAME;
                else if (strncmp(cmd, "ae", 2) == 0)
                    g_menu_state = CURRENT_STATUS_SET_AENC_INFO;
+       } else if (len == 2 && validate_with_demux) {
+               if (strncmp(cmd, "mp", 2) == 0)
+                       g_menu_state = CURRENT_STATUS_FILENAME;
+               else if (strncmp(cmd, "pr", 2) == 0)
+                       test_mediamuxer_with_demuxer_prepare();
        } else {
                g_print("unknown menu command. Please try again\n");
        }
@@ -539,6 +632,8 @@ static void displaymenu(void)
                g_print("*** input raw audio file name");
        } else if (g_menu_state == CURRENT_STATUS_SET_AENC_INFO) {
                g_print("*** input audio encode configure.(samplerate, channel, bit, bitrate (e.g. 44100,  1, 32, 128000))\n");
+       } else if (g_menu_state == CURRENT_STATUS_FILENAME) {
+               g_print("*** input file path:\n");
        } else {
                g_print("*** unknown status.\n");
                exit(0);
@@ -610,8 +705,6 @@ static void interpret(char *cmd)
                        break;
                }
        }
-       break;
-
        case CURRENT_STATUS_RAW_AUDIO_FILENAME:
                {       /* "ca" */
                        use_video = 0;
@@ -653,6 +746,12 @@ static void interpret(char *cmd)
                        }
                }
                break;
+       case CURRENT_STATUS_FILENAME: { /* mp */
+                       input_filepath(cmd);
+                       strncpy(media_file, cmd, MAX_INPUT_SIZE - 1);
+                       g_menu_state = CURRENT_STATUS_MAINMENU;
+                       break;
+               }
        default:
                break;
        }
@@ -672,6 +771,11 @@ static void display_sub_basic()
                g_print("ca. Create Media Codec for Audio\t");
                g_print("ae. Set aenc info \n");
        }
+       if (validate_with_demux) {
+               g_print("--To test Muxer along with Media Demuxer. --\n");
+               g_print("mp. set media path with demuxer \n");
+               g_print("pr. Prepare mediademuxer \n");
+       }
        g_print("c. Create \t");
        g_print("o. Set Data Sink \n");
        g_print("a. AddAudioTrack \t");
@@ -732,8 +836,10 @@ int main(int argc, char *argv[])
                /* Check whether validation with media codec is required */
                if (argv[1][0] == '-' && argv[1][1] == 'c')
                        validate_with_codec = true;
-               if (argv[1][0] == '-' && argv[1][1] == 'm')
+               else if (argv[1][0] == '-' && argv[1][1] == 'm')
                        validate_multitrack = true;
+               else if (argv[1][0] == '-' && argv[1][1] == 'd')
+                       validate_with_demux = true;
        }
 
        displaymenu();
diff --git a/test/mediamuxer_test_with_demuxer.c b/test/mediamuxer_test_with_demuxer.c
new file mode 100644 (file)
index 0000000..5ac1c0f
--- /dev/null
@@ -0,0 +1,274 @@
+#include <unistd.h>
+#include <string.h>
+#include <sys/time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <gst/gst.h>
+#include <inttypes.h>
+#include <mm_error.h>
+#include <mm_debug.h>
+#include "../include/mediamuxer_port.h"
+#include <mediademuxer.h>
+#include <mediamuxer.h>
+
+
+mediademuxer_h demuxer = NULL;
+media_format_mimetype_e v_mime;
+media_format_mimetype_e a_mime;
+media_format_mimetype_e t_mime;
+media_format_text_type_e t_type;
+int num_tracks = 0;
+int aud_track = -1;
+int vid_track = -1;
+int txt_track = -1;
+int w;
+int h;
+bool is_adts = 0;
+bool vid_eos_track = 0;
+bool aud_eos_track = 0;
+bool text_eos_track = 0;
+
+extern int track_index_vid;
+extern int track_index_aud;
+
+extern mediamuxer_h myMuxer;
+
+
+void eos_cb(int track_index, void *user_data)
+{
+       printf("Got EOS for track -- %d from Mediademuxer\n", track_index);
+       if (track_index == vid_track) {
+               vid_eos_track = true;
+               mediamuxer_close_track(myMuxer, track_index_vid);
+       } else if (track_index == aud_track) {
+               aud_eos_track = true;
+               mediamuxer_close_track(myMuxer, track_index_aud);
+       } else if (track_index == txt_track) {
+               text_eos_track = true;
+       } else {
+               g_print("EOS for invalid track number\n");
+       }
+}
+
+void err_cb(mediademuxer_error_e error, void *user_data)
+{
+       printf("Got Error %d from Mediademuxer\n", error);
+}
+
+int test_mediademuxer_create()
+{
+       int ret = 0;
+       g_print("test_mediademuxer_create\n");
+       ret = mediademuxer_create(&demuxer);
+       return ret;
+}
+
+int test_mediademuxer_set_data_source(const char *path)
+{
+       int ret = 0;
+       g_print("test_mediademuxer_set_data_source\n");
+
+       ret = mediademuxer_set_data_source(demuxer, path);
+       ret = mediademuxer_set_eos_cb(demuxer, eos_cb, demuxer);
+       ret = mediademuxer_set_error_cb(demuxer, err_cb, demuxer);
+       return ret;
+}
+
+int test_mediademuxer_prepare()
+{
+       int ret = 0;
+       g_print("test_mediademuxer_prepare\n");
+       ret = mediademuxer_prepare(demuxer);
+       return ret;
+}
+
+int test_mediademuxer_get_track_count(int *track_num)
+{
+       int num_tracks = 0;
+       g_print("test_mediademuxer_get_track_count\n");
+       mediademuxer_get_track_count(demuxer, &num_tracks);
+       g_print("Number of total tracks [%d]\n", num_tracks);
+       *track_num = num_tracks;
+       return 0;
+}
+
+int test_mediademuxer_select_track(int track_num)
+{
+       g_print("test_mediademuxer_select_track\n");
+       if (mediademuxer_select_track(demuxer, track_num)) {
+               g_print("mediademuxer_select_track index [%d] failed\n", track_num);
+               return -1;
+       }
+       return 0;
+}
+
+int test_mediademuxer_start()
+{
+       int ret = 0;
+       g_print("test_mediademuxer_start\n");
+       ret = mediademuxer_start(demuxer);
+       return ret;
+}
+
+int test_mediademuxer_stop()
+{
+       int ret = 0;
+       g_print("test_mediademuxer_stop\n");
+       ret = mediademuxer_stop(demuxer);
+       return ret;
+}
+
+
+int test_mediademuxer_get_track_info(int track_num, media_format_h *format, bool *is_video, bool *is_audio)
+{
+       int ret = 0;
+
+       g_print("test_mediademuxer_get_track_info\n");
+
+       media_format_h g_media_format;
+       ret = mediademuxer_get_track_info(demuxer, track_num, &g_media_format);
+       if (ret == 0) {
+               media_format_mimetype_e v_mime;
+               media_format_mimetype_e a_mime;
+               int w;
+               int h;
+               int channel;
+               int samplerate;
+               int bit;
+               if (media_format_get_video_info(g_media_format, &v_mime,
+                       &w, &h, NULL, NULL) == MEDIA_FORMAT_ERROR_NONE) {
+                       g_print("media_format_get_video_info is sucess!\n");
+                       g_print("\t\t[media_format_get_video]mime:%x, width :%d, height :%d\n",
+                                               v_mime, w, h);
+                       *is_video = true;
+                       *is_audio = false;
+                       vid_track = track_num;
+               } else if (media_format_get_audio_info(g_media_format, &a_mime,
+                                       &channel, &samplerate, &bit, NULL) == MEDIA_FORMAT_ERROR_NONE) {
+                       g_print("media_format_get_audio_info is sucess!\n");
+                       g_print("\t\t[media_format_get_audio]mime:%x, channel :%d, samplerate :%d, bit :%d\n",
+                                               a_mime, channel, samplerate, bit);
+                       *is_audio = true;
+                       *is_video = false;
+                       aud_track = track_num;
+               } else if (media_format_get_text_info(g_media_format, NULL, NULL) == MEDIA_FORMAT_ERROR_NONE) {
+                               g_print("media_format_get_text_info is sucess!\n");
+                               g_print("\t\t[media_format_get_text]mime:%x, type:%x\n", t_mime, t_type);
+               } else {
+                               g_print("Not Supported YET\n");
+               }
+       } else {
+               g_print("Error while getting mediademuxer_get_track_info\n");
+       }
+
+       *format = g_media_format;
+
+       return ret;
+}
+
+void *_fetch_video_data(void *ptr)
+{
+       int ret = MEDIADEMUXER_ERROR_NONE;
+       int *status = (int *)g_malloc(sizeof(int) * 1);
+       if (!status) {
+               g_print("Fail malloc fetch video data retur status value\n");
+               return NULL;
+       }
+       media_packet_h vidbuf;
+       int count = 0;
+       uint64_t buf_size = 0;
+       void *data = NULL;
+
+       *status = -1;
+       g_print("Video Data function\n");
+
+       while (1) {
+               ret = mediademuxer_read_sample(demuxer, vid_track, &vidbuf);
+               if (ret != MEDIADEMUXER_ERROR_NONE) {
+                       g_print("Error (%d) return of mediademuxer_read_sample()\n", ret);
+                       pthread_exit(NULL);
+               }
+
+               ret = mediamuxer_write_sample(myMuxer, track_index_vid, vidbuf);
+
+               count++;
+               media_packet_get_buffer_size(vidbuf, &buf_size);
+               media_packet_get_buffer_data_ptr(vidbuf, &data);
+               g_print("Video Read Count::[%4d] frame - get_buffer_size = %"PRIu64"\n", count, buf_size);
+
+               media_packet_destroy(vidbuf);
+
+               if (vid_eos_track)
+                       break;
+               usleep(1000);
+       }
+       g_print("EOS return of mediademuxer_read_sample() for video\n");
+       *status = 0;
+
+       return (void *)status;
+}
+
+void *_fetch_audio_data(void *ptr)
+{
+       int ret = MEDIADEMUXER_ERROR_NONE;
+
+       int *status = (int *)g_malloc(sizeof(int) * 1);
+       if (!status) {
+               g_print("Fail malloc fetch video data retur status value\n");
+               return NULL;
+       }
+
+       media_packet_h audbuf;
+       int count = 0;
+       uint64_t buf_size = 0;
+       void *data = NULL;
+
+       *status = -1;
+       g_print("Audio Data function\n");
+
+       while (1) {
+               ret = mediademuxer_read_sample(demuxer, aud_track, &audbuf);
+               if (ret != MEDIADEMUXER_ERROR_NONE) {
+                       g_print("Error (%d) return of mediademuxer_read_sample()\n", ret);
+                       pthread_exit(NULL);
+               }
+
+               ret = mediamuxer_write_sample(myMuxer, track_index_aud, audbuf);
+
+               count++;
+               media_packet_get_buffer_size(audbuf, &buf_size);
+               media_packet_get_buffer_data_ptr(audbuf, &data);
+               g_print("Audio Read Count::[%4d] frame - get_buffer_size = %"PRIu64"\n", count, buf_size);
+
+               media_packet_destroy(audbuf);
+
+               if (aud_eos_track)
+                       break;
+
+               usleep(1000);
+       }
+
+       g_print("EOS return of mediademuxer_read_sample() for audio\n");
+       *status = 0;
+
+       return (void *)status;
+}
+
+void test_mediademuxer_process_all(bool is_video, bool is_audio)
+{
+       pthread_t thread[2];
+
+       /* Initialize and set thread detached attribute */
+       if (is_video) {
+               g_print("In main: creating thread  for video\n");
+               pthread_create(&thread[0], NULL, _fetch_video_data, NULL);
+       }
+       if (is_audio) {
+               g_print("In main: creating thread  for audio\n");
+               pthread_create(&thread[1], NULL, _fetch_audio_data, NULL);
+       }
+
+       return;
+}
+
+