[libcamera-devel] [PATCH 2/3] cam: Pass stream names to FileSink

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Oct 12 04:23:20 CEST 2021


The FileSink class constructs stream names internally the same way that
the CameraSession does, except that it fails to add the camera name.
This results in files being written without the camera name.

This could be fixed in FileSink, but we would still duplicate code to
construct stream names. Pass the stream names map from CameraSession to
FileSink instead, and store it internally.

Fixes: 02001fecb0f5 ("cam: Turn BufferWriter into a FrameSink")
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/cam/camera_session.cpp |  5 +++--
 src/cam/file_sink.cpp      | 11 +++--------
 src/cam/file_sink.h        |  3 ++-
 3 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp
index 5a25baab03f5..605018278c5a 100644
--- a/src/cam/camera_session.cpp
+++ b/src/cam/camera_session.cpp
@@ -193,9 +193,10 @@ int CameraSession::start()
 
 	if (options_.isSet(OptFile)) {
 		if (!options_[OptFile].toString().empty())
-			sink_ = std::make_unique<FileSink>(options_[OptFile]);
+			sink_ = std::make_unique<FileSink>(streamNames_,
+							   options_[OptFile]);
 		else
-			sink_ = std::make_unique<FileSink>();
+			sink_ = std::make_unique<FileSink>(streamNames_);
 	}
 
 	if (sink_) {
diff --git a/src/cam/file_sink.cpp b/src/cam/file_sink.cpp
index 3c2e565b27a2..45213d4a54fe 100644
--- a/src/cam/file_sink.cpp
+++ b/src/cam/file_sink.cpp
@@ -20,8 +20,9 @@
 
 using namespace libcamera;
 
-FileSink::FileSink(const std::string &pattern)
-	: pattern_(pattern)
+FileSink::FileSink(const std::map<const libcamera::Stream *, std::string> &streamNames,
+		   const std::string &pattern)
+	: streamNames_(streamNames), pattern_(pattern)
 {
 }
 
@@ -35,12 +36,6 @@ int FileSink::configure(const libcamera::CameraConfiguration &config)
 	if (ret < 0)
 		return ret;
 
-	streamNames_.clear();
-	for (unsigned int index = 0; index < config.size(); ++index) {
-		const StreamConfiguration &cfg = config.at(index);
-		streamNames_[cfg.stream()] = "stream" + std::to_string(index);
-	}
-
 	return 0;
 }
 
diff --git a/src/cam/file_sink.h b/src/cam/file_sink.h
index 335be93b8732..8de93a01a1e8 100644
--- a/src/cam/file_sink.h
+++ b/src/cam/file_sink.h
@@ -20,7 +20,8 @@ class Image;
 class FileSink : public FrameSink
 {
 public:
-	FileSink(const std::string &pattern = "");
+	FileSink(const std::map<const libcamera::Stream *, std::string> &streamNames,
+		 const std::string &pattern = "");
 	~FileSink();
 
 	int configure(const libcamera::CameraConfiguration &config) override;
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list