[{"id":2597,"web_url":"https://patchwork.libcamera.org/comment/2597/","msgid":"<20190904174715.GA5433@pendragon.ideasonboard.com>","date":"2019-09-04T17:47:15","subject":"Re: [libcamera-devel] [PATCH v5 6/8] android: camera_device: Fix\n\thandling of request template","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nThank you for the patch.\n\nOn Wed, Sep 04, 2019 at 04:18:23PM +0200, Jacopo Mondi wrote:\n> According to the Android camera HALv3 documentation, the request\n> template metadata pack should not be modified after it is returned to\n> the camera stack from the HAL.\n> \n> Currently, the same metadata pack is used for all types of template\n> request, without updating the capture intent there contained to match\n> the requested template type, as correctly reported by the\n> cros_camera_test test application.\n> \n> In order to avoid modifying the single request template already returned\n> to the camera stack in order to update the capture intent it contains,\n> create a map that associates a dedicated template to each supported\n> capture type.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/android/camera_device.cpp | 98 +++++++++++++++++------------------\n>  src/android/camera_device.h   |  2 +-\n>  2 files changed, 49 insertions(+), 51 deletions(-)\n> \n> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> index 5f8d19b9ef3d..c4f11e91bcf1 100644\n> --- a/src/android/camera_device.cpp\n> +++ b/src/android/camera_device.cpp\n> @@ -51,7 +51,7 @@ CameraDevice::Camera3RequestDescriptor::~Camera3RequestDescriptor()\n>  \n>  CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camera)\n>  \t: running_(false), camera_(camera), staticMetadata_(nullptr),\n> -\t  requestTemplate_(nullptr)\n> +\t  requestTemplates_()\n\nThe default map constructor creates an empty map, so you can drop this.\n\n>  {\n>  \tcamera_->requestCompleted.connect(this, &CameraDevice::requestComplete);\n>  }\n> @@ -62,9 +62,9 @@ CameraDevice::~CameraDevice()\n>  \t\tfree_camera_metadata(staticMetadata_);\n>  \tstaticMetadata_ = nullptr;\n>  \n> -\tif (requestTemplate_)\n> -\t\tfree_camera_metadata(requestTemplate_);\n> -\trequestTemplate_ = nullptr;\n> +\tfor (auto &it : requestTemplates_)\n> +\t\tfree_camera_metadata(it.second);\n> +\trequestTemplates_.clear();\n\nThe clear() is not needed as requestTemplates_ is getting destroyed.\n\n>  }\n>  \n>  /*\n> @@ -515,119 +515,117 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)\n>  {\n>  \tint ret;\n>  \n> -\t/*\n> -\t * \\todo Inspect type and pick the right metadata pack.\n> -\t * As of now just use a single one for all templates.\n> -\t */\n> -\tuint8_t captureIntent;\n> -\tswitch (type) {\n> -\tcase CAMERA3_TEMPLATE_PREVIEW:\n> -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;\n> -\t\tbreak;\n> -\tcase CAMERA3_TEMPLATE_STILL_CAPTURE:\n> -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;\n> -\t\tbreak;\n> -\tcase CAMERA3_TEMPLATE_VIDEO_RECORD:\n> -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;\n> -\t\tbreak;\n> -\tcase CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:\n> -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;\n> -\t\tbreak;\n> -\tcase CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:\n> -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;\n> -\t\tbreak;\n> -\tcase CAMERA3_TEMPLATE_MANUAL:\n> -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;\n> -\t\tbreak;\n> -\tdefault:\n> -\t\tLOG(HAL, Error) << \"Invalid template request type: \" << type;\n> -\t\treturn nullptr;\n> -\t}\n> -\n> -\tif (requestTemplate_)\n> -\t\treturn requestTemplate_;\n> +\tif (requestTemplates_.find(type) != requestTemplates_.end())\n> +\t\treturn requestTemplates_[type];\n\nYou could make this slightly more efficient by avoiding the double\nlookup:\n\n\tauto it = requestTemplates_.find(type);\n\tif (it != requestTemplates_.end())\n\t\treturn it.second;\n\n>  \n>  \t/*\n>  \t * \\todo Keep this in sync with the actual number of entries.\n>  \t * Currently: 12 entries, 15 bytes\n>  \t */\n> -\trequestTemplate_ = allocate_camera_metadata(15, 20);\n> -\tif (!requestTemplate_) {\n> +\tcamera_metadata_t * requestTemplate = allocate_camera_metadata(15, 20);\n> +\tif (!requestTemplate) {\n>  \t\tLOG(HAL, Error) << \"Failed to allocate template metadata\";\n>  \t\treturn nullptr;\n>  \t}\n>  \n>  \tuint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_CONTROL_AE_MODE,\n>  \t\t\t&aeMode, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \tint32_t aeExposureCompensation = 0;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,\n>  \t\t\t&aeExposureCompensation, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \tuint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,\n>  \t\t\t&aePrecaptureTrigger, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \tuint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_CONTROL_AE_LOCK,\n>  \t\t\t&aeLock, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \tuint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_CONTROL_AF_TRIGGER,\n>  \t\t\t&afTrigger, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \tuint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_CONTROL_AWB_MODE,\n>  \t\t\t&awbMode, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \tuint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_CONTROL_AWB_LOCK,\n>  \t\t\t&awbLock, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \tuint8_t flashMode = ANDROID_FLASH_MODE_OFF;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_FLASH_MODE,\n>  \t\t\t&flashMode, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \tuint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_STATISTICS_FACE_DETECT_MODE,\n>  \t\t\t&faceDetectMode, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \tuint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_NOISE_REDUCTION_MODE, &noiseReduction, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n>  \tuint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;\n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE,\n>  \t\t\t&aberrationMode, 1);\n>  \tMETADATA_ASSERT(ret);\n>  \n> -\tret = add_camera_metadata_entry(requestTemplate_,\n> +\t/* Use the capture intent matching the requested template type. */\n> +\tuint8_t captureIntent;\n> +\tswitch (type) {\n> +\tcase CAMERA3_TEMPLATE_PREVIEW:\n> +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;\n> +\t\tbreak;\n> +\tcase CAMERA3_TEMPLATE_STILL_CAPTURE:\n> +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;\n> +\t\tbreak;\n> +\tcase CAMERA3_TEMPLATE_VIDEO_RECORD:\n> +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;\n> +\t\tbreak;\n> +\tcase CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:\n> +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;\n> +\t\tbreak;\n> +\tcase CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:\n> +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;\n> +\t\tbreak;\n> +\tcase CAMERA3_TEMPLATE_MANUAL:\n> +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;\n> +\t\tbreak;\n> +\tdefault:\n> +\t\tLOG(HAL, Error) << \"Invalid template request type: \" << type;\n> +\t\treturn nullptr;\n> +\t}\n> +\tret = add_camera_metadata_entry(requestTemplate,\n>  \t\t\tANDROID_CONTROL_CAPTURE_INTENT,\n>  \t\t\t&captureIntent, 1);\n>  \tMETADATA_ASSERT(ret);\n\nYou're leaking requestTemplate in all error paths, but you know that\nalready as you addressed it in the next patch, so with the issues above\nfixed,\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  \n> -\treturn requestTemplate_;\n> +\trequestTemplates_[type] = requestTemplate;\n> +\n> +\treturn requestTemplate;\n>  }\n>  \n>  /*\n> diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> index 7897ba9dc5c7..64382bbac76a 100644\n> --- a/src/android/camera_device.h\n> +++ b/src/android/camera_device.h\n> @@ -66,7 +66,7 @@ private:\n>  \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n>  \n>  \tcamera_metadata_t *staticMetadata_;\n> -\tcamera_metadata_t *requestTemplate_;\n> +\tstd::map<unsigned int, camera_metadata_t *> requestTemplates_;\n>  \tconst camera3_callback_ops_t *callbacks_;\n>  };\n>","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CC00F60BB2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  4 Sep 2019 19:47:23 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi\n\t[IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 30340440;\n\tWed,  4 Sep 2019 19:47:23 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1567619243;\n\tbh=WiBlXh6a9ETAZD2YyLK3FbW5lcXSkIrnCFR2uSyZzJs=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=lUZwSSWuTyn0amYhSjhCrhd0cI2ne+IgK+u3pVllEWOEkXfcT7pVBOIO//OBpReBU\n\tiNaOOIepTzHJRR7i7QwyL5Go5JbeEdaNxz18BL6dzxtK5EPdIxL40i8WyQP1lfHufb\n\tAeCMWLGKxojjD/doBYjysMoA05548Xa5RqFxxrR4=","Date":"Wed, 4 Sep 2019 20:47:15 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org, jcliang@google.com, wtlee@google.com","Message-ID":"<20190904174715.GA5433@pendragon.ideasonboard.com>","References":"<20190904141825.20697-1-jacopo@jmondi.org>\n\t<20190904141825.20697-7-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190904141825.20697-7-jacopo@jmondi.org>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v5 6/8] android: camera_device: Fix\n\thandling of request template","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":"Wed, 04 Sep 2019 17:47:24 -0000"}},{"id":2599,"web_url":"https://patchwork.libcamera.org/comment/2599/","msgid":"<20190904175518.GC5433@pendragon.ideasonboard.com>","date":"2019-09-04T17:55:18","subject":"Re: [libcamera-devel] [PATCH v5 6/8] android: camera_device: Fix\n\thandling of request template","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Wed, Sep 04, 2019 at 08:47:15PM +0300, Laurent Pinchart wrote:\n> On Wed, Sep 04, 2019 at 04:18:23PM +0200, Jacopo Mondi wrote:\n> > According to the Android camera HALv3 documentation, the request\n> > template metadata pack should not be modified after it is returned to\n> > the camera stack from the HAL.\n> > \n> > Currently, the same metadata pack is used for all types of template\n> > request, without updating the capture intent there contained to match\n> > the requested template type, as correctly reported by the\n> > cros_camera_test test application.\n> > \n> > In order to avoid modifying the single request template already returned\n> > to the camera stack in order to update the capture intent it contains,\n> > create a map that associates a dedicated template to each supported\n> > capture type.\n> > \n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >  src/android/camera_device.cpp | 98 +++++++++++++++++------------------\n> >  src/android/camera_device.h   |  2 +-\n> >  2 files changed, 49 insertions(+), 51 deletions(-)\n> > \n> > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > index 5f8d19b9ef3d..c4f11e91bcf1 100644\n> > --- a/src/android/camera_device.cpp\n> > +++ b/src/android/camera_device.cpp\n> > @@ -51,7 +51,7 @@ CameraDevice::Camera3RequestDescriptor::~Camera3RequestDescriptor()\n> >  \n> >  CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camera)\n> >  \t: running_(false), camera_(camera), staticMetadata_(nullptr),\n> > -\t  requestTemplate_(nullptr)\n> > +\t  requestTemplates_()\n> \n> The default map constructor creates an empty map, so you can drop this.\n> \n> >  {\n> >  \tcamera_->requestCompleted.connect(this, &CameraDevice::requestComplete);\n> >  }\n> > @@ -62,9 +62,9 @@ CameraDevice::~CameraDevice()\n> >  \t\tfree_camera_metadata(staticMetadata_);\n> >  \tstaticMetadata_ = nullptr;\n> >  \n> > -\tif (requestTemplate_)\n> > -\t\tfree_camera_metadata(requestTemplate_);\n> > -\trequestTemplate_ = nullptr;\n> > +\tfor (auto &it : requestTemplates_)\n> > +\t\tfree_camera_metadata(it.second);\n> > +\trequestTemplates_.clear();\n> \n> The clear() is not needed as requestTemplates_ is getting destroyed.\n> \n> >  }\n> >  \n> >  /*\n> > @@ -515,119 +515,117 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)\n> >  {\n> >  \tint ret;\n> >  \n> > -\t/*\n> > -\t * \\todo Inspect type and pick the right metadata pack.\n> > -\t * As of now just use a single one for all templates.\n> > -\t */\n> > -\tuint8_t captureIntent;\n> > -\tswitch (type) {\n> > -\tcase CAMERA3_TEMPLATE_PREVIEW:\n> > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;\n> > -\t\tbreak;\n> > -\tcase CAMERA3_TEMPLATE_STILL_CAPTURE:\n> > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;\n> > -\t\tbreak;\n> > -\tcase CAMERA3_TEMPLATE_VIDEO_RECORD:\n> > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;\n> > -\t\tbreak;\n> > -\tcase CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:\n> > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;\n> > -\t\tbreak;\n> > -\tcase CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:\n> > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;\n> > -\t\tbreak;\n> > -\tcase CAMERA3_TEMPLATE_MANUAL:\n> > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;\n> > -\t\tbreak;\n> > -\tdefault:\n> > -\t\tLOG(HAL, Error) << \"Invalid template request type: \" << type;\n> > -\t\treturn nullptr;\n> > -\t}\n> > -\n> > -\tif (requestTemplate_)\n> > -\t\treturn requestTemplate_;\n> > +\tif (requestTemplates_.find(type) != requestTemplates_.end())\n> > +\t\treturn requestTemplates_[type];\n> \n> You could make this slightly more efficient by avoiding the double\n> lookup:\n> \n> \tauto it = requestTemplates_.find(type);\n> \tif (it != requestTemplates_.end())\n> \t\treturn it.second;\n> \n> >  \n> >  \t/*\n> >  \t * \\todo Keep this in sync with the actual number of entries.\n> >  \t * Currently: 12 entries, 15 bytes\n> >  \t */\n> > -\trequestTemplate_ = allocate_camera_metadata(15, 20);\n> > -\tif (!requestTemplate_) {\n> > +\tcamera_metadata_t * requestTemplate = allocate_camera_metadata(15, 20);\n> > +\tif (!requestTemplate) {\n> >  \t\tLOG(HAL, Error) << \"Failed to allocate template metadata\";\n> >  \t\treturn nullptr;\n> >  \t}\n> >  \n> >  \tuint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_CONTROL_AE_MODE,\n> >  \t\t\t&aeMode, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> >  \tint32_t aeExposureCompensation = 0;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,\n> >  \t\t\t&aeExposureCompensation, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> >  \tuint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,\n> >  \t\t\t&aePrecaptureTrigger, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> >  \tuint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_CONTROL_AE_LOCK,\n> >  \t\t\t&aeLock, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> >  \tuint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_CONTROL_AF_TRIGGER,\n> >  \t\t\t&afTrigger, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> >  \tuint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_CONTROL_AWB_MODE,\n> >  \t\t\t&awbMode, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> >  \tuint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_CONTROL_AWB_LOCK,\n> >  \t\t\t&awbLock, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> >  \tuint8_t flashMode = ANDROID_FLASH_MODE_OFF;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_FLASH_MODE,\n> >  \t\t\t&flashMode, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> >  \tuint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_STATISTICS_FACE_DETECT_MODE,\n> >  \t\t\t&faceDetectMode, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> >  \tuint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_NOISE_REDUCTION_MODE, &noiseReduction, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> >  \tuint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;\n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE,\n> >  \t\t\t&aberrationMode, 1);\n> >  \tMETADATA_ASSERT(ret);\n> >  \n> > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > +\t/* Use the capture intent matching the requested template type. */\n> > +\tuint8_t captureIntent;\n> > +\tswitch (type) {\n> > +\tcase CAMERA3_TEMPLATE_PREVIEW:\n> > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;\n> > +\t\tbreak;\n> > +\tcase CAMERA3_TEMPLATE_STILL_CAPTURE:\n> > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;\n> > +\t\tbreak;\n> > +\tcase CAMERA3_TEMPLATE_VIDEO_RECORD:\n> > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;\n> > +\t\tbreak;\n> > +\tcase CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:\n> > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;\n> > +\t\tbreak;\n> > +\tcase CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:\n> > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;\n> > +\t\tbreak;\n> > +\tcase CAMERA3_TEMPLATE_MANUAL:\n> > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;\n> > +\t\tbreak;\n> > +\tdefault:\n> > +\t\tLOG(HAL, Error) << \"Invalid template request type: \" << type;\n> > +\t\treturn nullptr;\n\nThis leak isn't addressed in 7/8. If you use unique_ptr as proposed, it\nwill be fixed. I would then move the parts of 7/8 that deal with other\nmethods than constructDefaultRequestSettings() before this patch, and\nsquash the part that deals with constructDefaultRequestSettings() with\nthis patch to avoid a bisection regression.\n\n> > +\t}\n> > +\tret = add_camera_metadata_entry(requestTemplate,\n> >  \t\t\tANDROID_CONTROL_CAPTURE_INTENT,\n> >  \t\t\t&captureIntent, 1);\n> >  \tMETADATA_ASSERT(ret);\n> \n> You're leaking requestTemplate in all error paths, but you know that\n> already as you addressed it in the next patch, so with the issues above\n> fixed,\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> >  \n> > -\treturn requestTemplate_;\n> > +\trequestTemplates_[type] = requestTemplate;\n> > +\n> > +\treturn requestTemplate;\n> >  }\n> >  \n> >  /*\n> > diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> > index 7897ba9dc5c7..64382bbac76a 100644\n> > --- a/src/android/camera_device.h\n> > +++ b/src/android/camera_device.h\n> > @@ -66,7 +66,7 @@ private:\n> >  \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n> >  \n> >  \tcamera_metadata_t *staticMetadata_;\n> > -\tcamera_metadata_t *requestTemplate_;\n> > +\tstd::map<unsigned int, camera_metadata_t *> requestTemplates_;\n> >  \tconst camera3_callback_ops_t *callbacks_;\n> >  };\n> >","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D2C8360BB2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  4 Sep 2019 19:55:24 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi\n\t[IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 4752223F;\n\tWed,  4 Sep 2019 19:55:24 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1567619724;\n\tbh=UY6WFZ+K519sueyg3OLzrpuH+MxykYrlw96nq5r0uOU=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=h23vSrfXLRB2TiwgQqhEIDCj/3cIU5DXN3AJNSwr77NdoREm6wJPXHEhzdrKsfkno\n\t8sMIeDUeohR7eMnQoEw1XsT/ZC3OcnC20kwJpf0cr4iehgxEWOIEGIlWeDInsRQ/WO\n\tW0PnURCSasINTyBkwHZQHIa5kG8ykJy8EjjhEdII=","Date":"Wed, 4 Sep 2019 20:55:18 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"jcliang@google.com, libcamera-devel@lists.libcamera.org, wtlee@google.com","Message-ID":"<20190904175518.GC5433@pendragon.ideasonboard.com>","References":"<20190904141825.20697-1-jacopo@jmondi.org>\n\t<20190904141825.20697-7-jacopo@jmondi.org>\n\t<20190904174715.GA5433@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190904174715.GA5433@pendragon.ideasonboard.com>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v5 6/8] android: camera_device: Fix\n\thandling of request template","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":"Wed, 04 Sep 2019 17:55:25 -0000"}},{"id":2614,"web_url":"https://patchwork.libcamera.org/comment/2614/","msgid":"<20190904230531.GQ5433@pendragon.ideasonboard.com>","date":"2019-09-04T23:05:31","subject":"Re: [libcamera-devel] [PATCH v5 6/8] android: camera_device: Fix\n\thandling of request template","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Wed, Sep 04, 2019 at 08:55:18PM +0300, Laurent Pinchart wrote:\n> On Wed, Sep 04, 2019 at 08:47:15PM +0300, Laurent Pinchart wrote:\n> > On Wed, Sep 04, 2019 at 04:18:23PM +0200, Jacopo Mondi wrote:\n> > > According to the Android camera HALv3 documentation, the request\n> > > template metadata pack should not be modified after it is returned to\n> > > the camera stack from the HAL.\n> > > \n> > > Currently, the same metadata pack is used for all types of template\n> > > request, without updating the capture intent there contained to match\n> > > the requested template type, as correctly reported by the\n> > > cros_camera_test test application.\n> > > \n> > > In order to avoid modifying the single request template already returned\n> > > to the camera stack in order to update the capture intent it contains,\n> > > create a map that associates a dedicated template to each supported\n> > > capture type.\n> > > \n> > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > > ---\n> > >  src/android/camera_device.cpp | 98 +++++++++++++++++------------------\n> > >  src/android/camera_device.h   |  2 +-\n> > >  2 files changed, 49 insertions(+), 51 deletions(-)\n> > > \n> > > diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\n> > > index 5f8d19b9ef3d..c4f11e91bcf1 100644\n> > > --- a/src/android/camera_device.cpp\n> > > +++ b/src/android/camera_device.cpp\n> > > @@ -51,7 +51,7 @@ CameraDevice::Camera3RequestDescriptor::~Camera3RequestDescriptor()\n> > >  \n> > >  CameraDevice::CameraDevice(unsigned int id, const std::shared_ptr<Camera> &camera)\n> > >  \t: running_(false), camera_(camera), staticMetadata_(nullptr),\n> > > -\t  requestTemplate_(nullptr)\n> > > +\t  requestTemplates_()\n> > \n> > The default map constructor creates an empty map, so you can drop this.\n> > \n> > >  {\n> > >  \tcamera_->requestCompleted.connect(this, &CameraDevice::requestComplete);\n> > >  }\n> > > @@ -62,9 +62,9 @@ CameraDevice::~CameraDevice()\n> > >  \t\tfree_camera_metadata(staticMetadata_);\n> > >  \tstaticMetadata_ = nullptr;\n> > >  \n> > > -\tif (requestTemplate_)\n> > > -\t\tfree_camera_metadata(requestTemplate_);\n> > > -\trequestTemplate_ = nullptr;\n> > > +\tfor (auto &it : requestTemplates_)\n> > > +\t\tfree_camera_metadata(it.second);\n> > > +\trequestTemplates_.clear();\n> > \n> > The clear() is not needed as requestTemplates_ is getting destroyed.\n> > \n> > >  }\n> > >  \n> > >  /*\n> > > @@ -515,119 +515,117 @@ const camera_metadata_t *CameraDevice::constructDefaultRequestSettings(int type)\n> > >  {\n> > >  \tint ret;\n> > >  \n> > > -\t/*\n> > > -\t * \\todo Inspect type and pick the right metadata pack.\n> > > -\t * As of now just use a single one for all templates.\n> > > -\t */\n> > > -\tuint8_t captureIntent;\n> > > -\tswitch (type) {\n> > > -\tcase CAMERA3_TEMPLATE_PREVIEW:\n> > > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;\n> > > -\t\tbreak;\n> > > -\tcase CAMERA3_TEMPLATE_STILL_CAPTURE:\n> > > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;\n> > > -\t\tbreak;\n> > > -\tcase CAMERA3_TEMPLATE_VIDEO_RECORD:\n> > > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;\n> > > -\t\tbreak;\n> > > -\tcase CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:\n> > > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;\n> > > -\t\tbreak;\n> > > -\tcase CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:\n> > > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;\n> > > -\t\tbreak;\n> > > -\tcase CAMERA3_TEMPLATE_MANUAL:\n> > > -\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;\n> > > -\t\tbreak;\n> > > -\tdefault:\n> > > -\t\tLOG(HAL, Error) << \"Invalid template request type: \" << type;\n> > > -\t\treturn nullptr;\n> > > -\t}\n> > > -\n> > > -\tif (requestTemplate_)\n> > > -\t\treturn requestTemplate_;\n> > > +\tif (requestTemplates_.find(type) != requestTemplates_.end())\n> > > +\t\treturn requestTemplates_[type];\n> > \n> > You could make this slightly more efficient by avoiding the double\n> > lookup:\n> > \n> > \tauto it = requestTemplates_.find(type);\n> > \tif (it != requestTemplates_.end())\n> > \t\treturn it.second;\n> > \n> > >  \n> > >  \t/*\n> > >  \t * \\todo Keep this in sync with the actual number of entries.\n> > >  \t * Currently: 12 entries, 15 bytes\n> > >  \t */\n> > > -\trequestTemplate_ = allocate_camera_metadata(15, 20);\n> > > -\tif (!requestTemplate_) {\n> > > +\tcamera_metadata_t * requestTemplate = allocate_camera_metadata(15, 20);\n\nDidn't checkstyle.py catch this ?\n\n> > > +\tif (!requestTemplate) {\n> > >  \t\tLOG(HAL, Error) << \"Failed to allocate template metadata\";\n> > >  \t\treturn nullptr;\n> > >  \t}\n> > >  \n> > >  \tuint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_CONTROL_AE_MODE,\n> > >  \t\t\t&aeMode, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > >  \tint32_t aeExposureCompensation = 0;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,\n> > >  \t\t\t&aeExposureCompensation, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > >  \tuint8_t aePrecaptureTrigger = ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,\n> > >  \t\t\t&aePrecaptureTrigger, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > >  \tuint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_CONTROL_AE_LOCK,\n> > >  \t\t\t&aeLock, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > >  \tuint8_t afTrigger = ANDROID_CONTROL_AF_TRIGGER_IDLE;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_CONTROL_AF_TRIGGER,\n> > >  \t\t\t&afTrigger, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > >  \tuint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_CONTROL_AWB_MODE,\n> > >  \t\t\t&awbMode, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > >  \tuint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_CONTROL_AWB_LOCK,\n> > >  \t\t\t&awbLock, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > >  \tuint8_t flashMode = ANDROID_FLASH_MODE_OFF;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_FLASH_MODE,\n> > >  \t\t\t&flashMode, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > >  \tuint8_t faceDetectMode = ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_STATISTICS_FACE_DETECT_MODE,\n> > >  \t\t\t&faceDetectMode, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > >  \tuint8_t noiseReduction = ANDROID_NOISE_REDUCTION_MODE_OFF;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_NOISE_REDUCTION_MODE, &noiseReduction, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > >  \tuint8_t aberrationMode = ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF;\n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_COLOR_CORRECTION_ABERRATION_MODE,\n> > >  \t\t\t&aberrationMode, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > >  \n> > > -\tret = add_camera_metadata_entry(requestTemplate_,\n> > > +\t/* Use the capture intent matching the requested template type. */\n> > > +\tuint8_t captureIntent;\n> > > +\tswitch (type) {\n> > > +\tcase CAMERA3_TEMPLATE_PREVIEW:\n> > > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;\n> > > +\t\tbreak;\n> > > +\tcase CAMERA3_TEMPLATE_STILL_CAPTURE:\n> > > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;\n> > > +\t\tbreak;\n> > > +\tcase CAMERA3_TEMPLATE_VIDEO_RECORD:\n> > > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;\n> > > +\t\tbreak;\n> > > +\tcase CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:\n> > > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;\n> > > +\t\tbreak;\n> > > +\tcase CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:\n> > > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;\n> > > +\t\tbreak;\n> > > +\tcase CAMERA3_TEMPLATE_MANUAL:\n> > > +\t\tcaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_MANUAL;\n> > > +\t\tbreak;\n> > > +\tdefault:\n> > > +\t\tLOG(HAL, Error) << \"Invalid template request type: \" << type;\n> > > +\t\treturn nullptr;\n> \n> This leak isn't addressed in 7/8. If you use unique_ptr as proposed, it\n> will be fixed. I would then move the parts of 7/8 that deal with other\n> methods than constructDefaultRequestSettings() before this patch, and\n> squash the part that deals with constructDefaultRequestSettings() with\n> this patch to avoid a bisection regression.\n> \n> > > +\t}\n> > > +\tret = add_camera_metadata_entry(requestTemplate,\n> > >  \t\t\tANDROID_CONTROL_CAPTURE_INTENT,\n> > >  \t\t\t&captureIntent, 1);\n> > >  \tMETADATA_ASSERT(ret);\n> > \n> > You're leaking requestTemplate in all error paths, but you know that\n> > already as you addressed it in the next patch, so with the issues above\n> > fixed,\n> > \n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > \n> > >  \n> > > -\treturn requestTemplate_;\n> > > +\trequestTemplates_[type] = requestTemplate;\n> > > +\n> > > +\treturn requestTemplate;\n> > >  }\n> > >  \n> > >  /*\n> > > diff --git a/src/android/camera_device.h b/src/android/camera_device.h\n> > > index 7897ba9dc5c7..64382bbac76a 100644\n> > > --- a/src/android/camera_device.h\n> > > +++ b/src/android/camera_device.h\n> > > @@ -66,7 +66,7 @@ private:\n> > >  \tstd::unique_ptr<libcamera::CameraConfiguration> config_;\n> > >  \n> > >  \tcamera_metadata_t *staticMetadata_;\n> > > -\tcamera_metadata_t *requestTemplate_;\n> > > +\tstd::map<unsigned int, camera_metadata_t *> requestTemplates_;\n> > >  \tconst camera3_callback_ops_t *callbacks_;\n> > >  };\n> > >","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["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 0F2AF60BB2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  5 Sep 2019 01:05:38 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 6050B440;\n\tThu,  5 Sep 2019 01:05:37 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1567638337;\n\tbh=nvnCfkF3meo5ZLgscFKFph4+aCRVl2Hmt/qQRXWco9w=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=T0r01UjxMcr9F30q0G6Y9mYbc7Sy6AinTrMx8ToEd74nlBXwj7lgj4NZg40xgT7JZ\n\tyN78jC4TM5ZlUSPfch3IffLalJAxkUVlGhnq4tYhKrbvc6VPpPNqMeqe2XDD69J9e0\n\t+GEtyNPo55xRNH/soTekx0GN5F9OIdBhmyAaQgKY=","Date":"Thu, 5 Sep 2019 02:05:31 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"jcliang@google.com, libcamera-devel@lists.libcamera.org, wtlee@google.com","Message-ID":"<20190904230531.GQ5433@pendragon.ideasonboard.com>","References":"<20190904141825.20697-1-jacopo@jmondi.org>\n\t<20190904141825.20697-7-jacopo@jmondi.org>\n\t<20190904174715.GA5433@pendragon.ideasonboard.com>\n\t<20190904175518.GC5433@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190904175518.GC5433@pendragon.ideasonboard.com>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v5 6/8] android: camera_device: Fix\n\thandling of request template","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":"Wed, 04 Sep 2019 23:05:38 -0000"}}]