J'utilise Flutter Desktop pour Linux. MarkTextureFrameAvailable
J'appelle une méthode appelée qui est censée marquer une texture à restituer par le moteur. Étant donné que je programme un lecteur vidéo, je dois appeler à MarkTextureFrameAvailable
partir du fil du lecteur. Le problème est que le moteur me force à appeler MarkTextureFrameAvailable
(et toute autre méthode de moteur) à partir du thread qui a créé le moteur.
Vous pouvez voir que tous les appels au moteur se retrouvent dans le shell qui vérifie toujours si les appels sont effectués à partir du même thread qui a créé l'appel:
task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()
( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )
Voici comment je crée le moteur de flutter:
int main(int argc, char **argv) {
//..
flutter::FlutterWindowController flutter_controller(icu_data_path);
// Start the engine.
if (!flutter_controller.CreateWindow(800, 600, "Flutter WebRTC Demo", assets_path,
arguments)) {
return EXIT_FAILURE;
}
// Register any native plugins.
FlutterWebRTCPluginRegisterWithRegistrar(
flutter_controller.GetRegistrarForPlugin("FlutterWebRTCPlugin"));
// Run until the window is closed.
flutter_controller.RunEventLoop();
return EXIT_SUCCESS;
}
comme vous pouvez le voir, le thread qui crée le moteur est bloqué, flutter_controller.RunEventLoop();
ce qui est le seul endroit où je pourrais mettre un répartiteur d'événements qui a forcé les choses à être exécutées à partir du thread principal. Je n'aime pas cette idée. Même s'il RunEventLoopWithTimeout
existe, je dois mettre un délai d'attente et continuer à vérifier dans une file d'attente pour les MarkTextureFrameAvailable
appels. Je ne pense pas que ce soit optimal.
Alors, comment dois-je appeler à MarkTextureFrameAvailable
partir du thread principal?
J'ai trouvé un exemple d'utilisation MarkTextureFrameAvailable
ici: https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_renderer.cc#L90 et il semble que ce soit un autre fil qui l'appelle. Comment est-ce possible? Quand je le fais, j'obtiens une erreur FATAL, mais il le fait et cela fonctionne?
J'ai passé deux jours à essayer de comprendre quel fil appelle OnFrame sur cet exemple, mais je n'ai pas pu le savoir car il utilise https://github.com/flutter-webrtc/libwebrtc qui utilise le webrtc de Google: https://github.com/ JumpingYang001 / webrtc qui est trop gros pour que je trouve d'où OnFrame est appelé. Mais il me faut d'un fil. Comment est-ce possible?
flutter_controller.RunEventLoop()
, alors à coup sûr MarkTextureFrameAvailable
doit être appelé à partir d'un autre thread, ce qui devrait être impossible!
OnRender
s'agit d'un remplacement virtuel de Flutter, il est donc invoqué par le thread Flutter.