aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/coda/coda-jpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/platform/coda/coda-jpeg.c')
-rw-r--r--drivers/media/platform/coda/coda-jpeg.c26
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
181bool coda_jpeg_check_buffer(struct coda_ctx *ctx, struct vb2_v4l2_buffer *vb) 181bool 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/*