1 From 50a40e8c2a9014c62943b034edefa035c0647519 Mon Sep 17 00:00:00 2001
2 From: Dave Stevenson <dsteve@broadcom.com>
3 Date: Mon, 9 Dec 2013 11:24:55 +0000
4 Subject: [PATCH 141/174] V4L2: Fix issue when switching down JPEG resolution.
6 JPEG buffer size calculation is based on input resolution.
7 Input resolution was being configured after output port
8 format. Caused failures if switching from one JPEG resolution
11 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
13 drivers/media/platform/bcm2835/bcm2835-camera.c | 126 ++++++++++++++----------
14 1 file changed, 72 insertions(+), 54 deletions(-)
16 --- a/drivers/media/platform/bcm2835/bcm2835-camera.c
17 +++ b/drivers/media/platform/bcm2835/bcm2835-camera.c
18 @@ -955,69 +955,87 @@ static int mmal_setup_components(struct
19 camera_port->current_buffer.num =
20 camera_port->recommended_buffer.num;
22 - port->format.encoding = mfmt->mmal;
23 - port->format.encoding_variant = 0;
24 - /* Set any encoding specific parameters */
25 - switch (mfmt->mmal_component) {
26 - case MMAL_COMPONENT_VIDEO_ENCODE:
27 - port->format.bitrate =
28 - dev->capture.encode_bitrate;
30 - case MMAL_COMPONENT_IMAGE_ENCODE:
31 - /* Could set EXIF parameters here */
36 - ret = vchiq_mmal_port_set_format(dev->instance, port);
39 + vchiq_mmal_port_connect_tunnel(
42 + &encode_component->input[0]);
44 - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
45 - "%s failed to set format\n", __func__);
46 + v4l2_dbg(1, bcm2835_v4l2_debug,
48 + "%s failed to create connection\n",
50 + /* ensure capture is not going to be tried */
51 + dev->capture.port = NULL;
53 + port->es.video.width = f->fmt.pix.width;
54 + port->es.video.height = f->fmt.pix.height;
55 + port->es.video.crop.x = 0;
56 + port->es.video.crop.y = 0;
57 + port->es.video.crop.width = f->fmt.pix.width;
58 + port->es.video.crop.height = f->fmt.pix.height;
59 + port->es.video.frame_rate.num =
60 + dev->capture.timeperframe.denominator;
61 + port->es.video.frame_rate.den =
62 + dev->capture.timeperframe.numerator;
64 + port->format.encoding = mfmt->mmal;
65 + port->format.encoding_variant = 0;
66 + /* Set any encoding specific parameters */
67 + switch (mfmt->mmal_component) {
68 + case MMAL_COMPONENT_VIDEO_ENCODE:
69 + port->format.bitrate =
70 + dev->capture.encode_bitrate;
72 + case MMAL_COMPONENT_IMAGE_ENCODE:
73 + /* Could set EXIF parameters here */
78 + ret = vchiq_mmal_port_set_format(dev->instance,
81 + v4l2_dbg(1, bcm2835_v4l2_debug,
83 + "%s failed to set format\n",
88 ret = vchiq_mmal_component_enable(
92 v4l2_dbg(1, bcm2835_v4l2_debug,
94 - "%s Failed to enable encode components\n",
97 - /* configure buffering */
98 - port->current_buffer.num = 1;
99 - port->current_buffer.size =
100 - f->fmt.pix.sizeimage;
101 - if (port->format.encoding ==
102 - MMAL_ENCODING_JPEG) {
103 - v4l2_dbg(1, bcm2835_v4l2_debug,
105 - "JPEG - fiddle buffer size\n");
106 - port->current_buffer.size =
107 - (f->fmt.pix.sizeimage <
109 - ? (100 << 10) : f->fmt.pix.
113 + "%s Failed to enable encode components\n",
118 + /* configure buffering */
119 + port->current_buffer.num = 1;
120 + port->current_buffer.size =
121 + f->fmt.pix.sizeimage;
122 + if (port->format.encoding ==
123 + MMAL_ENCODING_JPEG) {
124 v4l2_dbg(1, bcm2835_v4l2_debug,
126 - "vid_cap - current_buffer.size being set to %d\n",
127 - f->fmt.pix.sizeimage);
128 - port->current_buffer.alignment = 0;
130 - vchiq_mmal_port_connect_tunnel(
133 - &encode_component->input[0]);
135 - v4l2_dbg(1, bcm2835_v4l2_debug,
137 - "%s failed to create connection\n",
139 - /* ensure capture is not going to be tried */
140 - dev->capture.port = NULL;
143 + "JPG - buf size now %d was %d\n",
144 + f->fmt.pix.sizeimage,
145 + port->current_buffer.size);
146 + port->current_buffer.size =
147 + (f->fmt.pix.sizeimage <
149 + ? (100 << 10) : f->fmt.pix.
152 + v4l2_dbg(1, bcm2835_v4l2_debug,
154 + "vid_cap - cur_buf.size set to %d\n",
155 + f->fmt.pix.sizeimage);
156 + port->current_buffer.alignment = 0;
159 /* configure buffering */