[vlc-commits] v4l2: factor our crop resetting
Rémi Denis-Courmont
git at videolan.org
Tue Mar 20 22:46:53 CET 2012
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Mar 20 23:01:04 2012 +0200| [2ff0d900afb545bc6010792f5fa25f31771e3d82] | committer: Rémi Denis-Courmont
v4l2: factor our crop resetting
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2ff0d900afb545bc6010792f5fa25f31771e3d82
---
modules/access/v4l2/video.c | 53 ++++++++++++++++++++++---------------------
1 files changed, 27 insertions(+), 26 deletions(-)
diff --git a/modules/access/v4l2/video.c b/modules/access/v4l2/video.c
index 6ebbab5..8569868 100644
--- a/modules/access/v4l2/video.c
+++ b/modules/access/v4l2/video.c
@@ -752,6 +752,32 @@ static int SetupTuner (vlc_object_t *obj, int fd,
return 0;
}
+static int ResetCrop (vlc_object_t *obj, int fd)
+{
+ struct v4l2_cropcap cropcap = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE };
+
+ /* In theory, this ioctl() must work for all video capture devices.
+ * In practice, it does not. */
+ if (v4l2_ioctl (fd, VIDIOC_CROPCAP, &cropcap) < 0)
+ {
+ msg_Warn (obj, "cannot get cropping properties: %m");
+ return -1;
+ }
+
+ /* Reset to the default cropping rectangle */
+ struct v4l2_crop crop = {
+ .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ .c = cropcap.defrect,
+ };
+
+ if (v4l2_ioctl (fd, VIDIOC_S_CROP, &crop) < 0)
+ {
+ msg_Warn (obj, "cannot reset cropping limits: %m");
+ return -1;
+ }
+ return 0;
+}
+
static int SetupInput (vlc_object_t *obj, int fd)
{
struct v4l2_input input;
@@ -786,6 +812,7 @@ static int SetupInput (vlc_object_t *obj, int fd)
msg_Dbg (obj, "selected input %"PRIu32, input.index);
SetupStandard (obj, fd, &input);
+ ResetCrop (obj, fd); /* crop depends on standard */
SetupTuner (obj, fd, &input);
SetupAudio (obj, fd, &input);
return 0;
@@ -1029,8 +1056,6 @@ static bool IsPixelFormatSupported( struct v4l2_fmtdesc *codecs, size_t n,
int InitVideo( vlc_object_t *p_obj, int i_fd, demux_sys_t *p_sys,
bool b_demux )
{
- struct v4l2_cropcap cropcap;
- struct v4l2_crop crop;
struct v4l2_format fmt;
unsigned int i_min;
enum v4l2_buf_type buf_type;
@@ -1137,30 +1162,6 @@ int InitVideo( vlc_object_t *p_obj, int i_fd, demux_sys_t *p_sys,
/* if MPEG encoder card, no need to do anything else after this */
p_sys->controls = ControlsInit( p_obj, i_fd );
- /* Reset Cropping */
- memset( &cropcap, 0, sizeof(cropcap) );
- cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- if( v4l2_ioctl( i_fd, VIDIOC_CROPCAP, &cropcap ) >= 0 )
- {
- crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- crop.c = cropcap.defrect; /* reset to default */
- if( crop.c.width > 0 && crop.c.height > 0 ) /* Fix for fm tuners */
- {
- if( v4l2_ioctl( i_fd, VIDIOC_S_CROP, &crop ) < 0 )
- {
- switch( errno )
- {
- case EINVAL:
- /* Cropping not supported. */
- break;
- default:
- /* Errors ignored. */
- break;
- }
- }
- }
- }
-
/* Try and find default resolution if not specified */
int width = var_InheritInteger( p_obj, CFG_PREFIX"width" );
int height = var_InheritInteger( p_obj, CFG_PREFIX"height" );
More information about the vlc-commits
mailing list