Support muxing from pcm file to wav file 18/210618/6 accepted/tizen/unified/20190730.112048 submit/tizen/20190729.071925
authorGilbok Lee <gilbok.lee@samsung.com>
Tue, 23 Jul 2019 04:24:33 +0000 (13:24 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Mon, 29 Jul 2019 02:24:12 +0000 (11:24 +0900)
[Version] 0.1.19
[Issue Type] Fix bugs

Change-Id: I0cf5e1bf54a235f8337cd14184efd2b483c561b9

packaging/capi-mediamuxer.spec
src/port_gst/mediamuxer_port_gst.c
test/mediamuxer_test.c
test/mediamuxer_test_gst.c

index 98c1124..b1ec240 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-mediamuxer
 Summary:    A Media Muxer library in Tizen Native API
-Version:    0.1.18
+Version:    0.1.19
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
index bc0d268..390c271 100644 (file)
@@ -25,6 +25,7 @@
 #define WRITE_POLL_PERIOD 100
 #define SEND_FULL_CAPS_VIA_CODEC_DATA /* For debug purpose */
 #define ASYCHRONOUS_WRITE  /* write sample is not blocking */
+#define MEDIA_FORMAT_PCM_MASK 0x1500
 
 static int gst_muxer_init(MMHandleType *pHandle);
 static int gst_muxer_set_data_sink(MMHandleType pHandle, char *uri,
@@ -141,6 +142,8 @@ static GstCaps * __gst_codec_specific_caps(media_format_h format)
        GstCaps *new_caps = NULL;
        media_format_type_e formattype = MEDIA_FORMAT_NONE;
        media_format_mimetype_e mimetype = MEDIA_FORMAT_MAX;
+       int channel = -1;
+       int samplerate = -1;
        int fps = 25;
 
        if (media_format_get_type(format, &formattype)) {
@@ -149,7 +152,7 @@ static GstCaps * __gst_codec_specific_caps(media_format_h format)
        }
 
        if (MEDIA_FORMAT_AUDIO == formattype) {
-               if (MEDIA_FORMAT_ERROR_NONE != media_format_get_audio_info(format, &mimetype, NULL, NULL, NULL, NULL)) {
+               if (MEDIA_FORMAT_ERROR_NONE != media_format_get_audio_info(format, &mimetype, &channel, &samplerate, NULL, NULL)) {
                        MX_E("media_format_get_container_mime failed");
                        return NULL;
                }
@@ -300,7 +303,61 @@ static GstCaps * __gst_codec_specific_caps(media_format_h format)
                break;
        case MEDIA_FORMAT_VORBIS:
                break;
-       case MEDIA_FORMAT_PCM:
+       case MEDIA_FORMAT_PCM_S16LE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "S16LE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_S24LE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "S24LE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_S32LE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "S32LE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_S16BE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "S16BE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_S24BE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "S24BE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_S32BE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "S32BE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_F32LE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "F32LE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_F32BE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "F32BE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_U16LE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "S16LE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_U24LE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "U24LE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_U32LE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "U32LE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_U16BE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "U16BE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_U24BE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "U24BE", NULL);
+               break;
+       case MEDIA_FORMAT_PCM_U32BE:
+               new_caps = gst_caps_new_simple("audio/x-raw",
+                       "format", G_TYPE_STRING, "U32BE", NULL);
                break;
        case MEDIA_FORMAT_PCMA:
                break;
@@ -310,6 +367,24 @@ static GstCaps * __gst_codec_specific_caps(media_format_h format)
                MX_E("Unknown media mimeype %d. Assuming H264", mimetype);
                break;
        }
+
+       if (mimetype & MEDIA_FORMAT_PCM_MASK) {
+               if (!new_caps) {
+                       MX_E("Fail to make simple caps");
+                       return NULL;
+               }
+               if ((channel == -1) || (samplerate == -1)) {
+                       MX_E("wrong information, channel : %d, samplerate : %d", channel, samplerate);
+                       gst_caps_unref(new_caps);
+                       return NULL;
+               }
+               gst_caps_set_simple(new_caps,
+                       "channels", G_TYPE_INT, channel,
+                       "rate", G_TYPE_INT, samplerate,
+                       "layout", G_TYPE_STRING, "interleaved",
+                       NULL);
+       }
+
        MEDIAMUXER_FLEAVE();
        return new_caps;
 }
@@ -465,7 +540,7 @@ static int gst_muxer_add_track(MMHandleType pHandle,
                                && (mimetype == MEDIA_FORMAT_AAC_LC || mimetype == MEDIA_FORMAT_AAC_HE || mimetype == MEDIA_FORMAT_AAC_HE_PS
                                || mimetype == MEDIA_FORMAT_AMR_NB))
                        || (mx_handle_gst->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_WAV
-                               && (mimetype == MEDIA_FORMAT_PCM))
+                               && (mimetype & MEDIA_FORMAT_PCM_MASK))
                        || (mx_handle_gst->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_AAC_ADTS
                                && (mimetype == MEDIA_FORMAT_AAC))
                        || (mx_handle_gst->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_AMR_NB
@@ -886,7 +961,7 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle)
                                        } else if (mimetype == MEDIA_FORMAT_AMR || mimetype == MEDIA_FORMAT_AMR_NB || mimetype == MEDIA_FORMAT_AMR_WB) {
                                                current->parser = gst_element_factory_make("amrparse", str_parser);
                                                MX_I("make amrparse element");
-                                       } else if (mimetype == MEDIA_FORMAT_PCM) {
+                                       } else if (mimetype & MEDIA_FORMAT_PCM_MASK) {
                                                MX_I("Do Nothing, as there is no need of parser for wav");
                                        } else {
                                                MX_I("Do Nothing");
@@ -903,7 +978,7 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle)
 
                                gst_bin_add_many(GST_BIN(gst_handle->pipeline), current->appsrc, NULL);
                                if (gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_AAC_ADTS
-                                       || mimetype == MEDIA_FORMAT_PCM) {
+                                       || mimetype & MEDIA_FORMAT_PCM_MASK) {
                                        MX_I("Do Nothing, as there is no need of parser for wav and AAC_ADTS");
                                } else {
                                        if (!current->parser) {
@@ -932,6 +1007,9 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle)
 
                                g_object_set(current->appsrc, "max-bytes", 3 * 1024 * 1024, NULL);
 
+                               if (mimetype & MEDIA_FORMAT_PCM_MASK)
+                                       g_object_set(current->appsrc, "do-timestamp", TRUE, NULL);
+
                                /* For wav, wavenc is muxer */
                                if (!current->parser) {
                                        gst_element_link(current->appsrc, gst_handle->muxer);
index 064421e..d9dc8e3 100644 (file)
@@ -71,6 +71,8 @@ enum {
        CURRENT_STATUS_SET_AENC_INFO,
        CURRENT_STATUS_FILENAME,
        CURRENT_STATUS_PREPARE_DEMUXER,
+       CURRENT_STATUS_PCM_FILENAME,
+       CURRENT_STATEUS_SET_PCM_INFO,
 };
 
 mediamuxer_h myMuxer = 0;
@@ -96,6 +98,7 @@ int target_bits = 0;
 int samplerate = DEFAULT_SAMPPLERATE;
 int channel = DEFAULT_CHANNEL;
 int bit = DEFAULT_BIT;
+int pcm_format = 0;
 unsigned char buf_adts[ADTS_HEADER_SIZE];
 uint64_t pts = 0;
 #ifdef USE_MEDIA_CODEC
@@ -105,6 +108,8 @@ int iseos_codec = 0;
 bool validate_with_codec = false;
 bool validate_multitrack = false;
 bool validate_with_demux = false;
+bool validate_with_pcm = false;
+
 char media_file[MAX_INPUT_SIZE];
 char data_sink[MAX_INPUT_SIZE];
 bool have_mp4 = false;
@@ -123,7 +128,7 @@ bool is_video = false;
 bool is_audio = false;
 
 int demux_mp4();
-int demux_audio();
+int demux_audio(bool need_demux);
 static void display_sub_basic();
 void mediacodec_process_all(void);
 void input_raw_filepath(char *filename);
@@ -291,7 +296,7 @@ int test_mediamuxer_add_track_audio()
                        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)
+                       if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_PCM + pcm_format) != 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)
@@ -313,11 +318,18 @@ int test_mediamuxer_add_track_audio()
                        media_format_set_audio_avg_bps(media_format_a, bitrate);
                } else {
 #endif
-                       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_pcm) {
+                               media_format_set_audio_channel(media_format_a, channel);
+                               media_format_set_audio_samplerate(media_format_a, samplerate);
+                               media_format_set_audio_bit(media_format_a, bit);
+                       } else {
+                               media_format_set_audio_channel(media_format_a, 2);
+                               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);
+                       }
+
 #ifdef USE_MEDIA_CODEC
                }
 #endif
@@ -413,10 +425,13 @@ int test_mediamuxer_write_sample()
                test_mediademuxer_process_all(sel_vid, sel_aud);
        } else
 #endif
-       if (strncmp(data_sink, "31", 2) == 0 || strncmp(data_sink, "wav", 3) == 0
+
+       if (validate_with_pcm) {
+               demux_audio(false);
+       } 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();
+               demux_audio(true);
        } else {
                demux_mp4();
        }
@@ -632,6 +647,8 @@ void _interpret_main_menu(char *cmd)
                        test_mediamuxer_set_error_cb();
                } else if (strncmp(cmd, "eo", 2) == 0) {
                        test_mediamuxer_set_eos_cb();
+               } else if (strncmp(cmd, "pa", 2) == 0) {
+                       g_menu_state = CURRENT_STATEUS_SET_PCM_INFO;
                }
 #ifdef USE_MEDIA_CODEC
                else if (validate_with_codec) {
@@ -689,6 +706,17 @@ static void displaymenu(void)
                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 if (g_menu_state == CURRENT_STATUS_PCM_FILENAME) {
+               g_print("*** input raw pcm file name:\n");
+       } else if (g_menu_state == CURRENT_STATEUS_SET_PCM_INFO) {
+               g_print("*** input pcm audio info (format, samplerate, channel)\n");
+               g_print("*** PCM format \
+                               \n(0)  PCM_S16LE        (1)  PCM_S24LE  (2)  PCM_S32LE \
+                               \n(3)  PCM_S16BE        (4)  PCM_S24BE  (5)  PCM_S32BE \
+                               \n(6)  PCM_F32LE        (7)  PCM_F32BE  (8)  PCM_U16LE \
+                               \n(9)  PCM_U24LE        (10) PCM_U32LE  (11) PCM_U16BE \
+                               \n(12) PCM_U24BE        (13) PCM_U32BE \n");
+               g_print("(e.g) 0 2 44100 16 (format = PCM_S16LE, channel = 2, samplerate = 44100) \n");
        } else {
                g_print("*** unknown status.\n");
                exit(0);
@@ -709,7 +737,9 @@ static void interpret(char *cmd)
                _interpret_main_menu(cmd);
                break;
        }
-       case CURRENT_STATUS_MP4_FILENAME: {
+       case CURRENT_STATUS_MP4_FILENAME:
+       case CURRENT_STATUS_FILENAME:
+       case CURRENT_STATUS_PCM_FILENAME: {
                input_filepath(cmd);
                strncpy(media_file, cmd, MAX_INPUT_SIZE - 1);
                g_menu_state = CURRENT_STATUS_MAINMENU;
@@ -804,12 +834,35 @@ static void interpret(char *cmd)
        }
        break;
 #endif
-       case CURRENT_STATUS_FILENAME: { /* mp */
-               input_filepath(cmd);
-               strncpy(media_file, cmd, MAX_INPUT_SIZE - 1);
-               g_menu_state = CURRENT_STATUS_MAINMENU;
-               break;
+       case CURRENT_STATEUS_SET_PCM_INFO:
+       {
+               static int cnt = 0;
+               switch (cnt) {
+               case 0:
+                       pcm_format = atoi(cmd);
+                       if (pcm_format == 0 || pcm_format == 3 || pcm_format == 8 || pcm_format == 11)
+                               bit = 16;
+                       else if (pcm_format == 1 || pcm_format == 4 || pcm_format == 9 || pcm_format == 12)
+                               bit = 24;
+                       else if (pcm_format == 2 || pcm_format == 5 || pcm_format == 6
+                                       || pcm_format == 7 || pcm_format == 10 || pcm_format == 13)
+                               bit = 32;
+                       cnt++;
+                       break;
+               case 1:
+                       channel = atoi(cmd);
+                       cnt++;
+                       break;
+               case 2:
+                       samplerate = atoi(cmd);
+                       cnt = 0;
+                       reset_menu_state();
+                       break;
+               default:
+                       break;
+               }
        }
+       break;
        default:
                break;
        }
@@ -828,11 +881,18 @@ static void display_sub_basic()
                g_print("ve. Set venc info \n");
                g_print("ca. Create Media Codec for Audio\t");
                g_print("ae. Set aenc info \n");
+               g_print("------------------------------------------\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("--------------------------------------------\n");
+       }
+       if (validate_with_pcm) {
+               g_print("-- test for PCM to WAV -------------------\n");
+               g_print("pa. set PCM info \n");
+               g_print("------------------------------------------\n");
        }
        g_print("c. Create \t");
        g_print("o. Set Data Sink \n");
@@ -893,12 +953,25 @@ int main(int argc, char *argv[])
 
        if (argc > 1) {
                /* Check whether validation with media codec is required */
-               if (argv[1][0] == '-' && argv[1][1] == 'c')
+               if (argv[1][0] == '-' && argv[1][1] == 'c') {
+#ifndef USE_MEDIA_CODEC
+                       g_print("Add define USE_MEDIA_CODE\n");
+                       return 0;
+#else
                        validate_with_codec = true;
-               else if (argv[1][0] == '-' && argv[1][1] == 'm')
+#endif
+               } else if (argv[1][0] == '-' && argv[1][1] == 'm') {
                        validate_multitrack = true;
-               else if (argv[1][0] == '-' && argv[1][1] == 'd')
+               } else if (argv[1][0] == '-' && argv[1][1] == 'd') {
+#ifndef USE_MEDIA_DEMUX
+                       g_print("Add define USE_MEDIA_CODE\n");
+                       return 0;
+#else
                        validate_with_demux = true;
+#endif
+               } else if (argv[1][0] == '-' && argv[1][1] == 'p') {
+                       validate_with_pcm = true;
+               }
        }
 
        displaymenu();
index debaa0d..ff75d69 100644 (file)
@@ -53,6 +53,9 @@ extern char media_file[2048];
 extern bool have_aud_track;
 extern bool have_vid_track;
 extern bool have_text_track;
+
+extern media_format_h media_format_a;
+
 const gchar *new_pad_type_aud = NULL; /* demuxer pad type for audio */
 const gchar *new_pad_type_vid = NULL; /* demuxer pad type for video */
 const gchar *new_pad_type_text = NULL; /* demuxer pad type for subtitle */
@@ -84,7 +87,6 @@ typedef struct _CustomData {
 static void __audio_app_sink_callback(GstElement *sink, CustomData *data)
 {
        GstBuffer *buffer = NULL;
-       media_format_h audfmt = NULL;
        media_packet_h aud_pkt = NULL;
        guint8 *dptr = NULL;
        static int count = 0;
@@ -121,53 +123,7 @@ static void __audio_app_sink_callback(GstElement *sink, CustomData *data)
                key = 0;
        }
 
-       if (media_format_create(&audfmt)) {
-               g_print("media_format_create failed\n");
-               gst_buffer_unmap(buffer, &map);
-               return;
-       }
-
-       g_print("audio data_sink = %s\n", data_sink);
-       /* check if the mime selected during set_data_sink is matching with the mime of the file inputted.*/
-       if (g_str_has_prefix(new_pad_type_aud, "audio/mpeg")
-               && (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)) {
-               if (media_format_set_audio_mime(audfmt, MEDIA_FORMAT_AAC_LC)) {
-                       g_print("media_format_set_audio_mime failed\n");
-                       goto ERROR1;
-               }
-       } else if (g_str_has_prefix(new_pad_type_aud, "audio/AMR-WB")
-               && strncmp(data_sink, "42", 2) == 0) {
-               g_print("For amr-wb, setting encoded media type as MEDIA_FORMAT_AMR_WB\n");
-               if (media_format_set_audio_mime(audfmt, MEDIA_FORMAT_AMR_WB)) {
-                       g_print("media_format_set_audio_mime failed\n");
-                       goto ERROR1;
-               }
-       } else if (g_str_has_prefix(new_pad_type_aud, "audio/AMR")
-               && (strncmp(data_sink, "23", 2) == 0 || strncmp(data_sink, "24", 2) == 0
-                       || strncmp(data_sink, "41", 2) == 0)) {
-               g_print("For amr-nb, setting encoded media type as MEDIA_FORMAT_AMR_NB\n");
-               if (media_format_set_audio_mime(audfmt, MEDIA_FORMAT_AMR_NB)) {
-                       g_print("media_format_set_audio_mime failed\n");
-                       goto ERROR1;
-               }
-       } else if (g_str_has_prefix(new_pad_type_aud, "audio/x-wav")
-               && strncmp(data_sink, "31", 2) == 0) {
-               g_print("creating audio-wav\n");
-               if (media_format_set_audio_mime(audfmt, MEDIA_FORMAT_PCM)) {
-                       g_print("media_format_set_audio_mime failed\n");
-                       goto ERROR1;
-               }
-               if (media_format_set_audio_bit(audfmt, 16))
-                       g_print("wav media_format_set_audio_bit failed\n");
-               if (media_format_set_audio_channel(audfmt, 2))
-                       g_print("wav media_format_set_audio_channel failed\n");
-               if (media_format_set_audio_samplerate(audfmt, 44100))
-                       g_print("wav media_format_set_audio_samplerate failed\n");
-       } else
-               g_print("Unsupported audio mime\n");
-
-       if (media_packet_create(audfmt, NULL, NULL, &aud_pkt)) {
+       if (media_packet_create(media_format_a, NULL, NULL, &aud_pkt)) {
                g_print("create audio media_packet failed\n");
                goto ERROR1;
        }
@@ -191,20 +147,6 @@ static void __audio_app_sink_callback(GstElement *sink, CustomData *data)
                goto ERROR2;
        }
 
-       if (strncmp(data_sink, "31", 2) == 0 || strncmp(data_sink, "wav", 3) == 0) {
-               aud_caps = "audio/x-raw, format=(string)S16LE, layout=(string)interleaved, channels=(int)2, channel-mask=(bitmask)0x0000000000000003, rate=(int)44100";
-               /* no need to set the rest of the parameters for wav */
-               goto SET_CAPS;
-       } else if (strncmp(data_sink, "41", 2) == 0 || strncmp(data_sink, "amr-nb", 6) == 0) {
-               /* ToDo: Query caps from amrparse src pad */
-               aud_caps = "audio/AMR, channels=1, rate=8000";
-               goto SET_CAPS;
-       } else if (strncmp(data_sink, "42", 2) == 0 || strncmp(data_sink, "amr-wb", 6) == 0) {
-               /* ToDo: Query caps from amrparse src pad */
-               aud_caps = "audio/AMR-WB, channels=1, rate=16000";
-               goto SET_CAPS;
-       }
-
        if (media_packet_set_pts(aud_pkt, buffer->pts)) {
                g_print("unable to set the pts\n");
                goto ERROR2;
@@ -225,7 +167,6 @@ static void __audio_app_sink_callback(GstElement *sink, CustomData *data)
                goto ERROR2;
        }
 
-SET_CAPS:
        if (!aud_codec_data) {
                aud_codec_data = true;
                /* Create the codec data and pass to _gst_copy_buf_to_media_packet() to add into the media packet */
@@ -278,7 +219,6 @@ SET_CAPS:
 ERROR2:
        media_packet_destroy(aud_pkt);
 ERROR1:
-       media_format_unref(audfmt);
        gst_buffer_unmap(buffer, &map);
        return;
 }
@@ -768,7 +708,7 @@ static gboolean __bus_call(GstBus *bus, GstMessage *mesg, gpointer data)
 
 
 /* Demux audio (wav/amr) file and generate raw data */
-int demux_audio()
+int demux_audio(bool need_demux)
 {
        CustomData data = {0, };
        GMainLoop *loop_dmx;
@@ -778,8 +718,7 @@ int demux_audio()
        g_print("Start of _demux_audio()\n");
 
        if (access(media_file, F_OK) == -1) {
-               /* wav/amr file doesn't exist */
-               g_print("wav/amr Invalid file path.\n");
+               g_print("Invalid audio file path.\n");
                return -1;
        }
 
@@ -790,23 +729,34 @@ int demux_audio()
        /* Create gstreamer elements for demuxer */
        data.pipeline = gst_pipeline_new("DemuxerPipeline");
        data.source = gst_element_factory_make("filesrc", "file-source");
-       if (strncmp(data_sink, "31", 2) == 0 || strncmp(data_sink, "wav", 3) == 0) {
-               data.demuxer = gst_element_factory_make("wavparse", "wavparse");
-               new_pad_type_aud = "audio/x-wav";       /* Update to aid cb */
-       } else if (strncmp(data_sink, "41", 2) == 0) {
-               data.demuxer = gst_element_factory_make("amrparse", "amrparse");
-               new_pad_type_aud = "audio/AMR"; /* Update to aid cb */
-       } else if (strncmp(data_sink, "42", 2) == 0 || strncmp(data_sink, "amr-wb", 6) == 0) {
-               data.demuxer = gst_element_factory_make("amrparse", "amrparse");
-               new_pad_type_aud = "audio/AMR-WB";      /* Update to aid cb */
+       if (need_demux) {
+               if (strncmp(data_sink, "31", 2) == 0 || strncmp(data_sink, "wav", 3) == 0) {
+                       data.demuxer = gst_element_factory_make("wavparse", "wavparse");
+                       new_pad_type_aud = "audio/x-wav";       /* Update to aid cb */
+               } else if (strncmp(data_sink, "41", 2) == 0) {
+                       data.demuxer = gst_element_factory_make("amrparse", "amrparse");
+                       new_pad_type_aud = "audio/AMR"; /* Update to aid cb */
+               } else if (strncmp(data_sink, "42", 2) == 0 || strncmp(data_sink, "amr-wb", 6) == 0) {
+                       data.demuxer = gst_element_factory_make("amrparse", "amrparse");
+                       new_pad_type_aud = "audio/AMR-WB";      /* Update to aid cb */
+               }
        }
+
        data.audioqueue = gst_element_factory_make("queue", "audio-queue");
        data.audio_appsink = gst_element_factory_make("appsink", "encoded_audio_appsink");
 
-       if (!data.pipeline || !data.source || !data.demuxer || !data.audioqueue || !data.audio_appsink) {
-               g_print("Test-Suite: One gst-element can't be created. Exiting\n");
-               g_main_loop_unref(loop_dmx);
-               return -1;
+       if (need_demux) {
+               if (!data.pipeline || !data.source || !data.demuxer || !data.audioqueue || !data.audio_appsink) {
+                       g_print("Test-Suite: One gst-element can't be created. Exiting\n");
+                       g_main_loop_unref(loop_dmx);
+                       return -1;
+               }
+       } else {
+               if (!data.pipeline || !data.source || !data.audioqueue || !data.audio_appsink) {
+                       g_print("Test-Suite: One gst-element can't be created. Exiting\n");
+                       g_main_loop_unref(loop_dmx);
+                       return -1;
+               }
        }
 
        /* Add msg-handler */
@@ -815,16 +765,27 @@ int demux_audio()
        gst_object_unref(bus);
 
        /* Add gstreamer-elements into gst-pipeline */
-       gst_bin_add_many(GST_BIN(data.pipeline), data.source, data.demuxer, data.audioqueue, data.audio_appsink, NULL);
+       if (need_demux)
+               gst_bin_add_many(GST_BIN(data.pipeline), data.source, data.demuxer, data.audioqueue, data.audio_appsink, NULL);
+       else
+               gst_bin_add_many(GST_BIN(data.pipeline), data.source, data.audioqueue, data.audio_appsink, NULL);
 
        /* we set the input filename to the source element */
        g_object_set(G_OBJECT(data.source), "location", media_file, NULL);
 
        /* we link the elements together */
-       if (!gst_element_link_many(data.source, data.demuxer, data.audioqueue, data.audio_appsink, NULL)) {
-               g_print("Demuxer pipeline link failed\n");
-               g_main_loop_unref(loop_dmx);
-               return -1;
+       if (need_demux) {
+               if (!gst_element_link_many(data.source, data.demuxer, data.audioqueue, data.audio_appsink, NULL)) {
+                       g_print("Demuxer pipeline link failed\n");
+                       g_main_loop_unref(loop_dmx);
+                       return -1;
+               }
+       } else {
+               if (!gst_element_link_many(data.source, data.audioqueue, data.audio_appsink, NULL)) {
+                       g_print("Demuxer pipeline link failed\n");
+                       g_main_loop_unref(loop_dmx);
+                       return -1;
+               }
        }
 
        g_object_set(data.audio_appsink, "emit-signals", TRUE, NULL);