Patch Detail
Show a patch.
GET /api/patches/2363/?format=api
{ "id": 2363, "url": "https://patchwork.libcamera.org/api/patches/2363/?format=api", "web_url": "https://patchwork.libcamera.org/patch/2363/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "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=api", "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=api", "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" ] }