2016-04-28 1 views
0

Ce que je veux faire est simple. Activez les pastilles de lavabo sur le mélangeur vidéo:Gstreamer: Comment régler videomixer sink_0 caps en C

/* Manually link the mixer, which has "Request" pads */ 
mixer_sink_pad_template = gst_element_class_get_pad_template(GST_ELEMENT_GET_CLASS(videomixer), "sink_%u"); 
mixer_sink_pad = gst_element_request_pad(videomixer, mixer_sink_pad_template, NULL, NULL); 
sink_pad = gst_element_get_static_pad(videomixer, "src"); 
gst_pad_link(sink_pad, mixer_sink_pad); 

Ensuite, définissez alpha, xpos, ypos, par ex.

g_object_set(videomixer, "sink_0::alpha", 0.5, NULL); 

Mais cela ne fonctionne pas.

(orig_code:22527): GLib-GObject-WARNING **: g_object_set_valist: object class 'GstVideoMixer2' has no property named 'sink_0::alpha' 

Je suis en train de comprendre la syntaxe pour obtenir le code C pour définir sink_0 de videomixer & propriétés pad sink_1.

Quelqu'un peut-il souligner à quel point c'est facile?

+0

Vous ne pouvez pas définir la propriété du récepteur via le videomixer. Essayez 'GstPad * sink_0 = gst_element_get_static_pad (videomixer," sink_0 ");' alors 'g_object_set (sink_0," alpha ", 0.5, NULL);' – Martin

+0

Merci Martin. Si je place le premier de cette façon, il semble fonctionner, c'est-à-dire compile et pas d'avertissement d'exécution, mais (dans ce cas) le xpos ne change pas. Si j'essaie de définir la seconde, il donne un avertissement ou des erreurs de segmentation (en fonction de la présence du premier gst_element_get_static_pad). Cela me fait me demander si le code qui demande les pads (montré ci-dessus) est incorrect, car il fait quelque chose de similaire. Les suggestions sont les bienvenues. Je vais creuser dans les blocs de requête. – Raydude

Répondre

1

Voici une réponse à ma propre question.

Première mise en garde. Je pense que lorsque de mauvaises données sont extraites de la caméra (généralement au démarrage), il n'y a pas assez de données pour classer le flux vidéo et les erreurs de segment de code. Mon expérience est la suivante: si vous courez encore, tout ira bien.

Les premières choses d'abord. Pour accéder aux pads du videomixer, vous devez les créer lorsque vous liez les éléments. Voici un exemple:

/* Manually link the mixer, which has "Request" pads */ 
    source0_src_pad = gst_element_get_static_pad (source0, "src"); 
    mixer_sink_pad_template = gst_element_class_get_pad_template(GST_ELEMENT_GET_CLASS(videomixer), "sink_%u"); 
    mixer_sink_pad = gst_element_request_pad(videomixer, mixer_sink_pad_template, NULL, NULL); 
    if (gst_pad_link(source0_src_pad, mixer_sink_pad) != GST_PAD_LINK_OK) { 
    g_printerr ("source0 and mixer pads could not be linked.\n"); 
    gst_object_unref (pipeline); 
    return -1; 
    } 

Je n'ai pas testé, mais vous devriez être en mesure de régler les xpos juste après l'auto-lien:

g_object_set(mixer_sink_pad, "xpos", 1280, NULL); 
gst_object_unref(source0_src_pad); 

Je le réglage des tampons xpos plus tard le code avec ce code:

GstPad* sink_0 = gst_element_get_static_pad(videomixer, "sink_0"); 
g_object_set(sink_0, "xpos", 0, NULL); 

Merci à Martin de me pointer dans la bonne direction.

Édité, parce que j'ai mal compris du code.

+0

J'essaie d'accomplir quelque chose de très similaire. Je veux changer dynamiquement la valeur alpha de videomixer.sink_1 :: alpha après le démarrage du pipeline. Avez-vous essayé cela? –

+0

Désolé, je n'ai pas fait cela et j'ai abandonné sur gstreamer. Je suis en train de tout coder moi-même maintenant. C'est beaucoup plus rapide et j'ai l'impression d'avoir le contrôle sur tout. – Raydude

+0

Etes-vous en train d'écrire vos propres codecs? –