2010-08-26 3 views
0

J'ai un pipeline gstreamer qui se termine par un élément xvimagesink. Pour avoir la vidéo affichée dans une fenêtre particulière , je peux utiliser le x_oerlay_interface:Ciblage du widget enfant Qt avec gstreamer

gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(xvsink), winid); 

Jusqu'à présent, si bon. Cependant, cela ne fonctionne que si winid est l'idée d'une fenêtre de haut niveau, ce qui n'est pas le cas du widget enfant. Disons que j'ai:

  1. Un widget dialogue DialogWidget
  2. Un widget vidéo VideoWidget, qui est un enfant de DialogWidget.

Si j'utilise DialogWidget->winId(), la vidéo s'affiche correctement.
Si j'utilise « VideoWidget-> winId() », je reçois un message de l'extension Xv me disant des choses comme

X Error: BadWindow (invalid Window parameter) 3 
    Major opcode: 3 (X_GetWindowAttributes) 
    Resource id: 0x40000d5 
X Error: BadWindow (invalid Window parameter) 3 
    Major opcode: 2 (X_ChangeWindowAttributes) 
    Resource id: 0x40000d5 
X Error: BadDrawable (invalid Pixmap or Window parameter) 9 
    Major opcode: 55 (X_CreateGC) 
    Resource id: 0x40000d5 
X Error: BadGC (invalid GC parameter) 13 
    Extension: 132 (Uknown extension) 
    Minor opcode: 19 (Unknown request) 
    Resource id: 0x40000d5 
X Error: BadGC (invalid GC parameter) 13 
    Extension: 132 (Uknown extension) 
    Minor opcode: 19 (Unknown request) 
    Resource id: 0x40000d5 

Je voudrais avoir une fenêtre redimensionnable avec des boutons de commandes, etc .., et à l'intérieur cette fenêtre, une fenêtre d'affichage vidéo ou un widget ou tout ce qui est une cible appropriée pour

gst_x_overlay_set_xwindow_id 

Comment puis-je faire cela?

Répondre

3

Il fonctionne en fait avec QWidget. Cependant, un appel à QApplication::syncX est nécessaire APRÈS l'appel à WinId:

/* Wrong order */ 
QApplication::syncX(); 
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(xvsink), someWidget->winId()); 

/* Right order */ 
unsigned long win_id = someWidget->winId(); 
QApplication::syncX(); 
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(xvsink), win_id);