[libcamera-devel] [PATCH v2 10/12] android: camera_device: Generate ResultMetadata earlier
Kieran Bingham
kieran.bingham at ideasonboard.com
Tue Aug 4 13:54:04 CEST 2020
Hi Jacopo,
On 04/08/2020 12:55, Jacopo Mondi wrote:
> Hi Kieran,
>
> On Tue, Aug 04, 2020 at 12:10:45PM +0100, Kieran Bingham wrote:
>> Hi Jacopo,
>>
>> On 04/08/2020 12:08, Jacopo Mondi wrote:
>>> Hi Kieran
>>>
>>> On Mon, Aug 03, 2020 at 05:18:14PM +0100, Kieran Bingham wrote:
>>>> Generate the ResultMetadata before performing JPEG compression so that
>>>> JPEG specific metadata can be added to the metadata when it has been
>>>> processed.
>>>>
>>>> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>>>> ---
>>>> src/android/camera_device.cpp | 25 ++++++++++++++-----------
>>>> 1 file changed, 14 insertions(+), 11 deletions(-)
>>>>
>>>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
>>>> index ae52a5ca8b86..e23ab055d012 100644
>>>> --- a/src/android/camera_device.cpp
>>>> +++ b/src/android/camera_device.cpp
>>>> @@ -1138,6 +1138,8 @@ void CameraDevice::requestComplete(Request *request)
>>>> const std::map<Stream *, FrameBuffer *> &buffers = request->buffers();
>>>> camera3_buffer_status status = CAMERA3_BUFFER_STATUS_OK;
>>>> std::unique_ptr<CameraMetadata> resultMetadata;
>>>> + Camera3RequestDescriptor *descriptor =
>>>> + reinterpret_cast<Camera3RequestDescriptor *>(request->cookie());
>>>>
>>>> if (request->status() != Request::RequestComplete) {
>>>> LOG(HAL, Error) << "Request not successfully completed: "
>>>> @@ -1145,9 +1147,18 @@ void CameraDevice::requestComplete(Request *request)
>>>> status = CAMERA3_BUFFER_STATUS_ERROR;
>>>> }
>>>>
>>>> + /*
>>>> + * \todo The timestamp used for the metadata is currently always taken
>>>> + * from the first buffer (which may be the first stream) in the Request.
>>>> + * It might be appropriate to return a 'correct' (as determined by
>>>> + * pipeline handlers) timestamp in the Request itself.
>>>> + */
>>>> + FrameBuffer *buffer = buffers.begin()->second;
>>>> + resultMetadata = getResultMetadata(descriptor->frameNumber,
>>>> + buffer->metadata().timestamp);
>>>> +
>>>> /* Prepare to call back the Android camera stack. */
>>>> - Camera3RequestDescriptor *descriptor =
>>>> - reinterpret_cast<Camera3RequestDescriptor *>(request->cookie());
>>>> +
>>>
>>> One empty line is enough
>>>
>>>>
>>>> camera3_capture_result_t captureResult = {};
>>>> captureResult.frame_number = descriptor->frameNumber;
>>>> @@ -1160,21 +1171,13 @@ void CameraDevice::requestComplete(Request *request)
>>>> captureResult.output_buffers =
>>>> const_cast<const camera3_stream_buffer_t *>(descriptor->buffers);
>>>>
>>>> - /*
>>>> - * \todo The timestamp used for the metadata is currently always taken
>>>> - * from the first buffer (which may be the first stream) in the Request.
>>>> - * It might be appropriate to return a 'correct' (as determined by
>>>> - * pipeline handlers) timestamp in the Request itself.
>>>> - */
>>>> - FrameBuffer *buffer = buffers.begin()->second;
>>>>
>>>> if (status == CAMERA3_BUFFER_STATUS_OK) {
>>>> notifyShutter(descriptor->frameNumber,
>>>> buffer->metadata().timestamp);
>>>>
>>>> captureResult.partial_result = 1;
>>>> - resultMetadata = getResultMetadata(descriptor->frameNumber,
>>>> - buffer->metadata().timestamp);
>>>> +
>>>
>>> I would drop this one too
>>>
>>> Overall I think this is fine so far, as we generate metadata
>>> statically, but going forward if we have to access the Controls
>>> returned by a completed Request, we shall make sure it completed
>>> successfully. Can we record that with a \todo entry ?
>>>
>>
>> I'm not sure I fully understand your comment here, do you mean the
>> libcamera request should be completed successfully before updating the
>> resultMetaData?
>
> What I meant to say is that before this change the metadata buffer was
> generated in the
> if (status == CAMERA3_BUFFER_STATUS_OK)
> case, while now, if I got this right, it's generated unconditionally.
> When we'll assemble it inspecting the ControlList associated with the
> just completed Request, if it has not completed succesfully, we might
> try to access an invalid control list or a control list with unset
> values. If that's correct, I think it has to be recorded.
No, I don't touch any control list. The added information comes only
from the generated JPEG content, which is local to the android layer,
not the underlying libcamera stream.
--
K
> Thanks
> j
>
>>
>> It will still only be assigned to the captureResult.result if the
>> status == CAMERA3_BUFFER_STATUS_OK
>>
>> check passes still...
>>
>> You'll see how this gets used in 12/12 of course.
>>
>>
>>> That apart
>>> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
>>
>> Thanks,
>>
>>
>>>
>>> Thanks
>>> j
>>>
>>>> captureResult.result = resultMetadata->get();
>>>> }
>>>>
>>>> --
>>>> 2.25.1
>>>>
>>>> _______________________________________________
>>>> libcamera-devel mailing list
>>>> libcamera-devel at lists.libcamera.org
>>>> https://lists.libcamera.org/listinfo/libcamera-devel
>>
>> --
>> Regards
>> --
>> Kieran
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list