Signed-off-by: Krzysztof Hałasa khal...@piap.pl
diff --git a/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c
b/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c
index a4c5896..e501287 100644
--- a/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c
+++ b/drivers/staging/media/solo6x10/solo6x10-v4l2-enc.c
@@ -95,38 +95,11 @@ static unsigned char vop_6110_pal_cif[] = {
0x01, 0x68, 0xce, 0x32, 0x28, 0x00, 0x00, 0x00,
};
-struct vop_header {
- /* VE_STATUS0 */
- u32 mpeg_size:20, sad_motion_flag:1, video_motion_flag:1, vop_type:2,
- channel:5, source_fl:1, interlace:1, progressive:1;
-
- /* VE_STATUS1 */
- u32 vsize:8, hsize:8, last_queue:4, nop0:8, scale:4;
-
- /* VE_STATUS2 */
- u32 mpeg_off;
-
- /* VE_STATUS3 */
- u32 jpeg_off;
-
- /* VE_STATUS4 */
- u32 jpeg_size:20, interval:10, nop1:2;
-
- /* VE_STATUS5/6 */
- u32 sec, usec;
-
- /* VE_STATUS7/8/9 */
- u32 nop2[3];
-
- /* VE_STATUS10 */
- u32 mpeg_size_alt:20, nop3:12;
-
- u32 end_nops[5];
-} __packed;
+typedef __le32 vop_header[16];
struct solo_enc_buf {
enum solo_enc_types type;
- struct vop_header *vh;
+ const vop_header*vh;
int motion;
};
@@ -430,8 +403,64 @@ static int solo_send_desc(struct solo_enc_dev *solo_enc,
int skip,
solo_enc-desc_count - 1);
}
+/* Extract values from VOP header - VE_STATUSxx */
+static inline int vop_interlaced(const vop_header *vh)
+{
+ return (__le32_to_cpu((*vh)[0]) 30) 1;
+}
+
+static inline u8 vop_channel(const vop_header *vh)
+{
+ return (__le32_to_cpu((*vh)[0]) 24) 0x1F;
+}
+
+static inline u8 vop_type(const vop_header *vh)
+{
+ return (__le32_to_cpu((*vh)[0]) 22) 3;
+}
+
+static inline u32 vop_mpeg_size(const vop_header *vh)
+{
+ return __le32_to_cpu((*vh)[0]) 0xF;
+}
+
+static inline u8 vop_hsize(const vop_header *vh)
+{
+ return (__le32_to_cpu((*vh)[1]) 8) 0xFF;
+}
+
+static inline u8 vop_vsize(const vop_header *vh)
+{
+ return __le32_to_cpu((*vh)[1]) 0xFF;
+}
+
+static inline u32 vop_mpeg_offset(const vop_header *vh)
+{
+ return __le32_to_cpu((*vh)[2]);
+}
+
+static inline u32 vop_jpeg_offset(const vop_header *vh)
+{
+ return __le32_to_cpu((*vh)[3]);
+}
+
+static inline u32 vop_jpeg_size(const vop_header *vh)
+{
+ return __le32_to_cpu((*vh)[4]) 0xF;
+}
+
+static inline u32 vop_sec(const vop_header *vh)
+{
+ return __le32_to_cpu((*vh)[5]);
+}
+
+static inline u32 vop_usec(const vop_header *vh)
+{
+ return __le32_to_cpu((*vh)[6]);
+}
+
static int solo_fill_jpeg(struct solo_enc_dev *solo_enc,
- struct vb2_buffer *vb, struct vop_header *vh)
+ struct vb2_buffer *vb, const vop_header *vh)
{
struct solo_dev *solo_dev = solo_enc-solo_dev;
struct vb2_dma_sg_desc *vbuf = vb2_dma_sg_plane_desc(vb, 0);
@@ -440,29 +469,30 @@ static int solo_fill_jpeg(struct solo_enc_dev *solo_enc,
vb-v4l2_buf.flags |= V4L2_BUF_FLAG_KEYFRAME;
- if (vb2_plane_size(vb, 0) vh-jpeg_size + solo_enc-jpeg_len)
+ if (vb2_plane_size(vb, 0) vop_jpeg_size(vh) + solo_enc-jpeg_len)
return -EIO;
sg_copy_from_buffer(vbuf-sglist, vbuf-num_pages,
solo_enc-jpeg_header,
solo_enc-jpeg_len);
- frame_size = (vh-jpeg_size + solo_enc-jpeg_len + (DMA_ALIGN - 1))
+ frame_size = (vop_jpeg_size(vh) + solo_enc-jpeg_len + (DMA_ALIGN - 1))
~(DMA_ALIGN - 1);
- vb2_set_plane_payload(vb, 0, vh-jpeg_size + solo_enc-jpeg_len);
+ vb2_set_plane_payload(vb, 0, vop_jpeg_size(vh) + solo_enc-jpeg_len);
dma_map_sg(solo_dev-pdev-dev, vbuf-sglist, vbuf-num_pages,
DMA_FROM_DEVICE);
- ret = solo_send_desc(solo_enc, solo_enc-jpeg_len, vbuf, vh-jpeg_off,
- frame_size, SOLO_JPEG_EXT_ADDR(solo_dev),
- SOLO_JPEG_EXT_SIZE(solo_dev));
+ ret = solo_send_desc(solo_enc, solo_enc-jpeg_len, vbuf,
+vop_jpeg_offset(vh) - SOLO_JPEG_EXT_ADDR(solo_dev),
+frame_size, SOLO_JPEG_EXT_ADDR(solo_dev),
+SOLO_JPEG_EXT_SIZE(solo_dev));
dma_unmap_sg(solo_dev-pdev-dev, vbuf-sglist, vbuf-num_pages,
DMA_FROM_DEVICE);
return ret;
}
static int solo_fill_mpeg(struct solo_enc_dev *solo_enc,
- struct vb2_buffer *vb, struct vop_header *vh)
+ struct vb2_buffer *vb, const vop_header *vh)
{
struct solo_dev *solo_dev = solo_enc-solo_dev;
struct vb2_dma_sg_desc *vbuf = vb2_dma_sg_plane_desc(vb, 0);
@@ -470,11 +500,11 @@ static int solo_fill_mpeg(struct solo_enc_dev *solo_enc,
int skip = 0;
int ret;
- if (vb2_plane_size(vb, 0)