Skip to contentSkip to conversation

hverkuil/go7007: staging: media: go7007: Add Framesizes

PATCH New Volokh Konstantin 1 participant 7 messages Mar 10, 2013

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/7 hverkuil/go7007: staging: media: go7007: Add Framesizes

---
 drivers/staging/media/go7007/go7007-v4l2.c |   76 ++++++++++++++++++++++++++++
 1 files changed, 76 insertions(+), 0 deletions(-)
drivers/staging/media/go7007/go7007-v4l2.c +76 -0
index 66307ea..4ec9b84 100644
@@ -612,6 +612,82 @@ static int vidioc_enum_framesizes(struct file *filp, void *priv,
 {
 	struct go7007 *go = video_drvdata(filp);
 
+	if (go->board_id == GO7007_BOARDID_ADLINK_MPG24) {
+		switch (go->standard) {
+		case GO7007_STD_NTSC:
+			switch (fsize->pixel_format) {
+			case V4L2_PIX_FMT_MJPEG:
+			case V4L2_PIX_FMT_MPEG:
+			case V4L2_PIX_FMT_H263:
+				switch (fsize->index) {
+				case 0:
+					fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+					fsize->discrete.width = 720;
+					fsize->discrete.height = 480;
+					break;
+				case 1:
+					fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+					fsize->discrete.width = 640;
+					fsize->discrete.height = 480;
+					break;
+				case 2:
+					fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+					fsize->discrete.width = 352;
+					fsize->discrete.height = 240;
+					break;
+				case 3:
+					fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+					fsize->discrete.width = 320;
+					fsize->discrete.height = 240;
+					break;
+				case 4:
+					fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+					fsize->discrete.width = 176;
+					fsize->discrete.height = 112;
+					break;
+				default:
+					return -EINVAL;
+				}
+				break;
+			default:
+				return -EINVAL;
+			}
+			break;
+		case GO7007_STD_PAL:
+			switch (fsize->pixel_format) {
+			case V4L2_PIX_FMT_MJPEG:
+			case V4L2_PIX_FMT_MPEG:
+			case V4L2_PIX_FMT_H263:
+				switch (fsize->index) {
+				case 0:
+					fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+					fsize->discrete.width = 720;
+					fsize->discrete.height = 576;
+					break;
+				case 1:
+					fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+					fsize->discrete.width = 352;
+					fsize->discrete.height = 288;
+					break;
+				case 2:
+					fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
+					fsize->discrete.width = 176;
+					fsize->discrete.height = 144;
+					break;
+				default:
+					return -EINVAL;
+				}
+				break;
+			default:
+				return -EINVAL;
+			}
+			break;
+		default:
+			return -EINVAL;
+		}
+		return 0;
+	}
+
 	if (fsize->index > 0)
 		return -EINVAL;
 
Signature · 1 line
1.7.7.6
#1 lore raw

PATCH 2/7 hverkuil/go7007: staging: media: go7007: Add Frameintervals

---
 drivers/staging/media/go7007/go7007-v4l2.c |  123 ++++++++++++++++++++++++++++
 1 files changed, 123 insertions(+), 0 deletions(-)
drivers/staging/media/go7007/go7007-v4l2.c +123 -0
index 4ec9b84..96538f6 100644
@@ -703,6 +703,129 @@ static int vidioc_enum_frameintervals(struct file *filp, void *priv,
 {
 	struct go7007 *go = video_drvdata(filp);
 
+	if (go->board_id == GO7007_BOARDID_ADLINK_MPG24) {
+		switch (fival->pixel_format) {
+		case V4L2_PIX_FMT_MJPEG:
+		case V4L2_PIX_FMT_MPEG:
+		case V4L2_PIX_FMT_H263:
+			switch (go->standard) {
+			case GO7007_STD_NTSC:
+				switch (fival->index) {
+				case 0:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*1;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 1:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*2;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 2:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*3;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 3:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*4;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 4:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*5;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 5:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*6;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 6:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*7;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 7:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*10;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 8:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*15;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 9:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*30;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				default:
+					return -EINVAL;
+				}
+				break;
+			case GO7007_STD_PAL:
+				switch (fival->index) {
+				case 0:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*1;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 1:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*2;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 2:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*3;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 3:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*4;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 4:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*5;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 5:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*6;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 6:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*8;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 7:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*13;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				case 8:
+					fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
+					fival->discrete.numerator = 1001*25;
+					fival->discrete.denominator = go->sensor_framerate;
+					break;
+				default:
+					return -EINVAL;
+				}
+				break;
+			default:
+				return -EINVAL;
+			}
+			break;
+		default:
+			return -EINVAL;
+		}
+		return 0;
+	}
+
 	if (fival->index > 0)
 		return -EINVAL;
 
Signature · 1 line
1.7.7.6
#2 lore raw

PATCH 3/7 hverkuil/go7007: staging: media: go7007: Restore b_frame control

In reply to Volokh Konstantin
---
 drivers/staging/media/go7007/go7007-priv.h |    1 +
 drivers/staging/media/go7007/go7007-v4l2.c |    7 +++++--
 2 files changed, 6 insertions(+), 2 deletions(-)
drivers/staging/media/go7007/go7007-priv.h +1 -0
index e969df1..fc8aac4 100644
@@ -174,6 +174,7 @@ struct go7007 {
 		struct v4l2_ctrl *mpeg_video_gop_size;
 		struct v4l2_ctrl *mpeg_video_gop_closure;
 		struct v4l2_ctrl *mpeg_video_bitrate;
+		struct v4l2_ctrl *mpeg_video_b_frames;
 	};
 	struct v4l2_ctrl *mpeg_video_aspect_ratio;
 	enum { STATUS_INIT, STATUS_ONLINE, STATUS_SHUTDOWN } status;
drivers/staging/media/go7007/go7007-v4l2.c +5 -2
index 96538f6..91e5572 100644
@@ -155,7 +155,7 @@ static void set_formatting(struct go7007 *go)
 	go->gop_header_enable = 1;
 	go->repeat_seqhead = 0;
 	go->dvd_mode = 0;
-	go->ipb = 0;
+	go->ipb = v4l2_ctrl_g_ctrl(go->mpeg_video_b_frames);
 
 	switch (v4l2_ctrl_g_ctrl(go->mpeg_video_aspect_ratio)) {
 	default:
@@ -1143,7 +1143,7 @@ int go7007_v4l2_ctrl_init(struct go7007 *go)
 	struct v4l2_ctrl *ctrl;
 	int rv;
 
-	v4l2_ctrl_handler_init(hdl, 12);
+	v4l2_ctrl_handler_init(hdl, 24);
 	go->mpeg_stream_type = v4l2_ctrl_new_std_menu(hdl, &go7007_ctrl_ops,
 			V4L2_CID_MPEG_STREAM_TYPE,
 			V4L2_MPEG_STREAM_TYPE_MPEG2_DVD,
@@ -1160,6 +1160,9 @@ int go7007_v4l2_ctrl_init(struct go7007 *go)
 	go->mpeg_video_bitrate = v4l2_ctrl_new_std(hdl, &go7007_ctrl_ops,
 			V4L2_CID_MPEG_VIDEO_BITRATE,
 			64000, 10000000, 1, 1500000);
+	go->mpeg_video_b_frames = v4l2_ctrl_new_std(hdl, &go7007_ctrl_ops,
+			V4L2_CID_MPEG_VIDEO_B_FRAMES,
+			0, 2, 1, 0);
 	go->mpeg_video_aspect_ratio = v4l2_ctrl_new_std_menu(hdl, &go7007_ctrl_ops,
 			V4L2_CID_MPEG_VIDEO_ASPECT,
 			V4L2_MPEG_VIDEO_ASPECT_16x9, 0,
Signature · 1 line
1.7.7.6
#3 lore raw

PATCH 4/7 hverkuil/go7007: staging: media: go7007: Add Modet controls

In reply to Volokh Konstantin
---
 drivers/staging/media/go7007/go7007-v4l2.c |   95 ++++++++++++++++++++++++++++
 drivers/staging/media/go7007/go7007.h      |   18 +++++
 2 files changed, 113 insertions(+), 0 deletions(-)
drivers/staging/media/go7007/go7007-v4l2.c +95 -0
index 91e5572..c4d0ca2 100644
@@ -1137,6 +1137,101 @@ static struct video_device go7007_template = {
 	.tvnorms	= V4L2_STD_ALL,
 };
 
+static struct v4l2_ctrl_config md_configs[] = {
+	{
+		.ops = &go7007_ctrl_ops
+		,.id = V4L2_CID_USER_MODET_REGION_NUMBER
+		,.name = "Region MD"
+		,.type = V4L2_CTRL_TYPE_INTEGER
+		,.min = 0
+		,.max = 3
+		,.step = 1
+		,.def = 0
+	}
+	,{
+		.ops = &go7007_ctrl_ops
+		,.id = V4L2_CID_USER_MODET_PIXEL_THRESOLD
+		,.name = "Pixel Thresold"
+		,.type = V4L2_CTRL_TYPE_INTEGER
+		,.min = 0
+		,.max = 65535
+		,.step = 1
+		,.def = 32767
+	}
+	,{
+		.ops = &go7007_ctrl_ops
+		,.id = V4L2_CID_USER_MODET_MOTION_THRESOLD
+		,.name = "Motion Thresold"
+		,.type = V4L2_CTRL_TYPE_INTEGER
+		,.min = 0
+		,.max = 65535
+		,.step = 1
+		,.def = 32767
+	}
+	,{
+		.ops = &go7007_ctrl_ops
+		,.id = V4L2_CID_USER_MODET_TRIGGER
+		,.name = "Trigger"
+		,.type = V4L2_CTRL_TYPE_INTEGER
+		,.min = 0
+		,.max = 65535
+		,.step = 1
+		,.def = 32767
+	}
+	,{
+		.ops = &go7007_ctrl_ops
+		,.id = V4L2_CID_USER_MODET_CLIP_LEFT
+		,.name = "Left of Region"
+		,.type = V4L2_CTRL_TYPE_INTEGER
+		,.min = 0
+		,.step = 1
+		,.def = 0
+	}
+	,{
+		.ops = &go7007_ctrl_ops
+		,.id = V4L2_CID_USER_MODET_CLIP_TOP
+		,.name = "Top of Region"
+		,.type = V4L2_CTRL_TYPE_INTEGER
+		,.min = 0
+		,.step = 1
+		,.def = 0
+	}
+	,{
+		.ops = &go7007_ctrl_ops
+		,.id = V4L2_CID_USER_MODET_CLIP_WIDTH
+		,.name = "Width of Region"
+		,.type = V4L2_CTRL_TYPE_INTEGER
+		,.min = 0
+		,.step = 1
+		,.def = 0
+	}
+	,{
+		.ops = &go7007_ctrl_ops
+		,.id = V4L2_CID_USER_MODET_CLIP_HEIGHT
+		,.name = "Height of Region"
+		,.type = V4L2_CTRL_TYPE_INTEGER
+		,.min = 0
+		,.step = 1
+		,.def = 0
+	}
+	,{
+		.ops = &go7007_ctrl_ops
+		,.id = V4L2_CID_USER_MODET_REGION_CONTROL
+		,.name = "Region Control"
+		,.type = V4L2_CTRL_TYPE_MENU
+		,.min = rcAdd
+		,.max = rcClear
+		,.step = 0
+		,.def = rcClear
+		,.qmenu = (const char * const[]){
+			"Add"
+			,"Delete"
+			,"Clear"
+			,NULL
+		}
+	}
+};
+
 int go7007_v4l2_ctrl_init(struct go7007 *go)
 {
 	struct v4l2_ctrl_handler *hdl = &go->hdl;
drivers/staging/media/go7007/go7007.h +18 -0
index 54b9897..fcb45ea 100644
@@ -38,3 +38,21 @@ struct go7007_md_region {
 					struct go7007_md_params)
 #define	GO7007IOC_S_MD_REGION	_IOW('V', BASE_VIDIOC_PRIVATE + 8, \
 					struct go7007_md_region)
+
+#define V4L2_CID_USER_GO7007_BASE			(V4L2_CID_USER_BASE + 0x1000)
+#define V4L2_CID_USER_MODET_REGION_NUMBER		(V4L2_CID_USER_GO7007_BASE + 0x01)
+#define V4L2_CID_USER_MODET_PIXEL_THRESOLD		(V4L2_CID_USER_GO7007_BASE + 0x02)
+#define V4L2_CID_USER_MODET_MOTION_THRESOLD		(V4L2_CID_USER_GO7007_BASE + 0x03)
+#define V4L2_CID_USER_MODET_TRIGGER			(V4L2_CID_USER_GO7007_BASE + 0x04)
+#define V4L2_CID_USER_MODET_REGION_CONTROL		(V4L2_CID_USER_GO7007_BASE + 0x05)
+#define V4L2_CID_USER_MODET_CLIP_LEFT			(V4L2_CID_USER_GO7007_BASE + 0x06)
+#define V4L2_CID_USER_MODET_CLIP_TOP			(V4L2_CID_USER_GO7007_BASE + 0x07)
+#define V4L2_CID_USER_MODET_CLIP_WIDTH			(V4L2_CID_USER_GO7007_BASE + 0x08)
+#define V4L2_CID_USER_MODET_CLIP_HEIGHT			(V4L2_CID_USER_GO7007_BASE + 0x09)
+#define V4L2_CID_USER_MODET_ALARM			(V4L2_CID_USER_GO7007_BASE + 0x09)
+
+enum RegionControl {
+	rcAdd = 0
+	,rcDelete = 1
+	,rcClear = 2
+};
Signature · 1 line
1.7.7.6
#4 lore raw

PATCH 5/7 hverkuil/go7007: staging: media: go7007: Functionality for modet controls

In reply to Volokh Konstantin

The idea of modet controls through userspace is:
The first of all need select region number (0..3) (it value stores) And then config thresolds (pixel,motion,trigger) for that region. Also it`s available setup regions controls (each of 16x16 rects of the frame, where detection will be approve).
In user space need only add/delete or clear some rect (set top,left,width,height) and system automaticaly set up each 16x16 rects for that.
Clear buttom/menu clears all modet region for detection. (idle work)

---
 drivers/staging/media/go7007/go7007-priv.h |    9 ++-
 drivers/staging/media/go7007/go7007-v4l2.c |  120 ++++++++++++++++++++++++++++
 2 files changed, 128 insertions(+), 1 deletions(-)
drivers/staging/media/go7007/go7007-priv.h +8 -1
index fc8aac4..36b271f 100644
@@ -226,7 +226,14 @@ struct go7007 {
 	} modet[4];
 	unsigned char modet_map[1624];
 	unsigned char active_map[216];
-
+	struct { /* modet type control cluster */
+		struct v4l2_ctrl *modet_clip_left;
+		struct v4l2_ctrl *modet_clip_top;
+		struct v4l2_ctrl *modet_clip_width;
+		struct v4l2_ctrl *modet_clip_height;
+		struct v4l2_ctrl *modet_region_number;
+		//struct v4l2_ctrl *mpeg_video_b_frames;
+	};
 	/* Video streaming */
 	struct mutex queue_lock;
 	struct vb2_queue vidq;
drivers/staging/media/go7007/go7007-v4l2.c +120 -0

138 lines not on this page · raw message

Signature · 1 line
1.7.7.6
#5 lore raw

PATCH 6/7 hverkuil/go7007: staging: media: go7007: Cleanup Unused modet code

In reply to Volokh Konstantin
---
 drivers/staging/media/go7007/go7007-v4l2.c |   94 ----------------------------
 1 files changed, 0 insertions(+), 94 deletions(-)
drivers/staging/media/go7007/go7007-v4l2.c +0 -94
index 7ea0ea1..30ae939 100644
@@ -292,64 +292,6 @@ static int set_capture_size(struct go7007 *go, struct v4l2_format *fmt, int try)
 	return 0;
 }
 
-#if 0
-static int clip_to_modet_map(struct go7007 *go, int region,
-		struct v4l2_clip *clip_list)
-{
-	struct v4l2_clip clip, *clip_ptr;
-	int x, y, mbnum;
-
-	/* Check if coordinates are OK and if any macroblocks are already
-	 * used by other regions (besides 0) */
-	clip_ptr = clip_list;
-	while (clip_ptr) {
-		if (copy_from_user(&clip, clip_ptr, sizeof(clip)))
-			return -EFAULT;
-		if (clip.c.left < 0 || (clip.c.left & 0xF) ||
-				clip.c.width <= 0 || (clip.c.width & 0xF))
-			return -EINVAL;
-		if (clip.c.left + clip.c.width > go->width)
-			return -EINVAL;
-		if (clip.c.top < 0 || (clip.c.top & 0xF) ||
-				clip.c.height <= 0 || (clip.c.height & 0xF))
-			return -EINVAL;
-		if (clip.c.top + clip.c.height > go->height)
-			return -EINVAL;
-		for (y = 0; y < clip.c.height; y += 16)
-			for (x = 0; x < clip.c.width; x += 16) {
-				mbnum = (go->width >> 4) *
-						((clip.c.top + y) >> 4) +
-					((clip.c.left + x) >> 4);
-				if (go->modet_map[mbnum] != 0 &&
-						go->modet_map[mbnum] != region)
-					return -EBUSY;
-			}
-		clip_ptr = clip.next;
-	}
-
-	/* Clear old region macroblocks */
-	for (mbnum = 0; mbnum < 1624; ++mbnum)
-		if (go->modet_map[mbnum] == region)
-			go->modet_map[mbnum] = 0;
-
-	/* Claim macroblocks in this list */
-	clip_ptr = clip_list;
-	while (clip_ptr) {
-		if (copy_from_user(&clip, clip_ptr, sizeof(clip)))
-			return -EFAULT;
-		for (y = 0; y < clip.c.height; y += 16)
-			for (x = 0; x < clip.c.width; x += 16) {
-				mbnum = (go->width >> 4) *
-						((clip.c.top + y) >> 4) +
-					((clip.c.left + x) >> 4);
-				go->modet_map[mbnum] = region;
-			}
-		clip_ptr = clip.next;
-	}
-	return 0;
-}
-#endif
-
 static int go7007_s_ctrl(struct v4l2_ctrl *ctrl)
 {
 	struct go7007 *go =
@@ -1045,42 +987,6 @@ static int vidioc_log_status(struct file *file, void *priv)
 	return call_all(&go->v4l2_dev, core, log_status);
 }
 
-/* FIXME:
-	Those ioctls are private, and not needed, since several standard
-	extended controls already provide streaming control.
-	So, those ioctls should be converted into vidioc_g_ext_ctrls()
-	and vidioc_s_ext_ctrls()
- */
-
-#if 0
-	case GO7007IOC_S_MD_PARAMS:
-	{
-		struct go7007_md_params *mdp = arg;
-
-		if (mdp->region > 3)
-			return -EINVAL;
-		if (mdp->trigger > 0) {
-			go->modet[mdp->region].pixel_threshold =
-					mdp->pixel_threshold >> 1;
-			go->modet[mdp->region].motion_threshold =
-					mdp->motion_threshold >> 1;
-			go->modet[mdp->region].mb_threshold =
-					mdp->trigger >> 1;
-			go->modet[mdp->region].enable = 1;
-		} else
-			go->modet[mdp->region].enable = 0;
-		/* fall-through */
-	}
-	case GO7007IOC_S_MD_REGION:
-	{
-		struct go7007_md_region *region = arg;
-
-		if (region->region < 1 || region->region > 3)
-			return -EINVAL;
-		return clip_to_modet_map(go, region->region, region->clips);
-	}
-#endif
-
 static struct v4l2_ctrl_ops go7007_ctrl_ops = {
 	.s_ctrl = go7007_s_ctrl,
 };
Signature · 1 line
1.7.7.6
#6 lore raw

PATCH 7/7 hverkuil/go7007: staging: media: go7007: Clean trivial

In reply to Volokh Konstantin
---
 drivers/staging/media/go7007/go7007-priv.h |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)
drivers/staging/media/go7007/go7007-priv.h +0 -1
index 36b271f..9ec5319 100644
@@ -232,7 +232,6 @@ struct go7007 {
 		struct v4l2_ctrl *modet_clip_width;
 		struct v4l2_ctrl *modet_clip_height;
 		struct v4l2_ctrl *modet_region_number;
-		//struct v4l2_ctrl *mpeg_video_b_frames;
 	};
 	/* Video streaming */
 	struct mutex queue_lock;
Signature · 1 line
1.7.7.6