Hi,
According to below analysis, it seems like IPU doesn't support all 90 degree related rotations(90=90Right,270=90Left,etc. mentioned below).
/* ipu.h */
typedef enum {
IPU_ROTATE_NONE = 0,
IPU_ROTATE_VERT_FLIP = 1,
IPU_ROTATE_HORIZ_FLIP = 2,
IPU_ROTATE_180 = 3,
IPU_ROTATE_90_RIGHT = 4,
IPU_ROTATE_90_RIGHT_VFLIP = 5,
IPU_ROTATE_90_RIGHT_HFLIP = 6,
IPU_ROTATE_90_LEFT = 7,
} ipu_rotate_mode_t;
After debugging calling sequence, below are the observations. Please refer NOTE for more detail.
mxc_vout.c
mxc_vidioc_s_crop()->mxc_vout_try_task()->ipu_try_task()->ipu_check_task()
ipu_device.c
ipu_check_task()->check_task()->update_split_setting()
NOTE :
1) mxc_vidioc_s_crop is being called when ioctl VIDIOC_S_CROP is invoked from application
2) Update_split_setting() is being called if crop width or crop height is > 1024
3) Inside update_split_setting(), at the start of function if requested rotation in case of split(i.e. crop width/height is greater than 1024) is related to 90degree, then error IPU_CHECK_ERR_SPLIT_WITH_ROT is returned. Refer below code.
/* ipu_device.c */
static int update_split_setting(struct ipu_task_entry *t, bool vdi_split)
{
:
if (t->output.rotate >= IPU_ROTATE_90_RIGHT)
return IPU_CHECK_ERR_SPLIT_WITH_ROT;
:
}
Please provide suggestions on below query
1) Is above understanding correct?
2) Is it feasible to modify driver to support 90 degree rotation for resolution above 1024X1024?
3) Are there any hardware IPU limitations due to which 90 degree rotation is not achievable above 1024X1024 resolution?