static int jpeg_enc_vidioc_s_fmt_out(struct file *file, void *priv, struct v4l2_format *f) { struct jpeg_ctx *ctx = priv; struct vb2_queue *vq; struct v4l2_pix_format_mplane *pix; struct jpeg_fmt *fmt; struct jpeg_frame *frame; int ret; int i; ret = jpeg_enc_vidioc_try_fmt(file, priv, f); if (ret) return ret; vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type); if (!vq) return -EINVAL; if (vb2_is_busy(vq)) { v4l2_err(&ctx->jpeg_dev->v4l2_dev, "queue (%d) busy\n", f->type); return -EBUSY; } /* TODO: width & height has to be multiple of two */ pix = &f->fmt.pix_mp; fmt = find_format(f); frame = ctx_get_frame(ctx, f->type); if (IS_ERR(frame)) return PTR_ERR(frame); frame->jpeg_fmt = fmt; if (!frame->jpeg_fmt) { v4l2_err(&ctx->jpeg_dev->v4l2_dev, "not supported format values\n"); return -EINVAL; } for (i = 0; i < fmt->memplanes; i++) { ctx->payload[i] = pix->plane_fmt[i].bytesperline * pix->height; ctx->param.enc_param.in_depth[i] = fmt->depth[i]; } frame->width = pix->width; frame->height = pix->height; frame->pixelformat = pix->pixelformat; ctx->param.enc_param.in_width = pix->width; ctx->param.enc_param.in_height = pix->height; ctx->param.enc_param.in_plane = fmt->memplanes; ctx->param.enc_param.in_fmt = fmt->color; return 0; }
static int jpeg_enc_vidioc_s_fmt_cap(struct file *file, void *priv, struct v4l2_format *f) { struct jpeg_ctx *ctx = priv; struct vb2_queue *vq; struct v4l2_pix_format_mplane *pix; struct jpeg_fmt *fmt; int ret; int i; ret = jpeg_enc_vidioc_try_fmt(file, priv, f); if (ret) return ret; vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type); if (!vq) return -EINVAL; if (vb2_is_busy(vq)) { v4l2_err(&ctx->dev->v4l2_dev, "queue (%d) busy\n", f->type); return -EBUSY; } pix = &f->fmt.pix_mp; fmt = find_format(f); if (!fmt) return -EINVAL; for (i = 0; i < fmt->memplanes; i++) ctx->payload[i] = pix->plane_fmt[i].bytesperline * pix->height; ctx->param.enc_param.out_width = pix->height; ctx->param.enc_param.out_height = pix->width; ctx->param.enc_param.out_plane = fmt->memplanes; ctx->param.enc_param.out_depth = fmt->depth[0]; ctx->param.enc_param.out_fmt = fmt->color; return 0; }