From 6781f8b46362c390d841afc3c0271c1b96f9fa30 Mon Sep 17 00:00:00 2001 From: Paul Elder Date: Sat, 6 Jun 2020 15:53:09 +0900 Subject: v4l2: v4l2_camera_proxy: Support MJPEG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an entry for MJPEG in V4L2CameraProxy's PixelFormatInfo list to allow proper calculation of sizeimage for MJPEG, such that the parameters to mmap can align properly instead of failing. This allows MJPEG to be used in the V4L2 compatibility layer. Signed-off-by: Paul Elder Reviewed-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- src/v4l2/v4l2_camera_proxy.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'src/v4l2') diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp index 852cca03..308a8abf 100644 --- a/src/v4l2/v4l2_camera_proxy.cpp +++ b/src/v4l2/v4l2_camera_proxy.cpp @@ -358,8 +358,9 @@ int V4L2CameraProxy::vidioc_reqbufs(struct v4l2_requestbuffers *arg) * don't support streaming mmap. Since we don't support readwrite and * userptr either, the application will get confused and think that * we don't support anything. - * On the other hand, if a format has a zero sizeimage (eg. MJPEG), - * we'll get a floating point exception when we try to stream it. + * On the other hand, if the set format at the time of reqbufs has a + * zero sizeimage we'll get a floating point exception when we try to + * stream it. */ if (sizeimage_ == 0) LOG(V4L2Compat, Warning) @@ -556,7 +557,7 @@ struct PixelFormatInfo { namespace { -static const std::array pixelFormatInfo = {{ +static const std::array pixelFormatInfo = {{ /* RGB formats. */ { PixelFormat(DRM_FORMAT_RGB888), V4L2_PIX_FMT_BGR24, 1, {{ { 24, 1, 1 }, { 0, 0, 0 }, { 0, 0, 0 } }} }, { PixelFormat(DRM_FORMAT_BGR888), V4L2_PIX_FMT_RGB24, 1, {{ { 24, 1, 1 }, { 0, 0, 0 }, { 0, 0, 0 } }} }, @@ -573,6 +574,13 @@ static const std::array pixelFormatInfo = {{ { PixelFormat(DRM_FORMAT_NV61), V4L2_PIX_FMT_NV61, 2, {{ { 8, 1, 1 }, { 16, 2, 1 }, { 0, 0, 0 } }} }, { PixelFormat(DRM_FORMAT_NV24), V4L2_PIX_FMT_NV24, 2, {{ { 8, 1, 1 }, { 16, 1, 1 }, { 0, 0, 0 } }} }, { PixelFormat(DRM_FORMAT_NV42), V4L2_PIX_FMT_NV42, 2, {{ { 8, 1, 1 }, { 16, 1, 1 }, { 0, 0, 0 } }} }, + /* Compressed formats. */ + /* + * \todo Get a better image size estimate for MJPEG, via + * StreamConfiguration, instead of using the worst-case + * width * height * bpp of uncompressed data. + */ + { PixelFormat(DRM_FORMAT_MJPEG), V4L2_PIX_FMT_MJPEG, 1, {{ { 16, 1, 1 }, { 0, 0, 0 }, { 0, 0, 0 } }} }, }}; } /* namespace */ -- cgit v1.2.1