Sto usando Flutter Desktop per Linux. Sto chiamando un metodo chiamato MarkTextureFrameAvailable
che dovrebbe contrassegnare una trama che deve essere renderizzata dal motore. Dal momento che sto programmando un lettore video, devo chiamare MarkTextureFrameAvailable
dal thread del lettore. Il problema è che il motore mi costringe a chiamare MarkTextureFrameAvailable
(e qualsiasi altro metodo del motore) dal thread che ha creato il motore.
Puoi vedere che tutte le chiamate al motore finiscono nella shell, che controlla sempre se le chiamate vengono fatte dallo stesso thread che ha creato la chiamata:
task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()
( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )
Ecco come sto creando il motore 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;
}
come puoi vedere, il thread che crea il motore viene bloccato da flutter_controller.RunEventLoop();
quale è l'unico posto in cui potrei mettere un dispatcher di eventi che costringe le cose ad essere eseguite dal thread di main. Non mi piace questa idea. Anche se RunEventLoopWithTimeout
esiste, devo mettere un timeout e continuare a controllare in coda per le MarkTextureFrameAvailable
chiamate. Non penso sia ottimale.
Quindi, come dovrei chiamare MarkTextureFrameAvailable
dal thread principale?
Ho trovato un esempio di utilizzo MarkTextureFrameAvailable
qui: https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_renderer.cc#L90 e sembra che sia un altro thread che lo chiama. Come è possibile? Quando lo faccio, ricevo un errore FATAL, ma lo fa e funziona?
Ho trascorso due giorni a cercare di capire quale thread chiama OnFrame in questo esempio ma non sono riuscito a scoprirlo perché utilizza https://github.com/flutter-webrtc/libwebrtc che utilizza il webrtc di google: https://github.com/ JumpingYang001 / webrtc che è troppo grande per me per trovare da dove viene chiamato OnFrame. Ma devo da un filo. Come è possibile?
flutter_controller.RunEventLoop()
, allora sicuramente MarkTextureFrameAvailable
deve essere chiamato da un altro thread, il che dovrebbe essere impossibile!
OnRender
è un override virtuale di Flutter, quindi viene invocato dal thread Flutter.