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;}