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
#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,
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)) {
}
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;
}
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;
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;
}
&& (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
} 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");
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) {
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);
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;
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
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;
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);
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)
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
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();
}
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) {
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);
_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;
}
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;
}
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");
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();
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 */
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;
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;
}
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;
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 */
ERROR2:
media_packet_destroy(aud_pkt);
ERROR1:
- media_format_unref(audfmt);
gst_buffer_unmap(buffer, &map);
return;
}
/* Demux audio (wav/amr) file and generate raw data */
-int demux_audio()
+int demux_audio(bool need_demux)
{
CustomData data = {0, };
GMainLoop *loop_dmx;
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;
}
/* 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 */
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);