<div dir="ltr">Hi all,<div><br></div><div>Gentle ping to get some feedback on this patch set when you get a moment.</div><div><br></div><div>Regards,</div><div>Naush</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 26 Oct 2020 at 09:53, Naushir Patuck <<a href="mailto:naush@raspberrypi.com">naush@raspberrypi.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Use a MappedFrameBuffer to mmap embedded data buffers for the pipeline<br>
handler to use in the cases where the sensor does not fill it in. This<br>
avoids the need to mmap and unmap on every frame.<br>
<br>
Signed-off-by: Naushir Patuck <<a href="mailto:naush@raspberrypi.com" target="_blank">naush@raspberrypi.com</a>><br>
---<br>
 .../pipeline/raspberrypi/raspberrypi.cpp      | 35 ++++++++++++++-----<br>
 1 file changed, 27 insertions(+), 8 deletions(-)<br>
<br>
diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp<br>
index dd62dfc7..8817915b 100644<br>
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp<br>
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp<br>
@@ -24,6 +24,7 @@<br>
 #include <linux/videodev2.h><br>
<br>
 #include "libcamera/internal/bayer_format.h"<br>
+#include "libcamera/internal/buffer.h"<br>
 #include "libcamera/internal/camera_sensor.h"<br>
 #include "libcamera/internal/device_enumerator.h"<br>
 #include "libcamera/internal/ipa_manager.h"<br>
@@ -165,6 +166,12 @@ public:<br>
        /* Stores the ids of the buffers mapped in the IPA. */<br>
        std::unordered_set<unsigned int> ipaBuffers_;<br>
<br>
+       /*<br>
+        * Map of (internal) mmaped embedded data buffers, to avoid having to<br>
+        * map/unmap on every frame.<br>
+        */<br>
+       std::map<unsigned int, MappedFrameBuffer> mappedEmbeddedBuffers_;<br>
+<br>
        /* DMAHEAP allocation helper. */<br>
        RPi::DmaHeap dmaHeap_;<br>
        FileDescriptor lsTable_;<br>
@@ -1040,6 +1047,15 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)<br>
                        return ret;<br>
        }<br>
<br>
+       if (!data->sensorMetadata_) {<br>
+               for (auto const &it : data->unicam_[Unicam::Embedded].getBuffers()) {<br>
+                       data->mappedEmbeddedBuffers_.emplace(std::piecewise_construct,<br>
+                                                            std::forward_as_tuple(it.first),<br>
+                                                            std::forward_as_tuple(<br>
+                                                            MappedFrameBuffer(it.second, PROT_READ | PROT_WRITE)));<br>
+               }<br>
+       }<br>
+<br>
        /*<br>
         * Pass the stats and embedded data buffers to the IPA. No other<br>
         * buffers need to be passed.<br>
@@ -1078,6 +1094,7 @@ void PipelineHandlerRPi::freeBuffers(Camera *camera)<br>
        std::vector<unsigned int> ipaBuffers(data->ipaBuffers_.begin(), data->ipaBuffers_.end());<br>
        data->ipa_->unmapBuffers(ipaBuffers);<br>
        data->ipaBuffers_.clear();<br>
+       data->mappedEmbeddedBuffers_.clear();<br>
<br>
        for (auto const stream : data->streams_)<br>
                stream->releaseBuffers();<br>
@@ -1310,14 +1327,16 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)<br>
                 * metadata buffer.<br>
                 */<br>
                if (!sensorMetadata_) {<br>
-                       const FrameBuffer &fb = buffer->planes();<br>
-                       uint32_t *mem = static_cast<uint32_t *>(::mmap(nullptr, fb.planes()[0].length,<br>
-                                                                      PROT_READ | PROT_WRITE,<br>
-                                                                      MAP_SHARED,<br>
-                                                                      fb.planes()[0].fd.fd(), 0));<br>
-                       mem[0] = ctrl[V4L2_CID_EXPOSURE];<br>
-                       mem[1] = ctrl[V4L2_CID_ANALOGUE_GAIN];<br>
-                       munmap(mem, fb.planes()[0].length);<br>
+                       unsigned int bufferId = unicam_[Unicam::Embedded].getBufferId(buffer);<br>
+                       auto it = mappedEmbeddedBuffers_.find(bufferId);<br>
+                       if (it != mappedEmbeddedBuffers_.end()) {<br>
+                               uint32_t *mem = reinterpret_cast<uint32_t *>(it->second.maps()[0].data());<br>
+                               mem[0] = ctrl[V4L2_CID_EXPOSURE];<br>
+                               mem[1] = ctrl[V4L2_CID_ANALOGUE_GAIN];<br>
+                       } else {<br>
+                               LOG(RPI, Warning) << "Failed to find embedded buffer "<br>
+                                                 << bufferId;<br>
+                       }<br>
                }<br>
        }<br>
<br>
-- <br>
2.25.1<br>
<br>
</blockquote></div>