linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4l-utils] v4l2-ctl: Move some code from do_handle_cap to a new function
@ 2018-12-29 15:32 Dafna Hirschfeld
  0 siblings, 0 replies; only message in thread
From: Dafna Hirschfeld @ 2018-12-29 15:32 UTC (permalink / raw)
  To: linux-media; +Cc: hverkuil, helen.koike, Dafna Hirschfeld

Move the code that deals with reading from file in
'do_handle_cap' to a new function 'write_buffer_to_file'

Signed-off-by: Dafna Hirschfeld <dafna3@gmail.com>
---
 utils/v4l2-ctl/v4l2-ctl-streaming.cpp | 139 +++++++++++++-------------
 1 file changed, 72 insertions(+), 67 deletions(-)

diff --git a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
index dee104d7..6f471842 100644
--- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
+++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
@@ -926,6 +926,76 @@ static int do_setup_out_buffers(cv4l_fd &fd, cv4l_queue &q, FILE *fin, bool qbuf
 	return 0;
 }
 
+static void write_buffer_to_file(cv4l_queue &q, cv4l_buffer &buf, FILE *fout)
+{
+#ifndef NO_STREAM_TO
+	unsigned comp_size[VIDEO_MAX_PLANES];
+	__u8 *comp_ptr[VIDEO_MAX_PLANES];
+
+	if (host_fd_to >= 0) {
+		unsigned tot_comp_size = 0;
+		unsigned tot_used = 0;
+
+		for (unsigned j = 0; j < buf.g_num_planes(); j++) {
+			__u32 used = buf.g_bytesused();
+			unsigned offset = buf.g_data_offset();
+			u8 *p = (u8 *)q.g_dataptr(buf.g_index(), j) + offset;
+
+			if (ctx) {
+				comp_ptr[j] = fwht_compress(ctx, p,
+						used - offset, &comp_size[j]);
+			} else {
+				comp_ptr[j] = p;
+				comp_size[j] = rle_compress(p, used - offset,
+						bpl_cap[j]);
+			}
+			tot_comp_size += comp_size[j];
+			tot_used += used - offset;
+		}
+		write_u32(fout, ctx ? V4L_STREAM_PACKET_FRAME_VIDEO_FWHT :
+				V4L_STREAM_PACKET_FRAME_VIDEO_RLE);
+		write_u32(fout, V4L_STREAM_PACKET_FRAME_VIDEO_SIZE(buf.g_num_planes()) + tot_comp_size);
+		write_u32(fout, V4L_STREAM_PACKET_FRAME_VIDEO_SIZE_HDR);
+		write_u32(fout, buf.g_field());
+		write_u32(fout, buf.g_flags());
+		comp_perc += (tot_comp_size * 100 / tot_used);
+		comp_perc_count++;
+	}
+	if (to_with_hdr)
+		write_u32(fout, FILE_HDR_ID);
+	for (unsigned j = 0; j < buf.g_num_planes(); j++) {
+		__u32 used = buf.g_bytesused();
+		unsigned offset = buf.g_data_offset();
+		unsigned sz;
+
+		if (offset > used) {
+			// Should never happen
+			fprintf(stderr, "offset %d > used %d!\n",
+					offset, used);
+			offset = 0;
+		}
+		used -= offset;
+		if (host_fd_to >= 0) {
+			write_u32(fout, V4L_STREAM_PACKET_FRAME_VIDEO_SIZE_PLANE_HDR);
+			write_u32(fout, used);
+			write_u32(fout, comp_size[j]);
+			used = comp_size[j];
+		} else if (to_with_hdr) {
+			write_u32(fout, used);
+		}
+		if (host_fd_to >= 0)
+			sz = fwrite(comp_ptr[j] + offset, 1, used, fout);
+		else
+			sz = fwrite((u8 *)q.g_dataptr(buf.g_index(), j) + offset, 1, used, fout);
+
+		if (sz != used)
+			fprintf(stderr, "%u != %u\n", sz, used);
+	}
+	if (host_fd_to >= 0)
+		fflush(fout);
+#endif
+}
+
 static int do_handle_cap(cv4l_fd &fd, cv4l_queue &q, FILE *fout, int *index,
 			 unsigned &count, fps_timestamps &fps_ts)
 {
@@ -964,75 +1034,10 @@ static int do_handle_cap(cv4l_fd &fd, cv4l_queue &q, FILE *fout, int *index,
 	double ts_secs = buf.g_timestamp().tv_sec + buf.g_timestamp().tv_usec / 1000000.0;
 	fps_ts.add_ts(ts_secs, buf.g_sequence(), buf.g_field());
 
-#ifndef NO_STREAM_TO
 	if (fout && (!stream_skip || ignore_count_skip) &&
-	    buf.g_bytesused(0) && !(buf.g_flags() & V4L2_BUF_FLAG_ERROR)) {
-		unsigned comp_size[VIDEO_MAX_PLANES];
-		__u8 *comp_ptr[VIDEO_MAX_PLANES];
-
-		if (host_fd_to >= 0) {
-			unsigned tot_comp_size = 0;
-			unsigned tot_used = 0;
-
-			for (unsigned j = 0; j < buf.g_num_planes(); j++) {
-				__u32 used = buf.g_bytesused();
-				unsigned offset = buf.g_data_offset();
-				u8 *p = (u8 *)q.g_dataptr(buf.g_index(), j) + offset;
-
-				if (ctx) {
-					comp_ptr[j] = fwht_compress(ctx, p,
-								    used - offset, &comp_size[j]);
-				} else {
-					comp_ptr[j] = p;
-					comp_size[j] = rle_compress(p, used - offset,
-								    bpl_cap[j]);
-				}
-				tot_comp_size += comp_size[j];
-				tot_used += used - offset;
-			}
-			write_u32(fout, ctx ? V4L_STREAM_PACKET_FRAME_VIDEO_FWHT :
-					      V4L_STREAM_PACKET_FRAME_VIDEO_RLE);
-			write_u32(fout, V4L_STREAM_PACKET_FRAME_VIDEO_SIZE(buf.g_num_planes()) + tot_comp_size);
-			write_u32(fout, V4L_STREAM_PACKET_FRAME_VIDEO_SIZE_HDR);
-			write_u32(fout, buf.g_field());
-			write_u32(fout, buf.g_flags());
-			comp_perc += (tot_comp_size * 100 / tot_used);
-			comp_perc_count++;
-		}
-		if (to_with_hdr)
-			write_u32(fout, FILE_HDR_ID);
-		for (unsigned j = 0; j < buf.g_num_planes(); j++) {
-			__u32 used = buf.g_bytesused();
-			unsigned offset = buf.g_data_offset();
-			unsigned sz;
+	    buf.g_bytesused(0) && !(buf.g_flags() & V4L2_BUF_FLAG_ERROR))
+		write_buffer_to_file(q, buf, fout);
 
-			if (offset > used) {
-				// Should never happen
-				fprintf(stderr, "offset %d > used %d!\n",
-					offset, used);
-				offset = 0;
-			}
-			used -= offset;
-			if (host_fd_to >= 0) {
-				write_u32(fout, V4L_STREAM_PACKET_FRAME_VIDEO_SIZE_PLANE_HDR);
-				write_u32(fout, used);
-				write_u32(fout, comp_size[j]);
-				used = comp_size[j];
-			} else if (to_with_hdr) {
-				write_u32(fout, used);
-			}
-			if (host_fd_to >= 0)
-				sz = fwrite(comp_ptr[j] + offset, 1, used, fout);
-			else
-				sz = fwrite((u8 *)q.g_dataptr(buf.g_index(), j) + offset, 1, used, fout);
-
-			if (sz != used)
-				fprintf(stderr, "%u != %u\n", sz, used);
-		}
-		if (host_fd_to >= 0)
-			fflush(fout);
-	}
-#endif
 	if (buf.g_flags() & V4L2_BUF_FLAG_KEYFRAME)
 		ch = 'K';
 	else if (buf.g_flags() & V4L2_BUF_FLAG_PFRAME)
-- 
2.17.1


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2018-12-29 15:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-29 15:32 [PATCH v4l-utils] v4l2-ctl: Move some code from do_handle_cap to a new function Dafna Hirschfeld

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).