From: Gilbok Lee Date: Tue, 23 Jul 2019 04:24:33 +0000 (+0900) Subject: Support muxing from pcm file to wav file X-Git-Tag: accepted/tizen/unified/20190730.112048^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=764776814cef302ff17aed2c02157b5e093a1db9;p=platform%2Fcore%2Fapi%2Fmediamuxer.git Support muxing from pcm file to wav file [Version] 0.1.19 [Issue Type] Fix bugs Change-Id: I0cf5e1bf54a235f8337cd14184efd2b483c561b9 --- diff --git a/packaging/capi-mediamuxer.spec b/packaging/capi-mediamuxer.spec index 98c1124..b1ec240 100644 --- a/packaging/capi-mediamuxer.spec +++ b/packaging/capi-mediamuxer.spec @@ -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 diff --git a/src/port_gst/mediamuxer_port_gst.c b/src/port_gst/mediamuxer_port_gst.c index bc0d268..390c271 100644 --- a/src/port_gst/mediamuxer_port_gst.c +++ b/src/port_gst/mediamuxer_port_gst.c @@ -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); diff --git a/test/mediamuxer_test.c b/test/mediamuxer_test.c index 064421e..d9dc8e3 100644 --- a/test/mediamuxer_test.c +++ b/test/mediamuxer_test.c @@ -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(); diff --git a/test/mediamuxer_test_gst.c b/test/mediamuxer_test_gst.c index debaa0d..ff75d69 100644 --- a/test/mediamuxer_test_gst.c +++ b/test/mediamuxer_test_gst.c @@ -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);