[C] GStreamer XDestroySubwindows

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goedeavond,


Ik ben bezig met een app te maken die gebruikt maakt van gstreamer voor X11. Deze app laat 2 video's zien in twee verschillende resoluties. Elke video die wordt weergegeven wordt in een x11_subwindow afgespeelt. Nu is het probleem zo dat als ik het eerste filmpje afspeel (die groter wordt weergeven) ik bij het tweede filmpje de subwindow van het eerste filmpje nog zie (als ik een achtergrond gebruik die niet zwart is). Nu dacht ik oke na het afspelen van een filmpje close ik de sub window. Echter krijg ik dan een segmentation fault.

Ik heb gegoogled op XdestroyWindow segmentation fault maar ook zonder resultaat.
Ik heb zelf al geprobeerd met XdestroyWindow, met gdb gekeken, zonder resultaat. Wil graag kunnen printen wat er in de screen en window staat maar weet niet of dit mogelijk is.

Wie o wie kan mij in de goede richting brengen. Zit er nu echt al paar dagen mee overhoop.
PS ben beginner met X11 programming.

Code:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Window set_gst_sdl_video_overlay (GstElement *pipeline,int x,int y,int width,int height)
{
    GstElement *videosink;
    SDL_SysWMinfo sdl_info;
    Window play_win;

    sdl_info = get_sdl_wm_info ();
    if (!sdl_info.version.major)
        return 0;

    g_object_get (pipeline, "video-sink", &videosink, NULL);

    if (videosink && GST_IS_X_OVERLAY (videosink)) {
        sdl_info.info.x11.lock_func ();
        g_message("video 1");
        play_win = create_x11_subwindow (sdl_info.info.x11.display,
            sdl_info.info.x11.window,
            x, y, width, height);
        sdl_info.info.x11.unlock_func ();

        gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (videosink), play_win);
    } else
        g_message("video else");
        play_win = 0;

    g_object_unref (videosink);

    return play_win;
}


void main_loop (char *playfile)
{
    SDL_SysWMinfo sdl_info;
    Display *currentDis;
    currentDis = sdl_info.info.x11.display;

    playbin = create_gst_playbin ();
    Window testWindow;
    testWindow = set_gst_sdl_video_overlay (playbin, 45, 45, 1080, 768);
    if (!testWindow)
        fprintf (stderr, "Not using Window overlay.\n");

    XDestroySubwindows(currentDis,testWindow);
        //segmentation fault
    return;
}

[ Voor 131% gewijzigd door Verwijderd op 15-07-2010 23:14 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Sorry, maar zo werken we hier niet. Het is hier niet de bedoeling dat je je code dumpt en wij even de fout voor je zoeken en aanwijzen. Dat is een quickfix en daar doen we hier niet aan. Debuggen mag je zelf (Debuggen: Hoe doe ik dat?). En als je dan toch code post, post dan enkel relevante(!) (delen) code en niet de hele shebang van 284 regels :X

Verder zie ik niet in je topic terug wat je allemaal al hebt geprobeerd; ik geloof best dat dat al heel wat is, maar we zien het niet in je topic terug. Dat betekent dat de eerste 5 oplossingen waarschijnlijk al door jezelf zijn geprobeerd of iets in die richting en dat schiet natuurlijk niet op. Dus graag zou ik, conform onze Quickstart, je topicstart gecorrigeerd zien ;)

Overigens kan ik me niet aan de indruk onttrekken dat de code die je postte voor een groot deel copy/paste is van elders; dan wil ik daar nog even als kanttekening bij plaatsen dat we geen support geven op code van derden; daarvoor mag je de originele auteurs benaderen. In de devschuur hebben we het immers over zélf programmeren. Mocht ik er helemaal langs zitten dan heb ik niets gezegd.

[edit]
Ik zie dat je (een deel van) de code reeds teruggeplaatst hebt. Zou je dan ook nog even zo vriendelijk willen zijn, nogmaals, om je topic meteen helemaal conform onze, voorgenoemde, quickstart te maken? Ik mis nog steeds wat je zelf hebt geprobeerd, wat er uit kwam toen je ging debuggen etc...

[ Voor 61% gewijzigd door RobIII op 15-07-2010 23:10 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02:32
Ik vermoed dat (een subelement van) de playbin de window nog in gebruik heeft op 't moment dat je 'm probeert te verwijderen. Waarschijnlijk kun je het oplossen door ofwel de hele playbin vrij te geven (met g_object_unref()) of de video-sink los te koppelen (met gst_x_overlay_set_xwindow_id() met 0 als window id), alvorens XDestroySubwindows() aan te roepen.

Als dat niet helpt, dan zul je zelf aan het debuggen moeten slaan, door in een debugger te kijken waar het precies misgaat. Dat is dan waarschijnlijk ergens in de gstreamer/SDL/Xlib code.

(En inderdaad, de code lijkt me grotendeels gekopieerd van: http://barbieri-playgroun...m/svn/sdl/sdl-gstreamer.c)

[ Voor 10% gewijzigd door Soultaker op 16-07-2010 03:53 ]


Acties:
  • 0 Henk 'm!

  • Orwell
  • Registratie: December 2009
  • Laatst online: 08-09 22:11
Heel duffig misschien, maar zou je die 'else' op regel 22 niet eens netjes openen met een '{'?