dynamiquement (un) lier des éléments dans un pipeline en cours d'exécution (gstreamer)?
il y a beaucoup d'exemples dans le gstreamer documentation sur la construction et l'exécution de statique des pipelines.
cependant, il n'y en a pas beaucoup sur la modification de/re-lier les éléments dans un vivre pipeline - alors que les médias est en fait couler.
c'est certainement possible, donc la question est:
- ce que gstreamer concepts/mécanique dois-je comprendre avant de tenter cela?
- existe-il des écueils à éviter?
- quelle est la procédure de base, ou un bon exemple?
accepté de réponse seront nourris cuillère, complet, et avec le code source
source d'informationauteur Jeremiah Rose
Vous devez vous connecter pour publier un commentaire.
Mon favori "concept" pour la compréhension de la liaison (et la liaison dynamique), c'est la réflexion sur le pipeline comme une vraie pipe avec de l'eau s'écoulant à travers elle. Une fois que vous faites cela, certaines choses vont devenir très évident. Comme, "vous définissez la source de LECTURE avant de lier l'élément?", devient "ne vous tournez sur l'eau avant de brancher le tuyau d'arrosage?", et qu'il sorte de lui-même les réponses. D'autant plus avec la liaison dynamique, comment vous assurez-vous que l'eau ne les "fuites" (ce qui est mauvais, les "fuites" dans GStreamer est l'équivalent de l'obtention d'un GST_FLOW_NOT_LINKED, et de cesser de votre source et le plaisir) ou se bouchent (peut causer une chute ou d'une congestion de paquets).
Oui. Beaucoup de. Avec un peu d'avertissement que j'ai encore actuellement de travailler avec de 0,10 et de certains de ces éléments peuvent avoir été corrigé avec la 1.0, il n'est malheureusement très, très difficile de faire la liaison dynamique et dissociation d'avec GStreamer 0.10. Laissez-moi vous expliquer:
Disons que vous êtes en utilisant un Tee-shirt, et que vous souhaitez dissocier une branche. Vous commencez par libérer les Tees srcpad (jamais l'esprit dissociation d'elle, ce qui se passe dans le cadre de la sortie de la tablette), et maintenant, vous devriez en toute sécurité être en mesure d'abattre les éléments en aval de la serviette. (L'équivalent en eau de la est que de la fermeture d'une vanne après le t-shirt, et devrait maintenant être en mesure de démonter les tuyaux en aval de la vanne, vous ne voulez pas commencer à démanteler les tuyaux sans fermer la vanne d'abord, à moins que vous vouliez obtenir humide,...)
Cela fonctionne la plupart du temps, mais il y a une course ici. Parce que, après avoir libéré le pad, il pourrait encore être un coup de pouce ou d'un pad-alloc sur leur chemin sur ce pad, et si vous avez maintenant dans votre code commencer à abattre les éléments en aval, ce qui pourrait maintenant se bloquer en raison de la race qui existe dans certains éléments s'ils obtiennent une poussée ou pad-alloc tout déchirer vers le bas, ou vous avez une GST_FLOW_WRONG_STATE ou GST_FLOW_NOT_LINKED et ils vont revenir à la source de l'arrêt du cours d'eau pour tout le monde...
J'ai fait beaucoup d'expériences avec cela, et a constaté que si vous avez besoin de stabilité, et de s'écraser/congélation parfois n'est pas une option que vous avez besoin d'un élément qui servira de votre dynamique de filet de sécurité. Un élément qui permettra de garantir que absolument aucune activité va se passer sur un pad, après la sortie d'/dissocier. La seule façon de le faire est de briser un autre GStreamer paradigme de ne pas pousser tout en maintenant un verrou: vous devez être titulaire d'un verrou tout en poussant /envoi d'événements /pad-allocing. J'ai fait une telle chose à un moment de retour ici. (test des cas d'être la chose la plus importante, bien sûr, comme il vous permet de tester votre propre /autres éléments pour leur solidité)
Vous pourriez aussi imaginer un lock-free élément susceptible d'avaler tous les mauvais FlowReturns, et juste peindre un joli tableau pour ses en amont, mais alors vous devez être absolument sûr que tous vos aval-les éléments seraient "pousser ou pad-alloc reçu lors de la fermeture"-safe, depuis votre élément ne serait pas en mesure de garantir qu'une fois "arrêter le flux" (libération/unlink) a été exécutée, un peu de baisse ne serait pas presser passé.
Bien sûr, vous devez le mettre en perspective. La fenêtre de cette terrible course-conditions dont je parle est en fait très, très petit, et peut seulement se produire chaque 1000e ou 10.000 ème fois que vous exécutez votre programme. Mais pour une application professionnelle ce n'est évidemment pas acceptable. J'ai fait une conférence où j'ai couvert certains de ces trucs ici
J'ai tendance à utiliser de sortie sélecteur de ou sélecteur d'entrée bacs en fonction de la situation plutôt que de tampon de blocage de la complexité (j'ai répondu le tampon de blocage dans un autre post http://gstreamer-devel.966125.n4.nabble.com/Dynamically-adding-and-removing-branches-of-a-tee-td973635.html#a4656812). Et connecter le sélecteur de fakesrc ou fakesink bacs lorsqu'il n'est pas en cours d'utilisation. Dans l'exemple ci-dessous si l'on est à l'aide de GTK alors on peut remplacer la ligne
g_timeout_add (SWITCH_TIMEOUT, switch_cb, osel);
avecgtk_toggle_button
et de mettre tout le code qui est actuellement dans laswitch_cb
fonction de basculer le bouton de fonction de rappel. Dans ce code on peut basculer entre les deux imagesinks. Je voudrais remplacer une image évier avec fakesink de garder pipeline en cours d'exécution, au cas où je veux ajouter un tee-shirt dans l'avenir avec un filesink où je veux enregistrer de la vidéo mais de fournir joueur une option pour activer (sélecteur sur imagesink)/off (sélecteur sur fakesink) l'affichage. Cela permet d'ajouter/supprimer des bacs lors de l'exécution à l'aide du sélecteur.En fait je suis en train de faire la même chose. Pas trop de chance encore 🙁
J'ai eu lien suivant en posant sur la #gstreamer canal IRC:
http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-dynamic.txt
Peut-être une allusion à la bonne direction.
S'il vous plaît laissez-moi savoir quand vous trouvez d'autres documents...
Ce message est apparu en premier quand j'ai regardé la dynamique de la modification de tout pipeline gstreamer. Trouvé quelques liens, mais il est maintenant bien documenté dans le manuel: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-dynamic-pipelines.html
Je n'ai pas parvenir à créer lisible multiplexé fichiers pour Gstreamer 0.10 sur le dessus de multifilesink ou de sortie sélecteur de.
Après l'analyse de beaucoup de solutions de rechange ma solution prend comme base de code de l'exemple décrit dans:
http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-dynamic-pipelines.html
La sondes fonction de l'API a été un peu modifié à partir de 0,10 à 1,0 mais la solution ci-dessous fonctionne pour créer toutes les N secondes différents fichiers MP4: