Browse Source

samples: video: capture: add crop/compose support

Demonstrate the crop/compose API by introducing 4 new
CONFIG options in order to define the crop area.
Moreover, if the selection API is available and if
the targetted size is different from the current crop
size, then try to apply a compose in order to reach
the targetted format size.

Signed-off-by: Alain Volmat <alain.volmat@foss.st.com>
pull/91677/head
Alain Volmat 3 weeks ago committed by Dan Kalowsky
parent
commit
174dead086
  1. 26
      samples/drivers/video/capture/Kconfig
  2. 47
      samples/drivers/video/capture/src/main.c

26
samples/drivers/video/capture/Kconfig

@ -5,6 +5,32 @@ mainmenu "Video capture sample application" @@ -5,6 +5,32 @@ mainmenu "Video capture sample application"
menu "Video capture configuration"
config VIDEO_SOURCE_CROP_LEFT
int "Crop area left value"
default 0
help
Left value of the crop area within the video source.
config VIDEO_SOURCE_CROP_TOP
int "Crop area top value"
default 0
help
Top value of the crop area within the video source.
config VIDEO_SOURCE_CROP_WIDTH
int "Crop area width value"
default 0
help
Width value of the crop area within the video source.
If set to 0, the crop is not applied.
config VIDEO_SOURCE_CROP_HEIGHT
int "Crop area height value"
default 0
help
Height value of the crop area within the video source.
If set to 0, the crop is not applied.
config VIDEO_FRAME_HEIGHT
int "Height of the video frame"
default 0

47
samples/drivers/video/capture/src/main.c

@ -95,6 +95,12 @@ int main(void) @@ -95,6 +95,12 @@ int main(void)
struct video_frmival frmival;
struct video_frmival_enum fie;
enum video_buf_type type = VIDEO_BUF_TYPE_OUTPUT;
#if (CONFIG_VIDEO_SOURCE_CROP_WIDTH && CONFIG_VIDEO_SOURCE_CROP_HEIGHT) || \
CONFIG_VIDEO_FRAME_HEIGHT || CONFIG_VIDEO_FRAME_WIDTH
struct video_selection sel = {
.type = VIDEO_BUF_TYPE_OUTPUT,
};
#endif
unsigned int frame = 0;
size_t bsize;
int i = 0;
@ -139,6 +145,22 @@ int main(void) @@ -139,6 +145,22 @@ int main(void)
return 0;
}
/* Set the crop setting if necessary */
#if CONFIG_VIDEO_SOURCE_CROP_WIDTH && CONFIG_VIDEO_SOURCE_CROP_HEIGHT
sel.target = VIDEO_SEL_TGT_CROP;
sel.rect.left = CONFIG_VIDEO_SOURCE_CROP_LEFT;
sel.rect.top = CONFIG_VIDEO_SOURCE_CROP_TOP;
sel.rect.width = CONFIG_VIDEO_SOURCE_CROP_WIDTH;
sel.rect.height = CONFIG_VIDEO_SOURCE_CROP_HEIGHT;
if (video_set_selection(video_dev, &sel)) {
LOG_ERR("Unable to set selection crop");
return 0;
}
LOG_INF("Selection crop set to (%u,%u)/%ux%u",
sel.rect.left, sel.rect.top, sel.rect.width, sel.rect.height);
#endif
#if CONFIG_VIDEO_FRAME_HEIGHT || CONFIG_VIDEO_FRAME_WIDTH
#if CONFIG_VIDEO_FRAME_HEIGHT
fmt.height = CONFIG_VIDEO_FRAME_HEIGHT;
#endif
@ -147,6 +169,31 @@ int main(void) @@ -147,6 +169,31 @@ int main(void)
fmt.width = CONFIG_VIDEO_FRAME_WIDTH;
#endif
/*
* Check (if possible) if targeted size is same as crop
* and if compose is necessary
*/
sel.target = VIDEO_SEL_TGT_CROP;
err = video_get_selection(video_dev, &sel);
if (err < 0 && err != -ENOSYS) {
LOG_ERR("Unable to get selection crop");
return 0;
}
if (err == 0 && (sel.rect.width != fmt.width || sel.rect.height != fmt.height)) {
sel.target = VIDEO_SEL_TGT_COMPOSE;
sel.rect.left = 0;
sel.rect.top = 0;
sel.rect.width = fmt.width;
sel.rect.height = fmt.height;
err = video_set_selection(video_dev, &sel);
if (err < 0 && err != -ENOSYS) {
LOG_ERR("Unable to set selection compose");
return 0;
}
}
#endif
if (strcmp(CONFIG_VIDEO_PIXEL_FORMAT, "")) {
fmt.pixelformat = VIDEO_FOURCC_FROM_STR(CONFIG_VIDEO_PIXEL_FORMAT);
}

Loading…
Cancel
Save