typedef enum {
MEDIAMUXER_CONTAINER_FORMAT_MP4 = MEDIA_FORMAT_CONTAINER_MP4, /**< The mediamuxer output format is MP4 container */
MEDIAMUXER_CONTAINER_FORMAT_3GP = MEDIA_FORMAT_CONTAINER_3GP, /**< The mediamuxer output format is 3GP container */
- MEDIAMUXER_CONTAINER_FORMAT_WAV = MEDIA_FORMAT_CONTAINER_WAV /**< The mediamuxer output format is WAV container */
+ MEDIAMUXER_CONTAINER_FORMAT_WAV = MEDIA_FORMAT_CONTAINER_WAV, /**< The mediamuxer output format is WAV container */
+ MEDIAMUXER_CONTAINER_FORMAT_AMR_NB = MEDIA_FORMAT_AMR_NB, /**< The mediamuxer output format is ARM_NB container */
+ MEDIAMUXER_CONTAINER_FORMAT_AMR_WB = MEDIA_FORMAT_AMR_WB /**< The mediamuxer output format is AMR_WB container */
} mediamuxer_output_format_e;
/**
if (format != MEDIAMUXER_CONTAINER_FORMAT_MP4
&& format != MEDIAMUXER_CONTAINER_FORMAT_3GP
- && format != MEDIAMUXER_CONTAINER_FORMAT_WAV) {
+ && format != MEDIAMUXER_CONTAINER_FORMAT_WAV
+ && format != MEDIAMUXER_CONTAINER_FORMAT_AMR_NB
+ && format != MEDIAMUXER_CONTAINER_FORMAT_AMR_WB) {
MX_E("Unsupported Container format: %d \n", format);
return MEDIAMUXER_ERROR_INVALID_PARAMETER;
}
&& (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))
+ || (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)++;
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 {
/* 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");
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");
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);
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();
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;
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);
} 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;
} 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;
}
} 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");
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;
}
} 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) {
}
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;
}
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 */
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;
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)) {
}
/* 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);
}
-/* 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;
}
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");
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)) {
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 */
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;
}
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;
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);
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 */