static int vidioc_reqbufs(struct file *file, void *priv,
			  struct v4l2_requestbuffers *rb)
{
	struct vcap_client_data *c_data = file->private_data;
	int rc;

	dprintk(3, "In Req Buf %08x\n", (unsigned int)rb->type);
	c_data->op_mode = determine_mode(c_data);
	if (c_data->op_mode == UNKNOWN_VCAP_OP) {
		pr_err("VCAP Error: %s: VCAP in unknown mode\n", __func__);
		return -ENOTRECOVERABLE;
	}

	switch (rb->type) {
	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
		if (c_data->op_mode == VC_AND_VP_VCAP_OP) {
			if (c_data->vc_format.color_space) {
				pr_err("VCAP Err: %s: VP No RGB support\n",
					__func__);
				return -ENOTRECOVERABLE;
			}
			if (!c_data->vc_format.mode) {
				pr_err("VCAP Err: VP No prog support\n");
				return -ENOTRECOVERABLE;
			}
			if (rb->count < 6) {
				pr_err("VCAP Err: Not enough buf for VC_VP\n");
				return -EINVAL;
			}
			rc = vb2_reqbufs(&c_data->vc_vidq, rb);
			if (rc < 0)
				return rc;

			c_data->vp_in_fmt.width =
				(c_data->vc_format.hactive_end -
				c_data->vc_format.hactive_start);
			c_data->vp_in_fmt.height =
				(c_data->vc_format.vactive_end -
				c_data->vc_format.vactive_start);
			/* VC outputs YCbCr 4:2:2 */
			c_data->vp_in_fmt.pixfmt = V4L2_PIX_FMT_NV16;
			rb->type = V4L2_BUF_TYPE_INTERLACED_IN_DECODER;
			rc = vb2_reqbufs(&c_data->vp_in_vidq, rb);
			rb->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
			return rc;

		} else {
			return vb2_reqbufs(&c_data->vc_vidq, rb);
		}
	case V4L2_BUF_TYPE_INTERLACED_IN_DECODER:
		return vb2_reqbufs(&c_data->vp_in_vidq, rb);
	case V4L2_BUF_TYPE_VIDEO_OUTPUT:
		return vb2_reqbufs(&c_data->vp_out_vidq, rb);
	default:
		pr_err("VCAP Error: %s: Unknown buffer type\n", __func__);
		return -EINVAL;
	}
	return 0;
}
Example #2
0
double FermiTable::calcSingleThermoVar(std::pair<double,double ThermodynamicVariables::*> input_1,
				       std::pair<double,double ThermodynamicVariables::*> input_2,
				       std::pair<double,double> aap,
				       double ThermodynamicVariables::* output_var) const
{
  ThermodynamicVariables tv;
  tv.*input_1.second = input_1.first;
  tv.*input_2.second = input_2.first;
  calcThermoVars(determine_mode(tvar_pair(input_1.second, input_2.second)),
		 aap, tv);
  return tv.*output_var;
}
static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
{
	struct vcap_client_data *c_data = file->private_data;
	int rc;

	dprintk(3, "In Stream ON\n");
	if (determine_mode(c_data) != c_data->op_mode) {
		pr_err("VCAP Error: %s: s_fmt called after req_buf", __func__);
		return -ENOTRECOVERABLE;
	}

	switch (c_data->op_mode) {
	case VC_VCAP_OP:
		c_data->dev->vc_client = c_data;
		config_vc_format(c_data);
		return vb2_streamon(&c_data->vc_vidq, i);
	case VP_VCAP_OP:
		rc = streamon_validate_q(&c_data->vp_in_vidq);
		if (rc < 0)
			return rc;
		rc = streamon_validate_q(&c_data->vp_out_vidq);
		if (rc < 0)
			return rc;

		c_data->dev->vp_client = c_data;

		rc = config_vp_format(c_data);
		if (rc < 0)
			return rc;
		rc = init_motion_buf(c_data);
		if (rc < 0)
			return rc;
		if (c_data->vid_vp_action.nr_enabled) {
			rc = init_nr_buf(c_data);
			if (rc < 0)
				goto s_on_deinit_m_buf;
		}

		c_data->vid_vp_action.vp_state = VP_FRAME1;

		rc = vb2_streamon(&c_data->vp_in_vidq,
				V4L2_BUF_TYPE_INTERLACED_IN_DECODER);
		if (rc < 0)
			goto s_on_deinit_nr_buf;

		rc = vb2_streamon(&c_data->vp_out_vidq,
				V4L2_BUF_TYPE_VIDEO_OUTPUT);
		if (rc < 0)
			goto s_on_deinit_nr_buf;
		return rc;
	case VC_AND_VP_VCAP_OP:
		rc = streamon_validate_q(&c_data->vc_vidq);
		if (rc < 0)
			return rc;
		rc = streamon_validate_q(&c_data->vp_in_vidq);
		if (rc < 0)
			return rc;
		rc = streamon_validate_q(&c_data->vp_out_vidq);
		if (rc < 0)
			return rc;

		c_data->dev->vc_client = c_data;
		c_data->dev->vp_client = c_data;
		c_data->dev->vc_to_vp_work.cd = c_data;

		rc = config_vc_format(c_data);
		if (rc < 0)
			return rc;
		rc = config_vp_format(c_data);
		if (rc < 0)
			return rc;
		rc = init_motion_buf(c_data);
		if (rc < 0)
			return rc;
		if (c_data->vid_vp_action.nr_enabled) {
			rc = init_nr_buf(c_data);
			if (rc < 0)
				goto s_on_deinit_m_buf;
		}
		c_data->streaming = 1;

		c_data->vid_vp_action.vp_state = VP_FRAME1;

		/* These stream on calls should not fail */
		rc = vb2_streamon(&c_data->vc_vidq,
				V4L2_BUF_TYPE_VIDEO_CAPTURE);
		if (rc < 0)
			goto s_on_deinit_nr_buf;

		rc = vb2_streamon(&c_data->vp_in_vidq,
				V4L2_BUF_TYPE_INTERLACED_IN_DECODER);
		if (rc < 0)
			goto s_on_deinit_nr_buf;

		rc = vb2_streamon(&c_data->vp_out_vidq,
				V4L2_BUF_TYPE_VIDEO_OUTPUT);
		if (rc < 0)
			goto s_on_deinit_nr_buf;
		return rc;
	default:
		pr_err("VCAP Error: %s: Operation Mode type", __func__);
		return -ENOTRECOVERABLE;
	}
	return 0;

s_on_deinit_nr_buf:
	if (c_data->vid_vp_action.nr_enabled)
		deinit_nr_buf(c_data);
s_on_deinit_m_buf:
	deinit_motion_buf(c_data);
	return rc;
}