aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-4.19/950-0337-staging-bcm2835-codec-Refactor-default-resolution-co.patch
blob: cd592e27da2522f9d4a2812082eb30341f681805 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
From a97baa799a8069fe965a4d194935c025e21acf8e Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.org>
Date: Wed, 20 Mar 2019 10:06:51 +0000
Subject: [PATCH] staging: bcm2835-codec: Refactor default resolution
 code

The default resolution code was different for each role
as compressed formats need to pass bytesperline as 0 and
set up customised buffer sizes.
This is common setup, therefore amend get_sizeimage and
get_bytesperline to do the correct thing whether compressed
or uncompressed.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.org>
---
 .../bcm2835-codec/bcm2835-v4l2-codec.c        | 103 +++++++-----------
 1 file changed, 40 insertions(+), 63 deletions(-)

--- a/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c
+++ b/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c
@@ -578,10 +578,17 @@ static void job_abort(void *priv)
 	ctx->aborting = 1;
 }
 
-static inline unsigned int get_sizeimage(int bpl, int height,
+static inline unsigned int get_sizeimage(int bpl, int width, int height,
 					 struct bcm2835_codec_fmt *fmt)
 {
-	return (bpl * height * fmt->size_multiplier_x2) >> 1;
+	if (fmt->flags & V4L2_FMT_FLAG_COMPRESSED) {
+		if (width * height > 1280 * 720)
+			return DEF_COMP_BUF_SIZE_GREATER_720P;
+		else
+			return DEF_COMP_BUF_SIZE_720P_OR_LESS;
+	} else {
+		return (bpl * height * fmt->size_multiplier_x2) >> 1;
+	}
 }
 
 static inline unsigned int get_bytesperline(int width,
@@ -1032,22 +1039,13 @@ static int vidioc_try_fmt(struct v4l2_fo
 		 * some of the pixels are active.
 		 */
 		f->fmt.pix.height = ALIGN(f->fmt.pix.height, 16);
-
-		f->fmt.pix.bytesperline = get_bytesperline(f->fmt.pix.width,
-							   fmt);
-		f->fmt.pix.sizeimage = get_sizeimage(f->fmt.pix.bytesperline,
-						     f->fmt.pix.height,
-						     fmt);
-	} else {
-		u32 min_size = f->fmt.pix.width > 1280 ||
-			       f->fmt.pix.height > 720 ?
-			       DEF_COMP_BUF_SIZE_GREATER_720P :
-			       DEF_COMP_BUF_SIZE_720P_OR_LESS;
-
-		f->fmt.pix.bytesperline = 0;
-		if (f->fmt.pix.sizeimage < min_size)
-			f->fmt.pix.sizeimage = min_size;
 	}
+	f->fmt.pix.bytesperline = get_bytesperline(f->fmt.pix.width,
+						   fmt);
+	f->fmt.pix.sizeimage = get_sizeimage(f->fmt.pix.bytesperline,
+					     f->fmt.pix.width,
+					     f->fmt.pix.height,
+					     fmt);
 
 	f->fmt.pix.field = V4L2_FIELD_NONE;
 
@@ -1159,6 +1157,7 @@ static int vidioc_s_fmt(struct bcm2835_c
 		q_data_dst->bytesperline =
 			get_bytesperline(f->fmt.pix.width, q_data_dst->fmt);
 		q_data_dst->sizeimage = get_sizeimage(q_data_dst->bytesperline,
+						      q_data_dst->crop_width,
 						      q_data_dst->height,
 						      q_data_dst->fmt);
 		update_capture_port = true;
@@ -2218,52 +2217,30 @@ static int bcm2835_codec_open(struct fil
 
 	ctx->q_data[V4L2_M2M_SRC].fmt = get_default_format(dev, false);
 	ctx->q_data[V4L2_M2M_DST].fmt = get_default_format(dev, true);
-	switch (dev->role) {
-	case DECODE:
-		/*
-		 * Input width and height are irrelevant as they will be defined
-		 * by the bitstream not the format. Required by V4L2 though.
-		 */
-		ctx->q_data[V4L2_M2M_SRC].crop_width = DEFAULT_WIDTH;
-		ctx->q_data[V4L2_M2M_SRC].crop_height = DEFAULT_HEIGHT;
-		ctx->q_data[V4L2_M2M_SRC].height = DEFAULT_HEIGHT;
-		ctx->q_data[V4L2_M2M_SRC].bytesperline = 0;
-		ctx->q_data[V4L2_M2M_SRC].sizeimage =
-						DEF_COMP_BUF_SIZE_720P_OR_LESS;
-
-		ctx->q_data[V4L2_M2M_DST].crop_width = DEFAULT_WIDTH;
-		ctx->q_data[V4L2_M2M_DST].crop_height = DEFAULT_HEIGHT;
-		ctx->q_data[V4L2_M2M_DST].height = DEFAULT_HEIGHT;
-		ctx->q_data[V4L2_M2M_DST].bytesperline =
-				get_bytesperline(DEFAULT_WIDTH,
-						 ctx->q_data[V4L2_M2M_DST].fmt);
-		ctx->q_data[V4L2_M2M_DST].sizeimage =
-			get_sizeimage(ctx->q_data[V4L2_M2M_DST].bytesperline,
-				      ctx->q_data[V4L2_M2M_DST].height,
-				      ctx->q_data[V4L2_M2M_DST].fmt);
-		break;
-	case ENCODE:
-		ctx->q_data[V4L2_M2M_SRC].crop_width = DEFAULT_WIDTH;
-		ctx->q_data[V4L2_M2M_SRC].crop_height = DEFAULT_HEIGHT;
-		ctx->q_data[V4L2_M2M_SRC].height = DEFAULT_HEIGHT;
-		ctx->q_data[V4L2_M2M_SRC].bytesperline =
-				get_bytesperline(DEFAULT_WIDTH,
-						 ctx->q_data[V4L2_M2M_SRC].fmt);
-		ctx->q_data[V4L2_M2M_SRC].sizeimage =
-			get_sizeimage(ctx->q_data[V4L2_M2M_SRC].bytesperline,
-				      ctx->q_data[V4L2_M2M_SRC].height,
-				      ctx->q_data[V4L2_M2M_SRC].fmt);
-
-		ctx->q_data[V4L2_M2M_DST].crop_width = DEFAULT_WIDTH;
-		ctx->q_data[V4L2_M2M_DST].crop_height = DEFAULT_HEIGHT;
-		ctx->q_data[V4L2_M2M_DST].bytesperline = 0;
-		ctx->q_data[V4L2_M2M_DST].height = DEFAULT_HEIGHT;
-		ctx->q_data[V4L2_M2M_DST].sizeimage =
-						DEF_COMP_BUF_SIZE_720P_OR_LESS;
-		break;
-	case ISP:
-		break;
-	}
+
+	ctx->q_data[V4L2_M2M_SRC].crop_width = DEFAULT_WIDTH;
+	ctx->q_data[V4L2_M2M_SRC].crop_height = DEFAULT_HEIGHT;
+	ctx->q_data[V4L2_M2M_SRC].height = DEFAULT_HEIGHT;
+	ctx->q_data[V4L2_M2M_SRC].bytesperline =
+			get_bytesperline(DEFAULT_WIDTH,
+					 ctx->q_data[V4L2_M2M_SRC].fmt);
+	ctx->q_data[V4L2_M2M_SRC].sizeimage =
+		get_sizeimage(ctx->q_data[V4L2_M2M_SRC].bytesperline,
+			      ctx->q_data[V4L2_M2M_SRC].crop_width,
+			      ctx->q_data[V4L2_M2M_SRC].height,
+			      ctx->q_data[V4L2_M2M_SRC].fmt);
+
+	ctx->q_data[V4L2_M2M_DST].crop_width = DEFAULT_WIDTH;
+	ctx->q_data[V4L2_M2M_DST].crop_height = DEFAULT_HEIGHT;
+	ctx->q_data[V4L2_M2M_DST].height = DEFAULT_HEIGHT;
+	ctx->q_data[V4L2_M2M_DST].bytesperline =
+			get_bytesperline(DEFAULT_WIDTH,
+					 ctx->q_data[V4L2_M2M_DST].fmt);
+	ctx->q_data[V4L2_M2M_DST].sizeimage =
+		get_sizeimage(ctx->q_data[V4L2_M2M_DST].bytesperline,
+			      ctx->q_data[V4L2_M2M_DST].crop_width,
+			      ctx->q_data[V4L2_M2M_DST].height,
+			      ctx->q_data[V4L2_M2M_DST].fmt);
 
 	ctx->colorspace = V4L2_COLORSPACE_REC709;
 	ctx->bitrate = 10 * 1000 * 1000;