AnsweredAssumed Answered

vpudec gsteamer C code

Question asked by Alok Kumar on Apr 4, 2013
Latest reply on Apr 8, 2013 by Leonardo Sandoval Gonzalez
Branched to a new discussion

Dear All,

 

I am trying programmatic way of processing gsteamer pipeline and having trouble with using vpudec decoder.

 

I was earlier using decodebin2 in program below and it plays without any issues.But when I change this to vpudec it does not work at all. Any pointers are highly appreciated.

I have humble request for a quick response.

 

code:

#include<stdio.h>

    #include<gst/gst.h>

    #include<glib.h>

 

    //Function to process message on bus of pipeline

    gboolean process_message(GstBus *bus, GstMessage *msg,gpointer data);

 

    //Function to add pad dynamically for ogg demux

void dynamic_addpad(GstElement *element, GstPad *pad, gpointer data);       

void dynamic_decodepad (GstElement* object, GstPad* arg0, gboolean arg1,gpointer user_data);

 

     GstElement *source, *demuxer, *audio_decoder, *video_decoder, *audio_convertor,*video_convertor, *audio_sink,*video_sink,*audioqueue,*videoqueue,*videoqueue2 ;//*audio_demuxer, *video_demuxer,

    int main(int argc,char* argv[])

    {

     GstBin *Bin;

      GstBus *bus;

      GMainLoop *Mainloop;

      gst_init (&argc,&argv);

 

      Mainloop = g_main_loop_new(NULL,FALSE);//NULL to use the current context and False to tell its not in running state

      GstElement *pipeline = gst_pipeline_new("PIPELINE");

      Bin = GST_BIN(pipeline);

      bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));

      source = gst_element_factory_make("filesrc","file-source");

      g_object_set(G_OBJECT(source),"location",argv[1],NULL);

      demuxer = gst_element_factory_make("avidemux","avi-demuxer");

      //audioqueue = gst_element_factory_make("queue","Queue for audio");

      videoqueue = gst_element_factory_make("queue","Queue for video");

      videoqueue2 = gst_element_factory_make("queue","Queue for video2");

      //audio_decoder = gst_element_factory_make("decodebin2","a_decodebin");

      video_decoder = gst_element_factory_make("decodebin2","decodebin2");//"Vorbis audio decoder","vorbis");

      //audio_convertor = gst_element_factory_make("audioconvert","audio convertor");//"Audio converter","audioconvert");

      video_convertor = gst_element_factory_make("videoscale","video convertor");//"Audio converter","audioconvert");

      //audio_sink = gst_element_factory_make("autoaudiosink","Auto audio sink");

      //video_sink = gst_element_factory_make("autovideosink","XV video sink ");

      video_sink = gst_element_factory_make("mfw_isink","XV video sink ");

     

      if(!source )

      {   g_print("Could not not create element -1\n");

        return 0;

      }

      if(!demuxer )

      {   g_print("Could not not create element -2\n");

        return 0;

      }

      #if 0

      if(!audioqueue )

      {   g_print("Could not not create element -3 \n");

        return 0;

      }

      #endif

 

 

      if(!videoqueue )

      {   g_print("Could not not create element -4\n");

        return 0;

      }

      if(!video_decoder )

      {   g_print("Could not not create element -5\n");

        return 0;

      }

      #if 0

      if(!audio_convertor )

      {   g_print("Could not not create element -6\n");

        return 0;

      }

      #endif

      if(!video_convertor )

      {   g_print("Could not not create element -7 \n");

        return 0;

      }

      #if 0

      if(!audio_sink )

      {   g_print("Could not not create element -8\n");

        return 0;

      }

      #endif

      if(!video_sink  )

      {   g_print("Could not not create element -9\n");

        return 0;

      }

      if(!videoqueue2 )

      {   g_print("Could not not create element -4\n");

        return 0;

      }

      gst_bin_add(Bin,source);

      //gst_bin_add_many(Bin,demuxer,audioqueue,videoqueue,audio_decoder,audio_convertor,video_decoder,video_convertor,audio_sink,video_sink,NULL);

      gst_bin_add_many(Bin,demuxer,videoqueue,video_decoder,/*videoqueue2,*/ video_convertor,video_sink,NULL);

 

 

      gst_element_link(source,demuxer);

      gst_element_link(videoqueue,video_decoder);

      gst_element_link(video_convertor,video_sink);

      //gst_element_link_many(audioqueue,audio_decoder,NULL);

      //gst_element_link_many(audio_convertor,audio_sink,NULL);

      //gst_element_link_many(videoqueue,video_decoder,/*videoqueue2,*/video_convertor,video_sink,NULL);

      //gst_element_link_many(video_convertor,video_sink,NULL);

      g_signal_connect(demuxer,"pad-added",G_CALLBACK(dynamic_addpad),NULL);//demuxer and decoder are passed as instance and data as pads of both the elements are linked in dynamic_addpad

      //g_signal_connect(audio_decoder,"new-decoded-pad",G_CALLBACK(dynamic_decodepad),NULL);//demuxer and decoder are passed as instance and data as pads of both the elements are linked in dynamic_addpad

      g_signal_connect(video_decoder,"new-decoded-pad",G_CALLBACK(dynamic_decodepad),NULL);//demuxer and decoder are passed as instance and data as pads of both the elements are linked in dynamic_addpad

      gst_bus_add_watch(bus,process_message,Mainloop); //Mainloop is passed as user data as in the process_message actions are taken on the loop

      g_object_unref(bus);

      g_print("In playing state\n");

      gst_element_set_state(pipeline,GST_STATE_PLAYING);//Pipeline is also a bin and bin is also an element at abstract level and hence gst_element_set_state call is used to set state of pipeline.

 

 

      g_main_loop_run(Mainloop);

      g_print("In playing state2\n");

      gst_element_set_state(pipeline,GST_STATE_NULL);

      g_object_unref(G_OBJECT(pipeline));

    }

    //Function to process message on bus of pipeline

    gboolean process_message(GstBus *bus, GstMessage *msg,gpointer data)

    {

      GError *error;

      gchar *debug;

      GMainLoop *loop = (GMainLoop *)data;

      g_print(" In process message msg->type : %d\n",GST_MESSAGE_TYPE(msg));

      switch(GST_MESSAGE_TYPE(msg))

      {

        case   GST_MESSAGE_UNKNOWN :

                g_print("GST_MESSAGE_UNKNOWN \n");

                break;

        case   GST_MESSAGE_EOS     :

                g_print("GST_MESSAGE_EOS \n");

                g_main_loop_quit(loop);

                break;

        case   GST_MESSAGE_ERROR   :

                g_print("GST_MESSAGE_ERROR \n");

                gst_message_parse_error (msg, &error, &debug);

                g_free(debug);

                //if(!error)

                {

                  g_print("GST_MESSAGE_ERROR message : %s \n",error->message);

                }

                g_main_loop_quit(loop);

                break;

        case   GST_MESSAGE_WARNING :

                g_print("GST_MESSAGE_WARNING  \n");

                break;

        case   GST_MESSAGE_INFO    :

                g_print("GST_MESSAGE_INFO \n");

                break;

        case   GST_MESSAGE_TAG     :

                g_print("GST_MESSAGE_TAG \n");

                break;

        case   GST_MESSAGE_BUFFERING:

                g_print("GST_MESSAGE_BUFFERING \n");

                break;

        case   GST_MESSAGE_STATE_CHANGED:

                g_print("GST_MESSAGE_STATE_CHANGED \n");

                break;

        default :

                g_print("default \n");

                break;

 

 

      }

      return TRUE; //returns true always as it has to be always registered returning false will deregister the function

    }

 

 

    //Function to add pad dynamically for ogg demux

 

 

    void dynamic_addpad(GstElement *element, GstPad *pad, gpointer data)

    {

     char* pad_name = gst_pad_get_name(pad);

     g_print(" In dynamic ADDING PAD %s\n", pad_name);

 

 

     #if 0

     if (g_str_has_prefix(pad_name,"audio")) {

       GstPad *audiodemuxsink = gst_element_get_static_pad(audioqueue,"sink");

       gst_pad_link(pad,audiodemuxsink );

     }

     #endif

     if (g_str_has_prefix(pad_name,"video")) {

       GstPad *videodemuxsink = gst_element_get_static_pad(videoqueue,"sink");

       gst_pad_link(pad,videodemuxsink );

     }

     g_free (pad_name);

   }

 

void dynamic_decodepad (GstElement* object, GstPad* pad, gboolean arg1,gpointer user_data)

{

  GstPad* videoconvertsink = gst_element_get_static_pad(video_convertor,"sink");

  if (gst_pad_can_link(pad,videoconvertsink)) {

    gst_pad_link(pad,videoconvertsink);

  }

 

  #if 0

  GstPad* audioconvertsink  = gst_element_get_static_pad(audio_convertor,"sink");

  if (gst_pad_can_link(pad,audioconvertsink)) {

    gst_pad_link(pad,audioconvertsink);

  }

  #endif

}

 

Outcomes