[{"id":31125,"web_url":"https://patchwork.libcamera.org/comment/31125/","msgid":"<172588592896.2319503.17130127511790603993@ping.linuxembedded.co.uk>","date":"2024-09-09T12:45:28","subject":"Re: [PATCH v11 0/7] Add VirtualPipelineHandler","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Harvey,\n\nQuoting Harvey Yang (2024-09-07 15:28:25)\n> Hi all,\n> \n> This series adds virtual pipeline handler, which doesn't depend on any\n> hardware, like camera sensor or ISP. Currently the configuration\n> supports test patterns and images.\n> \n> It passed the gitlab pipeline:\n> https://gitlab.freedesktop.org/chenghaoyang/libcamera/-/pipelines/1266568\n> \n> I failed to pass multi_stream_test when trying to enable multiple\n> streams though. Please give me some hints what it tests and what I\n> missed:\n\nI tried to run this but it crashed.\n\nI ran gdb --args ./build/gcc/src/apps/qcam/qcam and then chose virtual0:\n\n\nAnd here's the backtraces:\n\n(gdb) thread apply all bt\n\nThread 9 (Thread 0xffffda00eec0 (LWP 31018) \"qcam\"):\n#0  0x0000fffff7c92ff0 in libcamera::TestPatternGenerator::shiftLeft (this=0xffffb8060d40, size=...) at ../../src/libcamera/pipeline/virtual/test_pattern_generator.cpp:50\n#1  0x0000fffff7c92e2c in libcamera::TestPatternGenerator::generateFrame (this=0xffffb8060d40, size=..., buffer=0xffffb806fa00) at ../../src/libcamera/pipeline/virtual/test_pattern_generator.cpp:31\n#2  0x0000fffff7c94870 in libcamera::PipelineHandlerVirtual::queueRequestDevice (this=0xffffb80464a0, camera=0xffffb808a4d0, request=0xffffdc015e20) at ../../src/libcamera/pipeline/virtual/virtual.cpp:234\n#3  0x0000fffff7b76a30 in libcamera::PipelineHandler::doQueueRequest (this=0xffffb80464a0, request=0xffffdc015e20) at ../../src/libcamera/pipeline_handler.cpp:472\n#4  0x0000fffff7b76ab8 in libcamera::PipelineHandler::doQueueRequests (this=0xffffb80464a0) at ../../src/libcamera/pipeline_handler.cpp:492\n#5  0x0000fffff7b7dcac in libcamera::BoundMethodMember<libcamera::PipelineHandler, void>::invoke (this=0x8fdb40) at ../../include/libcamera/base/bound_method.h:191\n#6  0x0000fffff7ad7368 in libcamera::BoundMethodArgs<void>::invokePack<, void>(libcamera::BoundMethodPackBase*, std::integer_sequence<unsigned long>) (this=0x8fdb40, pack=0xffffb806e100) at ../../include/libcamera/base/bound_method.h:115\n#7  0x0000fffff7ad6728 in libcamera::BoundMethodArgs<void>::invokePack (this=0x8fdb40, pack=0xffffb806e100) at ../../include/libcamera/base/bound_method.h:124\n#8  0x0000fffff7f46ed4 in libcamera::BoundMethodBase::activatePack (this=0x8fdb40, pack=std::shared_ptr<libcamera::BoundMethodPackBase> (use count 2, weak count 0) = {...}, deleteMethod=false) at ../../src/libcamera/base/bound_method.cpp:85\n#9  0x0000fffff7b7dbc8 in libcamera::BoundMethodMember<libcamera::PipelineHandler, void>::activate (this=0x8fdb40, deleteMethod=false) at ../../include/libcamera/base/bound_method.h:184\n#10 0x0000fffff7af33e4 in libcamera::Signal<>::emit() (this=0x8fda90) at ../../include/libcamera/base/signal.h:153\n#11 0x0000fffff7b29b74 in libcamera::Request::Private::emitPrepareCompleted (this=0x8fda80) at ../../src/libcamera/request.cpp:190\n#12 0x0000fffff7b29cf0 in libcamera::Request::Private::prepare (this=0x8fda80, timeout=std::chrono::duration = { 300ms }) at ../../src/libcamera/request.cpp:243\n#13 0x0000fffff7b76968 in libcamera::PipelineHandler::queueRequest (this=0xffffb80464a0, request=0xffffdc015e20) at ../../src/libcamera/pipeline_handler.cpp:451\n#14 0x0000fffff7b0b768 in libcamera::BoundMethodMember<libcamera::PipelineHandler, void, libcamera::Request*>::invoke (this=0x86ad50, args#0=0xffffdc015e20) at ../../include/libcamera/base/bound_method.h:191\n#15 0x000000000044f6f4 in libcamera::BoundMethodArgs<void, libcamera::Request*>::invokePack<0ul, void> (this=0x86ad50, pack=0x86ada0) at ../../include/libcamera/base/bound_method.h:115\n#16 0x000000000044f1a0 in libcamera::BoundMethodArgs<void, libcamera::Request*>::invokePack (this=0x86ad50, pack=0x86ada0) at ../../include/libcamera/base/bound_method.h:124\n#17 0x0000fffff7f60fa8 in libcamera::InvokeMessage::invoke (this=0x86adc0) at ../../src/libcamera/base/message.cpp:153\n#18 0x0000fffff7f489c8 in libcamera::Object::message (this=0xffffb80464a0, msg=0x86adc0) at ../../src/libcamera/base/object.cpp:211\n#19 0x0000fffff7f62394 in libcamera::Thread::dispatchMessages (this=0x6993a0, type=libcamera::Message::None) at ../../src/libcamera/base/thread.cpp:602\n#20 0x0000fffff7f51e08 in libcamera::EventDispatcherPoll::processEvents (this=0xffffb8074d40) at ../../src/libcamera/base/event_dispatcher_poll.cpp:146\n#21 0x0000fffff7f618f4 in libcamera::Thread::exec (this=0x6993a0) at ../../src/libcamera/base/thread.cpp:306\n#22 0x0000fffff7b0c5ec in libcamera::CameraManager::Private::run (this=0x699390) at ../../src/libcamera/camera_manager.cpp:87\n#23 0x0000fffff7f61894 in libcamera::Thread::startThread (this=0x6993a0) at ../../src/libcamera/base/thread.cpp:284\n#24 0x0000fffff7f65cf4 in std::__invoke_impl<void, void (libcamera::Thread::*)(), libcamera::Thread*> (__f=@0x707f90: (void (libcamera::Thread::*)(libcamera::Thread * const)) 0xfffff7f61794 <libcamera::Thread::startThread()>, __t=@0x707f88: 0x6993a0) at /usr/include/c++/14/bits/invoke.h:74\n#25 0x0000fffff7f65c34 in std::__invoke<void (libcamera::Thread::*)(), libcamera::Thread*> (__fn=@0x707f90: (void (libcamera::Thread::*)(libcamera::Thread * const)) 0xfffff7f61794 <libcamera::Thread::startThread()>) at /usr/include/c++/14/bits/invoke.h:96\n#26 0x0000fffff7f65b98 in std::thread::_Invoker<std::tuple<void (libcamera::Thread::*)(), libcamera::Thread*> >::_M_invoke<0ul, 1ul> (this=0x707f88) at /usr/include/c++/14/bits/std_thread.h:301\n#27 0x0000fffff7f65b50 in std::thread::_Invoker<std::tuple<void (libcamera::Thread::*)(), libcamera::Thread*> >::operator() (this=0x707f88) at /usr/include/c++/14/bits/std_thread.h:308\n#28 0x0000fffff7f65b30 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (libcamera::Thread::*)(), libcamera::Thread*> > >::_M_run (this=0x707f80) at /usr/include/c++/14/bits/std_thread.h:253\n#29 0x0000fffff58e0200 in execute_native_thread_routine () at /lib64/libstdc++.so.6\n#30 0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n#31 0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n\nThread 8 (Thread 0xffffd960eec0 (LWP 31016) \"qcam\"):\n#0  0x0000fffff57200a4 in syscall () at /lib64/libc.so.6\n#1  0x0000fffff4c4c3d4 in g_cond_wait () at /lib64/libglib-2.0.so.0\n#2  0x0000fffff4be985c in g_async_queue_pop_intern_unlocked () at /lib64/libglib-2.0.so.0\n#3  0x0000fffff4be98ec in g_async_queue_pop () at /lib64/libglib-2.0.so.0\n#4  0x0000ffffe1ce3414 in fc_thread_func () at /lib64/libpangoft2-1.0.so.0\n#5  0x0000fffff4c54a20 in g_thread_proxy () at /lib64/libglib-2.0.so.0\n#6  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n#7  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n\nThread 6 (Thread 0xffffdaa0eec0 (LWP 31014) \"gdbus\"):\n#0  0x0000fffff57170c4 in ppoll () at /lib64/libc.so.6\n#1  0x0000fffff4c84284 in g_main_context_iterate_unlocked.isra () at /lib64/libglib-2.0.so.0\n#2  0x0000fffff4c26fb0 in g_main_loop_run () at /lib64/libglib-2.0.so.0\n#3  0x0000ffffe1133f64 in gdbus_shared_thread_func.lto_priv () at /lib64/libgio-2.0.so.0\n#4  0x0000fffff4c54a20 in g_thread_proxy () at /lib64/libglib-2.0.so.0\n#5  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n#6  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n\nThread 5 (Thread 0xffffdb40eec0 (LWP 31013) \"gmain\"):\n--Type <RET> for more, q to quit, c to continue without paging--\n#0  0x0000fffff57170c4 in ppoll () at /lib64/libc.so.6\n#1  0x0000fffff4c84284 in g_main_context_iterate_unlocked.isra () at /lib64/libglib-2.0.so.0\n#2  0x0000fffff4c22264 in g_main_context_iteration () at /lib64/libglib-2.0.so.0\n#3  0x0000fffff4c222cc in glib_worker_main () at /lib64/libglib-2.0.so.0\n#4  0x0000fffff4c54a20 in g_thread_proxy () at /lib64/libglib-2.0.so.0\n#5  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n#6  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n\nThread 4 (Thread 0xffffdbe0eec0 (LWP 31012) \"pool-spawner\"):\n#0  0x0000fffff57200a4 in syscall () at /lib64/libc.so.6\n#1  0x0000fffff4c4c3d4 in g_cond_wait () at /lib64/libglib-2.0.so.0\n#2  0x0000fffff4be985c in g_async_queue_pop_intern_unlocked () at /lib64/libglib-2.0.so.0\n#3  0x0000fffff4c557dc in g_thread_pool_spawn_thread () at /lib64/libglib-2.0.so.0\n#4  0x0000fffff4c54a20 in g_thread_proxy () at /lib64/libglib-2.0.so.0\n#5  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n#6  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n\nThread 3 (Thread 0xffffe260eec0 (LWP 31011) \"QXcbEventQueue\"):\n#0  0x0000fffff5716ad4 in poll () at /lib64/libc.so.6\n#1  0x0000fffff1821814 in _xcb_conn_wait.part.0 () at /lib64/libxcb.so.1\n#2  0x0000fffff18234d8 in xcb_wait_for_event () at /lib64/libxcb.so.1\n#3  0x0000ffffe3720d6c in QXcbEventQueue::run() () at /lib64/libQt6XcbQpa.so.6\n#4  0x0000fffff71384f4 in QThreadPrivate::start(void*) () at /lib64/libQt6Core.so.6\n#5  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n#6  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n\nThread 2 (Thread 0xffffe300eec0 (LWP 31010) \"QDBusConnection\"):\n#0  0x0000fffff57170c4 in ppoll () at /lib64/libc.so.6\n#1  0x0000fffff4c84284 in g_main_context_iterate_unlocked.isra () at /lib64/libglib-2.0.so.0\n#2  0x0000fffff4c22264 in g_main_context_iteration () at /lib64/libglib-2.0.so.0\n#3  0x0000fffff7272658 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt6Core.so.6\n#4  0x0000fffff6f7f694 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt6Core.so.6\n#5  0x0000fffff70a4c4c in QThread::exec() () at /lib64/libQt6Core.so.6\n#6  0x0000fffff408d790 in QDBusConnectionManager::run() () at /lib64/libQt6DBus.so.6\n#7  0x0000fffff71384f4 in QThreadPrivate::start(void*) () at /lib64/libQt6Core.so.6\n#8  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n#9  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n\nThread 1 (Thread 0xfffff7fb1020 (LWP 31007) \"qcam\"):\n#0  0x0000fffff5722668 in __clone3 () at /lib64/libc.so.6\n#1  0x0000fffff5722474 in __clone3_internal () at /lib64/libc.so.6\n#2  0x0000fffff5722508 in __clone_internal () at /lib64/libc.so.6\n#3  0x0000fffff56b6508 in create_thread () at /lib64/libc.so.6\n#4  0x0000fffff56b6fec in pthread_create@GLIBC_2.17 () at /lib64/libc.so.6\n#5  0x0000fffff7137d54 in QThread::start(QThread::Priority) () at /lib64/libQt6Core.so.6\n#6  0x0000fffff71414f0 in QThreadPoolPrivate::startThread(QRunnable*) () at /lib64/libQt6Core.so.6\n#7  0x0000fffff71428cc in QThreadPoolPrivate::tryStart(QRunnable*) () at /lib64/libQt6Core.so.6\n#8  0x0000fffff7142e08 in QThreadPool::start(QRunnable*, int) () at /lib64/libQt6Core.so.6\n#9  0x0000fffff6b2261c in blend_color_argb(int, QT_FT_Span_ const*, void*) () at /lib64/libQt6Gui.so.6\n#10 0x0000fffff66b3628 in bool drawLine<&(drawPixel(QCosmeticStroker*, int, int, int)), (anonymous namespace)::NoDasher>(QCosmeticStroker*, double, double, double, double, int) () at /lib64/libQt6Gui.so.6\n#11 0x0000fffff66b3ffc in QCosmeticStroker::drawLine(QPointF const&, QPointF const&) () at /lib64/libQt6Gui.so.6\n#12 0x0000fffff66ec12c in QRasterPaintEngine::drawLines(QLine const*, int) () at /lib64/libQt6Gui.so.6\n#13 0x0000fffff5e906f0 in QFusionStyle::drawControl(QStyle::ControlElement, QStyleOption const*, QPainter*, QWidget const*) const () at /lib64/libQt6Widgets.so.6\n#14 0x0000fffff5fb2198 in QToolBar::paintEvent(QPaintEvent*) () at /lib64/libQt6Widgets.so.6\n#15 0x0000fffff5dceecc in QWidget::event(QEvent*) () at /lib64/libQt6Widgets.so.6\n#16 0x0000fffff5d6ea18 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib64/libQt6Widgets.so.6\n#17 0x0000fffff6f71d58 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib64/libQt6Core.so.6\n#18 0x0000fffff5dc598c in QWidgetPrivate::sendPaintEvent(QRegion const&) () at /lib64/libQt6Widgets.so.6\n--Type <RET> for more, q to quit, c to continue without paging--\n#19 0x0000fffff5dc5e48 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () at /lib64/libQt6Widgets.so.6\n#20 0x0000fffff5dc714c in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () at /lib64/libQt6Widgets.so.6\n#21 0x0000fffff5dc7040 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () at /lib64/libQt6Widgets.so.6\n#22 0x0000fffff5dc5ccc in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () at /lib64/libQt6Widgets.so.6\n#23 0x0000fffff5ddb794 in QWidgetRepaintManager::paintAndFlush() () at /lib64/libQt6Widgets.so.6\n#24 0x0000fffff5dcf64c in QWidget::event(QEvent*) () at /lib64/libQt6Widgets.so.6\n#25 0x000000000043aff0 in MainWindow::event (this=0x7c3c20, e=0x7662e0) at ../../src/apps/qcam/main_window.cpp:177\n#26 0x0000fffff5d6ea18 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib64/libQt6Widgets.so.6\n#27 0x0000fffff6f71d58 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib64/libQt6Core.so.6\n#28 0x0000fffff6f76068 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /lib64/libQt6Core.so.6\n#29 0x0000fffff7272fd4 in postEventSourceDispatch(_GSource*, int (*)(void*), void*) () at /lib64/libQt6Core.so.6\n#30 0x0000fffff4c20b94 in g_main_context_dispatch_unlocked.lto_priv () at /lib64/libglib-2.0.so.0\n#31 0x0000fffff4c841d0 in g_main_context_iterate_unlocked.isra () at /lib64/libglib-2.0.so.0\n#32 0x0000fffff4c22264 in g_main_context_iteration () at /lib64/libglib-2.0.so.0\n#33 0x0000fffff7272658 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt6Core.so.6\n#34 0x0000fffff6f7f694 in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt6Core.so.6\n#35 0x0000fffff6f7ac3c in QCoreApplication::exec() () at /lib64/libQt6Core.so.6\n#36 0x0000000000439ae4 in main (argc=1, argv=0xffffffffeed8) at ../../src/apps/qcam/main.cpp:87\n\n--\nKieran\n\n\n\n> ```\n> [295:43:43.910237144] [1441841]  INFO IPAManager ipa_manager.cpp:137 libcamera is not installed. Adding '/usr/local/google/home/chenghaoyang/Workspace/libca\n> mera/build/src/ipa' to the IPA search path\n> [295:43:43.914030564] [1441841]  INFO Camera camera_manager.cpp:325 libcamera v0.3.1+79-8ca4f033-dirty (2024-08-29T19:18:51UTC)\n> [295:43:43.915493754] [1441844] ERROR DmaBufAllocator dma_buf_allocator.cpp:120 Could not open any dma-buf provider\n> [295:43:43.919118835] [1441841]  INFO IPAManager ipa_manager.cpp:137 libcamera is not installed. Adding '/usr/local/google/home/chenghaoyang/Workspace/libca\n> mera/build/src/ipa' to the IPA search path\n> [295:43:43.922245825] [1441841]  INFO Camera camera_manager.cpp:325 libcamera v0.3.1+79-8ca4f033-dirty (2024-08-29T19:18:51UTC)\n> [295:43:43.922820175] [1441846] ERROR DmaBufAllocator dma_buf_allocator.cpp:120 Could not open any dma-buf provider\n> Unable to set the pipeline to the playing state.\n> ```\n> \n> Gitlab pipeline failure:\n> https://gitlab.freedesktop.org/chenghaoyang/libcamera/-/pipelines/1260412\n> \n> Update in v11:\n> - Allowed a single value in the config file's frame_rates field.\n> \n> Update in v10:\n> Apply fixes according to Jacopo's and Barnabás' comments.\n> - Split test_pattern and path fields in the yaml format.\n> - Let FrameGenerators control frameCount_.\n> - Fixed match() returning values.\n> \n> Update in v9: Allocate contiguous memory for planes in the same\n> FrameBuffer.\n> \n> BR,\n> Harvey\n> \n> Harvey Yang (4):\n>   libcamera: add DmaBufAllocator::exportBuffers()\n>   libcamera: Remove PipelineHandler Fatal check of non-empty\n>     MediaDevices\n>   libcamera: virtual: Add VirtualPipelineHandler\n>   libcamera: software_isp: Refactor SoftwareIsp to use\n>     DmaBufAllocator::exportBuffers\n> \n> Konami Shu (3):\n>   libcamera: pipeline: Add test pattern for VirtualPipelineHandler\n>   libcamera: virtual: Read config and register cameras based on the\n>     config\n>   libcamera: virtual: Add ImageFrameGenerator\n> \n>  .../libcamera/internal/dma_buf_allocator.h    |  13 +\n>  meson.build                                   |   1 +\n>  meson_options.txt                             |   3 +-\n>  src/android/meson.build                       |  19 --\n>  src/libcamera/dma_buf_allocator.cpp           |  55 +++\n>  src/libcamera/pipeline/virtual/README.md      |  50 +++\n>  .../pipeline/virtual/data/virtual.yaml        |  36 ++\n>  .../pipeline/virtual/frame_generator.h        |  28 ++\n>  .../virtual/image_frame_generator.cpp         | 178 ++++++++++\n>  .../pipeline/virtual/image_frame_generator.h  |  54 +++\n>  src/libcamera/pipeline/virtual/meson.build    |  13 +\n>  src/libcamera/pipeline/virtual/parser.cpp     | 257 ++++++++++++++\n>  src/libcamera/pipeline/virtual/parser.h       |  44 +++\n>  .../virtual/test_pattern_generator.cpp        | 140 ++++++++\n>  .../pipeline/virtual/test_pattern_generator.h |  57 ++++\n>  src/libcamera/pipeline/virtual/utils.h        |  17 +\n>  src/libcamera/pipeline/virtual/virtual.cpp    | 323 ++++++++++++++++++\n>  src/libcamera/pipeline/virtual/virtual.h      | 107 ++++++\n>  src/libcamera/pipeline_handler.cpp            |  11 +-\n>  src/libcamera/software_isp/software_isp.cpp   |  20 +-\n>  src/meson.build                               |  19 ++\n>  21 files changed, 1403 insertions(+), 42 deletions(-)\n>  create mode 100644 src/libcamera/pipeline/virtual/README.md\n>  create mode 100644 src/libcamera/pipeline/virtual/data/virtual.yaml\n>  create mode 100644 src/libcamera/pipeline/virtual/frame_generator.h\n>  create mode 100644 src/libcamera/pipeline/virtual/image_frame_generator.cpp\n>  create mode 100644 src/libcamera/pipeline/virtual/image_frame_generator.h\n>  create mode 100644 src/libcamera/pipeline/virtual/meson.build\n>  create mode 100644 src/libcamera/pipeline/virtual/parser.cpp\n>  create mode 100644 src/libcamera/pipeline/virtual/parser.h\n>  create mode 100644 src/libcamera/pipeline/virtual/test_pattern_generator.cpp\n>  create mode 100644 src/libcamera/pipeline/virtual/test_pattern_generator.h\n>  create mode 100644 src/libcamera/pipeline/virtual/utils.h\n>  create mode 100644 src/libcamera/pipeline/virtual/virtual.cpp\n>  create mode 100644 src/libcamera/pipeline/virtual/virtual.h\n> \n> -- \n> 2.46.0.469.g59c65b2a67-goog\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id A406EBF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  9 Sep 2024 12:45:34 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 63518634FA;\n\tMon,  9 Sep 2024 14:45:33 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CE951634EE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  9 Sep 2024 14:45:31 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 745FF3DA;\n\tMon,  9 Sep 2024 14:44:15 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"rNGv7YIc\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1725885855;\n\tbh=fpUa24ab5l07iSU8IdarNnmEhXfj4tuogwq3+29oj1A=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=rNGv7YIcMNST5Mtl1QFvON9tXH1I1Q4jLWwTTO8cNs1yWhXl4TwWPUh8vCV3od7eM\n\tCInN6uMnVWvv3KGV/4vlQdyB88XIDzoTk6iNTMY1+rfpowO6vvolep6ZgwdAB/LR6I\n\t7UKE5JEViE2Jt94tK3agT+0prHo2VBC0XVbTfVnk=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20240907143110.2210711-1-chenghaoyang@google.com>","References":"<20240907143110.2210711-1-chenghaoyang@google.com>","Subject":"Re: [PATCH v11 0/7] Add VirtualPipelineHandler","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"Harvey Yang <chenghaoyang@google.com>","To":"Harvey Yang <chenghaoyang@chromium.org>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Mon, 09 Sep 2024 13:45:28 +0100","Message-ID":"<172588592896.2319503.17130127511790603993@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":31131,"web_url":"https://patchwork.libcamera.org/comment/31131/","msgid":"<CAEB1ahvPd2F--pSTEL6dEOvK8Dye=_t4a_cfYTcipv0JYiTkew@mail.gmail.com>","date":"2024-09-09T14:11:35","subject":"Re: [PATCH v11 0/7] Add VirtualPipelineHandler","submitter":{"id":117,"url":"https://patchwork.libcamera.org/api/people/117/","name":"Cheng-Hao Yang","email":"chenghaoyang@chromium.org"},"content":"Thanks for the catch Kieran!\n\nIt's due to a bug in VirtualPipelineHandler::configure [1]:\nI used `data->streamConfigs_[i].stream.configuration()`\nbefore it's set in `Camera::configure()`. Should be using\n`CameraConfiguration[i].configuration()` directly.\nWill be fixed in v12.\n\n[1]: https://patchwork.libcamera.org/patch/21196/\n\nOn Mon, Sep 9, 2024 at 8:45 PM Kieran Bingham <\nkieran.bingham@ideasonboard.com> wrote:\n\n> Hi Harvey,\n>\n> Quoting Harvey Yang (2024-09-07 15:28:25)\n> > Hi all,\n> >\n> > This series adds virtual pipeline handler, which doesn't depend on any\n> > hardware, like camera sensor or ISP. Currently the configuration\n> > supports test patterns and images.\n> >\n> > It passed the gitlab pipeline:\n> >\n> https://gitlab.freedesktop.org/chenghaoyang/libcamera/-/pipelines/1266568\n> >\n> > I failed to pass multi_stream_test when trying to enable multiple\n> > streams though. Please give me some hints what it tests and what I\n> > missed:\n>\n> I tried to run this but it crashed.\n>\n> I ran gdb --args ./build/gcc/src/apps/qcam/qcam and then chose virtual0:\n>\n>\n> And here's the backtraces:\n>\n> (gdb) thread apply all bt\n>\n> Thread 9 (Thread 0xffffda00eec0 (LWP 31018) \"qcam\"):\n> #0  0x0000fffff7c92ff0 in libcamera::TestPatternGenerator::shiftLeft\n> (this=0xffffb8060d40, size=...) at\n> ../../src/libcamera/pipeline/virtual/test_pattern_generator.cpp:50\n> #1  0x0000fffff7c92e2c in libcamera::TestPatternGenerator::generateFrame\n> (this=0xffffb8060d40, size=..., buffer=0xffffb806fa00) at\n> ../../src/libcamera/pipeline/virtual/test_pattern_generator.cpp:31\n> #2  0x0000fffff7c94870 in\n> libcamera::PipelineHandlerVirtual::queueRequestDevice (this=0xffffb80464a0,\n> camera=0xffffb808a4d0, request=0xffffdc015e20) at\n> ../../src/libcamera/pipeline/virtual/virtual.cpp:234\n> #3  0x0000fffff7b76a30 in libcamera::PipelineHandler::doQueueRequest\n> (this=0xffffb80464a0, request=0xffffdc015e20) at\n> ../../src/libcamera/pipeline_handler.cpp:472\n> #4  0x0000fffff7b76ab8 in libcamera::PipelineHandler::doQueueRequests\n> (this=0xffffb80464a0) at ../../src/libcamera/pipeline_handler.cpp:492\n> #5  0x0000fffff7b7dcac in\n> libcamera::BoundMethodMember<libcamera::PipelineHandler, void>::invoke\n> (this=0x8fdb40) at ../../include/libcamera/base/bound_method.h:191\n> #6  0x0000fffff7ad7368 in libcamera::BoundMethodArgs<void>::invokePack<,\n> void>(libcamera::BoundMethodPackBase*, std::integer_sequence<unsigned\n> long>) (this=0x8fdb40, pack=0xffffb806e100) at\n> ../../include/libcamera/base/bound_method.h:115\n> #7  0x0000fffff7ad6728 in libcamera::BoundMethodArgs<void>::invokePack\n> (this=0x8fdb40, pack=0xffffb806e100) at\n> ../../include/libcamera/base/bound_method.h:124\n> #8  0x0000fffff7f46ed4 in libcamera::BoundMethodBase::activatePack\n> (this=0x8fdb40, pack=std::shared_ptr<libcamera::BoundMethodPackBase> (use\n> count 2, weak count 0) = {...}, deleteMethod=false) at\n> ../../src/libcamera/base/bound_method.cpp:85\n> #9  0x0000fffff7b7dbc8 in\n> libcamera::BoundMethodMember<libcamera::PipelineHandler, void>::activate\n> (this=0x8fdb40, deleteMethod=false) at\n> ../../include/libcamera/base/bound_method.h:184\n> #10 0x0000fffff7af33e4 in libcamera::Signal<>::emit() (this=0x8fda90) at\n> ../../include/libcamera/base/signal.h:153\n> #11 0x0000fffff7b29b74 in\n> libcamera::Request::Private::emitPrepareCompleted (this=0x8fda80) at\n> ../../src/libcamera/request.cpp:190\n> #12 0x0000fffff7b29cf0 in libcamera::Request::Private::prepare\n> (this=0x8fda80, timeout=std::chrono::duration = { 300ms }) at\n> ../../src/libcamera/request.cpp:243\n> #13 0x0000fffff7b76968 in libcamera::PipelineHandler::queueRequest\n> (this=0xffffb80464a0, request=0xffffdc015e20) at\n> ../../src/libcamera/pipeline_handler.cpp:451\n> #14 0x0000fffff7b0b768 in\n> libcamera::BoundMethodMember<libcamera::PipelineHandler, void,\n> libcamera::Request*>::invoke (this=0x86ad50, args#0=0xffffdc015e20) at\n> ../../include/libcamera/base/bound_method.h:191\n> #15 0x000000000044f6f4 in libcamera::BoundMethodArgs<void,\n> libcamera::Request*>::invokePack<0ul, void> (this=0x86ad50, pack=0x86ada0)\n> at ../../include/libcamera/base/bound_method.h:115\n> #16 0x000000000044f1a0 in libcamera::BoundMethodArgs<void,\n> libcamera::Request*>::invokePack (this=0x86ad50, pack=0x86ada0) at\n> ../../include/libcamera/base/bound_method.h:124\n> #17 0x0000fffff7f60fa8 in libcamera::InvokeMessage::invoke (this=0x86adc0)\n> at ../../src/libcamera/base/message.cpp:153\n> #18 0x0000fffff7f489c8 in libcamera::Object::message (this=0xffffb80464a0,\n> msg=0x86adc0) at ../../src/libcamera/base/object.cpp:211\n> #19 0x0000fffff7f62394 in libcamera::Thread::dispatchMessages\n> (this=0x6993a0, type=libcamera::Message::None) at\n> ../../src/libcamera/base/thread.cpp:602\n> #20 0x0000fffff7f51e08 in libcamera::EventDispatcherPoll::processEvents\n> (this=0xffffb8074d40) at\n> ../../src/libcamera/base/event_dispatcher_poll.cpp:146\n> #21 0x0000fffff7f618f4 in libcamera::Thread::exec (this=0x6993a0) at\n> ../../src/libcamera/base/thread.cpp:306\n> #22 0x0000fffff7b0c5ec in libcamera::CameraManager::Private::run\n> (this=0x699390) at ../../src/libcamera/camera_manager.cpp:87\n> #23 0x0000fffff7f61894 in libcamera::Thread::startThread (this=0x6993a0)\n> at ../../src/libcamera/base/thread.cpp:284\n> #24 0x0000fffff7f65cf4 in std::__invoke_impl<void, void\n> (libcamera::Thread::*)(), libcamera::Thread*> (__f=@0x707f90: (void\n> (libcamera::Thread::*)(libcamera::Thread * const)) 0xfffff7f61794\n> <libcamera::Thread::startThread()>, __t=@0x707f88: 0x6993a0) at\n> /usr/include/c++/14/bits/invoke.h:74\n> #25 0x0000fffff7f65c34 in std::__invoke<void (libcamera::Thread::*)(),\n> libcamera::Thread*> (__fn=@0x707f90: (void\n> (libcamera::Thread::*)(libcamera::Thread * const)) 0xfffff7f61794\n> <libcamera::Thread::startThread()>) at /usr/include/c++/14/bits/invoke.h:96\n> #26 0x0000fffff7f65b98 in std::thread::_Invoker<std::tuple<void\n> (libcamera::Thread::*)(), libcamera::Thread*> >::_M_invoke<0ul, 1ul>\n> (this=0x707f88) at /usr/include/c++/14/bits/std_thread.h:301\n> #27 0x0000fffff7f65b50 in std::thread::_Invoker<std::tuple<void\n> (libcamera::Thread::*)(), libcamera::Thread*> >::operator() (this=0x707f88)\n> at /usr/include/c++/14/bits/std_thread.h:308\n> #28 0x0000fffff7f65b30 in\n> std::thread::_State_impl<std::thread::_Invoker<std::tuple<void\n> (libcamera::Thread::*)(), libcamera::Thread*> > >::_M_run (this=0x707f80)\n> at /usr/include/c++/14/bits/std_thread.h:253\n> #29 0x0000fffff58e0200 in execute_native_thread_routine () at\n> /lib64/libstdc++.so.6\n> #30 0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n> #31 0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n>\n> Thread 8 (Thread 0xffffd960eec0 (LWP 31016) \"qcam\"):\n> #0  0x0000fffff57200a4 in syscall () at /lib64/libc.so.6\n> #1  0x0000fffff4c4c3d4 in g_cond_wait () at /lib64/libglib-2.0.so.0\n> #2  0x0000fffff4be985c in g_async_queue_pop_intern_unlocked () at\n> /lib64/libglib-2.0.so.0\n> #3  0x0000fffff4be98ec in g_async_queue_pop () at /lib64/libglib-2.0.so.0\n> #4  0x0000ffffe1ce3414 in fc_thread_func () at /lib64/libpangoft2-1.0.so.0\n> #5  0x0000fffff4c54a20 in g_thread_proxy () at /lib64/libglib-2.0.so.0\n> #6  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n> #7  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n>\n> Thread 6 (Thread 0xffffdaa0eec0 (LWP 31014) \"gdbus\"):\n> #0  0x0000fffff57170c4 in ppoll () at /lib64/libc.so.6\n> #1  0x0000fffff4c84284 in g_main_context_iterate_unlocked.isra () at\n> /lib64/libglib-2.0.so.0\n> #2  0x0000fffff4c26fb0 in g_main_loop_run () at /lib64/libglib-2.0.so.0\n> #3  0x0000ffffe1133f64 in gdbus_shared_thread_func.lto_priv () at\n> /lib64/libgio-2.0.so.0\n> #4  0x0000fffff4c54a20 in g_thread_proxy () at /lib64/libglib-2.0.so.0\n> #5  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n> #6  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n>\n> Thread 5 (Thread 0xffffdb40eec0 (LWP 31013) \"gmain\"):\n> --Type <RET> for more, q to quit, c to continue without paging--\n> #0  0x0000fffff57170c4 in ppoll () at /lib64/libc.so.6\n> #1  0x0000fffff4c84284 in g_main_context_iterate_unlocked.isra () at\n> /lib64/libglib-2.0.so.0\n> #2  0x0000fffff4c22264 in g_main_context_iteration () at\n> /lib64/libglib-2.0.so.0\n> #3  0x0000fffff4c222cc in glib_worker_main () at /lib64/libglib-2.0.so.0\n> #4  0x0000fffff4c54a20 in g_thread_proxy () at /lib64/libglib-2.0.so.0\n> #5  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n> #6  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n>\n> Thread 4 (Thread 0xffffdbe0eec0 (LWP 31012) \"pool-spawner\"):\n> #0  0x0000fffff57200a4 in syscall () at /lib64/libc.so.6\n> #1  0x0000fffff4c4c3d4 in g_cond_wait () at /lib64/libglib-2.0.so.0\n> #2  0x0000fffff4be985c in g_async_queue_pop_intern_unlocked () at\n> /lib64/libglib-2.0.so.0\n> #3  0x0000fffff4c557dc in g_thread_pool_spawn_thread () at\n> /lib64/libglib-2.0.so.0\n> #4  0x0000fffff4c54a20 in g_thread_proxy () at /lib64/libglib-2.0.so.0\n> #5  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n> #6  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n>\n> Thread 3 (Thread 0xffffe260eec0 (LWP 31011) \"QXcbEventQueue\"):\n> #0  0x0000fffff5716ad4 in poll () at /lib64/libc.so.6\n> #1  0x0000fffff1821814 in _xcb_conn_wait.part.0 () at /lib64/libxcb.so.1\n> #2  0x0000fffff18234d8 in xcb_wait_for_event () at /lib64/libxcb.so.1\n> #3  0x0000ffffe3720d6c in QXcbEventQueue::run() () at\n> /lib64/libQt6XcbQpa.so.6\n> #4  0x0000fffff71384f4 in QThreadPrivate::start(void*) () at\n> /lib64/libQt6Core.so.6\n> #5  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n> #6  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n>\n> Thread 2 (Thread 0xffffe300eec0 (LWP 31010) \"QDBusConnection\"):\n> #0  0x0000fffff57170c4 in ppoll () at /lib64/libc.so.6\n> #1  0x0000fffff4c84284 in g_main_context_iterate_unlocked.isra () at\n> /lib64/libglib-2.0.so.0\n> #2  0x0000fffff4c22264 in g_main_context_iteration () at\n> /lib64/libglib-2.0.so.0\n> #3  0x0000fffff7272658 in\n> QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)\n> () at /lib64/libQt6Core.so.6\n> #4  0x0000fffff6f7f694 in\n> QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at\n> /lib64/libQt6Core.so.6\n> #5  0x0000fffff70a4c4c in QThread::exec() () at /lib64/libQt6Core.so.6\n> #6  0x0000fffff408d790 in QDBusConnectionManager::run() () at\n> /lib64/libQt6DBus.so.6\n> #7  0x0000fffff71384f4 in QThreadPrivate::start(void*) () at\n> /lib64/libQt6Core.so.6\n> #8  0x0000fffff56b6998 in start_thread () at /lib64/libc.so.6\n> #9  0x0000fffff572268c in thread_start () at /lib64/libc.so.6\n>\n> Thread 1 (Thread 0xfffff7fb1020 (LWP 31007) \"qcam\"):\n> #0  0x0000fffff5722668 in __clone3 () at /lib64/libc.so.6\n> #1  0x0000fffff5722474 in __clone3_internal () at /lib64/libc.so.6\n> #2  0x0000fffff5722508 in __clone_internal () at /lib64/libc.so.6\n> #3  0x0000fffff56b6508 in create_thread () at /lib64/libc.so.6\n> #4  0x0000fffff56b6fec in pthread_create@GLIBC_2.17 () at /lib64/libc.so.6\n> #5  0x0000fffff7137d54 in QThread::start(QThread::Priority) () at\n> /lib64/libQt6Core.so.6\n> #6  0x0000fffff71414f0 in QThreadPoolPrivate::startThread(QRunnable*) ()\n> at /lib64/libQt6Core.so.6\n> #7  0x0000fffff71428cc in QThreadPoolPrivate::tryStart(QRunnable*) () at\n> /lib64/libQt6Core.so.6\n> #8  0x0000fffff7142e08 in QThreadPool::start(QRunnable*, int) () at\n> /lib64/libQt6Core.so.6\n> #9  0x0000fffff6b2261c in blend_color_argb(int, QT_FT_Span_ const*, void*)\n> () at /lib64/libQt6Gui.so.6\n> #10 0x0000fffff66b3628 in bool drawLine<&(drawPixel(QCosmeticStroker*,\n> int, int, int)), (anonymous namespace)::NoDasher>(QCosmeticStroker*,\n> double, double, double, double, int) () at /lib64/libQt6Gui.so.6\n> #11 0x0000fffff66b3ffc in QCosmeticStroker::drawLine(QPointF const&,\n> QPointF const&) () at /lib64/libQt6Gui.so.6\n> #12 0x0000fffff66ec12c in QRasterPaintEngine::drawLines(QLine const*, int)\n> () at /lib64/libQt6Gui.so.6\n> #13 0x0000fffff5e906f0 in\n> QFusionStyle::drawControl(QStyle::ControlElement, QStyleOption const*,\n> QPainter*, QWidget const*) const () at /lib64/libQt6Widgets.so.6\n> #14 0x0000fffff5fb2198 in QToolBar::paintEvent(QPaintEvent*) () at\n> /lib64/libQt6Widgets.so.6\n> #15 0x0000fffff5dceecc in QWidget::event(QEvent*) () at\n> /lib64/libQt6Widgets.so.6\n> #16 0x0000fffff5d6ea18 in QApplicationPrivate::notify_helper(QObject*,\n> QEvent*) () at /lib64/libQt6Widgets.so.6\n> #17 0x0000fffff6f71d58 in QCoreApplication::notifyInternal2(QObject*,\n> QEvent*) () at /lib64/libQt6Core.so.6\n> #18 0x0000fffff5dc598c in QWidgetPrivate::sendPaintEvent(QRegion const&)\n> () at /lib64/libQt6Widgets.so.6\n> --Type <RET> for more, q to quit, c to continue without paging--\n> #19 0x0000fffff5dc5e48 in QWidgetPrivate::drawWidget(QPaintDevice*,\n> QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>,\n> QPainter*, QWidgetRepaintManager*) () at /lib64/libQt6Widgets.so.6\n> #20 0x0000fffff5dc714c in\n> QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*>\n> const&, int, QRegion const&, QPoint const&,\n> QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*)\n> () at /lib64/libQt6Widgets.so.6\n> #21 0x0000fffff5dc7040 in\n> QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*>\n> const&, int, QRegion const&, QPoint const&,\n> QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*)\n> () at /lib64/libQt6Widgets.so.6\n> #22 0x0000fffff5dc5ccc in QWidgetPrivate::drawWidget(QPaintDevice*,\n> QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>,\n> QPainter*, QWidgetRepaintManager*) () at /lib64/libQt6Widgets.so.6\n> #23 0x0000fffff5ddb794 in QWidgetRepaintManager::paintAndFlush() () at\n> /lib64/libQt6Widgets.so.6\n> #24 0x0000fffff5dcf64c in QWidget::event(QEvent*) () at\n> /lib64/libQt6Widgets.so.6\n> #25 0x000000000043aff0 in MainWindow::event (this=0x7c3c20, e=0x7662e0) at\n> ../../src/apps/qcam/main_window.cpp:177\n> #26 0x0000fffff5d6ea18 in QApplicationPrivate::notify_helper(QObject*,\n> QEvent*) () at /lib64/libQt6Widgets.so.6\n> #27 0x0000fffff6f71d58 in QCoreApplication::notifyInternal2(QObject*,\n> QEvent*) () at /lib64/libQt6Core.so.6\n> #28 0x0000fffff6f76068 in\n> QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) ()\n> at /lib64/libQt6Core.so.6\n> #29 0x0000fffff7272fd4 in postEventSourceDispatch(_GSource*, int\n> (*)(void*), void*) () at /lib64/libQt6Core.so.6\n> #30 0x0000fffff4c20b94 in g_main_context_dispatch_unlocked.lto_priv () at\n> /lib64/libglib-2.0.so.0\n> #31 0x0000fffff4c841d0 in g_main_context_iterate_unlocked.isra () at\n> /lib64/libglib-2.0.so.0\n> #32 0x0000fffff4c22264 in g_main_context_iteration () at\n> /lib64/libglib-2.0.so.0\n> #33 0x0000fffff7272658 in\n> QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)\n> () at /lib64/libQt6Core.so.6\n> #34 0x0000fffff6f7f694 in\n> QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at\n> /lib64/libQt6Core.so.6\n> #35 0x0000fffff6f7ac3c in QCoreApplication::exec() () at\n> /lib64/libQt6Core.so.6\n> #36 0x0000000000439ae4 in main (argc=1, argv=0xffffffffeed8) at\n> ../../src/apps/qcam/main.cpp:87\n>\n> --\n> Kieran\n>\n>\n>\n> > ```\n> > [295:43:43.910237144] [1441841]  INFO IPAManager ipa_manager.cpp:137\n> libcamera is not installed. Adding\n> '/usr/local/google/home/chenghaoyang/Workspace/libca\n> > mera/build/src/ipa' to the IPA search path\n> > [295:43:43.914030564] [1441841]  INFO Camera camera_manager.cpp:325\n> libcamera v0.3.1+79-8ca4f033-dirty (2024-08-29T19:18:51UTC)\n> > [295:43:43.915493754] [1441844] ERROR DmaBufAllocator\n> dma_buf_allocator.cpp:120 Could not open any dma-buf provider\n> > [295:43:43.919118835] [1441841]  INFO IPAManager ipa_manager.cpp:137\n> libcamera is not installed. Adding\n> '/usr/local/google/home/chenghaoyang/Workspace/libca\n> > mera/build/src/ipa' to the IPA search path\n> > [295:43:43.922245825] [1441841]  INFO Camera camera_manager.cpp:325\n> libcamera v0.3.1+79-8ca4f033-dirty (2024-08-29T19:18:51UTC)\n> > [295:43:43.922820175] [1441846] ERROR DmaBufAllocator\n> dma_buf_allocator.cpp:120 Could not open any dma-buf provider\n> > Unable to set the pipeline to the playing state.\n> > ```\n> >\n> > Gitlab pipeline failure:\n> >\n> https://gitlab.freedesktop.org/chenghaoyang/libcamera/-/pipelines/1260412\n> >\n> > Update in v11:\n> > - Allowed a single value in the config file's frame_rates field.\n> >\n> > Update in v10:\n> > Apply fixes according to Jacopo's and Barnabás' comments.\n> > - Split test_pattern and path fields in the yaml format.\n> > - Let FrameGenerators control frameCount_.\n> > - Fixed match() returning values.\n> >\n> > Update in v9: Allocate contiguous memory for planes in the same\n> > FrameBuffer.\n> >\n> > BR,\n> > Harvey\n> >\n> > Harvey Yang (4):\n> >   libcamera: add DmaBufAllocator::exportBuffers()\n> >   libcamera: Remove PipelineHandler Fatal check of non-empty\n> >     MediaDevices\n> >   libcamera: virtual: Add VirtualPipelineHandler\n> >   libcamera: software_isp: Refactor SoftwareIsp to use\n> >     DmaBufAllocator::exportBuffers\n> >\n> > Konami Shu (3):\n> >   libcamera: pipeline: Add test pattern for VirtualPipelineHandler\n> >   libcamera: virtual: Read config and register cameras based on the\n> >     config\n> >   libcamera: virtual: Add ImageFrameGenerator\n> >\n> >  .../libcamera/internal/dma_buf_allocator.h    |  13 +\n> >  meson.build                                   |   1 +\n> >  meson_options.txt                             |   3 +-\n> >  src/android/meson.build                       |  19 --\n> >  src/libcamera/dma_buf_allocator.cpp           |  55 +++\n> >  src/libcamera/pipeline/virtual/README.md      |  50 +++\n> >  .../pipeline/virtual/data/virtual.yaml        |  36 ++\n> >  .../pipeline/virtual/frame_generator.h        |  28 ++\n> >  .../virtual/image_frame_generator.cpp         | 178 ++++++++++\n> >  .../pipeline/virtual/image_frame_generator.h  |  54 +++\n> >  src/libcamera/pipeline/virtual/meson.build    |  13 +\n> >  src/libcamera/pipeline/virtual/parser.cpp     | 257 ++++++++++++++\n> >  src/libcamera/pipeline/virtual/parser.h       |  44 +++\n> >  .../virtual/test_pattern_generator.cpp        | 140 ++++++++\n> >  .../pipeline/virtual/test_pattern_generator.h |  57 ++++\n> >  src/libcamera/pipeline/virtual/utils.h        |  17 +\n> >  src/libcamera/pipeline/virtual/virtual.cpp    | 323 ++++++++++++++++++\n> >  src/libcamera/pipeline/virtual/virtual.h      | 107 ++++++\n> >  src/libcamera/pipeline_handler.cpp            |  11 +-\n> >  src/libcamera/software_isp/software_isp.cpp   |  20 +-\n> >  src/meson.build                               |  19 ++\n> >  21 files changed, 1403 insertions(+), 42 deletions(-)\n> >  create mode 100644 src/libcamera/pipeline/virtual/README.md\n> >  create mode 100644 src/libcamera/pipeline/virtual/data/virtual.yaml\n> >  create mode 100644 src/libcamera/pipeline/virtual/frame_generator.h\n> >  create mode 100644\n> src/libcamera/pipeline/virtual/image_frame_generator.cpp\n> >  create mode 100644\n> src/libcamera/pipeline/virtual/image_frame_generator.h\n> >  create mode 100644 src/libcamera/pipeline/virtual/meson.build\n> >  create mode 100644 src/libcamera/pipeline/virtual/parser.cpp\n> >  create mode 100644 src/libcamera/pipeline/virtual/parser.h\n> >  create mode 100644\n> src/libcamera/pipeline/virtual/test_pattern_generator.cpp\n> >  create mode 100644\n> src/libcamera/pipeline/virtual/test_pattern_generator.h\n> >  create mode 100644 src/libcamera/pipeline/virtual/utils.h\n> >  create mode 100644 src/libcamera/pipeline/virtual/virtual.cpp\n> >  create mode 100644 src/libcamera/pipeline/virtual/virtual.h\n> >\n> > --\n> > 2.46.0.469.g59c65b2a67-goog\n> >\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id AC0F6BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  9 Sep 2024 14:11:50 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 577B4634F8;\n\tMon,  9 Sep 2024 16:11:50 +0200 (CEST)","from mail-lj1-x234.google.com (mail-lj1-x234.google.com\n\t[IPv6:2a00:1450:4864:20::234])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 54724634EB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  9 Sep 2024 16:11:48 +0200 (CEST)","by mail-lj1-x234.google.com with SMTP id\n\t38308e7fff4ca-2f75d044201so18399251fa.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 09 Sep 2024 07:11:48 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"Pj5P4Tyx\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=chromium.org; s=google; t=1725891107; x=1726495907;\n\tdarn=lists.libcamera.org; \n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:from:to:cc:subject:date:message-id:reply-to;\n\tbh=Y/AbvJ2BtnQwozQf6cwSe+XrxWqLkXMGP9T0nuJSdGg=;\n\tb=Pj5P4TyxJhu+Fu6D7Dig/ksWLcT+w59suLEjdlQ0SiceBW3TCset8293o+nbRzFdTv\n\taXHonQGG91UelWpC01FHj3nhYwaZtlOeg3GwEmLuffRwySRoBwC7CWUJ4oUQhWuAByPW\n\tqWWIP+pb7RJT52kw3Wq8Og7gM6mvIrGx/Lpx0=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1725891107; x=1726495907;\n\th=cc:to:subject:message-id:date:from:in-reply-to:references\n\t:mime-version:x-gm-message-state:from:to:cc:subject:date:message-id\n\t:reply-to;\n\tbh=Y/AbvJ2BtnQwozQf6cwSe+XrxWqLkXMGP9T0nuJSdGg=;\n\tb=bsMYzcOGxVDCogd4r33FWxmret8pofla8vPYe+Iez1umq0mRlfDC5EJaoouCPYOaem\n\tkVHOlzXhBssete7AmpjlLCKylzVdjLOaOoTZM4MnqQcBH1KBLEWbhowrffrlpRiGVjeG\n\tGnJXX9paV0+1df9o6zG/lm1d+VpTUMQU4MtqoBH78MCNc/Nl+39BS59S6Af9+SmSr4CG\n\tRqBoktrWmq862nfzAuQ4/X5tPhCGnHPBXLiSeUmE+ulm1XlZPwbb7Pooj2dU/7zr+7W/\n\tvjUlnRG4Ck1ysSkL1NnkdUNp9W3KX21kGQn6yWkgfhv4ISVdeeR/LT8SFIjEKM7I2pEu\n\tPsYA==","X-Gm-Message-State":"AOJu0YwQ3KHPhXN6ZKPWSzuyz8Px81WoBwotl5meGF67e5tXabuqp7fP\n\tVif9Fc/x548byYnNx042YaHwZFo/8sGBOLGRZTCeIwMSUwr50F0w7QlKuR9UmcTsPUCBCfD/Bsj\n\t9EP2Qty6twzMggWsWA9gSXqN1pzNRWuq3lGgYVgKUZcQxX5gT2g==","X-Google-Smtp-Source":"AGHT+IECnBakSw96pgDazFZsix4d3lEXk9GIqIfJQruPWNBnY+NxqNUMFV9l6+lCWfEI7SWCw3lYDVz5V5vTKZ9NmP4=","X-Received":"by 2002:a2e:bea7:0:b0:2f7:5c20:5daf with SMTP id\n\t38308e7fff4ca-2f75c205f01mr25727261fa.2.1725891107027;\n\tMon, 09 Sep 2024 07:11:47 -0700 (PDT)","MIME-Version":"1.0","References":"<20240907143110.2210711-1-chenghaoyang@google.com>\n\t<172588592896.2319503.17130127511790603993@ping.linuxembedded.co.uk>","In-Reply-To":"<172588592896.2319503.17130127511790603993@ping.linuxembedded.co.uk>","From":"Cheng-Hao Yang <chenghaoyang@chromium.org>","Date":"Mon, 9 Sep 2024 22:11:35 +0800","Message-ID":"<CAEB1ahvPd2F--pSTEL6dEOvK8Dye=_t4a_cfYTcipv0JYiTkew@mail.gmail.com>","Subject":"Re: [PATCH v11 0/7] Add VirtualPipelineHandler","To":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org,\n\tHarvey Yang <chenghaoyang@google.com>","Content-Type":"multipart/alternative; boundary=\"0000000000005b0fae0621b05698\"","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]