diff options
Diffstat (limited to 'drivers/media/platform/coda/coda-jpeg.c')
-rw-r--r-- | drivers/media/platform/coda/coda-jpeg.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/drivers/media/platform/coda/coda-jpeg.c b/drivers/media/platform/coda/coda-jpeg.c index 96cd42a0baaf..9f899a6cefed 100644 --- a/drivers/media/platform/coda/coda-jpeg.c +++ b/drivers/media/platform/coda/coda-jpeg.c | |||
@@ -178,14 +178,28 @@ int coda_jpeg_write_tables(struct coda_ctx *ctx) | |||
178 | return 0; | 178 | return 0; |
179 | } | 179 | } |
180 | 180 | ||
181 | bool coda_jpeg_check_buffer(struct coda_ctx *ctx, struct vb2_v4l2_buffer *vb) | 181 | bool coda_jpeg_check_buffer(struct coda_ctx *ctx, struct vb2_buffer *vb) |
182 | { | 182 | { |
183 | void *vaddr = vb2_plane_vaddr(&vb->vb2_buf, 0); | 183 | void *vaddr = vb2_plane_vaddr(vb, 0); |
184 | u16 soi = be16_to_cpup((__be16 *)vaddr); | 184 | u16 soi, eoi; |
185 | u16 eoi = be16_to_cpup((__be16 *)(vaddr + | 185 | int len, i; |
186 | vb2_get_plane_payload(&vb->vb2_buf, 0) - 2)); | 186 | |
187 | soi = be16_to_cpup((__be16 *)vaddr); | ||
188 | if (soi != SOI_MARKER) | ||
189 | return false; | ||
190 | |||
191 | len = vb2_get_plane_payload(vb, 0); | ||
192 | vaddr += len - 2; | ||
193 | for (i = 0; i < 32; i++) { | ||
194 | eoi = be16_to_cpup((__be16 *)(vaddr - i)); | ||
195 | if (eoi == EOI_MARKER) { | ||
196 | if (i > 0) | ||
197 | vb2_set_plane_payload(vb, 0, len - i); | ||
198 | return true; | ||
199 | } | ||
200 | } | ||
187 | 201 | ||
188 | return soi == SOI_MARKER && eoi == EOI_MARKER; | 202 | return false; |
189 | } | 203 | } |
190 | 204 | ||
191 | /* | 205 | /* |