Skip to content

Commit

Permalink
V4L/DVB (13431): cx18: Adjust an MDL's final buffer size to force enc…
Browse files Browse the repository at this point in the history
…oder transfer size

The encoder was not honoring the MDL size sent in DE_SET_MDL mailbox commands.
This change adjusts the size of the last buffer in an MDL, as reported to the
firmware, so that the encoder will send the exact amount of bytes we specify
per MDL transfer.  This eliminates tearing in YUV playback when using
non-default YUV buffer sizes.

Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
  • Loading branch information
Andy Walls authored and Mauro Carvalho Chehab committed Dec 5, 2009
1 parent 22dce18 commit 1047a83
Showing 1 changed file with 18 additions and 3 deletions.
21 changes: 18 additions & 3 deletions drivers/media/video/cx18/cx18-queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ void cx18_load_queues(struct cx18_stream *s)
struct cx18_buffer *buf;
int mdl_id;
int i;
u32 partial_buf_size;

/*
* Attach buffers to MDLs, give the MDLs ids, and add MDLs to q_free
Expand Down Expand Up @@ -308,10 +309,24 @@ void cx18_load_queues(struct cx18_stream *s)
&cx->scb->cpu_mdl[mdl_id + i].length);
}

if (i == s->bufs_per_mdl)
if (i == s->bufs_per_mdl) {
/*
* The encoder doesn't honor s->mdl_size. So in the
* case of a non-integral number of buffers to meet
* mdl_size, we lie about the size of the last buffer
* in the MDL to get the encoder to really only send
* us mdl_size bytes per MDL transfer.
*/
partial_buf_size = s->mdl_size % s->buf_size;
if (partial_buf_size) {
cx18_writel(cx, partial_buf_size,
&cx->scb->cpu_mdl[mdl_id + i - 1].length);
}
cx18_enqueue(s, mdl, &s->q_free);
else
cx18_push(s, mdl, &s->q_idle); /* not enough buffers */
} else {
/* Not enough buffers for this MDL; we won't use it */
cx18_push(s, mdl, &s->q_idle);
}
mdl_id += i;
}
}
Expand Down

0 comments on commit 1047a83

Please sign in to comment.