From f0ae68d9440e90711c7b547f03d7165357b9c4ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 24 Feb 2009 16:33:51 +0100 Subject: Move examples directory to tests/examples as in every other GStreamer module --- examples/directfb/gstdfb.c | 514 --------------------------------------------- 1 file changed, 514 deletions(-) delete mode 100644 examples/directfb/gstdfb.c (limited to 'examples/directfb/gstdfb.c') diff --git a/examples/directfb/gstdfb.c b/examples/directfb/gstdfb.c deleted file mode 100644 index 675e5e23..00000000 --- a/examples/directfb/gstdfb.c +++ /dev/null @@ -1,514 +0,0 @@ -/* - (c) Copyright 2000-2002 convergence integrated media GmbH. - All rights reserved. - - Written by Denis Oliver Kropp , - Andreas Hundt , - Sven Neumann and - Julien Moutte . - - This file is subject to the terms and conditions of the MIT License: - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#include -#include -#include -#include -#include - -#include -#include -#include - -/* macro for a safe call to DirectFB functions */ -#define DFBCHECK(x...) \ - { \ - err = x; \ - if (err != DFB_OK) { \ - fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \ - DirectFBErrorFatal( #x, err ); \ - } \ - } - -typedef struct -{ - const gchar *padname; - GstPad *target; - GstElement *bin; -} dyn_link; - -static inline long -myclock () -{ - struct timeval tv; - - gettimeofday (&tv, NULL); - return (tv.tv_sec * 1000 + tv.tv_usec / 1000); -} - -static void -dynamic_link (GstPadTemplate * templ, GstPad * newpad, gpointer data) -{ - dyn_link *connect = (dyn_link *) data; - - if (connect->padname == NULL || - !strcmp (gst_pad_get_name (newpad), connect->padname)) { - gst_pad_link (newpad, connect->target); - } -} - -static void -size_changed (GObject * obj, GParamSpec * pspec, IDirectFBWindow * window) -{ - GstPad *pad = GST_PAD (obj); - GstStructure *s; - GstCaps *caps; - - if (!(caps = gst_pad_get_negotiated_caps (pad))) - return; - - s = gst_caps_get_structure (caps, 0); - if (s) { - gint width, height; - - if (!(gst_structure_get_int (s, "width", &width) && - gst_structure_get_int (s, "height", &height))) - return; - - window->Resize (window, width, height); - } -} - -static void -setup_dynamic_link (GstElement * element, const gchar * padname, - GstPad * target, GstElement * bin) -{ - dyn_link *connect; - - connect = g_new0 (dyn_link, 1); - connect->padname = g_strdup (padname); - connect->target = target; - connect->bin = bin; - - g_signal_connect (G_OBJECT (element), "pad-added", G_CALLBACK (dynamic_link), - connect); -} - -int -main (int argc, char *argv[]) -{ - IDirectFB *dfb; - IDirectFBDisplayLayer *layer; - - IDirectFBImageProvider *provider; - IDirectFBVideoProvider *video_provider; - - IDirectFBSurface *bgsurface; - - IDirectFBWindow *window1; - IDirectFBWindow *window2; - IDirectFBWindow *window3; - IDirectFBSurface *window_surface1; - IDirectFBSurface *window_surface2; - IDirectFBSurface *window_surface3; - - GstElement *pipeline; - - IDirectFBEventBuffer *buffer; - - IDirectFBFont *font; - - DFBDisplayLayerConfig layer_config; - DFBGraphicsDeviceDescription gdesc; - DFBWindowID id1; - DFBWindowID id2; - DFBWindowID id3; - - int fontheight; - int err; - int quit = 0; - - - DFBCHECK (DirectFBInit (&argc, &argv)); - gst_init (&argc, &argv); - DFBCHECK (DirectFBCreate (&dfb)); - - dfb->GetDeviceDescription (dfb, &gdesc); - - DFBCHECK (dfb->GetDisplayLayer (dfb, DLID_PRIMARY, &layer)); - - layer->SetCooperativeLevel (layer, DLSCL_ADMINISTRATIVE); - - if (!((gdesc.blitting_flags & DSBLIT_BLEND_ALPHACHANNEL) && - (gdesc.blitting_flags & DSBLIT_BLEND_COLORALPHA))) { - layer_config.flags = DLCONF_BUFFERMODE; - layer_config.buffermode = DLBM_BACKSYSTEM; - - layer->SetConfiguration (layer, &layer_config); - } - - layer->GetConfiguration (layer, &layer_config); - layer->EnableCursor (layer, 1); - - { - DFBFontDescription desc; - - desc.flags = DFDESC_HEIGHT; - desc.height = layer_config.width / 50; - - DFBCHECK (dfb->CreateFont (dfb, "decker.ttf", &desc, &font)); - font->GetHeight (font, &fontheight); - } - - if (argc < 2 || - dfb->CreateVideoProvider (dfb, argv[1], &video_provider) != DFB_OK) { - video_provider = NULL; - } - - { - DFBSurfaceDescription desc; - - desc.flags = DSDESC_WIDTH | DSDESC_HEIGHT; - desc.width = layer_config.width; - desc.height = layer_config.height; - - DFBCHECK (dfb->CreateSurface (dfb, &desc, &bgsurface)); - - DFBCHECK (bgsurface->SetFont (bgsurface, font)); - - bgsurface->SetColor (bgsurface, 0xCF, 0xCF, 0xFF, 0xFF); - bgsurface->DrawString (bgsurface, - "Move the mouse over a window to activate it.", - -1, 0, 0, DSTF_LEFT | DSTF_TOP); - - bgsurface->SetColor (bgsurface, 0xCF, 0xDF, 0xCF, 0xFF); - bgsurface->DrawString (bgsurface, - "Press left mouse button and drag to move the window.", - -1, 0, fontheight, DSTF_LEFT | DSTF_TOP); - - bgsurface->SetColor (bgsurface, 0xCF, 0xEF, 0x9F, 0xFF); - bgsurface->DrawString (bgsurface, - "Press middle mouse button to raise/lower the window.", - -1, 0, fontheight * 2, DSTF_LEFT | DSTF_TOP); - - bgsurface->SetColor (bgsurface, 0xCF, 0xFF, 0x6F, 0xFF); - bgsurface->DrawString (bgsurface, - "Press right mouse button when you are done.", -1, - 0, fontheight * 3, DSTF_LEFT | DSTF_TOP); - - layer->SetBackgroundImage (layer, bgsurface); - layer->SetBackgroundMode (layer, DLBM_IMAGE); - } - - { - DFBSurfaceDescription sdsc; - DFBWindowDescription desc; - - desc.flags = (DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT); - - if (!video_provider) { - desc.caps = DWCAPS_ALPHACHANNEL; - desc.flags |= DWDESC_CAPS; - - sdsc.width = 300; - sdsc.height = 200; - } else { - video_provider->GetSurfaceDescription (video_provider, &sdsc); - - if (sdsc.flags & DSDESC_CAPS) { - desc.flags |= DWDESC_SURFACE_CAPS; - desc.surface_caps = sdsc.caps; - } - } - - desc.posx = 20; - desc.posy = 120; - desc.width = sdsc.width; - desc.height = sdsc.height; - - DFBCHECK (layer->CreateWindow (layer, &desc, &window2)); - window2->GetSurface (window2, &window_surface2); - - window2->SetOpacity (window2, 0xFF); - - window2->GetID (window2, &id2); - - window2->CreateEventBuffer (window2, &buffer); - - if (video_provider) { - video_provider->PlayTo (video_provider, window_surface2, - NULL, NULL, NULL); - } else { - window_surface2->SetColor (window_surface2, 0x00, 0x30, 0x10, 0xc0); - window_surface2->DrawRectangle (window_surface2, - 0, 0, desc.width, desc.height); - window_surface2->SetColor (window_surface2, 0x80, 0xa0, 0x00, 0x90); - window_surface2->FillRectangle (window_surface2, - 1, 1, desc.width - 2, desc.height - 2); - } - - window_surface2->Flip (window_surface2, NULL, 0); - } - - { - DFBWindowDescription desc; - - desc.flags = (DWDESC_POSX | DWDESC_POSY | - DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS); - desc.posx = 200; - desc.posy = 200; - desc.width = 512; - desc.height = 145; - desc.caps = DWCAPS_ALPHACHANNEL; - - DFBCHECK (layer->CreateWindow (layer, &desc, &window1)); - window1->GetSurface (window1, &window_surface1); - - DFBCHECK (dfb->CreateImageProvider (dfb, "dfblogo.png", &provider)); - provider->RenderTo (provider, window_surface1, NULL); - - window_surface1->SetColor (window_surface1, 0xFF, 0x20, 0x20, 0x90); - window_surface1->DrawRectangle (window_surface1, - 0, 0, desc.width, desc.height); - - window_surface1->Flip (window_surface1, NULL, 0); - - provider->Release (provider); - - window1->AttachEventBuffer (window1, buffer); - - window1->SetOpacity (window1, 0xFF); - - window1->GetID (window1, &id1); - } - - { - DFBWindowDescription desc; - GstElement *src, *decode; - GstElement *v_queue, *v_scale, *cs, *v_sink; - GstElement *a_queue, *conv, *a_sink; - GstPad *v_pad, *a_pad; - - desc.flags = (DWDESC_POSX | DWDESC_POSY | - DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS); - desc.posx = 10; - desc.posy = 10; - desc.width = 100; - desc.height = 100; - desc.caps = DWCAPS_ALPHACHANNEL; - - DFBCHECK (layer->CreateWindow (layer, &desc, &window3)); - window3->GetSurface (window3, &window_surface3); - - window3->AttachEventBuffer (window3, buffer); - - window3->SetOpacity (window3, 0xFF); - - window3->GetID (window3, &id3); - - pipeline = gst_pipeline_new ("pipeline"); - - src = gst_element_factory_make ("gnomevfssrc", "src"); - g_object_set (src, "location", argv[1], NULL); - decode = gst_element_factory_make ("decodebin", "decode"); - - v_queue = gst_element_factory_make ("queue", "v_queue"); - v_scale = gst_element_factory_make ("videoscale", "v_scale"); - cs = gst_element_factory_make ("ffmpegcolorspace", "cs"); - v_sink = gst_element_factory_make ("dfbvideosink", "v_sink"); - g_object_set (v_sink, "surface", window_surface3, NULL); - - a_queue = gst_element_factory_make ("queue", "a_queue"); - conv = gst_element_factory_make ("audioconvert", "conv"); - a_sink = gst_element_factory_make ("alsasink", "a_sink"); - - gst_bin_add_many (GST_BIN (pipeline), src, decode, NULL); - gst_bin_add_many (GST_BIN (pipeline), v_queue, v_scale, cs, v_sink, NULL); - gst_bin_add_many (GST_BIN (pipeline), a_queue, conv, a_sink, NULL); - - gst_element_link (src, decode); - gst_element_link_many (v_queue, v_scale, cs, v_sink, NULL); - gst_element_link_many (a_queue, conv, a_sink, NULL); - - v_pad = gst_element_get_static_pad (v_queue, "sink"); - a_pad = gst_element_get_static_pad (a_queue, "sink"); - - setup_dynamic_link (decode, NULL, v_pad, NULL); - setup_dynamic_link (decode, NULL, a_pad, NULL); - - /* We want to know when the size is defined */ - g_signal_connect (v_pad, "notify::caps", G_CALLBACK (size_changed), - window3); - - gst_object_unref (a_pad); - gst_object_unref (v_pad); - - gst_element_set_state (pipeline, GST_STATE_PLAYING); - } - - window1->RequestFocus (window1); - window1->RaiseToTop (window1); - - while (!quit) { - static IDirectFBWindow *active = NULL; - static int grabbed = 0; - static int startx = 0; - static int starty = 0; - static int endx = 0; - static int endy = 0; - DFBWindowEvent evt; - - buffer->WaitForEventWithTimeout (buffer, 0, 10); - - while (buffer->GetEvent (buffer, DFB_EVENT (&evt)) == DFB_OK) { - IDirectFBWindow *window; - - if (evt.window_id == id1) - window = window1; - else if (evt.window_id == id3) - window = window3; - else - window = window2; - - if (evt.type == DWET_GOTFOCUS) { - active = window; - } else if (active) { - switch (evt.type) { - - case DWET_BUTTONDOWN: - if (!grabbed && evt.button == DIBI_LEFT) { - grabbed = 1; - startx = evt.cx; - starty = evt.cy; - window->GrabPointer (window); - } - break; - - case DWET_BUTTONUP: - switch (evt.button) { - case DIBI_LEFT: - if (grabbed) { - window->UngrabPointer (window); - grabbed = 0; - } - break; - case DIBI_MIDDLE: - active->RaiseToTop (active); - break; - case DIBI_RIGHT: - quit = DIKS_DOWN; - break; - default: - break; - } - break; - - case DWET_KEYDOWN: - if (grabbed) - break; - switch (evt.key_id) { - case DIKI_RIGHT: - active->Move (active, 1, 0); - break; - case DIKI_LEFT: - active->Move (active, -1, 0); - break; - case DIKI_UP: - active->Move (active, 0, -1); - break; - case DIKI_DOWN: - active->Move (active, 0, 1); - break; - default: - break; - } - break; - - case DWET_LOSTFOCUS: - if (!grabbed && active == window) - active = NULL; - break; - - default: - break; - - } - } - - switch (evt.type) { - - case DWET_MOTION: - endx = evt.cx; - endy = evt.cy; - break; - - case DWET_KEYDOWN: - switch (evt.key_symbol) { - case DIKS_ESCAPE: - case DIKS_SMALL_Q: - case DIKS_CAPITAL_Q: - case DIKS_BACK: - case DIKS_STOP: - quit = 1; - break; - default: - break; - } - break; - - default: - break; - } - } - - if (video_provider) - window_surface2->Flip (window_surface2, NULL, 0); - - if (active) { - if (grabbed) { - active->Move (active, endx - startx, endy - starty); - startx = endx; - starty = endy; - } - active->SetOpacity (active, (sin (myclock () / 300.0) * 85) + 170); - } - } - - if (video_provider) - video_provider->Release (video_provider); - - gst_element_set_state (pipeline, GST_STATE_NULL); - - buffer->Release (buffer); - font->Release (font); - window_surface2->Release (window_surface2); - window_surface1->Release (window_surface1); - window_surface3->Release (window_surface3); - window2->Release (window2); - window1->Release (window1); - window3->Release (window3); - layer->Release (layer); - bgsurface->Release (bgsurface); - dfb->Release (dfb); - - return 42; -} -- cgit v1.2.1