static int allegro_enum_fmt_vid(struct file *file, void *fh,
                                struct v4l2_fmtdesc *f)
 {
-       if (f->index)
-               return -EINVAL;
        switch (f->type) {
        case V4L2_BUF_TYPE_VIDEO_OUTPUT:
+               if (f->index >= 1)
+                       return -EINVAL;
                f->pixelformat = V4L2_PIX_FMT_NV12;
                break;
        case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+               if (f->index >= 1)
+                       return -EINVAL;
                f->pixelformat = V4L2_PIX_FMT_H264;
                break;
        default:
        return 0;
 }
 
+static int allegro_s_fmt_vid_cap(struct file *file, void *fh,
+                                struct v4l2_format *f)
+{
+       struct allegro_channel *channel = fh_to_channel(fh);
+       struct vb2_queue *vq;
+       int err;
+
+       err = allegro_try_fmt_vid_cap(file, fh, f);
+       if (err)
+               return err;
+
+       vq = v4l2_m2m_get_vq(channel->fh.m2m_ctx, f->type);
+       if (!vq)
+               return -EINVAL;
+       if (vb2_is_busy(vq))
+               return -EBUSY;
+
+       channel->codec = f->fmt.pix.pixelformat;
+
+       return 0;
+}
+
 static int allegro_g_fmt_vid_out(struct file *file, void *fh,
                                 struct v4l2_format *f)
 {
        .vidioc_enum_fmt_vid_out = allegro_enum_fmt_vid,
        .vidioc_g_fmt_vid_cap = allegro_g_fmt_vid_cap,
        .vidioc_try_fmt_vid_cap = allegro_try_fmt_vid_cap,
-       .vidioc_s_fmt_vid_cap = allegro_try_fmt_vid_cap,
+       .vidioc_s_fmt_vid_cap = allegro_s_fmt_vid_cap,
        .vidioc_g_fmt_vid_out = allegro_g_fmt_vid_out,
        .vidioc_try_fmt_vid_out = allegro_try_fmt_vid_out,
        .vidioc_s_fmt_vid_out = allegro_s_fmt_vid_out,