From 3668157e6b0f52d8ef0fd50a55091785b8a00eee Mon Sep 17 00:00:00 2001 From: Mahesh Kondiparthi Date: Mon, 7 Dec 2015 12:44:50 +0530 Subject: [PATCH] Added amr support to muxer Support to both amr-nb and amr-wb is added Enhanced the testsuite to add demux amr-nb and demux amr-wb. Removed calling gst_element_get_state() from pause as the state is known to be PLAYING Change-Id: I096a14c705f4237d4083dc32fc4133f54e17372a Signed-off-by: Mahesh Kondiparthi muxed_format == MEDIAMUXER_CONTAINER_FORMAT_WAV - && (mimetype == MEDIA_FORMAT_PCM))) { + && (mimetype == MEDIA_FORMAT_PCM)) + || (mx_handle_gst->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_AMR_NB + && (mimetype == MEDIA_FORMAT_AMR_NB)) + || (mx_handle_gst->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_AMR_WB + && (mimetype == MEDIA_FORMAT_AMR_WB))) { current->track_index = 1 + NO_OF_TRACK_TYPES*(mx_handle_gst->track_info.audio_track_cnt); (mx_handle_gst->track_info.audio_track_cnt)++; @@ -417,8 +421,10 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle) if (gst_handle->muxed_format != MEDIAMUXER_CONTAINER_FORMAT_MP4 && gst_handle->muxed_format != MEDIAMUXER_CONTAINER_FORMAT_3GP - && gst_handle->muxed_format != MEDIAMUXER_CONTAINER_FORMAT_WAV) { - MX_E("Unsupported format. Currently supports only MP4, 3GP & WAV"); + && gst_handle->muxed_format != MEDIAMUXER_CONTAINER_FORMAT_WAV + && gst_handle->muxed_format != MEDIAMUXER_CONTAINER_FORMAT_AMR_NB + && gst_handle->muxed_format != MEDIAMUXER_CONTAINER_FORMAT_AMR_WB) { + MX_E("Unsupported container-format. Currently suports only MP4, 3GP, WAV & AMR"); ret = MEDIAMUXER_ERROR_INVALID_PATH; goto ERROR; } else { @@ -431,6 +437,9 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle) /* gst_handle->muxer = gst_element_factory_make("qtmux", "qtmux"); */ else if (gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_WAV) gst_handle->muxer = gst_element_factory_make("wavenc", "wavenc"); + else if (gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_AMR_NB + || gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_AMR_WB) + gst_handle->muxer = gst_element_factory_make("avmux_amr", "avmux_amr"); if ((!gst_handle->pipeline) || (!gst_handle->muxer) || (!gst_handle->sink)) { MX_E("One element could not be created. Exiting.\n"); @@ -516,7 +525,7 @@ mx_ret_e _gst_create_pipeline(mxgst_handle_t *gst_handle) MEDIA_FORMAT_ERROR_INVALID_OPERATION) { if (mimetype == MEDIA_FORMAT_AAC_LC || mimetype == MEDIA_FORMAT_AAC_HE || mimetype == MEDIA_FORMAT_AAC_HE_PS) current->parser = gst_element_factory_make("aacparse", str_parser); - else if (mimetype == MEDIA_FORMAT_AMR_NB) + else if (mimetype == MEDIA_FORMAT_AMR_NB || mimetype == MEDIA_FORMAT_AMR_WB) current->parser = gst_element_factory_make("amrparse", str_parser); else if (mimetype == MEDIA_FORMAT_PCM) MX_I("Do Nothing, as there is no need of parser for wav\n"); @@ -554,7 +563,10 @@ 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 (gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_WAV) { /* wavenc is muxer */ + /* For wav, wavenc is muxer */ + if (gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_WAV + || gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_AMR_NB + || gst_handle->muxed_format == MEDIAMUXER_CONTAINER_FORMAT_AMR_WB) { gst_element_link(current->appsrc, gst_handle->muxer); } else { gst_element_link(current->appsrc, current->parser); @@ -1179,20 +1191,11 @@ static int gst_muxer_pause(MMHandleType pHandle) int ret = MX_ERROR_NONE; MEDIAMUXER_CHECK_NULL(pHandle); mxgst_handle_t *gst_handle = (mxgst_handle_t *) pHandle; - GstState state; MX_I("gst_muxer_pause setting pipeline to pause"); - gst_element_get_state(gst_handle->pipeline, &state, NULL, GST_CLOCK_TIME_NONE); - - if (state == GST_STATE_PLAYING) { - if (gst_element_set_state(gst_handle->pipeline, GST_STATE_PAUSED) - == GST_STATE_CHANGE_FAILURE) { - MX_I("Setting pipeline to pause failed"); - ret = MX_ERROR_INVALID_ARGUMENT; - } - } else { - MX_I("pipeline is not in playing, PAUSE is intended to pause a playing pipeline. \ - exiting with out state change"); + if (gst_element_set_state(gst_handle->pipeline, GST_STATE_PAUSED) + == GST_STATE_CHANGE_FAILURE) { + MX_I("Setting pipeline to pause failed"); ret = MX_ERROR_INVALID_ARGUMENT; } MEDIAMUXER_FLEAVE(); diff --git a/test/mediamuxer_test.c b/test/mediamuxer_test.c index f23d01c..90a220f 100644 --- a/test/mediamuxer_test.c +++ b/test/mediamuxer_test.c @@ -85,7 +85,7 @@ static int bitrate = DEFAULT_BITRATE; int iseos_codec = 0; bool validate_with_codec = false; bool validate_multitrack = false; -char file_mp4[MAX_INPUT_SIZE]; +char media_file[MAX_INPUT_SIZE]; char data_sink[MAX_INPUT_SIZE]; bool have_mp4 = false; bool have_vid_track = false; @@ -95,7 +95,7 @@ int track_index_aud; int track_index_aud2; int demux_mp4(); -int demux_wav(); +int demux_audio(); void mediacodec_process_all(void); void input_raw_filepath(char *filename); void mediacodec_config_set_codec(int codecid, int flag); @@ -143,8 +143,16 @@ int test_mediamuxer_set_data_sink() } else if (strncmp(data_sink, "5", 1) == 0 || strncmp(data_sink, "wav", 3) == 0) { op_uri = "MuxTest.wav"; ret = mediamuxer_set_data_sink(myMuxer, op_uri, MEDIAMUXER_CONTAINER_FORMAT_WAV); + } else if (strncmp(data_sink, "6", 1) == 0 || strncmp(data_sink, "amr-nb", 6) == 0) { + op_uri = "MuxTest_nb.amr"; + ret = mediamuxer_set_data_sink(myMuxer, op_uri, MEDIAMUXER_CONTAINER_FORMAT_AMR_NB); + } else if (strncmp(data_sink, "7", 1) == 0 || strncmp(data_sink, "amr-wb", 6) == 0) { + op_uri = "MuxTest_wb.amr"; + ret = mediamuxer_set_data_sink(myMuxer, op_uri, MEDIAMUXER_CONTAINER_FORMAT_AMR_WB); } + g_print("\nFile will be saved to: %s\n", op_uri); + if (ret != MEDIAMUXER_ERROR_NONE) g_print("mediamuxer_set_data_sink is failed\n"); return ret; @@ -174,8 +182,9 @@ int test_mediamuxer_add_track_video() } else if (strncmp(data_sink, "4", 1) == 0) { if (media_format_set_video_mime(media_format, MEDIA_FORMAT_H263) == MEDIA_FORMAT_ERROR_INVALID_OPERATION) g_print("Problem during media_format_set_audio_mime operation\n"); - } else if (strncmp(data_sink, "5", 1) == 0) { - g_print("Add video track is invalid for wav\n"); + } else if (strncmp(data_sink, "5", 1) == 0 + || strncmp(data_sink, "6", 1) == 0 || strncmp(data_sink, "7", 1) == 0) { + g_print("Add video track is invalid for wav/amr\n"); return 1; } @@ -219,16 +228,23 @@ int test_mediamuxer_add_track_audio() } else if (strncmp(data_sink, "2", 1) == 0 || strncmp(data_sink, "3gp", 3) == 0 || strncmp(data_sink, "3", 1) == 0) { if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AAC_LC) == MEDIA_FORMAT_ERROR_INVALID_OPERATION) - g_print("Problem during media_format_set_audio_mime operation\n"); + g_print("Problem during media_format_set_audio_mime operation, for AAC in 3GP\n"); } else if (strncmp(data_sink, "4", 1) == 0) { if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AMR_NB) == MEDIA_FORMAT_ERROR_INVALID_OPERATION) - g_print("Problem during media_format_set_audio_mime operation\n"); + g_print("Problem during media_format_set_audio_mime operation for AMR_NB in 3GP\n"); } else if (strncmp(data_sink, "5", 1) == 0) { if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_PCM) == MEDIA_FORMAT_ERROR_INVALID_OPERATION) - g_print("Problem during media_format_set_audio_mime operation\n"); + g_print("Problem during media_format_set_audio_mime operation for PCM in WAV\n"); + } else if (strncmp(data_sink, "6", 1) == 0) { + if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AMR_NB) == MEDIA_FORMAT_ERROR_INVALID_OPERATION) + g_print("Problem during media_format_set_audio_mime operation for amr-nb audio\n"); + } else if (strncmp(data_sink, "7", 1) == 0) { + if (media_format_set_audio_mime(media_format_a, MEDIA_FORMAT_AMR_WB) == MEDIA_FORMAT_ERROR_INVALID_OPERATION) + g_print("Problem during media_format_set_audio_mime operation for amr-wb audio\n"); } + if (validate_with_codec) { if (media_format_set_audio_channel(media_format_a, channel) == MEDIA_FORMAT_ERROR_INVALID_OPERATION) g_print("Problem during media_format_set_audio_channel operation\n"); @@ -282,9 +298,12 @@ int test_mediamuxer_write_sample() if (validate_with_codec) { /* Test muxer with codec */ mediacodec_process_all(); - } else if (strncmp(data_sink, "5", 1) == 0 || strncmp(data_sink, "wav", 3)) { - demux_wav(); + } else if (strncmp(data_sink, "5", 1) == 0 || strncmp(data_sink, "wav", 3) == 0 + || strncmp(data_sink, "6", 1) == 0 + || strncmp(data_sink, "7", 1) == 0 || strncmp(data_sink, "amr", 3) == 0) { + demux_audio(); } else { + demux_mp4(); } return 0; @@ -458,7 +477,7 @@ static void displaymenu(void) } } else if (g_menu_state == CURRENT_STATUS_DATA_SINK) { g_print("*** input the datasink container format:\n"); - g_print("(1) mp4 \n(2) 3gp (h264 + AAC) \n(3) 3gp (h263 + AAC) \n(4) 3gp (h263 + AMR) \n(5) wav\n"); + g_print("(1) mp4 \n(2) 3gp (h264 + AAC) \n(3) 3gp (h263 + AAC) \n(4) 3gp (h263 + AMR) \n(5) wav \n(6) amr-nb \n(7) amr-wb \n"); } else if (g_menu_state == CURRENT_STATUS_RAW_VIDEO_FILENAME) { g_print("*** input raw video file name"); } else if (g_menu_state == CURRENT_STATUS_SET_VENC_INFO) { @@ -490,7 +509,7 @@ static void interpret(char *cmd) } case CURRENT_STATUS_MP4_FILENAME: { input_filepath(cmd); - strncpy(file_mp4, cmd, MAX_INPUT_SIZE - 1); + strncpy(media_file, cmd, MAX_INPUT_SIZE - 1); g_menu_state = CURRENT_STATUS_MAINMENU; break; } diff --git a/test/mediamuxer_test_gst.c b/test/mediamuxer_test_gst.c index 6fc9cf0..98d0bd8 100644 --- a/test/mediamuxer_test_gst.c +++ b/test/mediamuxer_test_gst.c @@ -45,7 +45,7 @@ extern mediamuxer_h myMuxer; extern bool validate_multitrack; extern char media_file[2048]; extern char data_sink[2048]; -extern char file_mp4[2048]; +extern char media_file[2048]; extern bool have_aud_track; extern bool have_vid_track; const gchar *new_pad_type_aud = NULL; /* demuxer pad type for audio */ @@ -110,9 +110,14 @@ static void __audio_app_sink_callback(GstElement *sink, CustomData *data) g_print("media_format_set_audio_mime failed\n"); return; } - } else if (g_str_has_prefix(new_pad_type_aud, "audio/AMR") - || g_str_has_prefix(new_pad_type_aud, "audio/x-amr-wb-sh") - || g_str_has_prefix(new_pad_type_aud, "audio/x-amr-nb-sh")) { + } else if (g_str_has_prefix(new_pad_type_aud, "audio/AMR-WB")) { + 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"); + return; + } + } else if (g_str_has_prefix(new_pad_type_aud, "audio/AMR")) { + 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"); return; @@ -158,6 +163,14 @@ static void __audio_app_sink_callback(GstElement *sink, CustomData *data) 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, "6", 1) == 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, "7", 1) == 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)) { @@ -313,12 +326,13 @@ static void __video_app_sink_callback(GstElement *sink, CustomData *data) } /* demuxer audio appsink eos callback */ -static void __audio_app_sink_eos_callback(GstElement *sink, CustomData *data) +void __audio_app_sink_eos_callback(GstElement *sink, CustomData *data) { + g_print("__audio_app_sink_eos_callback, closing track_index = %d\n", track_index_aud); mediamuxer_close_track(myMuxer, track_index_aud); if (validate_multitrack) mediamuxer_close_track(myMuxer, track_index_aud2); - g_print("Encoded Audio EOS cb reached \n"); + g_print("audio EOS cb reached \n"); aud_eos = 1; if (!have_vid_track || vid_eos == 1) g_main_loop_quit(data->loop); @@ -436,19 +450,19 @@ static gboolean __bus_call(GstBus *bus, GstMessage *mesg, gpointer data) } -/* Demux wav file and generate raw data */ -int demux_wav() +/* Demux audio (wav/amr) file and generate raw data */ +int demux_audio() { CustomData data; GMainLoop *loop_dmx; GstBus *bus; guint watch_id_for_bus; - g_print("Start of _demux_wav()\n"); + g_print("Start of _demux_audio()\n"); - if (access(file_mp4, F_OK) == -1) { - /* wav file doesn't exist */ - g_print("Invalid wav file path."); + if (access(media_file, F_OK) == -1) { + /* wav/amr file doesn't exist */ + g_print("wav/amr Invalid file path."); return -1; } @@ -456,10 +470,19 @@ int demux_wav() loop_dmx = g_main_loop_new(NULL, FALSE); data.loop = loop_dmx; new_pad_type_aud = "audio/x-wav"; /* Update to aid cb. */ - /* Create gstreamer elements for demuxer*/ + /* Create gstreamer elements for demuxer */ data.pipeline = gst_pipeline_new("DemuxerPipeline"); data.source = gst_element_factory_make("filesrc", "file-source"); - data.demuxer = gst_element_factory_make("wavparse", "wavparse"); + if (strncmp(data_sink, "5", 1) == 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, "6", 1) == 0) { + data.demuxer = gst_element_factory_make("amrparse", "amrparse"); + new_pad_type_aud = "audio/AMR"; /* Update to aid cb */ + } else if (strncmp(data_sink, "7", 1) == 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"); @@ -477,7 +500,7 @@ int demux_wav() gst_bin_add_many(GST_BIN(data.pipeline), data.source, data.demuxer, data.audioqueue, data.audio_appsink, NULL); /* we set the input filename to the source element */ - g_object_set(G_OBJECT(data.source), "location", file_mp4, NULL); + 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)) { @@ -489,12 +512,12 @@ int demux_wav() g_signal_connect(data.audio_appsink, "new-sample", G_CALLBACK(__audio_app_sink_callback), &data); g_signal_connect(data.audio_appsink, "eos", G_CALLBACK(__audio_app_sink_eos_callback), &data); - /* No demuxer callback for wav, playing the pipeline*/ - g_print("Now playing: %s\n", file_mp4); + /* No demuxer callback for wav, playing the pipeline */ + g_print("Now playing: %s\n", media_file); gst_element_set_state(data.pipeline, GST_STATE_PLAYING); /* Run the loop till quit */ - g_print("gst-wav-pipeline - Running...\n"); + g_print("gst-wav/amr-pipeline -Running...\n"); g_main_loop_run(loop_dmx); /* Done with gst-loop. Free resources */ @@ -504,7 +527,7 @@ int demux_wav() gst_object_unref(GST_OBJECT(data.pipeline)); g_source_remove(watch_id_for_bus); g_main_loop_unref(loop_dmx); - g_print("End of demux_wav()\n"); + g_print("End of demux_audio()\n"); return 0; } @@ -518,7 +541,7 @@ int demux_mp4() g_print("Start of _demux_mp4()\n"); - if (access(file_mp4, F_OK) == -1) { + if (access(media_file, F_OK) == -1) { /* mp4 file doesn't exist */ g_print("mp4 Invalid file path."); return -1; @@ -555,7 +578,7 @@ int demux_mp4() data.audioqueue, data.videoqueue, data.audio_appsink, data.video_appsink, NULL); /* we set the input filename to the source element */ - g_object_set(G_OBJECT(data.source), "location", file_mp4, NULL); + g_object_set(G_OBJECT(data.source), "location", media_file, NULL); /* we link the elements together */ gst_element_link(data.source, data.demuxer); @@ -564,7 +587,7 @@ int demux_mp4() g_signal_connect(data.demuxer, "pad-added", G_CALLBACK(__on_pad_added), &data); /* Play the pipeline */ - g_print("Now playing : %s\n", file_mp4); + g_print("Now playing : %s\n", media_file); gst_element_set_state(data.pipeline, GST_STATE_PLAYING); /* Run the loop till quit */ -- 2.7.4