V4L/DVB (13430): cx18: Fix YUV capture so that encoder passes a single frame per...
[safe/jmp/linux-2.6] / drivers / media / video / cx18 / cx18-streams.c
index 9f8adda..7755937 100644 (file)
@@ -262,9 +262,11 @@ static int cx18_reg_dev(struct cx18 *cx, int type)
 
        switch (vfl_type) {
        case VFL_TYPE_GRABBER:
-               CX18_INFO("Registered device video%d for %s (%d x %d kB)\n",
+               CX18_INFO("Registered device video%d for %s "
+                         "(%d x %d.%02d kB)\n",
                          num, s->name, cx->stream_buffers[type],
-                         cx->stream_buf_size[type]/1024);
+                         cx->stream_buf_size[type] / 1024,
+                         (cx->stream_buf_size[type] * 100 / 1024) % 100);
                break;
 
        case VFL_TYPE_RADIO:
@@ -501,9 +503,23 @@ static void cx18_stream_configure_mdls(struct cx18_stream *s)
 {
        cx18_unload_queues(s);
 
-       /* For now */
-       s->bufs_per_mdl = 1;
-       s->mdl_size = s->buf_size * s->bufs_per_mdl;
+       switch (s->type) {
+       case CX18_ENC_STREAM_TYPE_YUV:
+               /*
+                * Height should be a multiple of 32 lines.
+                * Set the MDL size to the exact size needed for one frame.
+                * Use enough buffers per MDL to cover the MDL size
+                */
+               s->mdl_size = 720 * s->cx->params.height * 3 / 2;
+               s->bufs_per_mdl = s->mdl_size / s->buf_size;
+               if (s->mdl_size % s->buf_size)
+                       s->bufs_per_mdl++;
+               break;
+       default:
+               s->bufs_per_mdl = 1;
+               s->mdl_size = s->buf_size * s->bufs_per_mdl;
+               break;
+       }
 
        cx18_load_queues(s);
 }