[gst-devel] sdlvideosink structure
Corentin BARON
corentin.baron at inrialpes.fr
Tue Jun 6 15:50:34 CEST 2006
Hi,
That's what I'm doing actually. What I'd like to do is get a direct
pointer to the SDL_Overlay in the structure of the element (but if
xvimagesink had worked on the Nokia 770 that'd have solved my
problem). My problem is that the video doesn't fit in my view. Maybe
I should make a personalized version of sdlvideosink with explicit
height / width parameters.
Thx,
Corentin.
Le 6 juin 06 à 15:20, Edgard Lima a écrit :
>
> try the code attached code is attached
>
> unfortunatelly sdlvideosink (I have to try fix that) still doens't
> work 100% fine :-(
>
> you can see how it works with 100% with ximagesink and xvimagesink
> insteadof sdlvideosink
>
> video_sink = gst_element_factory_make("sdlvideosink", NULL);
>
> gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(video_sink,
> GDK_WINDOW_XWINDOW(widgetGst->window));
>
> http://gstreamer.freedesktop.org/media/large/matrix.avi
>
> compile with
>
> gcc -Wall `pkg-config --cflags --libs gstreamer-plugins-base-0.10`
> `pkg-config --cflags --libs gstreamer-0.10` `pkg-config --cflags --
> libs gstreamer-base-0.10` `pkg-config --cflags --libs gtk+-2.0` /
> home/edlima/Projects/gstreamer/v0010/alex/gst-plugins-base-0.10.0/
> gst-libs/gst/interfaces/xoverlay.c seek.c
>
> btw: code is ugly but you can see how some things work.
>
> BR,
> Edgard
>
>
>
>
> ext Corentin BARON wrote:
>
>> Hello,
>>
>> Does anyone know how I could get a pointer to the SDL_Overlay
>> stuff in the sdlvideosink? That would be very useful.
>>
>> Thx,
>> Corentin.
>>
>> ---------------------------------------------------------------------
>> ---
>>
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>>
>
> <babytux.png>
> /*
> * Copyright (C) <2006> Edgard Lima <edgard.lima at indt.org.br>
> *
> * License: do all you want with this code.
> */
>
>
> #include <gtk/gtk.h>
> #include <gdk/gdkx.h>
> #include <gst/gst.h>
> #include <gst/interfaces/xoverlay.h>
>
> GtkWindow *window;
> GtkWidget *box;
> GtkWidget *widget;
> GtkWidget *widgetGst;
> GtkWidget *button;
> GtkWidget *hscale;
>
> GstElement *pipeline;
> GstElement *source;
> GstElement *demuxer;
>
> GstElement *video_queue;
> GstElement *video_dec;
> GstElement *video_conv;
> GstElement *video_scale;
> GstElement *video_sink;
>
> GstElement *audio_queue;
> GstElement *audio_dec;
> GstElement *audio_conv;
> GstElement *audio_sink;
>
> GMutex* mutex;
> gboolean update_pos_flag = TRUE;
>
> gint64 duration;
> gint64 position;
>
> static void
> new_pad (GstElement *element,
> GstPad *pad,
> gpointer data)
> {
> GstPad *sinkpad;
> gchar* name;
> /* We can now link this pad with the audio decoder */
> g_print ("Dynamic pad created, linking parser/decoder\n");
>
> name = gst_pad_get_name(pad);
>
> if ( name[0] == 'a' ) // audio_00
> sinkpad = gst_element_get_pad (audio_queue, "sink");
> else // video_00
> sinkpad = gst_element_get_pad (video_queue, "sink");
>
> gst_pad_link (pad, sinkpad);
>
> g_free(name);
> gst_object_unref (sinkpad);
> }
>
> static gboolean
> bus_call (GstBus *bus, GstMessage *msg, gpointer data)
> {
>
> printf("message from %s\n", GST_OBJECT_NAME(GST_MESSAGE_SRC(msg)));
>
> switch (GST_MESSAGE_TYPE (msg)) {
> case GST_MESSAGE_EOS:
> printf ("End-of-stream\n");
> break;
> case GST_MESSAGE_ERROR: {
> gchar *debug;
> GError *err;
>
> gst_message_parse_error (msg, &err, &debug);
> g_free (debug);
>
> printf ("Error: %s\n", err->message);
> g_error_free (err);
>
>
> }
> break;
> case GST_MESSAGE_STATE_CHANGED: {
> GstState oldstate;
> GstState newstate;
> GstState pending;
>
> gst_message_parse_state_changed (msg,
> &oldstate,
> &newstate,
> &pending);
> /*
> printf("oldstate = %s, newstate = %s, pendingstate = %s",
> gst_element_state_get_name (oldstate),
> gst_element_state_get_name (newstate),
> gst_element_state_get_name (pending));
> */
>
> if ( newstate == GST_STATE_PAUSED ) {
> GstFormat format = GST_FORMAT_TIME;
> gst_element_query_duration (pipeline, &format, &duration);
> gst_element_query_position (pipeline, &format, &position);
> printf("duration = %lld, position = %lld\n", duration,
> position);
> gtk_range_set_range((GtkRange*)hscale, 0, duration);
> gtk_range_set_value((GtkRange*)hscale, position);
> }
>
>
> }
> break;
> default:
> printf(gst_message_type_get_name (GST_MESSAGE_TYPE (msg)));
> printf("\n");
> break;
> }
>
> printf("\n");
> fflush(stdout);
>
> return TRUE;
> }
>
> gboolean start_seek (GtkWidget *widget, GdkEventButton *event,
> gpointer user_data) {
> g_mutex_lock(mutex);
> update_pos_flag = FALSE;
> g_mutex_unlock(mutex);
> return FALSE;
> }
>
> gboolean stop_seek (GtkWidget *widget, GdkEventButton *event,
> gpointer user_data) {
> g_mutex_lock(mutex);
> update_pos_flag = TRUE;
> g_mutex_unlock(mutex);
> return FALSE;
> }
>
>
> gboolean update_pos (gpointer data) {
> GstFormat format = GST_FORMAT_TIME;
>
> g_mutex_lock(mutex);
> if ( ! update_pos_flag ) {
> g_mutex_unlock(mutex);
> return TRUE;
> }
> g_mutex_unlock(mutex);
>
> gst_element_query_duration (pipeline, &format, &duration);
> gst_element_query_position (pipeline, &format, &position);
> printf("duration = %lld, position = %lld\n", duration, position);
> gtk_range_set_range((GtkRange*)hscale, 0, duration);
> gtk_range_set_value((GtkRange*)hscale, position);
> return TRUE;
> }
>
> gboolean seek (GtkRange *range, GtkScrollType scroll, gdouble
> value, gpointer user_data) {
> printf("value = %lf\n", value);
> if ( scroll == GTK_SCROLL_JUMP ) {
> gst_element_seek(pipeline, 1.0, GST_FORMAT_TIME,
> GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
> GST_SEEK_TYPE_SET, value,
> GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
> return FALSE;
> }
> return TRUE;
> }
>
> void change_null(GtkWidget *locwidget, gpointer data)
> {
> gst_element_set_state (pipeline, GST_STATE_NULL);
> gtk_widget_hide(widgetGst);
> gtk_widget_show(widget);
> }
>
> void change_ready(GtkWidget *locwidget, gpointer data)
> {
> gst_element_set_state (pipeline, GST_STATE_READY);
> gtk_widget_hide(widgetGst);
> gtk_widget_show(widget);
> }
>
> void change_paused(GtkWidget *locwidget, gpointer data)
> {
> gtk_widget_hide(widget);
> gtk_widget_show(widgetGst);
> gst_element_set_state (pipeline, GST_STATE_PAUSED);
> }
>
> void change_playing(GtkWidget *locwidget, gpointer data)
> {
> gtk_widget_hide(widget);
> gtk_widget_show(widgetGst);
> gst_element_set_state (pipeline, GST_STATE_PLAYING);
> }
>
>
> gint delete_event(GtkWidget *widget, GdkEvent event, gpointer data)
> {
> /* when this function returns FALSE, the delete-event
> signal becomes a destroy signal */
> return FALSE;
> }
>
> void end_program(GtkWidget *widget, gpointer data)
> {
> /* End the main loop */
> printf ("Returned, stopping playback\n"); fflush(stdout);
> gst_element_set_state (pipeline, GST_STATE_NULL);
> gtk_main_quit();
> }
>
>
> gboolean expose (GtkWidget *widget,
> GdkEventExpose *event,
> gpointer user_data)
> {
> printf("expose1\n"); fflush(stdout);
> gst_x_overlay_set_xwindow_id (GST_X_OVERLAY(video_sink),
> GDK_WINDOW_XWINDOW(widgetGst->window));
> printf("expose2\n"); fflush(stdout);
> return TRUE;
> }
>
> int main(int argc, char **argv)
> {
>
> /* Initialize GTK+ */
> gtk_init(&argc, &argv);
> gst_init(&argc, &argv);
> /* create window, set default height and width to 200 pixels */
>
> window = g_object_new(GTK_TYPE_WINDOW,
> "default-height", 200,
> "default-width", 200,
> "border-width", 12,
> "title", "GtkHello",
> NULL);
>
> /* add signal handlers for window */
> g_signal_connect(window,
> "delete-event", G_CALLBACK(delete_event),
> NULL);
> g_signal_connect(window,
> "destroy", G_CALLBACK(end_program),
> NULL);
>
> box = gtk_vbox_new(FALSE, 0);
>
> widget = gtk_image_new_from_file("babytux.png");
> widgetGst = gtk_drawing_area_new();
> gtk_widget_set_size_request (widgetGst, 352, 288);
>
> g_signal_connect(widgetGst,
> "expose-event", G_CALLBACK(expose),
> window);
>
> gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 0);
> gtk_box_pack_start (GTK_BOX(box), widgetGst, FALSE, FALSE, 0);
> gtk_widget_hide(widgetGst);
>
> /* create a button */
> button = gtk_button_new_with_label("state to null!");
> gtk_box_pack_end (GTK_BOX(box), button, FALSE, FALSE, 0);
> /* install signal handlers for button */
> g_signal_connect(button,
> "clicked", G_CALLBACK(change_null),
> window);
>
>
> /* create a button */
> button = gtk_button_new_with_label("state to ready!");
> gtk_box_pack_end (GTK_BOX(box), button, FALSE, FALSE, 0);
> /* install signal handlers for button */
> g_signal_connect(button,
> "clicked", G_CALLBACK(change_ready),
> window);
>
> /* create a button */
> button = gtk_button_new_with_label("state to paused!");
> gtk_box_pack_end (GTK_BOX(box), button, FALSE, FALSE, 0);
> /* install signal handlers for button */
> g_signal_connect(button,
> "clicked", G_CALLBACK(change_paused),
> window);
>
>
> /* create a button */
> button = gtk_button_new_with_label("state to playing!");
> gtk_box_pack_end (GTK_BOX(box), button, FALSE, FALSE, 0);
> /* install signal handlers for button */
> g_signal_connect(button,
> "clicked", G_CALLBACK(change_playing),
> window);
>
>
> /* create a button */
> hscale = gtk_hscale_new_with_range(0.0, 100.0, 1);
> gtk_box_pack_end (GTK_BOX(box), hscale, FALSE, FALSE, 0);
> /* install signal handlers for button */
> g_signal_connect(hscale,
> "change-value", G_CALLBACK(seek),
> window);
> g_signal_connect(hscale,
> "button-press-event", G_CALLBACK(start_seek),
> window);
> g_signal_connect(hscale,
> "button-release-event", G_CALLBACK(stop_seek),
> window);
>
> gtk_range_set_value((GtkRange*)hscale, 0.0);
>
>
> gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(box));
>
> gtk_widget_show_all(GTK_WIDGET(window));
>
> /* create elements */
> pipeline = gst_pipeline_new ("audio-player");
> source = gst_element_factory_make ("filesrc", NULL);
> demuxer = gst_element_factory_make ("avidemux", NULL);
>
> video_queue = gst_element_factory_make ("queue", NULL);
> video_dec = gst_element_factory_make ("ffdec_msmpeg4", NULL);
> video_conv = gst_element_factory_make ("ffmpegcolorspace", NULL);
> video_scale = gst_element_factory_make ("videoscale", NULL);
> video_sink = gst_element_factory_make ("sdlvideosink", NULL);
>
> audio_queue = gst_element_factory_make ("queue", NULL);
> audio_dec = gst_element_factory_make ("mad", NULL);
> audio_conv = gst_element_factory_make ("audioconvert", NULL);
> audio_sink = gst_element_factory_make ("alsasink", NULL);
>
>
> if (!pipeline || !source || !demuxer ||
> !video_queue || !video_dec || !video_conv || !video_scale || !
> video_sink ||
> !audio_queue || !audio_dec || !audio_conv || !audio_sink ) {
> printf ("One element could not be created\n");
> return -1;
> }
>
> /* set filename property on the file source. Also add a message
> * handler. */
> g_object_set (G_OBJECT (source), "location", "matrix.avi", NULL);
> //g_object_set (G_OBJECT (scaler), "method", 1, NULL);
> // g_object_set (G_OBJECT (sink), "fullscreen", TRUE, NULL);
> gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (pipeline)),
> bus_call, NULL);
>
> /* put all elements in a bin */
> gst_bin_add_many (GST_BIN (pipeline),
> source, demuxer,
> video_queue, video_dec, video_conv, video_scale, video_sink,
> audio_queue, audio_dec, audio_conv, audio_sink, NULL);
>
> /* link together - note that we cannot link the parser and
> * decoder yet, becuse the parser uses dynamic pads. For that,
> * we set a pad-added signal handler. */
> gst_element_link_many (source, demuxer, NULL);
> g_signal_connect (demuxer, "pad-added", G_CALLBACK (new_pad), NULL);
> gst_element_link_many (video_queue, video_dec, video_conv,
> video_scale, video_sink, NULL);
> gst_element_link_many (audio_queue, audio_dec, audio_conv,
> audio_sink, NULL);
>
>
> mutex = g_mutex_new();
>
> g_timeout_add (100, update_pos, NULL);
>
> printf ("Running\n"); fflush(stdout);
> gtk_main();
>
> /* clean up nicely */
> printf ("Returned, stopping playback\n"); fflush(stdout);
> gst_element_set_state (pipeline, GST_STATE_NULL);
> printf ("Deleting pipeline\n");
> gst_object_unref (GST_OBJECT (pipeline));
>
> g_mutex_free(mutex);
>
> return 0;
> }
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20060606/5d2b8e8e/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: corentinbaron.gpgkey
Type: application/octet-stream
Size: 916 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20060606/5d2b8e8e/attachment.obj>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20060606/5d2b8e8e/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 186 bytes
Desc: Ceci est une signature ?lectronique PGP
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20060606/5d2b8e8e/attachment.pgp>
More information about the gstreamer-devel
mailing list