brcm2708: update 3.10 patches with raspberrypi/rpi-3.10.y of 27 Apr. 2014
[openwrt.git] / target / linux / brcm2708 / patches-3.10 / 0141-V4L2-Fix-issue-when-switching-down-JPEG-resolution.patch
1 From 8a529de86bee2dd7e76fc77d0364ace6df3da685 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/196] V4L2: Fix issue when switching down JPEG resolution.
5
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
9 to a smaller one.
10
11 Signed-off-by: Dave Stevenson <dsteve@broadcom.com>
12 ---
13  drivers/media/platform/bcm2835/bcm2835-camera.c | 126 ++++++++++++++----------
14  1 file changed, 72 insertions(+), 54 deletions(-)
15
16 diff --git a/drivers/media/platform/bcm2835/bcm2835-camera.c b/drivers/media/platform/bcm2835/bcm2835-camera.c
17 index 9fc90a2..4780107 100644
18 --- a/drivers/media/platform/bcm2835/bcm2835-camera.c
19 +++ b/drivers/media/platform/bcm2835/bcm2835-camera.c
20 @@ -955,69 +955,87 @@ static int mmal_setup_components(struct bm2835_mmal_dev *dev,
21                         camera_port->current_buffer.num =
22                             camera_port->recommended_buffer.num;
23  
24 -                       port->format.encoding = mfmt->mmal;
25 -                       port->format.encoding_variant = 0;
26 -                       /* Set any encoding specific parameters */
27 -                       switch (mfmt->mmal_component) {
28 -                       case MMAL_COMPONENT_VIDEO_ENCODE:
29 -                               port->format.bitrate =
30 -                                   dev->capture.encode_bitrate;
31 -                               break;
32 -                       case MMAL_COMPONENT_IMAGE_ENCODE:
33 -                               /* Could set EXIF parameters here */
34 -                               break;
35 -                       default:
36 -                               break;
37 -                       }
38 -                       ret = vchiq_mmal_port_set_format(dev->instance, port);
39 -
40 +                       ret =
41 +                           vchiq_mmal_port_connect_tunnel(
42 +                                       dev->instance,
43 +                                       camera_port,
44 +                                       &encode_component->input[0]);
45                         if (ret) {
46 -                               v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev,
47 -                                        "%s failed to set format\n", __func__);
48 +                               v4l2_dbg(1, bcm2835_v4l2_debug,
49 +                                        &dev->v4l2_dev,
50 +                                        "%s failed to create connection\n",
51 +                                        __func__);
52 +                               /* ensure capture is not going to be tried */
53 +                               dev->capture.port = NULL;
54                         } else {
55 +                               port->es.video.width = f->fmt.pix.width;
56 +                               port->es.video.height = f->fmt.pix.height;
57 +                               port->es.video.crop.x = 0;
58 +                               port->es.video.crop.y = 0;
59 +                               port->es.video.crop.width = f->fmt.pix.width;
60 +                               port->es.video.crop.height = f->fmt.pix.height;
61 +                               port->es.video.frame_rate.num =
62 +                                         dev->capture.timeperframe.denominator;
63 +                               port->es.video.frame_rate.den =
64 +                                         dev->capture.timeperframe.numerator;
65 +
66 +                               port->format.encoding = mfmt->mmal;
67 +                               port->format.encoding_variant = 0;
68 +                               /* Set any encoding specific parameters */
69 +                               switch (mfmt->mmal_component) {
70 +                               case MMAL_COMPONENT_VIDEO_ENCODE:
71 +                                       port->format.bitrate =
72 +                                           dev->capture.encode_bitrate;
73 +                                       break;
74 +                               case MMAL_COMPONENT_IMAGE_ENCODE:
75 +                                       /* Could set EXIF parameters here */
76 +                                       break;
77 +                               default:
78 +                                       break;
79 +                               }
80 +                               ret = vchiq_mmal_port_set_format(dev->instance,
81 +                                                                port);
82 +                               if (ret)
83 +                                       v4l2_dbg(1, bcm2835_v4l2_debug,
84 +                                                &dev->v4l2_dev,
85 +                                                "%s failed to set format\n",
86 +                                                __func__);
87 +                       }
88 +
89 +                       if (!ret) {
90                                 ret = vchiq_mmal_component_enable(
91                                                 dev->instance,
92                                                 encode_component);
93                                 if (ret) {
94                                         v4l2_dbg(1, bcm2835_v4l2_debug,
95 -                                                &dev->v4l2_dev,
96 -                                                "%s Failed to enable encode components\n",
97 -                                                __func__);
98 -                               } else {
99 -                                       /* configure buffering */
100 -                                       port->current_buffer.num = 1;
101 -                                       port->current_buffer.size =
102 -                                           f->fmt.pix.sizeimage;
103 -                                       if (port->format.encoding ==
104 -                                           MMAL_ENCODING_JPEG) {
105 -                                               v4l2_dbg(1, bcm2835_v4l2_debug,
106 -                                                        &dev->v4l2_dev,
107 -                                                        "JPEG - fiddle buffer size\n");
108 -                                               port->current_buffer.size =
109 -                                                   (f->fmt.pix.sizeimage <
110 -                                                    (100 << 10))
111 -                                                   ? (100 << 10) : f->fmt.pix.
112 -                                                   sizeimage;
113 -                                       }
114 +                                          &dev->v4l2_dev,
115 +                                          "%s Failed to enable encode components\n",
116 +                                          __func__);
117 +                               }
118 +                       }
119 +                       if (!ret) {
120 +                               /* configure buffering */
121 +                               port->current_buffer.num = 1;
122 +                               port->current_buffer.size =
123 +                                   f->fmt.pix.sizeimage;
124 +                               if (port->format.encoding ==
125 +                                   MMAL_ENCODING_JPEG) {
126                                         v4l2_dbg(1, bcm2835_v4l2_debug,
127 -                                                &dev->v4l2_dev,
128 -                                                "vid_cap - current_buffer.size being set to %d\n",
129 -                                                f->fmt.pix.sizeimage);
130 -                                       port->current_buffer.alignment = 0;
131 -                                       ret =
132 -                                           vchiq_mmal_port_connect_tunnel(
133 -                                                       dev->instance,
134 -                                                       camera_port,
135 -                                                       &encode_component->input[0]);
136 -                                       if (ret) {
137 -                                               v4l2_dbg(1, bcm2835_v4l2_debug,
138 -                                                        &dev->v4l2_dev,
139 -                                                        "%s failed to create connection\n",
140 -                                                        __func__);
141 -                                               /* ensure capture is not going to be tried */
142 -                                               dev->capture.port = NULL;
143 -                                       }
144 +                                           &dev->v4l2_dev,
145 +                                           "JPG - buf size now %d was %d\n",
146 +                                           f->fmt.pix.sizeimage,
147 +                                           port->current_buffer.size);
148 +                                       port->current_buffer.size =
149 +                                           (f->fmt.pix.sizeimage <
150 +                                            (100 << 10))
151 +                                           ? (100 << 10) : f->fmt.pix.
152 +                                           sizeimage;
153                                 }
154 +                               v4l2_dbg(1, bcm2835_v4l2_debug,
155 +                                        &dev->v4l2_dev,
156 +                                        "vid_cap - cur_buf.size set to %d\n",
157 +                                        f->fmt.pix.sizeimage);
158 +                               port->current_buffer.alignment = 0;
159                         }
160                 } else {
161                         /* configure buffering */
162 -- 
163 1.9.1
164