Я використовую робочий стіл Flutter для Linux. Я називаю метод, який називається, MarkTextureFrameAvailable
який повинен позначати текстуру, яка повинна бути відтворена двигуном. Оскільки я програмую відеоплеєр, мені потрібно дзвонити MarkTextureFrameAvailable
з потоку програвача. Проблема полягає в тому, що двигун змушує мене дзвонити MarkTextureFrameAvailable
(і будь-який інший метод двигуна) з потоку, який створив двигун.
Ви можете бачити, що всі дзвінки до двигуна закінчуються в оболонці, яка завжди перевіряє, чи здійснюються дзвінки з тієї ж нитки, що і створила виклик:
task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread()
( https://github.com/flutter/engine/blob/master/shell/common/shell.cc#L838 )
Ось так я створюю двигун «трепет»:
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;
}
як бачите, потік, який створює двигун, блокується, flutter_controller.RunEventLoop();
і це єдине місце, де я міг би поставити диспетчер подій, який змусив речі виконуватись з потоку основного. Мені не подобається ця ідея. Незважаючи на те, що RunEventLoopWithTimeout
існує, мені потрібно поставити тайм-аут і продовжувати перевірку в черзі на MarkTextureFrameAvailable
дзвінки. Я не думаю, що це оптимально.
Тож як мені зателефонувати MarkTextureFrameAvailable
з головної нитки?
Я знайшов приклад використання MarkTextureFrameAvailable
тут: https://github.com/cloudwebrtc/flutter-webrtc/blob/desktop/common/src/flutter_video_renderer.cc#L90, і схоже, що це ще одна нитка, яка називає його. Як це можливо? Коли я це роблю, я отримую FATAL помилку, але він робить і це працює?
Я провів два дні, намагаючись зрозуміти, яка нитка викликає OnFrame на цьому прикладі, але не змогла дізнатися, оскільки він використовує https://github.com/flutter-webrtc/libwebrtc, який використовує webrtc google: https://github.com/ JumpingYang001 / webrtc, який для мене занадто великий, щоб знайти, звідки викликається OnFrame. Але це повинно мені з нитки. Як це можливо?
flutter_controller.RunEventLoop()
, то точно MarkTextureFrameAvailable
потрібно викликати її з іншої нитки, що має бути неможливим!
OnRender
віртуальне переповнення Flutter, тому воно викликається потоком Flutter.