Help Decodeb program.in

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Help Decodeb program.in

giorgio-2
Hi,
I am trying to realize a simple program to play video file using
decodebin as decoder on my embedded platform with Gstreamer installed.

Those are some code fragment of my test program:
//------------------------------------------------------------------------------------------------------------------
static void
typefound_cb (GstElement *typefind,
              guint       probability,
              GstCaps    *caps,
              gpointer    data)
{
  GMainLoop *loop = (GMainLoop *)data;
  gchar *type;
  type = gst_caps_to_string (caps);
  printf ("Media type %s found, probability %d%%\n", type, probability);
  g_free (type);    
}
//------------------------------------------------------------------------------------------------------------------
static gboolean
cb_print_position (GstElement *pipeline)
{
  GstFormat fmt = GST_FORMAT_TIME;
  gint64 pos, len;

  if (gst_element_query_position (pW->pipeline, &fmt, &pos)
    && gst_element_query_duration (pW->pipeline, &fmt, &len)) {
    printf ("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r",
             GST_TIME_ARGS (pos), GST_TIME_ARGS (len));
  }

  /* call me again */
  return TRUE;
}

//------------------------------------------------------------------------------------------------------------------
static void cb_newpad (GstElement *decodebin,
       GstPad     *pad,
       gboolean    last,
       gpointer    data)
{

        GstCaps *caps;
        GstStructure *str;
        GstPad *audiopad,*videopad;
        gchar *tex;

        /* check media type */
        caps = gst_pad_get_caps (pad);
        str = gst_caps_get_structure (caps, 0);
        tex = (gchar *)gst_structure_get_name(str);

        if(g_strrstr(tex,"audio"))
        {
                audiopad = gst_element_get_static_pad (pW->audio, "sink");
                if(GST_PAD_IS_LINKED(audiopad))
                {
                        g_object_unref(audiopad);
                        return;
                }
                else
                {
                        gst_pad_link(pad,audiopad);
                        g_object_unref(audiopad);
                }
                return;
        }

        /* link videopad */
        videopad = gst_element_get_static_pad(pW->video,"sink");
        if (!GST_PAD_IS_LINKED (videopad)) {
                gst_pad_link(pad,videopad);
                gst_element_link(pW->videoqueue,pW->video);
                g_object_unref (videopad);
                return;
        }

}
//------------------------------------------------------------------------------------------------------------------
void PlayerTest::VideoPlayerGst(char* pName){

        gst_init (NULL, NULL);
        loop = g_main_loop_new (NULL, FALSE);

        pipeline = gst_pipeline_new ("pipeline");
        bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
        gst_bus_add_watch (bus, my_bus_callback, loop);
        //gst_bus_add_watch (bus, NULL, loop);
        gst_object_unref (bus);

src = gst_element_factory_make ("filesrc", "source");
        g_object_set (G_OBJECT (src), "location", pName, NULL);

        typefind = gst_element_factory_make("typefind","typefinder");
        g_signal_connect(typefind,"have-type",G_CALLBACK(typefound_cb),loop);

        decoder = gst_element_factory_make ("decodebin2", "decoder");
        g_signal_connect (decoder, "new-decoded-pad", G_CALLBACK (cb_newpad),
NULL);

        audioqueue = gst_element_factory_make("queue","audioqueue");
        videoqueue = gst_element_factory_make("queue","videoqueue");

        gst_bin_add_many (GST_BIN (pipeline), src,typefind,decoder,NULL);
        gst_element_link_many (src,typefind,decoder,NULL);

        // create audio output
        audio = gst_bin_new ("audiobin");
        conv = gst_element_factory_make ("audioconvert", "aconv");

        typefind2 = gst_element_factory_make("typefind","typefinder2");
        g_signal_connect(typefind2,"have-type",G_CALLBACK(typefound_cb),loop);

        audiopad = gst_element_get_static_pad (audioqueue, "sink");
        sink = gst_element_factory_make ("alsasink", "sink");

        gst_bin_add_many (GST_BIN (audio),audioqueue,conv,typefind2, sink,
NULL);
        gst_element_link_many (audioqueue,conv,typefind2, sink,NULL);

        gst_element_add_pad (audio, gst_ghost_pad_new ("sink", audiopad));
        gst_object_unref (audiopad);

        gst_bin_add (GST_BIN (pipeline), audio);

        // create video output
        video = gst_bin_new("videobin");
        convVid = gst_element_factory_make("ffmpegcolorspace","converter");
        videopad = gst_element_get_static_pad(videoqueue,"sink");
        videosink = gst_element_factory_make("mfw_v4lsink","videosink");

        gst_bin_add_many(GST_BIN(video),videoqueue,convVid,videosink,NULL);
        gst_element_link_many(videoqueue,convVid,videosink,NULL);
        gst_element_add_pad(video,gst_ghost_pad_new("sink",videopad));
        gst_object_unref(videopad);

        gst_bin_add(GST_BIN(pipeline),video);

        // run
        gst_element_set_state (pipeline, GST_STATE_PLAYING);
        g_timeout_add (200, (GSourceFunc) cb_print_position, pipeline);

        g_main_loop_run (loop);

        // cleanup
        gst_element_set_state (pipeline, GST_STATE_NULL);
        gst_object_unref (GST_OBJECT (pipeline));
}

//-----------------------------------------------------------------------------------------

Where mfw_v4lsink is my Video rendering device plugin.

When I try to play a video file, nothing happens.
>From may output console I can read this messages:

---
---

MFW_GST_V4LSINK_PLUGIN 1.7.1 build on Apr  7 2010 09:23:18.
MPEG4PARSER_05.14.02  build on Sep 16 2009 15:48:34.
MFW_GST_MP4_PARSER_PLUGIN 1.7.1 build on Apr  7 2010 09:23:01.[0mvideo
type(0):33.
[INFO]\0x09Product Info: i.MX51
VPU Version: firmware 15.2.2; libvpu: 4.7.4
MFW_GST_VPU_DECODER_PLUGIN 1.7.1 build on Apr  7 2010 09:22:32.
BLN_MAD-MMCODECS_AACD_ARM_03.05.00  build on Nov 25 2009
Unhandled fault: external abort on non-linefetch (0x1018) at 0x44433054

15:02:24.
MFW_GST_AAC_PLUGIN 1.7.1 build on Apr  7 2010 09:22:01.
Got state-changed message
Got state-changed message
Got state-changed message
Got state-changed message
...
...
Got tag message
Got stream-status message
Got stream-status message
Got stream-status message
Got state-changed message
Got state-changed message
Got stream-status message
Got state-changed message
Got state-changed message

(<unknown>:2067): GLib-GObject-CRITICAL **: g_value_get_boolean:
assertion `G_VALUE_HOLDS_BOOLEAN (value)' failed
Got state-changed message
Media type audio/x-raw-int, endianness=(int)1234, signed=(boolean)true,
width=(int)16, depth=(int)16, rate=(int)44100, channels=(int)2,
channel-positions=(GstAudioChannelPosition)<
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER > found, probability
100%
[V4L Update Display]: left=0, top=0, width=640, height=360
[0m>>V4L_SINK: Actually buffer status:
hardware buffer : 6
software buffer : 0

Time: 0:00:00.000000000 / 0:01:31.985633280
Time: 0:00:00.000000000 / 0:01:31.985633280
Got stream-status message
Got warning message
Got state-changed message
Got state-changed message

Time: 0:00:00.000000000 / 0:01:31.985633280
Time: 0:00:00.000000000 / 0:01:31.985633280
Time: 0:00:00.000000000 / 0:01:31.985633280
....
....
 

>From this output messages seems that the dedecoder pipeline is not
playing (like Pause).

Could this be a problem with my board or it could be caused by an error
in my code?
What can I do to understand why playing the file does not start?


Giorgio.

 





------------------------------------------------------------------------------
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: Help Decodeb program.in

Fariq Izwan
You should change this code

/* link videopad */
videopad = gst_element_get_static_pad(pW->video,"sink");
if (!GST_PAD_IS_LINKED (videopad)) {
gst_pad_link(pad,videopad);
gst_element_link(pW->videoqueue,pW->video);
g_object_unref (videopad);
return;
}


to the code same like how you link the audiopad. Here's the example:

if(g_strrstr(tex,"video"))
{
videopad = gst_element_get_static_pad (pW->video, "sink");
if(GST_PAD_IS_LINKED(videopad))
{
g_object_unref(videopad);
.
.
.
.and so on..

Fariq Izwan


------------------------------------------------------------------------------

_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel