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 |
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 |
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 |
Free forum by Nabble | Edit this page |