fakesink not working as a videosink with playbin2 ?

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

fakesink not working as a videosink with playbin2 ?

Vincent Torri

Hey,

basically, I create a playbin2, i pause the pipeline, i create a fakesink,
and set it as the video-sink for playbin2.

When I play the file, the handoff callback of the fakesink is not called.
Instead, a new window is created, where the stream is rendered. It seems
that settin the video sink as the fakesink is not working (that is, i'm
doing something wrong). The code is below.

Does someone see where the problem is ?

thank you

Vincent Torri



Eina_Bool
_emotion_pipeline_build(Emotion_Gstreamer_Video *ev, const char *file)
{
   int n_audio;
   int n_video;
   int i;

    ev->pipeline = gst_element_factory_make ("playbin2", "pipeline");
    if (!ev->pipeline)
      {
        ERR("could not create playbin2 element");
        return EINA_FALSE;
      }

    ev->eos_bus = gst_pipeline_get_bus(GST_PIPELINE(ev->pipeline));
    if (!ev->eos_bus)
      {
        ERR("could not create BUS");
        goto unref_pipeline;
      }

    g_object_set (G_OBJECT (ev->pipeline), "uri", file, NULL);

    if (!emotion_pipeline_pause(ev->pipeline))
      goto unref_pipeline;

    g_object_get (G_OBJECT (ev->pipeline),
                  "n-audio", &n_audio,
                  "n-video", &n_video,
                  NULL);

    /* Video sinks */

    for (i = 0; i < n_video; i++)
      {
        GstPad *pad = NULL;

        g_signal_emit_by_name (ev->pipeline, "get-video-pad", i, &pad);
        if (pad)
          {
            GstCaps *caps = NULL;
            GstStructure *structure;
            GstQuery     *query;
            const GValue *val;
            gchar        *str;
            Eina_Bool build_sink = EINA_FALSE;

            gdouble length_time;
            gint width;
            gint height;
            gint fps_num;
            gint fps_den;
            guint32 fourcc;

            caps = gst_pad_get_negotiated_caps(pad);
            if (!caps)
              goto unref_pad_v;
            structure = gst_caps_get_structure(caps, 0);
            str = gst_caps_to_string(caps);

            if (!gst_structure_get_int(structure, "width", &width))
              goto unref_caps_v;
            if (!gst_structure_get_int(structure, "height", &height))
              goto unref_caps_v;
            if (!gst_structure_get_fraction(structure, "framerate", &fps_num, &fps_den))
              goto unref_caps_v;

            if (g_str_has_prefix(str, "video/x-raw-yuv"))
              {
                val = gst_structure_get_value(structure, "format");
                fourcc = gst_value_get_fourcc(val);
              }
            else if (g_str_has_prefix(str, "video/x-raw-rgb"))
              fourcc = GST_MAKE_FOURCC('A', 'R', 'G', 'B');
            else
              goto unref_caps_v;

            query = gst_query_new_duration(GST_FORMAT_TIME);
            if (gst_pad_peer_query(pad, query))
              {
                gint64 t;

                gst_query_parse_duration(query, NULL, &t);
                length_time = (double)t / (double)GST_SECOND;
              }
            else
              goto unref_query_v;

            build_sink = EINA_TRUE;

          unref_query_v:
            gst_query_unref(query);
          unref_caps_v:
            gst_caps_unref(caps);
          unref_pad_v:
            gst_object_unref(pad);

            if (build_sink)
              {
                Emotion_Video_Sink *vsink;

                vsink = emotion_video_sink_new(ev);
                if (!vsink) continue;

                vsink->length_time = length_time;
                vsink->width = width;
                vsink->height = height;
                vsink->fps_num = fps_num;
                vsink->fps_den = fps_den;
                vsink->fourcc = fourcc;

                vsink->sink = gst_element_factory_make("fakesink", "videosink");
                gst_element_set_state(vsink->sink, GST_STATE_PAUSED);
              }
          }
      }

    /* Audio sinks */

    for (i = 0; i < n_audio; i++)
      {
        GstPad *pad = NULL;

        g_signal_emit_by_name (ev->pipeline, "get-audio-pad", i, &pad);
        if (pad)
          {
            GstCaps *caps = NULL;
            GstStructure *structure;
            GstQuery     *query;
            Eina_Bool build_sink = EINA_FALSE;

            gdouble length_time;
            gint channels;
            gint samplerate;

            caps = gst_pad_get_negotiated_caps(pad);
            if (!caps)
              goto unref_pad_a;
            structure = gst_caps_get_structure(caps, 0);

            if (!gst_structure_get_int(structure, "channels", &channels))
              goto unref_caps_a;
            if (!gst_structure_get_int(structure, "rate", &samplerate))
              goto unref_caps_a;

            query = gst_query_new_duration(GST_FORMAT_TIME);
            if (gst_pad_peer_query(pad, query))
              {
                gint64 t;

                gst_query_parse_duration(query, NULL, &t);
                length_time = (double)t / (double)GST_SECOND;
              }
            else
              goto unref_query_a;

            build_sink = EINA_TRUE;

          unref_query_a:
            gst_query_unref(query);
          unref_caps_a:
            gst_caps_unref(caps);
          unref_pad_a:
            gst_object_unref(pad);

            if (build_sink)
              {
                Emotion_Audio_Sink *asink;

                asink = (Emotion_Audio_Sink *)calloc(1, sizeof(Emotion_Audio_Sink));
                if (!asink) continue;
                ev->audio_sinks = eina_list_append(ev->audio_sinks, asink);
                if (eina_error_get())
                  {
                    free(asink);
                    continue;
                  }

                asink->length_time = length_time;
                asink->channels = channels;
                asink->samplerate = samplerate;

                asink->sink = gst_element_factory_make("autoaudiosink", "audiosink");
                gst_element_set_state(asink->sink, GST_STATE_PAUSED);
              }
          }
      }

    if (eina_list_count(ev->video_sinks) == 1)
      {
        Emotion_Video_Sink *vsink;

        vsink = (Emotion_Video_Sink *)eina_list_data_get(ev->video_sinks);
        ev->ratio = (double)vsink->width / (double)vsink->height;
      }

    {
      Emotion_Video_Sink *vsink;

      vsink = (Emotion_Video_Sink *)eina_list_data_get(ev->video_sinks);
      if (vsink && vsink->sink)
        {
          g_object_set(G_OBJECT(ev->pipeline), "video-sink", vsink->sink, NULL);
          g_object_set(G_OBJECT(vsink->sink), "sync", TRUE, NULL);
          g_object_set(G_OBJECT(vsink->sink), "signal-handoffs", TRUE, NULL);
          g_signal_connect(G_OBJECT(vsink->sink),
                           "handoff",
                           G_CALLBACK(cb_handoff), ev);
        }
    }

    {
      Emotion_Audio_Sink *asink;

      asink = (Emotion_Audio_Sink *)eina_list_data_get(ev->audio_sinks);
      if (asink && asink->sink)
        {
          g_object_set(G_OBJECT(ev->pipeline), "audio-sink", asink->sink,
NULL);
        }
    }

    return EINA_TRUE;

  unref_pipeline:
    gst_object_unref(ev->pipeline);

    return EINA_FALSE;
}

------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: fakesink not working as a videosink with playbin2 ?

Stefan Sauer
Am 14.10.2010 17:44, schrieb Vincent Torri:

>
> Hey,
>
> basically, I create a playbin2, i pause the pipeline, i create a fakesink,
> and set it as the video-sink for playbin2.
>
> When I play the file, the handoff callback of the fakesink is not called.
> Instead, a new window is created, where the stream is rendered. It seems
> that settin the video sink as the fakesink is not working (that is, i'm
> doing something wrong). The code is below.
>
> Does someone see where the problem is ?


Maybe you set it too late. Imho you should just be able to set "video-sink" to
your fakesink instance right after playbin2 creation.

Stefan



>
> thank you
>
> Vincent Torri
>
>
>
> Eina_Bool
> _emotion_pipeline_build(Emotion_Gstreamer_Video *ev, const char *file)
> {
>    int n_audio;
>    int n_video;
>    int i;
>
>     ev->pipeline = gst_element_factory_make ("playbin2", "pipeline");
>     if (!ev->pipeline)
>       {
>         ERR("could not create playbin2 element");
>         return EINA_FALSE;
>       }
>
>     ev->eos_bus = gst_pipeline_get_bus(GST_PIPELINE(ev->pipeline));
>     if (!ev->eos_bus)
>       {
>         ERR("could not create BUS");
>         goto unref_pipeline;
>       }
>
>     g_object_set (G_OBJECT (ev->pipeline), "uri", file, NULL);
>
>     if (!emotion_pipeline_pause(ev->pipeline))
>       goto unref_pipeline;
>
>     g_object_get (G_OBJECT (ev->pipeline),
>                   "n-audio", &n_audio,
>                   "n-video", &n_video,
>                   NULL);
>
>     /* Video sinks */
>
>     for (i = 0; i < n_video; i++)
>       {
>         GstPad *pad = NULL;
>
>         g_signal_emit_by_name (ev->pipeline, "get-video-pad", i, &pad);
>         if (pad)
>           {
>             GstCaps *caps = NULL;
>             GstStructure *structure;
>             GstQuery     *query;
>             const GValue *val;
>             gchar        *str;
>             Eina_Bool build_sink = EINA_FALSE;
>
>             gdouble length_time;
>             gint width;
>             gint height;
>             gint fps_num;
>             gint fps_den;
>             guint32 fourcc;
>
>             caps = gst_pad_get_negotiated_caps(pad);
>             if (!caps)
>               goto unref_pad_v;
>             structure = gst_caps_get_structure(caps, 0);
>             str = gst_caps_to_string(caps);
>
>             if (!gst_structure_get_int(structure, "width", &width))
>               goto unref_caps_v;
>             if (!gst_structure_get_int(structure, "height", &height))
>               goto unref_caps_v;
>             if (!gst_structure_get_fraction(structure, "framerate", &fps_num, &fps_den))
>               goto unref_caps_v;
>
>             if (g_str_has_prefix(str, "video/x-raw-yuv"))
>               {
>                 val = gst_structure_get_value(structure, "format");
>                 fourcc = gst_value_get_fourcc(val);
>               }
>             else if (g_str_has_prefix(str, "video/x-raw-rgb"))
>               fourcc = GST_MAKE_FOURCC('A', 'R', 'G', 'B');
>             else
>               goto unref_caps_v;
>
>             query = gst_query_new_duration(GST_FORMAT_TIME);
>             if (gst_pad_peer_query(pad, query))
>               {
>                 gint64 t;
>
>                 gst_query_parse_duration(query, NULL, &t);
>                 length_time = (double)t / (double)GST_SECOND;
>               }
>             else
>               goto unref_query_v;
>
>             build_sink = EINA_TRUE;
>
>           unref_query_v:
>             gst_query_unref(query);
>           unref_caps_v:
>             gst_caps_unref(caps);
>           unref_pad_v:
>             gst_object_unref(pad);
>
>             if (build_sink)
>               {
>                 Emotion_Video_Sink *vsink;
>
>                 vsink = emotion_video_sink_new(ev);
>                 if (!vsink) continue;
>
>                 vsink->length_time = length_time;
>                 vsink->width = width;
>                 vsink->height = height;
>                 vsink->fps_num = fps_num;
>                 vsink->fps_den = fps_den;
>                 vsink->fourcc = fourcc;
>
>                 vsink->sink = gst_element_factory_make("fakesink", "videosink");
>                 gst_element_set_state(vsink->sink, GST_STATE_PAUSED);
>               }
>           }
>       }
>
>     /* Audio sinks */
>
>     for (i = 0; i < n_audio; i++)
>       {
>         GstPad *pad = NULL;
>
>         g_signal_emit_by_name (ev->pipeline, "get-audio-pad", i, &pad);
>         if (pad)
>           {
>             GstCaps *caps = NULL;
>             GstStructure *structure;
>             GstQuery     *query;
>             Eina_Bool build_sink = EINA_FALSE;
>
>             gdouble length_time;
>             gint channels;
>             gint samplerate;
>
>             caps = gst_pad_get_negotiated_caps(pad);
>             if (!caps)
>               goto unref_pad_a;
>             structure = gst_caps_get_structure(caps, 0);
>
>             if (!gst_structure_get_int(structure, "channels", &channels))
>               goto unref_caps_a;
>             if (!gst_structure_get_int(structure, "rate", &samplerate))
>               goto unref_caps_a;
>
>             query = gst_query_new_duration(GST_FORMAT_TIME);
>             if (gst_pad_peer_query(pad, query))
>               {
>                 gint64 t;
>
>                 gst_query_parse_duration(query, NULL, &t);
>                 length_time = (double)t / (double)GST_SECOND;
>               }
>             else
>               goto unref_query_a;
>
>             build_sink = EINA_TRUE;
>
>           unref_query_a:
>             gst_query_unref(query);
>           unref_caps_a:
>             gst_caps_unref(caps);
>           unref_pad_a:
>             gst_object_unref(pad);
>
>             if (build_sink)
>               {
>                 Emotion_Audio_Sink *asink;
>
>                 asink = (Emotion_Audio_Sink *)calloc(1, sizeof(Emotion_Audio_Sink));
>                 if (!asink) continue;
>                 ev->audio_sinks = eina_list_append(ev->audio_sinks, asink);
>                 if (eina_error_get())
>                   {
>                     free(asink);
>                     continue;
>                   }
>
>                 asink->length_time = length_time;
>                 asink->channels = channels;
>                 asink->samplerate = samplerate;
>
>                 asink->sink = gst_element_factory_make("autoaudiosink", "audiosink");
>                 gst_element_set_state(asink->sink, GST_STATE_PAUSED);
>               }
>           }
>       }
>
>     if (eina_list_count(ev->video_sinks) == 1)
>       {
>         Emotion_Video_Sink *vsink;
>
>         vsink = (Emotion_Video_Sink *)eina_list_data_get(ev->video_sinks);
>         ev->ratio = (double)vsink->width / (double)vsink->height;
>       }
>
>     {
>       Emotion_Video_Sink *vsink;
>
>       vsink = (Emotion_Video_Sink *)eina_list_data_get(ev->video_sinks);
>       if (vsink && vsink->sink)
>         {
>           g_object_set(G_OBJECT(ev->pipeline), "video-sink", vsink->sink, NULL);
>           g_object_set(G_OBJECT(vsink->sink), "sync", TRUE, NULL);
>           g_object_set(G_OBJECT(vsink->sink), "signal-handoffs", TRUE, NULL);
>           g_signal_connect(G_OBJECT(vsink->sink),
>                            "handoff",
>                            G_CALLBACK(cb_handoff), ev);
>         }
>     }
>
>     {
>       Emotion_Audio_Sink *asink;
>
>       asink = (Emotion_Audio_Sink *)eina_list_data_get(ev->audio_sinks);
>       if (asink && asink->sink)
>         {
>           g_object_set(G_OBJECT(ev->pipeline), "audio-sink", asink->sink,
> NULL);
>         }
>     }
>
>     return EINA_TRUE;
>
>   unref_pipeline:
>     gst_object_unref(ev->pipeline);
>
>     return EINA_FALSE;
> }
>
> ------------------------------------------------------------------------------
> Beautiful is writing same markup. Internet Explorer 9 supports
> standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
> Spend less time writing and  rewriting code and more time creating great
> experiences on the web. Be a part of the beta today.
> http://p.sf.net/sfu/beautyoftheweb
> _______________________________________________
> gstreamer-devel mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel


------------------------------------------------------------------------------
Download new Adobe(R) Flash(R) Builder(TM) 4
The new Adobe(R) Flex(R) 4 and Flash(R) Builder(TM) 4 (formerly
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: fakesink not working as a videosink with playbin2 ?

Vincent Torri


On Fri, 15 Oct 2010, Stefan Kost wrote:

> Am 14.10.2010 17:44, schrieb Vincent Torri:
>>
>> Hey,
>>
>> basically, I create a playbin2, i pause the pipeline, i create a fakesink,
>> and set it as the video-sink for playbin2.
>>
>> When I play the file, the handoff callback of the fakesink is not called.
>> Instead, a new window is created, where the stream is rendered. It seems
>> that settin the video sink as the fakesink is not working (that is, i'm
>> doing something wrong). The code is below.
>>
>> Does someone see where the problem is ?
>
>
> Maybe you set it too late. Imho you should just be able to set "video-sink" to
> your fakesink instance right after playbin2 creation.

You're right. Setting it before pausing works. I tried to set the sink to
NULL before pausing and setting the sink after, but it does not work too.

thank you

Vincent

------------------------------------------------------------------------------
Download new Adobe(R) Flash(R) Builder(TM) 4
The new Adobe(R) Flex(R) 4 and Flash(R) Builder(TM) 4 (formerly
Flex(R) Builder(TM)) enable the development of rich applications that run
across multiple browsers and platforms. Download your free trials today!
http://p.sf.net/sfu/adobe-dev2dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel