[libcamera-devel,v3,2/5] cam: Extend BufferWriter to include a stream name in file path

Message ID 20190405235929.27987-3-niklas.soderlund@ragnatech.se
State Superseded
Headers show
Series
  • cam: Add support to specify multiple stream configurations with roles
Related show

Commit Message

Niklas Söderlund April 5, 2019, 11:59 p.m. UTC
To be able to write multiple buffers captured in the same request  and
hence have the same sequence number the buffer writer needs to name each
file uniquely. Add a stream name to the writer function which the buffer
writer can add to the part of the pattern it already expands to the
sequence number. As cam only supports one streams, hard code the name to
stream0.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 src/cam/buffer_writer.cpp | 6 ++++--
 src/cam/buffer_writer.h   | 2 +-
 src/cam/main.cpp          | 4 ++--
 3 files changed, 7 insertions(+), 5 deletions(-)

Comments

Laurent Pinchart April 6, 2019, 5:13 p.m. UTC | #1
Hi Niklas,

Thank you for the patch.

On Sat, Apr 06, 2019 at 01:59:26AM +0200, Niklas Söderlund wrote:
> To be able to write multiple buffers captured in the same request  and
> hence have the same sequence number the buffer writer needs to name each

"To be able to write multiple buffers captured in the same request (and
hence having the same sequence number) the buffer writer needs to name
each file uniquely."

> file uniquely. Add a stream name to the writer function which the buffer
> writer can add to the part of the pattern it already expands to the
> sequence number. As cam only supports one streams, hard code the name to

s/streams/stream/

> stream0.
> 
> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  src/cam/buffer_writer.cpp | 6 ++++--
>  src/cam/buffer_writer.h   | 2 +-
>  src/cam/main.cpp          | 4 ++--
>  3 files changed, 7 insertions(+), 5 deletions(-)
> 
> diff --git a/src/cam/buffer_writer.cpp b/src/cam/buffer_writer.cpp
> index 2d2258b4cd1cbbc2..e0374ffcb3199d30 100644
> --- a/src/cam/buffer_writer.cpp
> +++ b/src/cam/buffer_writer.cpp
> @@ -19,7 +19,8 @@ BufferWriter::BufferWriter(const std::string &pattern)
>  {
>  }
>  
> -int BufferWriter::write(libcamera::Buffer *buffer)
> +int BufferWriter::write(libcamera::Buffer *buffer,
> +			const std::string &streamName)
>  {
>  	std::string filename;
>  	size_t pos;
> @@ -29,7 +30,8 @@ int BufferWriter::write(libcamera::Buffer *buffer)
>  	pos = filename.find_first_of('#');
>  	if (pos != std::string::npos) {
>  		std::stringstream ss;
> -		ss << std::setw(6) << std::setfill('0') << buffer->sequence();
> +		ss << streamName << "-" << std::setw(6)
> +		   << std::setfill('0') << buffer->sequence();
>  		filename.replace(pos, 1, ss.str());
>  	}
>  
> diff --git a/src/cam/buffer_writer.h b/src/cam/buffer_writer.h
> index 9705773e0e397d45..7bf785d1e83235ff 100644
> --- a/src/cam/buffer_writer.h
> +++ b/src/cam/buffer_writer.h
> @@ -16,7 +16,7 @@ class BufferWriter
>  public:
>  	BufferWriter(const std::string &pattern = "frame-#.bin");
>  
> -	int write(libcamera::Buffer *buffer);
> +	int write(libcamera::Buffer *buffer, const std::string &streamName);
>  
>  private:
>  	std::string pattern_;
> diff --git a/src/cam/main.cpp b/src/cam/main.cpp
> index 41a4d9c6b7afa684..3dd4b24d2401162c 100644
> --- a/src/cam/main.cpp
> +++ b/src/cam/main.cpp
> @@ -57,7 +57,7 @@ static int parseOptions(int argc, char *argv[])
>  			 "Capture until interrupted by user", "capture");
>  	parser.addOption(OptFile, OptionString,
>  			 "Write captured frames to disk\n"
> -			 "The first '#' character in the file name is expanded to the frame sequence number.\n"
> +			 "The first '#' character in the file name is expanded to the stream name and frame sequence number.\n"
>  			 "The default file name is 'frame-#.bin'.",
>  			 "file", ArgumentOptional, "filename");
>  	parser.addOption(OptStream, &streamKeyValue,
> @@ -121,7 +121,7 @@ static void requestComplete(Request *request, const std::map<Stream *, Buffer *>
>  		  << std::endl;
>  
>  	if (writer)
> -		writer->write(buffer);
> +		writer->write(buffer, "stream0");
>  
>  	request = camera->createRequest();
>  	if (!request) {

Patch

diff --git a/src/cam/buffer_writer.cpp b/src/cam/buffer_writer.cpp
index 2d2258b4cd1cbbc2..e0374ffcb3199d30 100644
--- a/src/cam/buffer_writer.cpp
+++ b/src/cam/buffer_writer.cpp
@@ -19,7 +19,8 @@  BufferWriter::BufferWriter(const std::string &pattern)
 {
 }
 
-int BufferWriter::write(libcamera::Buffer *buffer)
+int BufferWriter::write(libcamera::Buffer *buffer,
+			const std::string &streamName)
 {
 	std::string filename;
 	size_t pos;
@@ -29,7 +30,8 @@  int BufferWriter::write(libcamera::Buffer *buffer)
 	pos = filename.find_first_of('#');
 	if (pos != std::string::npos) {
 		std::stringstream ss;
-		ss << std::setw(6) << std::setfill('0') << buffer->sequence();
+		ss << streamName << "-" << std::setw(6)
+		   << std::setfill('0') << buffer->sequence();
 		filename.replace(pos, 1, ss.str());
 	}
 
diff --git a/src/cam/buffer_writer.h b/src/cam/buffer_writer.h
index 9705773e0e397d45..7bf785d1e83235ff 100644
--- a/src/cam/buffer_writer.h
+++ b/src/cam/buffer_writer.h
@@ -16,7 +16,7 @@  class BufferWriter
 public:
 	BufferWriter(const std::string &pattern = "frame-#.bin");
 
-	int write(libcamera::Buffer *buffer);
+	int write(libcamera::Buffer *buffer, const std::string &streamName);
 
 private:
 	std::string pattern_;
diff --git a/src/cam/main.cpp b/src/cam/main.cpp
index 41a4d9c6b7afa684..3dd4b24d2401162c 100644
--- a/src/cam/main.cpp
+++ b/src/cam/main.cpp
@@ -57,7 +57,7 @@  static int parseOptions(int argc, char *argv[])
 			 "Capture until interrupted by user", "capture");
 	parser.addOption(OptFile, OptionString,
 			 "Write captured frames to disk\n"
-			 "The first '#' character in the file name is expanded to the frame sequence number.\n"
+			 "The first '#' character in the file name is expanded to the stream name and frame sequence number.\n"
 			 "The default file name is 'frame-#.bin'.",
 			 "file", ArgumentOptional, "filename");
 	parser.addOption(OptStream, &streamKeyValue,
@@ -121,7 +121,7 @@  static void requestComplete(Request *request, const std::map<Stream *, Buffer *>
 		  << std::endl;
 
 	if (writer)
-		writer->write(buffer);
+		writer->write(buffer, "stream0");
 
 	request = camera->createRequest();
 	if (!request) {