{"id":2363,"url":"https://patchwork.libcamera.org/api/patches/2363/?format=json","web_url":"https://patchwork.libcamera.org/patch/2363/","project":{"id":1,"url":"https://patchwork.libcamera.org/api/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":"<20191126233620.1695316-16-niklas.soderlund@ragnatech.se>","date":"2019-11-26T23:36:05","name":"[libcamera-devel,15/30] libcamera: buffer: Move capture information to BufferInfo","commit_ref":null,"pull_url":null,"state":"superseded","archived":false,"hash":"881660da706e9d885594840bf61364eae4731c7c","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/?format=json","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"delegate":null,"mbox":"https://patchwork.libcamera.org/patch/2363/mbox/","series":[{"id":579,"url":"https://patchwork.libcamera.org/api/series/579/?format=json","web_url":"https://patchwork.libcamera.org/project/libcamera/list/?series=579","date":"2019-11-26T23:35:50","name":"libcamera: Rework buffer API","version":1,"mbox":"https://patchwork.libcamera.org/series/579/mbox/"}],"comments":"https://patchwork.libcamera.org/api/patches/2363/comments/","check":"pending","checks":"https://patchwork.libcamera.org/api/patches/2363/checks/","tags":{},"headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from bin-mail-out-05.binero.net (bin-mail-out-05.binero.net\n\t[195.74.38.228])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B40246136B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 27 Nov 2019 00:39:35 +0100 (CET)","from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de\n\t[84.172.88.101]) by bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA\n\tid ffd6d11a-10a5-11ea-a0b9-005056917f90;\n\tWed, 27 Nov 2019 00:39:33 +0100 (CET)"],"X-Halon-ID":"ffd6d11a-10a5-11ea-a0b9-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":"Wed, 27 Nov 2019 00:36:05 +0100","Message-Id":"<20191126233620.1695316-16-niklas.soderlund@ragnatech.se>","X-Mailer":"git-send-email 2.24.0","In-Reply-To":"<20191126233620.1695316-1-niklas.soderlund@ragnatech.se>","References":"<20191126233620.1695316-1-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Subject":"[libcamera-devel] [PATCH 15/30] libcamera: buffer: Move capture\n\tinformation to BufferInfo","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>","X-List-Received-Date":"Tue, 26 Nov 2019 23:39:36 -0000"},"content":"Move the metadata information retrieved when dequeuing a V4L2 buffer\ninto a BufferInfo. This is done as a step to migrate to the FrameBuffer\ninterface as the functions added to Buffer around BufferInfo matches the\none in FrameBuffer.\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n---\n include/libcamera/buffer.h               |  2 ++\n src/android/camera_device.cpp            |  4 +--\n src/cam/buffer_writer.cpp                |  2 +-\n src/cam/capture.cpp                      |  8 ++++--\n src/libcamera/buffer.cpp                 | 34 +++++++++++++++++-------\n src/libcamera/pipeline/ipu3/ipu3.cpp     |  4 +--\n src/libcamera/pipeline/rkisp1/rkisp1.cpp |  8 +++---\n src/libcamera/request.cpp                |  2 +-\n src/libcamera/v4l2_videodevice.cpp       | 23 +++++++++-------\n src/qcam/main_window.cpp                 | 13 ++++-----\n test/camera/buffer_import.cpp            |  2 +-\n test/camera/capture.cpp                  |  2 +-\n test/v4l2_videodevice/buffer_sharing.cpp | 12 ++++++---\n 13 files changed, 72 insertions(+), 44 deletions(-)","diff":"diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h\nindex d6db6138ca11d5fe..2e5376fb8b53a4c5 100644\n--- a/include/libcamera/buffer.h\n+++ b/include/libcamera/buffer.h\n@@ -122,6 +122,7 @@ public:\n \tunsigned int bytesused() const { return bytesused_; }\n \tuint64_t timestamp() const { return timestamp_; }\n \tunsigned int sequence() const { return sequence_; }\n+\tconst BufferInfo &info() const { return info_; };\n \n \tStatus status() const { return status_; }\n \tRequest *request() const { return request_; }\n@@ -142,6 +143,7 @@ private:\n \tunsigned int bytesused_;\n \tuint64_t timestamp_;\n \tunsigned int sequence_;\n+\tBufferInfo info_;\n \n \tStatus status_;\n \tRequest *request_;\ndiff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp\nindex 09588c16a6301649..55b29a9a41ab8943 100644\n--- a/src/android/camera_device.cpp\n+++ b/src/android/camera_device.cpp\n@@ -803,11 +803,11 @@ void CameraDevice::requestComplete(Request *request)\n \n \tif (status == CAMERA3_BUFFER_STATUS_OK) {\n \t\tnotifyShutter(descriptor->frameNumber,\n-\t\t\t      libcameraBuffer->timestamp());\n+\t\t\t      libcameraBuffer->info().timestamp());\n \n \t\tcaptureResult.partial_result = 1;\n \t\tresultMetadata = getResultMetadata(descriptor->frameNumber,\n-\t\t\t\t\t\t   libcameraBuffer->timestamp());\n+\t\t\t\t\t\t   libcameraBuffer->info().timestamp());\n \t\tcaptureResult.result = resultMetadata->get();\n \t}\n \ndiff --git a/src/cam/buffer_writer.cpp b/src/cam/buffer_writer.cpp\nindex 5967efca07254666..b6b40baeee661df6 100644\n--- a/src/cam/buffer_writer.cpp\n+++ b/src/cam/buffer_writer.cpp\n@@ -32,7 +32,7 @@ int BufferWriter::write(Buffer *buffer, const std::string &streamName)\n \tif (pos != std::string::npos) {\n \t\tstd::stringstream ss;\n \t\tss << streamName << \"-\" << std::setw(6)\n-\t\t   << std::setfill('0') << buffer->sequence();\n+\t\t   << std::setfill('0') << buffer->info().sequence();\n \t\tfilename.replace(pos, 1, ss.str());\n \t}\n \ndiff --git a/src/cam/capture.cpp b/src/cam/capture.cpp\nindex 1a4dbe7ce4a15a2d..a4fa88a8d99669bc 100644\n--- a/src/cam/capture.cpp\n+++ b/src/cam/capture.cpp\n@@ -155,8 +155,12 @@ void Capture::requestComplete(Request *request)\n \t\tconst std::string &name = streamName_[stream];\n \n \t\tinfo << \" \" << name\n-\t\t     << \" seq: \" << std::setw(6) << std::setfill('0') << buffer->sequence()\n-\t\t     << \" bytesused: \" << buffer->bytesused();\n+\t\t     << \" seq: \" << std::setw(6) << std::setfill('0') << buffer->info().sequence();\n+\n+\t\tunsigned int nplane = 0;\n+\t\tfor (const BufferInfo::Plane &plane : buffer->info().planes())\n+\t\t\tinfo << \" bytesused(\" << nplane++ << \"): \"\n+\t\t\t     << plane.bytesused;\n \n \t\tif (writer_)\n \t\t\twriter_->write(buffer, name);\ndiff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp\nindex 7043345c3f3207cd..d5a4815a0bb8c528 100644\n--- a/src/libcamera/buffer.cpp\n+++ b/src/libcamera/buffer.cpp\n@@ -375,15 +375,22 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata)\n \t  status_(Buffer::BufferSuccess), request_(nullptr),\n \t  stream_(nullptr)\n {\n+\tunsigned int sequence;\n+\tuint64_t timestamp;\n+\tunsigned int bytesused;\n+\n \tif (metadata) {\n-\t\tbytesused_ = metadata->bytesused_;\n-\t\tsequence_ = metadata->sequence_;\n-\t\ttimestamp_ = metadata->timestamp_;\n+\t\tbytesused = metadata->info().planes()[0].bytesused;\n+\t\tsequence = metadata->info().sequence();\n+\t\ttimestamp = metadata->info().timestamp();\n \t} else {\n-\t\tbytesused_ = 0;\n-\t\tsequence_ = 0;\n-\t\ttimestamp_ = 0;\n+\t\tbytesused = 0;\n+\t\tsequence = 0;\n+\t\ttimestamp = 0;\n \t}\n+\n+\tinfo_.update(BufferInfo::BufferSuccess, sequence, timestamp,\n+\t\t     { { bytesused } });\n }\n \n /**\n@@ -439,6 +446,16 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata)\n  * \\return Sequence number of the buffer\n  */\n \n+/**\n+ * \\fn Buffer::info()\n+ * \\brief Retrieve the buffer metadata information\n+ *\n+ * The buffer metadata information is update every time the buffer contained\n+ * are changed, for example when it is dequeued from hardware.\n+ *\n+ * \\return Metadata of the buffer\n+ */\n+\n /**\n  * \\fn Buffer::status()\n  * \\brief Retrieve the buffer status\n@@ -482,10 +499,7 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata)\n  */\n void Buffer::cancel()\n {\n-\tbytesused_ = 0;\n-\ttimestamp_ = 0;\n-\tsequence_ = 0;\n-\tstatus_ = BufferCancelled;\n+\tinfo_.update(BufferInfo::BufferCancelled, 0, 0, { {} });\n }\n \n /**\ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex ad223d9101bdc6ed..8ba08351c950f5e2 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -928,7 +928,7 @@ int PipelineHandlerIPU3::registerCameras()\n void IPU3CameraData::imguInputBufferReady(Buffer *buffer)\n {\n \t/* \\todo Handle buffer failures when state is set to BufferError. */\n-\tif (buffer->status() == Buffer::BufferCancelled)\n+\tif (buffer->info().status() == BufferInfo::BufferCancelled)\n \t\treturn;\n \n \tcio2_.output_->queueBuffer(buffer);\n@@ -962,7 +962,7 @@ void IPU3CameraData::imguOutputBufferReady(Buffer *buffer)\n void IPU3CameraData::cio2BufferReady(Buffer *buffer)\n {\n \t/* \\todo Handle buffer failures when state is set to BufferError. */\n-\tif (buffer->status() == Buffer::BufferCancelled)\n+\tif (buffer->info().status() == BufferInfo::BufferCancelled)\n \t\treturn;\n \n \timgu_->input_->queueBuffer(buffer);\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex e8b6a278e97b0ba0..6ad9b57d8353896c 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -100,10 +100,10 @@ public:\n \t\tASSERT(frameOffset(SOE) == 0);\n \n \t\tutils::time_point soe = std::chrono::time_point<utils::clock>()\n-\t\t\t+ std::chrono::nanoseconds(buffer->timestamp())\n+\t\t\t+ std::chrono::nanoseconds(buffer->info().timestamp())\n \t\t\t+ timeOffset(SOE);\n \n-\t\tnotifyStartOfExposure(buffer->sequence(), soe);\n+\t\tnotifyStartOfExposure(buffer->info().sequence(), soe);\n \t}\n \n \tvoid setDelay(unsigned int type, int frame, int msdelay)\n@@ -1006,8 +1006,8 @@ void PipelineHandlerRkISP1::bufferReady(Buffer *buffer)\n \n \tdata->timeline_.bufferReady(buffer);\n \n-\tif (data->frame_ <= buffer->sequence())\n-\t\tdata->frame_ = buffer->sequence() + 1;\n+\tif (data->frame_ <= buffer->info().sequence())\n+\t\tdata->frame_ = buffer->info().sequence() + 1;\n \n \tcompleteBuffer(activeCamera_, request, buffer);\n \ttryCompleteRequest(request);\ndiff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp\nindex 3b49e52510918eee..7593bf9dfa546401 100644\n--- a/src/libcamera/request.cpp\n+++ b/src/libcamera/request.cpp\n@@ -260,7 +260,7 @@ bool Request::completeBuffer(Buffer *buffer)\n \n \tbuffer->request_ = nullptr;\n \n-\tif (buffer->status() == Buffer::BufferCancelled)\n+\tif (buffer->info().status() == BufferInfo::BufferCancelled)\n \t\tcancelled_ = true;\n \n \treturn !hasPendingBuffers();\ndiff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\nindex cc0a1c9382a2b1ed..8f962c7e9d0c7d01 100644\n--- a/src/libcamera/v4l2_videodevice.cpp\n+++ b/src/libcamera/v4l2_videodevice.cpp\n@@ -1012,10 +1012,12 @@ int V4L2VideoDevice::queueBuffer(Buffer *buffer)\n \t}\n \n \tif (V4L2_TYPE_IS_OUTPUT(buf.type)) {\n-\t\tbuf.bytesused = buffer->bytesused_;\n-\t\tbuf.sequence = buffer->sequence_;\n-\t\tbuf.timestamp.tv_sec = buffer->timestamp_ / 1000000000;\n-\t\tbuf.timestamp.tv_usec = (buffer->timestamp_ / 1000) % 1000000;\n+\t\tconst BufferInfo &info = buffer->info();\n+\n+\t\tbuf.bytesused = info.planes()[0].bytesused;\n+\t\tbuf.sequence = info.sequence();\n+\t\tbuf.timestamp.tv_sec = info.timestamp() / 1000000000;\n+\t\tbuf.timestamp.tv_usec = (info.timestamp() / 1000) % 1000000;\n \t}\n \n \tLOG(V4L2, Debug) << \"Queueing buffer \" << buf.index;\n@@ -1121,12 +1123,13 @@ Buffer *V4L2VideoDevice::dequeueBuffer()\n \t\tfdEvent_->setEnabled(false);\n \n \tbuffer->index_ = buf.index;\n-\tbuffer->bytesused_ = buf.bytesused;\n-\tbuffer->timestamp_ = buf.timestamp.tv_sec * 1000000000ULL\n-\t\t\t   + buf.timestamp.tv_usec * 1000ULL;\n-\tbuffer->sequence_ = buf.sequence;\n-\tbuffer->status_ = buf.flags & V4L2_BUF_FLAG_ERROR\n-\t\t\t? Buffer::BufferError : Buffer::BufferSuccess;\n+\n+\tBufferInfo::Status status = buf.flags & V4L2_BUF_FLAG_ERROR\n+\t\t? BufferInfo::BufferError : BufferInfo::BufferSuccess;\n+\tuint64_t timestamp = buf.timestamp.tv_sec * 1000000000ULL\n+\t\t+ buf.timestamp.tv_usec * 1000ULL;\n+\n+\tbuffer->info_.update(status, buf.sequence, timestamp, { { buf.bytesused } });\n \n \treturn buffer;\n }\ndiff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\nindex 4cecf7e351214f3d..771020112f09b1ef 100644\n--- a/src/qcam/main_window.cpp\n+++ b/src/qcam/main_window.cpp\n@@ -258,14 +258,15 @@ void MainWindow::requestComplete(Request *request)\n \tframesCaptured_++;\n \n \tBuffer *buffer = buffers.begin()->second;\n+\tconst BufferInfo &info = buffer->info();\n \n-\tdouble fps = buffer->timestamp() - lastBufferTime_;\n+\tdouble fps = info.timestamp() - lastBufferTime_;\n \tfps = lastBufferTime_ && fps ? 1000000000.0 / fps : 0.0;\n-\tlastBufferTime_ = buffer->timestamp();\n+\tlastBufferTime_ = info.timestamp();\n \n-\tstd::cout << \"seq: \" << std::setw(6) << std::setfill('0') << buffer->sequence()\n-\t\t  << \" bytesused: \" << buffer->bytesused()\n-\t\t  << \" timestamp: \" << buffer->timestamp()\n+\tstd::cout << \"seq: \" << std::setw(6) << std::setfill('0') << info.sequence()\n+\t\t  << \" bytesused: \" << info.planes()[0].bytesused\n+\t\t  << \" timestamp: \" << info.timestamp()\n \t\t  << \" fps: \" << std::fixed << std::setprecision(2) << fps\n \t\t  << std::endl;\n \n@@ -302,7 +303,7 @@ int MainWindow::display(Buffer *buffer)\n \n \tDmabuf &dmabuf = mem->planes().front();\n \tunsigned char *raw = static_cast<unsigned char *>(dmabuf.mem());\n-\tviewfinder_->display(raw, buffer->bytesused());\n+\tviewfinder_->display(raw, buffer->info().planes()[0].bytesused);\n \n \treturn 0;\n }\ndiff --git a/test/camera/buffer_import.cpp b/test/camera/buffer_import.cpp\nindex dae907f9f41841c9..5dbaed9255d3d60c 100644\n--- a/test/camera/buffer_import.cpp\n+++ b/test/camera/buffer_import.cpp\n@@ -275,7 +275,7 @@ public:\n protected:\n \tvoid bufferComplete(Request *request, Buffer *buffer)\n \t{\n-\t\tif (buffer->status() != Buffer::BufferSuccess)\n+\t\tif (buffer->info().status() != BufferInfo::BufferSuccess)\n \t\t\treturn;\n \n \t\tunsigned int index = buffer->index();\ndiff --git a/test/camera/capture.cpp b/test/camera/capture.cpp\nindex ca1ebe419946dd4d..8307ea2629801679 100644\n--- a/test/camera/capture.cpp\n+++ b/test/camera/capture.cpp\n@@ -28,7 +28,7 @@ protected:\n \n \tvoid bufferComplete(Request *request, Buffer *buffer)\n \t{\n-\t\tif (buffer->status() != Buffer::BufferSuccess)\n+\t\tif (buffer->info().status() != BufferInfo::BufferSuccess)\n \t\t\treturn;\n \n \t\tcompleteBuffersCount_++;\ndiff --git a/test/v4l2_videodevice/buffer_sharing.cpp b/test/v4l2_videodevice/buffer_sharing.cpp\nindex d02c391b95933922..6b71caef111693d6 100644\n--- a/test/v4l2_videodevice/buffer_sharing.cpp\n+++ b/test/v4l2_videodevice/buffer_sharing.cpp\n@@ -92,10 +92,12 @@ protected:\n \n \tvoid captureBufferReady(Buffer *buffer)\n \t{\n+\t\tconst BufferInfo &info = buffer->info();\n+\n \t\tstd::cout << \"Received capture buffer  sequence \"\n-\t\t\t  << buffer->sequence() << std::endl;\n+\t\t\t  << info.sequence() << std::endl;\n \n-\t\tif (buffer->status() != Buffer::BufferSuccess)\n+\t\tif (info.status() != BufferInfo::BufferSuccess)\n \t\t\treturn;\n \n \t\toutput_->queueBuffer(buffer);\n@@ -104,10 +106,12 @@ protected:\n \n \tvoid outputBufferReady(Buffer *buffer)\n \t{\n+\t\tconst BufferInfo &info = buffer->info();\n+\n \t\tstd::cout << \"Received output buffer sequence \"\n-\t\t\t  << buffer->sequence() << std::endl;\n+\t\t\t  << info.sequence() << std::endl;\n \n-\t\tif (buffer->status() != Buffer::BufferSuccess)\n+\t\tif (info.status() != BufferInfo::BufferSuccess)\n \t\t\treturn;\n \n \t\tcapture_->queueBuffer(buffer);\n","prefixes":["libcamera-devel","15/30"]}