All pastes #499485 Raw Edit

Untitled

public text v1 · immutable
·published 2007-05-21 02:26 UTC
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;
}