{"id":1128,"url":"https://patchwork.libcamera.org/api/1.1/covers/1128/?format=json","web_url":"https://patchwork.libcamera.org/cover/1128/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/1.1/projects/1/?format=json","name":"libcamera","link_name":"libcamera","list_id":"libcamera_core","list_email":"libcamera-devel@lists.libcamera.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20190429191729.29697-1-niklas.soderlund@ragnatech.se>","date":"2019-04-29T19:17:18","name":"[libcamera-devel,00/11] libcamerea: Add support for exclusive access to cameras between processes","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/1.1/people/5/?format=json","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"mbox":"https://patchwork.libcamera.org/cover/1128/mbox/","series":[{"id":284,"url":"https://patchwork.libcamera.org/api/1.1/series/284/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=284","date":"2019-04-29T19:17:18","name":"libcamerea: Add support for exclusive access to cameras between processes","version":1,"mbox":"https://patchwork.libcamera.org/series/284/mbox/"}],"comments":"https://patchwork.libcamera.org/api/covers/1128/comments/","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net\n\t[195.74.38.229])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D6A27600EC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 29 Apr 2019 21:17:46 +0200 (CEST)","from wyvern.station (unknown [37.182.44.227])\n\tby bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA\n\tid 727d3f34-6ab3-11e9-8e2c-005056917f90;\n\tMon, 29 Apr 2019 21:17:43 +0200 (CEST)"],"X-Halon-ID":"727d3f34-6ab3-11e9-8e2c-005056917f90","Authorized-sender":"niklas@soderlund.pp.se","From":"=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","To":"libcamera-devel@lists.libcamera.org","Date":"Mon, 29 Apr 2019 21:17:18 +0200","Message-Id":"<20190429191729.29697-1-niklas.soderlund@ragnatech.se>","X-Mailer":"git-send-email 2.21.0","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH 00/11] libcamerea: Add support for\n\texclusive access to cameras between processes","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Mon, 29 Apr 2019 19:17:47 -0000"},"content":"Hi,\n\nThis series aims to solve mutably exclusive access to a  camera between \ntwo or more processes by the use of lockf(). In the process of adding \nsupport for this the MediaDevice implementation is cleaned up a bit and \nstricter call patterns are enforced. At the same time a small load is \ntaken of pipeline handler implementations.\n\nAs a camera might share resources with other cameras from the same\npipeline handler instance I have chosen to put the granularity of the\nlock at the media device level. When a camera is acquired by an\napplications all media devices the pipeline handler it belongs to have\nclaimed are locked and becomes unavailable to other processes. Other\nprocess can still enumerate locked media devices and list all cameras\nthey provide but they can't use any of the cameras who are backed by a\nlocked media device.\n\nPatches 1/11 -- 7/11 deals with tidying up and adding more restrictions\nto the MediaDevices and how they handled inside pipeline handlers. While\npatches 8/11 -- 11/11 adds the new locking scheme which depends on the\nnew stricter handling of media devices.\n\nNiklas Söderlund (11):\n  libcamera: Always check return value of MediaDevice::acquire()\n  libcamera: media_device: Open and close media device inside populate()\n  libcamera: media_device: Only read device information in populate()\n  libcamera: media_device: Handle media device fd in acquire() and\n    release()\n  test: media_device: Create a common MediaDeviceTest base class\n  test: media_device: Add test for acquire() and release()\n  libcamera: media_device: Make open() and close() private\n  libcamera: media_device: Add functions to lock device for other\n    processes\n  libcamera: pipeline_handler: Keep track of MediaDevice\n  libcamera: pipeline_handler: Add functions to lock a whole pipeline\n  libcamera: camera: Lock the pipeline handler in acquire()\n\n src/libcamera/camera.cpp                      |   7 +\n src/libcamera/device_enumerator.cpp           |   8 +-\n src/libcamera/include/media_device.h          |  10 +-\n src/libcamera/include/pipeline_handler.h      |   7 +\n src/libcamera/media_device.cpp                | 238 +++++++++++-------\n src/libcamera/pipeline/ipu3/ipu3.cpp          |  71 +-----\n src/libcamera/pipeline/rkisp1/rkisp1.cpp      |  57 ++---\n src/libcamera/pipeline/uvcvideo.cpp           |  23 +-\n src/libcamera/pipeline/vimc.cpp               |  21 +-\n src/libcamera/pipeline_handler.cpp            |  71 ++++++\n test/media_device/media_device_basic.cpp      |  41 +++\n test/media_device/media_device_link_test.cpp  |  76 ++----\n test/media_device/media_device_print_test.cpp |  17 --\n test/media_device/media_device_test.cpp       |  41 +++\n test/media_device/media_device_test.h         |  35 +++\n test/media_device/meson.build                 |   3 +-\n test/pipeline/ipu3/ipu3_pipeline_test.cpp     |   5 -\n test/v4l2_device/v4l2_device_test.cpp         |   4 -\n test/v4l2_subdevice/v4l2_subdevice_test.cpp   |  17 +-\n 19 files changed, 420 insertions(+), 332 deletions(-)\n create mode 100644 test/media_device/media_device_basic.cpp\n create mode 100644 test/media_device/media_device_test.cpp\n create mode 100644 test/media_device/media_device_test.h"}