Exemple #1
0
static int fimc_cap_s_crop(struct file *file, void *fh,
			       struct v4l2_crop *cr)
{
	struct fimc_frame *f;
	struct fimc_ctx *ctx = file->private_data;
	struct fimc_dev *fimc = ctx->fimc_dev;
	int ret = -EINVAL;

	if (fimc_capture_active(fimc))
		return -EBUSY;

	ret = fimc_try_crop(ctx, cr);
	if (ret)
		return ret;

	if (mutex_lock_interruptible(&fimc->lock))
		return -ERESTARTSYS;

	if (!(ctx->state & FIMC_DST_FMT)) {
		v4l2_err(&fimc->vid_cap.v4l2_dev,
			 "Capture color format not set\n");
		goto sc_unlock;
	}

	f = &ctx->s_frame;
	/* Check for the pixel scaling ratio when cropping input image. */
	ret = fimc_check_scaler_ratio(&cr->c, &ctx->d_frame);
	if (ret) {
		v4l2_err(&fimc->vid_cap.v4l2_dev, "Out of the scaler range");
	} else {
		ret = 0;
		f->offs_h = cr->c.left;
		f->offs_v = cr->c.top;
		f->width  = cr->c.width;
		f->height = cr->c.height;
	}

sc_unlock:
	mutex_unlock(&fimc->lock);
	return ret;
}
static int fimc_cap_s_crop(struct file *file, void *fh,
                           struct v4l2_crop *cr)
{
    struct fimc_frame *f;
    struct fimc_ctx *ctx = file->private_data;
    struct fimc_dev *fimc = ctx->fimc_dev;
    int ret = -EINVAL;

    if (fimc_capture_active(fimc))
        return -EBUSY;

    ret = fimc_try_crop(ctx, cr);
    if (ret)
        return ret;

    if (!(ctx->state & FIMC_DST_FMT)) {
        v4l2_err(&fimc->vid_cap.v4l2_dev,
                 "Capture color format not set\n");
        return -EINVAL; /* TODO: make sure this is the right value */
    }

    f = &ctx->s_frame;
    /* Check for the pixel scaling ratio when cropping input image. */
    ret = fimc_check_scaler_ratio(cr->c.width, cr->c.height,
                                  ctx->d_frame.width, ctx->d_frame.height,
                                  ctx->rotation);
    if (ret) {
        v4l2_err(&fimc->vid_cap.v4l2_dev, "Out of the scaler range\n");
        return ret;
    }

    f->offs_h = cr->c.left;
    f->offs_v = cr->c.top;
    f->width  = cr->c.width;
    f->height = cr->c.height;

    return 0;
}