rendered paste body#include <glib.h>
#include <stdio.h>
#include <gst/gst.h>
#include <assert.h>
#include <alp/traces.h>
#define ALP_MTL(str, ...) ALP_TM(TL(0, str, ## __VA_ARGS__))
static gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data){
GMainLoop *loop = (GMainLoop *) data;
ALP_MTL("Processing Message: %s", GST_MESSAGE_TYPE_NAME(msg));
switch (GST_MESSAGE_TYPE(msg)) {
case GST_MESSAGE_EOS:
g_main_loop_quit(loop);
ALP_MTL(" End of file");
break;
case GST_MESSAGE_TAG:
//ALP_MTL(" Tag message captured");
break;
case GST_MESSAGE_WARNING:{
gchar *debug;
GError *err;
gst_message_parse_warning(msg, &err, &debug);
g_free(debug);
g_print (" Warning: %s\n", err->message);
break;
}
case GST_MESSAGE_DURATION:{
gint64 *duration=0;
//gst_message_parse_duration(msg, NULL, duration);
ALP_MTL(" duration is %lld\n", duration);
break;
}
case GST_MESSAGE_ERROR: {
gchar *debug;
GError *err;
gst_message_parse_error (msg, &err, &debug);
g_free (debug);
g_print (" Error: %s", err->message);
g_error_free (err);
g_main_loop_quit (loop);
break;
}
default:
break;
}
return TRUE;
}
void play_mp3(char *url_mp3){
ALP_MTL(" Playing mp3...\n");
GstElement *src, *decoder, *sink, *pipeline;
GstBus *bus;
GMainLoop *loop;
loop = g_main_loop_new(NULL, FALSE);
pipeline = gst_pipeline_new("mp3player");
if (!pipeline)
ALP_MTL(" error while creating pipeline");
src = gst_element_factory_make("filesrc", "mysrc");
g_object_set(G_OBJECT(src), "location", url_mp3, NULL);
decoder = gst_element_factory_make("oki_mp3_dec", "mydecoder");
sink = gst_element_factory_make("filesink", "mysink");
g_object_set(G_OBJECT(sink), "location", "1.mp3", NULL);
if ((!src) || (!decoder) || (!sink))
ALP_MTL(" error while creating elements\n");
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
if (!bus)
ALP_MTL(" error\n");
gst_bus_add_watch(bus, bus_call, loop);
g_object_unref(bus);
gst_bin_add_many(GST_BIN(pipeline), src, decoder, sink, NULL);
if (!gst_element_link_many(src, decoder, sink, NULL))
ALP_MTL(" error while linking elements!");
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);
//****************************************************
GstQuery *query;
gboolean res;
query = gst_query_new_duration (GST_FORMAT_TIME);
res = gst_element_query (pipeline, query);
if (res) {
gint64 duration;
gst_query_parse_duration (query, NULL, &duration);
ALP_MTL (" duration = %"GST_TIME_FORMAT, GST_TIME_ARGS (duration));
}
else {
ALP_MTL (" duration query failed...");
}
gst_query_unref (query);
//****************************************************/
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));
}
GstElement *audiodec;
GstElement *decoder;
static void cbnewpad(GstElement *element, GstPad *pad, GstElement *target1){
GstElement *target;
if (strcmp(gst_pad_get_name(pad), "video_00") == 0) {
target = decoder;
}
else
target = audiodec;
GstCaps *cap, *captarget;
cap = gst_pad_get_caps(pad);
GstPad *padtarget;
padtarget = gst_element_get_pad(GST_ELEMENT(target), "sink");
captarget = gst_pad_get_caps(padtarget);
ALP_MTL(" A new pad: %s was created!\n", gst_pad_get_name(pad));
ALP_MTL(" Sink Cap: %s\n", gst_caps_to_string(cap));
ALP_MTL(" Src Cap: %s\n", gst_caps_to_string(captarget));
ALP_MTL(" Linking elements ...");
if (gst_pad_link(pad, padtarget) != GST_PAD_LINK_OK){
ALP_MTL(" Error while linking pad %s and %s", gst_pad_get_name(pad), gst_pad_get_name(padtarget));
}
}
void play_3gp(gchar *url_3gp){
GstElement *src, *demux, *sink, *audiosink;//, *decoder;
GstElement *pipeline;
GstBus *bus;
GMainLoop *loop;
ALP_MTL(" Playing 3gp file...");
loop = g_main_loop_new(NULL, FALSE);
pipeline = gst_pipeline_new("3gpplayer");
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
gst_bus_add_watch(bus, bus_call, loop);
src = gst_element_factory_make("filesrc", "3gpsrc");
g_object_set(G_OBJECT(src), "location", url_3gp, NULL);
demux = gst_element_factory_make("qtdemux", "3gpdemux");
decoder = gst_element_factory_make("oki_h263_dec", "263decoder");
sink = gst_element_factory_make("fakesink", "vasink");
audiodec = gst_element_factory_make("oki_amrnb_dec", "audiodec");
audiosink = gst_element_factory_make("fakesink", "audiosink");
g_signal_connect(demux, "pad-added", G_CALLBACK(cbnewpad), NULL);
gst_bin_add_many(GST_BIN(pipeline), src, demux, decoder, sink, audiodec, audiosink, NULL);
if (!gst_element_link_many(src, demux, NULL))
ALP_MTL("Error while linking src and demux");
if (!gst_element_link_many(decoder, sink, NULL))
ALP_MTL("Error while linking decoder and sink");
if (!gst_element_link_many(audiodec, audiosink, NULL))
ALP_MTL("Error while linking audiodec and audiosink");
gst_element_set_state(pipeline, GST_STATE_PLAYING);
g_main_loop_run(loop);
//****************************************************
GstQuery *query;
gboolean res;
query = gst_query_new_duration (GST_FORMAT_TIME);
res = gst_element_query (pipeline, query);
if (res) {
gint64 duration;
gst_query_parse_duration (query, NULL, &duration);
ALP_MTL (" duration = %"GST_TIME_FORMAT, GST_TIME_ARGS (duration));
}
else {
ALP_MTL (" duration query failed...");
}
gst_query_unref (query);
//****************************************************/
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));
}
int alp_main(int argc, char *argv[]){
gst_init(NULL, NULL);
ALP_MTL("\n************ Codec Test ********************\n");
ALP_MTL(" argc = %d\n", argc);
ALP_MTL(" argv[0] = %s\n", argv[0]);
ALP_MTL(" argv[1] = %s\n", argv[1]);
//play_mp3("/var/opt/alp/bundles/com.access.apps.codec_test/rsc/test.mp3");
play_3gp("/var/opt/alp/bundles/com.access.apps.codec_test/rsc/crazyfrog.3gp");
ALP_MTL("************ Codec Test Exit ***************\n");
return 0;
}