Re: [RFC/PATCH 3/5] vpif_cap/disp: Added support for DV presets

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Saturday, October 23, 2010 21:40:01 Hiremath, Vaibhav wrote:
> 
> > -----Original Message-----
> > From: mats.randgaard@xxxxxxxxxxxx [mailto:mats.randgaard@xxxxxxxxxxxx]
> > Sent: Friday, October 22, 2010 12:31 PM
> > To: Hiremath, Vaibhav
> > Cc: linux-media@xxxxxxxxxxxxxxx; hans.verkuil@xxxxxxxxxxxx; Mats Randgaard
> > Subject: [RFC/PATCH 3/5] vpif_cap/disp: Added support for DV presets
> > 
> > From: Mats Randgaard <mats.randgaard@xxxxxxxxxxxx>
> > 
> > Added functions to set/get/query/enum DV presets.
> > 
> > Signed-off-by: Mats Randgaard <mats.randgaard@xxxxxxxxxxxx>
> > Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxxxxx>
> > ---
> >  drivers/media/video/davinci/vpif_capture.c |  143
> > +++++++++++++++++++++++++++-
> >  drivers/media/video/davinci/vpif_capture.h |    1 +
> >  drivers/media/video/davinci/vpif_display.c |  119 ++++++++++++++++++++++-
> >  drivers/media/video/davinci/vpif_display.h |    1 +
> >  4 files changed, 255 insertions(+), 9 deletions(-)
> > 
> > diff --git a/drivers/media/video/davinci/vpif_capture.c
> > b/drivers/media/video/davinci/vpif_capture.c
> > index 778af7e..bf1adea 100644
> > --- a/drivers/media/video/davinci/vpif_capture.c
> > +++ b/drivers/media/video/davinci/vpif_capture.c
> > @@ -432,9 +432,18 @@ static int vpif_update_std_info(struct channel_obj
> > *ch)
> > 
> >  	for (index = 0; index < vpif_ch_params_count; index++) {
> >  		config = &ch_params[index];
> > -		if (config->stdid & vid_ch->stdid) {
> > -			memcpy(std_info, config, sizeof(*config));
> > -			break;
> > +		if (config->hd_sd == 0) {
> > +			vpif_dbg(2, debug, "SD format\n");
> > +			if (config->stdid & vid_ch->stdid) {
> > +				memcpy(std_info, config, sizeof(*config));
> > +				break;
> > +			}
> > +		} else {
> > +			vpif_dbg(2, debug, "HD format\n");
> > +			if (config->dv_preset == vid_ch->dv_preset) {
> > +				memcpy(std_info, config, sizeof(*config));
> > +				break;
> > +			}
> >  		}
> >  	}
> > 
> > @@ -1442,6 +1451,7 @@ static int vpif_s_std(struct file *file, void *priv,
> > v4l2_std_id *std_id)
> >  		return -ERESTARTSYS;
> > 
> >  	ch->video.stdid = *std_id;
> > +	ch->video.dv_preset = V4L2_DV_INVALID;
> > 
> >  	/* Get the information about the standard */
> >  	if (vpif_update_std_info(ch)) {
> > @@ -1794,6 +1804,129 @@ static int vpif_cropcap(struct file *file, void
> > *priv,
> >  	return 0;
> >  }
> > 
> > +/**
> > + * vpif_enum_dv_presets() - ENUM_DV_PRESETS handler
> > + * @file: file ptr
> > + * @priv: file handle
> > + * @preset: input preset
> > + */
> > +static int vpif_enum_dv_presets(struct file *file, void *priv,
> > +		struct v4l2_dv_enum_preset *preset)
> > +{
> > +	struct vpif_fh *fh = priv;
> > +	struct channel_obj *ch = fh->channel;
> > +
> > +	if (!vpif_obj.sd) {
> > +		vpif_dbg(2, debug, "No sub devices registered\n");
> > +
> > +		if (preset->index >= vpif_ch_params_count)
> > +			return -EINVAL;
> > +
> > +		/* dv-presets only */
> > +		if (ch_params[preset->index].hd_sd == 0)
> > +			return -EINVAL;
> > +
> > +		return v4l_fill_dv_preset_info(
> > +				ch_params[preset->index].dv_preset, preset);
> > +	}
> > +
> [Hiremath, Vaibhav] I believe to completely work in non-subdev mode of operation you might have to change some existing API's as well right? So I think we should break this patch into two separate patches, 

Oops, that's a left-over from the earlier patch-series. We're not going to do
non-subdev mode (as per our discussions), so this 'if (!vpif_obj.sd)' condition
should be removed for the time being. Once we start work on the 'dummy' subdev
we probably will have to revisit this.

Regards,

	Hans

> 
> vpif_cap/disp: Added support for DV presets
> and
> vpif_cap/disp: Add support for non-subdev mode
> 
> Rest looks ok to me.
> 
> Thanks,
> Vaibhav
> 
> 
> > +	return v4l2_subdev_call(vpif_obj.sd[ch->curr_sd_index],
> > +			video, enum_dv_presets, preset);
> > +}
> > +
> > +/**
> > + * vpif_query_dv_presets() - QUERY_DV_PRESET handler
> > + * @file: file ptr
> > + * @priv: file handle
> > + * @preset: input preset
> > + */
> > +static int vpif_query_dv_preset(struct file *file, void *priv,
> > +		struct v4l2_dv_preset *preset)
> > +{
> > +	struct vpif_fh *fh = priv;
> > +	struct channel_obj *ch = fh->channel;
> > +
> > +	if (!vpif_obj.sd) {
> > +		vpif_dbg(2, debug, "No sub devices registered\n");
> > +		return -EINVAL;
> > +	}
> > +
> > +	return v4l2_subdev_call(vpif_obj.sd[ch->curr_sd_index],
> > +		       video, query_dv_preset, preset);
> > +}
> > +/**
> > + * vpif_s_dv_presets() - S_DV_PRESETS handler
> > + * @file: file ptr
> > + * @priv: file handle
> > + * @preset: input preset
> > + */
> > +static int vpif_s_dv_preset(struct file *file, void *priv,
> > +		struct v4l2_dv_preset *preset)
> > +{
> > +	struct vpif_fh *fh = priv;
> > +	struct channel_obj *ch = fh->channel;
> > +	struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX];
> > +	int ret = 0;
> > +
> > +	if (common->started) {
> > +		vpif_err("streaming in progress\n");
> > +		return -EBUSY;
> > +	}
> > +
> > +	if ((VPIF_CHANNEL0_VIDEO == ch->channel_id) ||
> > +	    (VPIF_CHANNEL1_VIDEO == ch->channel_id)) {
> > +		if (!fh->initialized) {
> > +			vpif_dbg(1, debug, "Channel Busy\n");
> > +			return -EBUSY;
> > +		}
> > +	}
> > +
> > +	ret = v4l2_prio_check(&ch->prio, fh->prio);
> > +	if (ret)
> > +		return ret;
> > +
> > +	fh->initialized = 1;
> > +
> > +	/* Call encoder subdevice function to set the standard */
> > +	if (mutex_lock_interruptible(&common->lock))
> > +		return -ERESTARTSYS;
> > +
> > +	ch->video.dv_preset = preset->preset;
> > +	ch->video.stdid = V4L2_STD_UNKNOWN;
> > +
> > +	/* Get the information about the standard */
> > +	if (vpif_update_std_info(ch)) {
> > +		ret = -EINVAL;
> > +		vpif_err("Error getting the standard info\n");
> > +	} else {
> > +		/* Configure the default format information */
> > +		vpif_config_format(ch);
> > +
> > +	ret = v4l2_subdev_call(vpif_obj.sd[ch->curr_sd_index],
> > +			video, s_dv_preset, preset);
> > +	}
> > +
> > +	mutex_unlock(&common->lock);
> > +
> > +	return ret;
> > +}
> > +/**
> > + * vpif_g_dv_presets() - G_DV_PRESETS handler
> > + * @file: file ptr
> > + * @priv: file handle
> > + * @preset: input preset
> > + */
> > +static int vpif_g_dv_preset(struct file *file, void *priv,
> > +		struct v4l2_dv_preset *preset)
> > +{
> > +	struct vpif_fh *fh = priv;
> > +	struct channel_obj *ch = fh->channel;
> > +
> > +	preset->preset = ch->video.dv_preset;
> > +
> > +	return 0;
> > +}
> > +
> >  /*
> >   * vpif_g_chip_ident() - Identify the chip
> >   * @file: file ptr
> > @@ -1896,6 +2029,10 @@ static const struct v4l2_ioctl_ops vpif_ioctl_ops =
> > {
> >  	.vidioc_streamon        	= vpif_streamon,
> >  	.vidioc_streamoff       	= vpif_streamoff,
> >  	.vidioc_cropcap         	= vpif_cropcap,
> > +	.vidioc_enum_dv_presets         = vpif_enum_dv_presets,
> > +	.vidioc_s_dv_preset             = vpif_s_dv_preset,
> > +	.vidioc_g_dv_preset             = vpif_g_dv_preset,
> > +	.vidioc_query_dv_preset         = vpif_query_dv_preset,
> >  	.vidioc_g_chip_ident		= vpif_g_chip_ident,
> >  #ifdef CONFIG_VIDEO_ADV_DEBUG
> >  	.vidioc_g_register		= vpif_dbg_g_register,
> > diff --git a/drivers/media/video/davinci/vpif_capture.h
> > b/drivers/media/video/davinci/vpif_capture.h
> > index 4e12ec8..3452a8a 100644
> > --- a/drivers/media/video/davinci/vpif_capture.h
> > +++ b/drivers/media/video/davinci/vpif_capture.h
> > @@ -59,6 +59,7 @@ struct video_obj {
> >  	enum v4l2_field buf_field;
> >  	/* Currently selected or default standard */
> >  	v4l2_std_id stdid;
> > +	u32 dv_preset;
> >  	/* This is to track the last input that is passed to application */
> >  	u32 input_idx;
> >  };
> > diff --git a/drivers/media/video/davinci/vpif_display.c
> > b/drivers/media/video/davinci/vpif_display.c
> > index edfc095..4554971 100644
> > --- a/drivers/media/video/davinci/vpif_display.c
> > +++ b/drivers/media/video/davinci/vpif_display.c
> > @@ -373,15 +373,23 @@ static int vpif_get_std_info(struct channel_obj *ch)
> > 
> >  	int index;
> > 
> > -	std_info->stdid = vid_ch->stdid;
> > -	if (!std_info->stdid)
> > -		return -1;
> > +	if (!vid_ch->stdid && !vid_ch->dv_preset)
> > +		return -EINVAL;
> > 
> >  	for (index = 0; index < vpif_ch_params_count; index++) {
> >  		config = &ch_params[index];
> > -		if (config->stdid & std_info->stdid) {
> > -			memcpy(std_info, config, sizeof(*config));
> > -			break;
> > +		if (config->hd_sd == 0) {
> > +			vpif_dbg(2, debug, "SD format\n");
> > +			if (config->stdid & vid_ch->stdid) {
> > +				memcpy(std_info, config, sizeof(*config));
> > +				break;
> > +			}
> > +		} else {
> > +			vpif_dbg(2, debug, "HD format\n");
> > +			if (config->dv_preset == vid_ch->dv_preset) {
> > +				memcpy(std_info, config, sizeof(*config));
> > +				break;
> > +			}
> >  		}
> >  	}
> > 
> > @@ -1305,6 +1313,102 @@ static int vpif_s_priority(struct file *file, void
> > *priv, enum v4l2_priority p)
> >  	return v4l2_prio_change(&ch->prio, &fh->prio, p);
> >  }
> > 
> > +/**
> > + * vpif_enum_dv_presets() - ENUM_DV_PRESETS handler
> > + * @file: file ptr
> > + * @priv: file handle
> > + * @preset: input preset
> > + */
> > +static int vpif_enum_dv_presets(struct file *file, void *priv,
> > +		struct v4l2_dv_enum_preset *preset)
> > +{
> > +	struct vpif_fh *fh = priv;
> > +	struct channel_obj *ch = fh->channel;
> > +	struct video_obj *vid_ch = &ch->video;
> > +
> > +	if (!vpif_obj.sd) {
> > +		vpif_dbg(2, debug, "No sub devices registered\n");
> > +
> > +		if (preset->index >= vpif_ch_params_count)
> > +			return -EINVAL;
> > +
> > +		/* dv-presets only */
> > +		if (ch_params[preset->index].hd_sd == 0)
> > +			return -EINVAL;
> > +
> > +		return v4l_fill_dv_preset_info(
> > +				ch_params[preset->index].dv_preset, preset);
> > +	}
> > +
> > +	return v4l2_subdev_call(vpif_obj.sd[vid_ch->output_id],
> > +			video, enum_dv_presets, preset);
> > +}
> > +
> > +/**
> > + * vpif_s_dv_presets() - S_DV_PRESETS handler
> > + * @file: file ptr
> > + * @priv: file handle
> > + * @preset: input preset
> > + */
> > +static int vpif_s_dv_preset(struct file *file, void *priv,
> > +		struct v4l2_dv_preset *preset)
> > +{
> > +	struct vpif_fh *fh = priv;
> > +	struct channel_obj *ch = fh->channel;
> > +	struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX];
> > +	struct video_obj *vid_ch = &ch->video;
> > +	int ret = 0;
> > +
> > +	if (common->started) {
> > +		vpif_err("streaming in progress\n");
> > +		return -EBUSY;
> > +	}
> > +
> > +	ret = v4l2_prio_check(&ch->prio, fh->prio);
> > +	if (ret != 0)
> > +		return ret;
> > +
> > +	fh->initialized = 1;
> > +
> > +	/* Call encoder subdevice function to set the standard */
> > +	if (mutex_lock_interruptible(&common->lock))
> > +		return -ERESTARTSYS;
> > +
> > +	ch->video.dv_preset = preset->preset;
> > +	ch->video.stdid = V4L2_STD_UNKNOWN;
> > +
> > +	/* Get the information about the standard */
> > +	if (vpif_get_std_info(ch)) {
> > +		ret = -EINVAL;
> > +		vpif_err("Error getting the standard info\n");
> > +	} else {
> > +		/* Configure the default format information */
> > +		vpif_config_format(ch);
> > +
> > +		ret = v4l2_subdev_call(vpif_obj.sd[vid_ch->output_id],
> > +				video, s_dv_preset, preset);
> > +	}
> > +
> > +	mutex_unlock(&common->lock);
> > +
> > +	return ret;
> > +}
> > +/**
> > + * vpif_g_dv_presets() - G_DV_PRESETS handler
> > + * @file: file ptr
> > + * @priv: file handle
> > + * @preset: input preset
> > + */
> > +static int vpif_g_dv_preset(struct file *file, void *priv,
> > +		struct v4l2_dv_preset *preset)
> > +{
> > +	struct vpif_fh *fh = priv;
> > +	struct channel_obj *ch = fh->channel;
> > +
> > +	preset->preset = ch->video.dv_preset;
> > +
> > +	return 0;
> > +}
> > 
> >  /*
> >   * vpif_g_chip_ident() - Identify the chip
> > @@ -1410,6 +1514,9 @@ static const struct v4l2_ioctl_ops vpif_ioctl_ops =
> > {
> >  	.vidioc_s_output		= vpif_s_output,
> >  	.vidioc_g_output		= vpif_g_output,
> >  	.vidioc_cropcap         	= vpif_cropcap,
> > +	.vidioc_enum_dv_presets         = vpif_enum_dv_presets,
> > +	.vidioc_s_dv_preset             = vpif_s_dv_preset,
> > +	.vidioc_g_dv_preset             = vpif_g_dv_preset,
> >  	.vidioc_g_chip_ident		= vpif_g_chip_ident,
> >  #ifdef CONFIG_VIDEO_ADV_DEBUG
> >  	.vidioc_g_register		= vpif_dbg_g_register,
> > diff --git a/drivers/media/video/davinci/vpif_display.h
> > b/drivers/media/video/davinci/vpif_display.h
> > index a2a7cd1..3d56b3e 100644
> > --- a/drivers/media/video/davinci/vpif_display.h
> > +++ b/drivers/media/video/davinci/vpif_display.h
> > @@ -67,6 +67,7 @@ struct video_obj {
> >  					 * most recent displayed frame only */
> >  	v4l2_std_id stdid;		/* Currently selected or default
> >  					 * standard */
> > +	u32 dv_preset;
> >  	u32 output_id;			/* Current output id */
> >  };
> > 
> > --
> > 1.7.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 

-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG, part of Cisco
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux