[{"id":22599,"web_url":"https://patchwork.libcamera.org/comment/22599/","msgid":"<YkzubJk3BPnmSiPm@pendragon.ideasonboard.com>","date":"2022-04-06T01:35:40","subject":"Re: [libcamera-devel] [PATCH 5/9] android: Add pipeline_config_file\n\tparameter for camera_hal.yaml","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Han-Lin,\n\nThank you for the patch.\n\nOn Wed, Feb 09, 2022 at 03:19:13PM +0800, Han-Lin Chen wrote:\n> Add pipeline_config_file parameter for camera_hal.yaml for the ipu3\n> devices of ChromeOS, which specify a path to a pipeline configuration\n> file for a camera, and could be empty if no configuration is provided.\n> \n> The configuration files for soraka [1] and nautilus [2] are added, which\n> are copied and converted to yaml format from the ChromeOS repos. See:\n> \n> [1] https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/master/baseboard-poppy/media-libs/cros-camera-hal-configs-poppy/files/gcss\n> [2] https://chromium.googlesource.com/chromiumos/overlays/board-overlays/+/refs/heads/main/overlay-nautilus/media-libs/cros-camera-hal-configs-nautilus/files/gcss/\n> \n> Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>\n> ---\n>  src/android/camera_hal_config.cpp         |  17 ++\n>  src/android/camera_hal_config.h           |   1 +\n>  src/android/data/nautilus/camera_hal.yaml |   2 +\n>  src/android/data/nautilus/imx258.yaml     | 248 ++++++++++++++++++++++\n>  src/android/data/soraka/camera_hal.yaml   |   2 +\n>  src/android/data/soraka/ov13858.yaml      | 236 ++++++++++++++++++++\n>  src/android/data/soraka/ov5670.yaml       | 242 +++++++++++++++++++++\n>  7 files changed, 748 insertions(+)\n>  create mode 100644 src/android/data/nautilus/imx258.yaml\n>  create mode 100644 src/android/data/soraka/ov13858.yaml\n>  create mode 100644 src/android/data/soraka/ov5670.yaml\n> \n> diff --git a/src/android/camera_hal_config.cpp b/src/android/camera_hal_config.cpp\n> index 54611956..f378df9d 100644\n> --- a/src/android/camera_hal_config.cpp\n> +++ b/src/android/camera_hal_config.cpp\n> @@ -40,6 +40,7 @@ private:\n>  \tint parseCameraConfigData(const std::string &cameraId, const YamlObject &);\n>  \tint parseLocation(const YamlObject &, CameraConfigData &cameraConfigData);\n>  \tint parseRotation(const YamlObject &, CameraConfigData &cameraConfigData);\n> +\tint parsePipelineConf(const YamlObject &, CameraConfigData &cameraConfigData);\n>  \n>  \tstd::map<std::string, CameraConfigData> *cameras_;\n>  \tYamlParser yamlParser_;\n> @@ -63,11 +64,13 @@ int CameraHalConfig::Private::parseConfigFile(FILE *fh,\n>  \t *   \"camera0 id\":\n>  \t *     location: value\n>  \t *     rotation: value\n> +\t *     pipeline_config_file: path\n>  \t *     ...\n>  \t *\n>  \t *   \"camera1 id\":\n>  \t *     location: value\n>  \t *     rotation: value\n> +\t *     pipeline_config_file: path\n\nHmmmm... I'm in two minds about this.\n\nOn one hand, the HAL layer is a user of the libcamera public API,\nsimilarly to other applications using the libcamera native API, so it\ncan make sense to consider it as the entity in charge of passing the\nconfiguration file name to libcamera. On the other hand, I think we need\nthe ability to have a system-wide configuration file for the libcamera\ncode (including the pipeline handlers, excluding the HAL) as we don't\nwant to force applications to supply a configuration file in the general\ncase. This will also be needed when using the V4L2 adaptation layer, as\nit can't supply a configuration file to libcamera (well, technically\nspeaking it could, but that would have to be a system-wide file, so\nlibcamera could read that default system-wide file directly), and the\nGStreamer element would also need something similar I believe (we have a\nbit more flexibility here, we could add a property to libcamerasrc to\nspecific a configuration file, but I'm not sure that's desirable). That\nsystem-wide configuration file  could thus also be used when libcamera\nis used through the HAL.\n\n>  \t *     ...\n>  \t */\n>  \n> @@ -116,6 +119,10 @@ int CameraHalConfig::Private::parseCameraConfigData(const std::string &cameraId,\n>  \tif (parseRotation(cameraObject, cameraConfigData))\n>  \t\treturn -EINVAL;\n>  \n> +\t/* Parse property \"pipeline_config_file\" */\n> +\tif (parsePipelineConf(cameraObject, cameraConfigData))\n> +\t\treturn -EINVAL;\n> +\n>  \t(*cameras_)[cameraId] = cameraConfigData;\n>  \n>  \treturn 0;\n> @@ -157,6 +164,16 @@ int CameraHalConfig::Private::parseRotation(const YamlObject &cameraObject,\n>  \treturn 0;\n>  }\n>  \n> +int CameraHalConfig::Private::parsePipelineConf(const YamlObject &cameraObject,\n> +\t\t\t\t\t\tCameraConfigData &cameraConfigData)\n> +{\n> +\tif (!cameraObject.isMember(\"pipeline_config_file\"))\n> +\t\treturn -EINVAL;\n\nShouldn't the pipeline configuration file be optional ?\n\n> +\n> +\tcameraConfigData.pipelineConfigFile = cameraObject.get(\"pipeline_config_file\").asString();\n> +\treturn 0;\n> +}\n> +\n>  CameraHalConfig::CameraHalConfig()\n>  \t: Extensible(std::make_unique<Private>()), exists_(false), valid_(false)\n>  {\n> diff --git a/src/android/camera_hal_config.h b/src/android/camera_hal_config.h\n> index 9df554f9..3a905c92 100644\n> --- a/src/android/camera_hal_config.h\n> +++ b/src/android/camera_hal_config.h\n> @@ -15,6 +15,7 @@\n>  struct CameraConfigData {\n>  \tint facing = -1;\n>  \tint rotation = -1;\n> +\tstd::string pipelineConfigFile;\n>  };\n>  \n>  class CameraHalConfig final : public libcamera::Extensible\n> diff --git a/src/android/data/nautilus/camera_hal.yaml b/src/android/data/nautilus/camera_hal.yaml\n> index faddd29e..18a2b7a9 100644\n> --- a/src/android/data/nautilus/camera_hal.yaml\n> +++ b/src/android/data/nautilus/camera_hal.yaml\n> @@ -2,7 +2,9 @@ cameras:\n>    \"\\\\_SB_.PCI0.I2C2.CAM0\":\n>      location: back\n>      rotation: 0\n> +    pipeline_config_file: \"/etc/camera/libcamera/imx258.yaml\"\n>  \n>    \"\\\\_SB_.PCI0.XHCI.RHUB.HS09-9:1.0-04f2:b647\":\n>      location: front\n>      rotation: 0\n> +    pipeline_config_file: \"\"\n> diff --git a/src/android/data/nautilus/imx258.yaml b/src/android/data/nautilus/imx258.yaml\n> new file mode 100644\n> index 00000000..be52e752\n> --- /dev/null\n> +++ b/src/android/data/nautilus/imx258.yaml\n> @@ -0,0 +1,248 @@\n> +still_mode:\n> +- bds: [4208, 3116]\n> +  cio2: [4208, 3118]\n> +  gdc: [4096, 3072]\n> +  iff: [4208, 3116]\n> +  main: [4096, 3072]\n> +  viewfinder: [0, 0]\n\nWhile both are valid and parse the same way, I think\n\nstill_mode:\n  - bds: [4208, 3116]\n    cio2: [4208, 3118]\n    gdc: [4096, 3072]\n    iff: [4208, 3116]\n    main: [4096, 3072]\n    viewfinder: [0, 0]\n\nwould avoid confusion, given how the indentation matters in\n\nstill_mode:\nbds: [4208, 3116]\ncio2: [4208, 3118]\n\nvs.\n\nstill_mode:\n  bds: [4208, 3116]\n  cio2: [4208, 3118]\n\nI'm also tempted to support writing sizes as\n\nstill_mode:\n  - bds: 4208x3116\n    cio2: 4208x3118\n    gdc: 4096x3072\n    iff: 4208x3116\n    main: 4096x3072\n    viewfinder: 0x0\n\n(which would of course require adapting the asSize() function of the\nYamlObject class). What do you think ?\n\nRegarding the structure of the YAML file itself, maybe we should use\nsomething like\n\nstill_mode:\n  4096x3072:\n    bds: [4208, 3116]\n    cio2: [4208, 3118]\n    gdc: [4096, 3072]\n    iff: [4208, 3116]\n    main: [4096, 3072]\n    viewfinder: [0, 0]\n  1920x1080:\n    bds: [1968, 1184]\n    cio2: [4208, 3118]\n    gdc: [1920, 1080]\n    iff: [4182, 2516]\n    main: [1920, 1080]\n    viewfinder: [0, 0]\n  ...\n\nwhich I think would not only make it a bit more readable, but also\nprevent multiple configurations with identical output sizes. The name of\neach mode entry is meaningless, it's just there for readability, and the\nnaming scheme would need to also allow specifying the viewfinder output\nsize where applicable.\n\nOne downside is that this would allow a mismatch between the mode name\nand the configuration, one could write\n\nstill_mode:\n  4096x3072:\n    bds: [4208, 3116]\n    cio2: [4208, 3118]\n    gdc: [4096, 3072]\n    iff: [4208, 3116]\n    main: [4096, 3070]\n    viewfinder: [0, 0]\n\nand that wouldn't result in any error at runtime. Matching the main and\nviewfinder resolutions with the mode name could be done, but that's\nlikely overkill.\n\nFinally, it could be nice if the actual configuration files could be\nmoved to a different patch, reviewing them here is a bit more difficult\nas their format hasn't been introduced yet.\n\n> +- bds: [1968, 1184]\n> +  cio2: [4208, 3118]\n> +  gdc: [1920, 1080]\n> +  iff: [4182, 2516]\n> +  main: [1920, 1080]\n> +  viewfinder: [0, 0]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [0, 0]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1280, 960]\n> +  viewfinder: [0, 0]\n> +- bds: [1968, 1184]\n> +  cio2: [4208, 3118]\n> +  gdc: [1920, 1080]\n> +  iff: [4182, 2516]\n> +  main: [1280, 720]\n> +  viewfinder: [0, 0]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [640, 480]\n> +  viewfinder: [0, 0]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [320, 240]\n> +  viewfinder: [0, 0]\n> +video_mode:\n> +- bds: [4208, 3116]\n> +  cio2: [4208, 3118]\n> +  gdc: [4096, 3072]\n> +  iff: [4208, 3116]\n> +  main: [4096, 3072]\n> +  viewfinder: [0, 0]\n> +- bds: [1968, 1184]\n> +  cio2: [4208, 3118]\n> +  gdc: [1920, 1080]\n> +  iff: [4182, 2516]\n> +  main: [1920, 1080]\n> +  viewfinder: [0, 0]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [0, 0]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1280, 960]\n> +  viewfinder: [0, 0]\n> +- bds: [1968, 1184]\n> +  cio2: [4208, 3118]\n> +  gdc: [1920, 1080]\n> +  iff: [4182, 2516]\n> +  main: [1280, 720]\n> +  viewfinder: [0, 0]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [640, 480]\n> +  viewfinder: [0, 0]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [320, 240]\n> +  viewfinder: [0, 0]\n> +- bds: [4208, 3116]\n> +  cio2: [4208, 3118]\n> +  gdc: [4160, 3072]\n> +  iff: [4208, 3116]\n> +  main: [4096, 3072]\n> +  viewfinder: [4096, 3072]\n> +- bds: [4208, 3116]\n> +  cio2: [4208, 3118]\n> +  gdc: [4160, 3072]\n> +  iff: [4208, 3116]\n> +  main: [4096, 3072]\n> +  viewfinder: [1920, 1080]\n> +- bds: [4208, 3116]\n> +  cio2: [4208, 3118]\n> +  gdc: [4096, 3072]\n> +  iff: [4208, 3116]\n> +  main: [4096, 3072]\n> +  viewfinder: [1600, 1200]\n> +- bds: [4208, 3116]\n> +  cio2: [4208, 3118]\n> +  gdc: [4096, 3072]\n> +  iff: [4208, 3116]\n> +  main: [4096, 3072]\n> +  viewfinder: [1280, 960]\n> +- bds: [4208, 3116]\n> +  cio2: [4208, 3118]\n> +  gdc: [4160, 3072]\n> +  iff: [4208, 3116]\n> +  main: [4096, 3072]\n> +  viewfinder: [1280, 720]\n> +- bds: [4208, 3116]\n> +  cio2: [4208, 3118]\n> +  gdc: [4096, 3072]\n> +  iff: [4208, 3116]\n> +  main: [4096, 3072]\n> +  viewfinder: [640, 480]\n> +- bds: [4208, 3116]\n> +  cio2: [4208, 3118]\n> +  gdc: [4096, 3072]\n> +  iff: [4208, 3116]\n> +  main: [4096, 3072]\n> +  viewfinder: [320, 240]\n> +- bds: [1968, 1184]\n> +  cio2: [4208, 3118]\n> +  gdc: [1920, 1080]\n> +  iff: [4182, 2516]\n> +  main: [1920, 1080]\n> +  viewfinder: [1920, 1080]\n> +- bds: [1968, 1440]\n> +  cio2: [4208, 3118]\n> +  gdc: [1920, 1424]\n> +  iff: [4182, 3060]\n> +  main: [1920, 1080]\n> +  viewfinder: [1600, 1200]\n> +- bds: [1968, 1440]\n> +  cio2: [4208, 3118]\n> +  gdc: [1920, 1424]\n> +  iff: [4182, 3060]\n> +  main: [1920, 1080]\n> +  viewfinder: [1280, 960]\n> +- bds: [1968, 1184]\n> +  cio2: [4208, 3118]\n> +  gdc: [1920, 1080]\n> +  iff: [4182, 2516]\n> +  main: [1920, 1080]\n> +  viewfinder: [1280, 720]\n> +- bds: [1968, 1440]\n> +  cio2: [4208, 3118]\n> +  gdc: [1920, 1424]\n> +  iff: [4182, 3060]\n> +  main: [1920, 1080]\n> +  viewfinder: [640, 480]\n> +- bds: [1968, 1440]\n> +  cio2: [4208, 3118]\n> +  gdc: [1920, 1424]\n> +  iff: [4182, 3060]\n> +  main: [1920, 1080]\n> +  viewfinder: [320, 240]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [1600, 1200]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [1280, 960]\n> +- bds: [1680, 1240]\n> +  cio2: [4208, 3118]\n> +  gdc: [1664, 1200]\n> +  iff: [4200, 3100]\n> +  main: [1600, 1200]\n> +  viewfinder: [1280, 720]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [640, 480]\n> +- bds: [1632, 1216]\n> +  cio2: [4208, 3118]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [320, 240]\n> +- bds: [1344, 992]\n> +  cio2: [4208, 3118]\n> +  gdc: [1280, 960]\n> +  iff: [4200, 3100]\n> +  main: [1280, 960]\n> +  viewfinder: [1280, 960]\n> +- bds: [1400, 1036]\n> +  cio2: [4208, 3118]\n> +  gdc: [1344, 960]\n> +  iff: [4200, 3108]\n> +  main: [1280, 960]\n> +  viewfinder: [1280, 720]\n> +- bds: [1344, 992]\n> +  cio2: [4208, 3118]\n> +  gdc: [1280, 960]\n> +  iff: [4200, 3100]\n> +  main: [1280, 960]\n> +  viewfinder: [640, 480]\n> +- bds: [1344, 992]\n> +  cio2: [4208, 3118]\n> +  gdc: [1280, 960]\n> +  iff: [4200, 3100]\n> +  main: [1280, 960]\n> +  viewfinder: [320, 240]\n> +- bds: [1288, 800]\n> +  cio2: [4208, 3118]\n> +  gdc: [1280, 720]\n> +  iff: [4186, 2600]\n> +  main: [1280, 720]\n> +  viewfinder: [1280, 720]\n> +- bds: [1312, 960]\n> +  cio2: [4208, 3118]\n> +  gdc: [1280, 952]\n> +  iff: [4182, 3060]\n> +  main: [1280, 720]\n> +  viewfinder: [640, 480]\n> +- bds: [1312, 960]\n> +  cio2: [4208, 3118]\n> +  gdc: [1280, 952]\n> +  iff: [4182, 3060]\n> +  main: [1280, 720]\n> +  viewfinder: [320, 240]\n> +- bds: [700, 520]\n> +  cio2: [2104, 1560]\n> +  gdc: [640, 480]\n> +  iff: [2100, 1560]\n> +  main: [640, 480]\n> +  viewfinder: [320, 240]\n> +- bds: [364, 276]\n> +  cio2: [4208, 3118]\n> +  gdc: [320, 240]\n> +  iff: [1456, 1104]\n> +  main: [320, 240]\n> +  viewfinder: [320, 240]\n> diff --git a/src/android/data/soraka/camera_hal.yaml b/src/android/data/soraka/camera_hal.yaml\n> index 2e996403..6f0062e9 100644\n> --- a/src/android/data/soraka/camera_hal.yaml\n> +++ b/src/android/data/soraka/camera_hal.yaml\n> @@ -2,7 +2,9 @@ cameras:\n>    \"\\\\_SB_.PCI0.I2C4.CAM1\":\n>      location: front\n>      rotation: 0\n> +    pipeline_config_file: \"/etc/camera/libcamera/ov5670.yaml\"\n>  \n>    \"\\\\_SB_.PCI0.I2C2.CAM0\":\n>      location: back\n>      rotation: 0\n> +    pipeline_config_file: \"/etc/camera/libcamera/ov13858.yaml\"\n> diff --git a/src/android/data/soraka/ov13858.yaml b/src/android/data/soraka/ov13858.yaml\n> new file mode 100644\n> index 00000000..c6f4d091\n> --- /dev/null\n> +++ b/src/android/data/soraka/ov13858.yaml\n> @@ -0,0 +1,236 @@\n> +still_mode:\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [640, 480]\n> +  viewfinder: [0, 0]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [320, 240]\n> +  viewfinder: [0, 0]\n> +- bds: [4216, 2386]\n> +  cio2: [4224, 3136]\n> +  gdc: [4128, 2322]\n> +  iff: [4216, 2386]\n> +  main: [1920, 1080]\n> +  viewfinder: [0, 0]\n> +- bds: [4216, 2386]\n> +  cio2: [4224, 3136]\n> +  gdc: [4128, 2322]\n> +  iff: [4216, 2386]\n> +  main: [1280, 720]\n> +  viewfinder: [0, 0]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [1280, 960]\n> +  viewfinder: [0, 0]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [1600, 1200]\n> +  viewfinder: [0, 0]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [4096, 3072]\n> +  viewfinder: [0, 0]\n> +video_mode:\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [4096, 3072]\n> +  viewfinder: [1920, 1080]\n> +- bds: [1984, 1184]\n> +  cio2: [4224, 3136]\n> +  gdc: [1920, 1080]\n> +  iff: [4216, 2516]\n> +  main: [1920, 1080]\n> +  viewfinder: [0, 0]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [4096, 3072]\n> +  viewfinder: [1280, 720]\n> +- bds: [1984, 1184]\n> +  cio2: [4224, 3136]\n> +  gdc: [1920, 1080]\n> +  iff: [4216, 2516]\n> +  main: [1280, 720]\n> +  viewfinder: [0, 0]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [4096, 3072]\n> +  viewfinder: [640, 480]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [4096, 3072]\n> +  viewfinder: [1280, 960]\n> +- bds: [1632, 1216]\n> +  cio2: [4224, 3136]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1280, 960]\n> +  viewfinder: [0, 0]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [4096, 3072]\n> +  viewfinder: [1600, 1200]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [4096, 3072]\n> +  viewfinder: [320, 240]\n> +- bds: [1296, 800]\n> +  cio2: [4224, 3136]\n> +  gdc: [1280, 720]\n> +  iff: [4212, 2600]\n> +  main: [1280, 720]\n> +  viewfinder: [1280, 720]\n> +- bds: [1296, 960]\n> +  cio2: [4224, 3136]\n> +  gdc: [1280, 952]\n> +  iff: [4212, 3120]\n> +  main: [1280, 720]\n> +  viewfinder: [640, 480]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4160, 3120]\n> +  iff: [4224, 3136]\n> +  main: [1920, 1080]\n> +  viewfinder: [1600, 1200]\n> +- bds: [1984, 1472]\n> +  cio2: [4224, 3136]\n> +  gdc: [1920, 1432]\n> +  iff: [4216, 3128]\n> +  main: [1920, 1080]\n> +  viewfinder: [1600, 1200]\n> +- bds: [1296, 960]\n> +  cio2: [4224, 3136]\n> +  gdc: [1280, 952]\n> +  iff: [4212, 3120]\n> +  main: [1280, 720]\n> +  viewfinder: [320, 240]\n> +- bds: [1984, 1184]\n> +  cio2: [4224, 3136]\n> +  gdc: [1920, 1080]\n> +  iff: [4216, 2516]\n> +  main: [1920, 1080]\n> +  viewfinder: [1920, 1080]\n> +- bds: [1984, 1184]\n> +  cio2: [4224, 3136]\n> +  gdc: [1920, 1080]\n> +  iff: [4216, 2516]\n> +  main: [1920, 1080]\n> +  viewfinder: [1280, 720]\n> +- bds: [1984, 1472]\n> +  cio2: [4224, 3136]\n> +  gdc: [1920, 1432]\n> +  iff: [4216, 3128]\n> +  main: [1920, 1080]\n> +  viewfinder: [640, 480]\n> +- bds: [1984, 1472]\n> +  cio2: [4224, 3136]\n> +  gdc: [1920, 1432]\n> +  iff: [4216, 3128]\n> +  main: [1920, 1080]\n> +  viewfinder: [1280, 960]\n> +- bds: [1984, 1472]\n> +  cio2: [4224, 3136]\n> +  gdc: [1920, 1432]\n> +  iff: [4216, 3128]\n> +  main: [1920, 1080]\n> +  viewfinder: [320, 240]\n> +- bds: [1688, 1248]\n> +  cio2: [4224, 3136]\n> +  gdc: [1664, 1200]\n> +  iff: [4220, 3120]\n> +  main: [1600, 1200]\n> +  viewfinder: [1280, 720]\n> +- bds: [1632, 1216]\n> +  cio2: [4224, 3136]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [640, 480]\n> +- bds: [1632, 1216]\n> +  cio2: [4224, 3136]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [1280, 960]\n> +- bds: [1632, 1216]\n> +  cio2: [4224, 3136]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [1600, 1200]\n> +- bds: [1632, 1216]\n> +  cio2: [4224, 3136]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [320, 240]\n> +- bds: [1376, 1024]\n> +  cio2: [4224, 3136]\n> +  gdc: [1344, 960]\n> +  iff: [4214, 3136]\n> +  main: [1280, 960]\n> +  viewfinder: [1280, 720]\n> +- bds: [1344, 992]\n> +  cio2: [4224, 3136]\n> +  gdc: [1280, 960]\n> +  iff: [4200, 3100]\n> +  main: [1280, 960]\n> +  viewfinder: [640, 480]\n> +- bds: [1344, 992]\n> +  cio2: [4224, 3136]\n> +  gdc: [1280, 960]\n> +  iff: [4200, 3100]\n> +  main: [1280, 960]\n> +  viewfinder: [1280, 960]\n> +- bds: [1344, 992]\n> +  cio2: [4224, 3136]\n> +  gdc: [1280, 960]\n> +  iff: [4200, 3100]\n> +  main: [1280, 960]\n> +  viewfinder: [320, 240]\n> +- bds: [1632, 1216]\n> +  cio2: [4224, 3136]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [640, 480]\n> +  viewfinder: [0, 0]\n> +- bds: [1632, 1216]\n> +  cio2: [4224, 3136]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [320, 240]\n> +  viewfinder: [0, 0]\n> +- bds: [1632, 1216]\n> +  cio2: [4224, 3136]\n> +  gdc: [1600, 1200]\n> +  iff: [4182, 3116]\n> +  main: [1600, 1200]\n> +  viewfinder: [0, 0]\n> +- bds: [4224, 3136]\n> +  cio2: [4224, 3136]\n> +  gdc: [4096, 3072]\n> +  iff: [4224, 3136]\n> +  main: [4096, 3072]\n> +  viewfinder: [0, 0]\n> diff --git a/src/android/data/soraka/ov5670.yaml b/src/android/data/soraka/ov5670.yaml\n> new file mode 100644\n> index 00000000..35ad8684\n> --- /dev/null\n> +++ b/src/android/data/soraka/ov5670.yaml\n> @@ -0,0 +1,242 @@\n> +still_mode:\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [1600, 1200]\n> +  viewfinder: [0, 0]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [1280, 960]\n> +  viewfinder: [0, 0]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [2560, 1920]\n> +  viewfinder: [0, 0]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [1920, 1080]\n> +  viewfinder: [0, 0]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [1280, 720]\n> +  viewfinder: [0, 0]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [640, 480]\n> +  viewfinder: [0, 0]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [320, 240]\n> +  viewfinder: [0, 0]\n> +video_mode:\n> +- bds: [1952, 1152]\n> +  cio2: [2592, 1944]\n> +  gdc: [1920, 1080]\n> +  iff: [2562, 1512]\n> +  main: [1920, 1080]\n> +  viewfinder: [1920, 1080]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [2560, 1920]\n> +  viewfinder: [1920, 1080]\n> +- bds: [1952, 1152]\n> +  cio2: [2592, 1944]\n> +  gdc: [1920, 1080]\n> +  iff: [2562, 1512]\n> +  main: [1920, 1080]\n> +  viewfinder: [0, 0]\n> +- bds: [1952, 1152]\n> +  cio2: [2592, 1944]\n> +  gdc: [1920, 1080]\n> +  iff: [2562, 1512]\n> +  main: [1920, 1080]\n> +  viewfinder: [1280, 720]\n> +- bds: [1296, 972]\n> +  cio2: [2592, 1944]\n> +  gdc: [1280, 960]\n> +  iff: [2592, 1944]\n> +  main: [1280, 960]\n> +  viewfinder: [1280, 720]\n> +- bds: [1296, 804]\n> +  cio2: [2592, 1944]\n> +  gdc: [1280, 720]\n> +  iff: [2592, 1608]\n> +  main: [1280, 720]\n> +  viewfinder: [1280, 720]\n> +- bds: [1632, 1216]\n> +  cio2: [2592, 1944]\n> +  gdc: [1600, 1200]\n> +  iff: [2550, 1900]\n> +  main: [1600, 1200]\n> +  viewfinder: [1280, 720]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [2560, 1920]\n> +  viewfinder: [1280, 720]\n> +- bds: [1952, 1152]\n> +  cio2: [2592, 1944]\n> +  gdc: [1920, 1080]\n> +  iff: [2562, 1512]\n> +  main: [1280, 720]\n> +  viewfinder: [0, 0]\n> +- bds: [1952, 1472]\n> +  cio2: [2592, 1944]\n> +  gdc: [1920, 1440]\n> +  iff: [2562, 1932]\n> +  main: [1920, 1080]\n> +  viewfinder: [640, 480]\n> +- bds: [1296, 972]\n> +  cio2: [2592, 1944]\n> +  gdc: [1280, 960]\n> +  iff: [2592, 1944]\n> +  main: [1280, 960]\n> +  viewfinder: [640, 480]\n> +- bds: [1296, 972]\n> +  cio2: [2592, 1944]\n> +  gdc: [1280, 960]\n> +  iff: [2592, 1944]\n> +  main: [1280, 720]\n> +  viewfinder: [640, 480]\n> +- bds: [1632, 1216]\n> +  cio2: [2592, 1944]\n> +  gdc: [1600, 1200]\n> +  iff: [2550, 1900]\n> +  main: [1600, 1200]\n> +  viewfinder: [640, 480]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [2560, 1920]\n> +  viewfinder: [640, 480]\n> +- bds: [1632, 1216]\n> +  cio2: [2592, 1944]\n> +  gdc: [1600, 1200]\n> +  iff: [2550, 1900]\n> +  main: [1600, 1200]\n> +  viewfinder: [1600, 1200]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [2560, 1920]\n> +  viewfinder: [1600, 1200]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [1600, 1200]\n> +  viewfinder: [0, 0]\n> +- bds: [1952, 1472]\n> +  cio2: [2592, 1944]\n> +  gdc: [1920, 1440]\n> +  iff: [2562, 1932]\n> +  main: [1920, 1080]\n> +  viewfinder: [1280, 960]\n> +- bds: [1296, 972]\n> +  cio2: [2592, 1944]\n> +  gdc: [1280, 960]\n> +  iff: [2592, 1944]\n> +  main: [1280, 960]\n> +  viewfinder: [1280, 960]\n> +- bds: [1632, 1216]\n> +  cio2: [2592, 1944]\n> +  gdc: [1600, 1200]\n> +  iff: [2550, 1900]\n> +  main: [1600, 1200]\n> +  viewfinder: [1280, 960]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [2560, 1920]\n> +  viewfinder: [1280, 960]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [1280, 960]\n> +  viewfinder: [0, 0]\n> +- bds: [1952, 1472]\n> +  cio2: [2592, 1944]\n> +  gdc: [1920, 1440]\n> +  iff: [2562, 1932]\n> +  main: [1920, 1080]\n> +  viewfinder: [320, 240]\n> +- bds: [1296, 972]\n> +  cio2: [2592, 1944]\n> +  gdc: [1280, 960]\n> +  iff: [2592, 1944]\n> +  main: [1280, 960]\n> +  viewfinder: [320, 240]\n> +- bds: [1296, 972]\n> +  cio2: [2592, 1944]\n> +  gdc: [1280, 960]\n> +  iff: [2592, 1944]\n> +  main: [1280, 720]\n> +  viewfinder: [320, 240]\n> +- bds: [1632, 1216]\n> +  cio2: [2592, 1944]\n> +  gdc: [1600, 1200]\n> +  iff: [2550, 1900]\n> +  main: [1600, 1200]\n> +  viewfinder: [320, 240]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [2560, 1920]\n> +  viewfinder: [2560, 1920]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [2560, 1920]\n> +  viewfinder: [0, 0]\n> +- bds: [1296, 972]\n> +  cio2: [2592, 1944]\n> +  gdc: [1280, 960]\n> +  iff: [2592, 1944]\n> +  main: [640, 480]\n> +  viewfinder: [0, 0]\n> +- bds: [1296, 972]\n> +  cio2: [2592, 1944]\n> +  gdc: [1280, 960]\n> +  iff: [2592, 1944]\n> +  main: [320, 240]\n> +  viewfinder: [0, 0]\n> +- bds: [976, 736]\n> +  cio2: [2576, 1936]\n> +  gdc: [960, 720]\n> +  iff: [2562, 1932]\n> +  main: [960, 720]\n> +  viewfinder: [320, 240]\n> +- bds: [2572, 1936]\n> +  cio2: [2576, 1936]\n> +  gdc: [2560, 1920]\n> +  iff: [2572, 1936]\n> +  main: [2560, 1920]\n> +  viewfinder: [320, 240]\n> +- bds: [2592, 1944]\n> +  cio2: [2592, 1944]\n> +  gdc: [2560, 1920]\n> +  iff: [2592, 1944]\n> +  main: [1920, 1080]\n> +  viewfinder: [1600, 1200]","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 A66A6C3256\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  6 Apr 2022 01:35:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1FD416563F;\n\tWed,  6 Apr 2022 03:35:46 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 12CC3604B6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  6 Apr 2022 03:35:44 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(117.145-247-81.adsl-dyn.isp.belgacom.be [81.247.145.117])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7D67B482;\n\tWed,  6 Apr 2022 03:35:43 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1649208946;\n\tbh=TrQlwn5CsiZpXjd4myCLRFy4vUyE0AqayS3xCRU6lF0=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=zYOslNDGiah5vU10gd3s8m68eCJBLIjHD5VOSaehlyTpm4jjky7sRQZnnxRHTfktO\n\tDdlYfi085+dOTK2TLweVoMia3auFW5Paa6q5AybRwq3vav9Uvzfq57VB+yECdsz9gg\n\tZ4jW5FAzinUPh1aDgirDBtPBujM36EBW3nhsCDyh6DHNSOkThDwlTO1J1Cs80UwgMW\n\tOutjuCogGkSSlbbWe4IHw9CPNJqraB84+xikQVfiUMyn+z4Pm2pQlFpuCWAoK7qIn9\n\ty1B138bjkP5nmvLsEkEqsUagAuFYRrfIgq3BWMhqdl2hg38DpajjbOjDIZbSDryrd0\n\t/U0Plyc6gHrQA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1649208943;\n\tbh=TrQlwn5CsiZpXjd4myCLRFy4vUyE0AqayS3xCRU6lF0=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=KkcJEy47QoN3HFaj0to7zNQ266+ICWU8Lg2ToUEKa4X48v4EcSpMBwoLinT5O9cyj\n\tlyMNWzrQr+ovVNpjJZaK6KPT6Fk6oR+5qdxnfPHa8D8y76hm4F6QZA80ZX84qsTp0A\n\tZsJRi+h1x0uLNwaFwVVA8Mj6BqRrKKP5pMhSxOg4="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"KkcJEy47\"; dkim-atps=neutral","Date":"Wed, 6 Apr 2022 04:35:40 +0300","To":"Han-Lin Chen <hanlinchen@chromium.org>","Message-ID":"<YkzubJk3BPnmSiPm@pendragon.ideasonboard.com>","References":"<20220209071917.559993-1-hanlinchen@chromium.org>\n\t<20220209071917.559993-6-hanlinchen@chromium.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220209071917.559993-6-hanlinchen@chromium.org>","Subject":"Re: [libcamera-devel] [PATCH 5/9] android: Add pipeline_config_file\n\tparameter for camera_hal.yaml","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>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]