Problem with IPU : Rotation by 90 and 270 degree

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

Problem with IPU : Rotation by 90 and 270 degree

1,346 次查看
rinkeshpatel
Contributor II

We are using i.MX6 SabreSD Dual board.

We are trying to perform captured frames using IPU.

We are working on resolutions 720p and 1080p.

We tried both capture(V4L2_CID_MXC_ROT) and display(V4L2_CID_ROTATE) IOCTLs for rotation. But rotation is only possible for 180 and 0 degree.

Where as we are getting below error while doing rotation of 90 and 270 degrees.

mxc_v4l2_output mxc_v4l2_output.0: display work fail ret = -22.

we observed that IPU rotation(90 and 270 degree) works fine for VGA resolution but not for 720p and 1080p.

Can you please suggest any possible approach?

0 项奖励
4 回复数

785 次查看
binjiao
Contributor I

Hi Rinkesh Patel

0 项奖励

785 次查看
rinkeshpatel
Contributor II

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?

0 项奖励

785 次查看
alejandrolozan1
NXP Employee
NXP Employee

Hi,

I.MX6 IPU does not support rotation (limitation of IC module) above 1024x1024,

so one needs to split image on smaller areas and rotate them, after that

combine to whole image. Unfortunately I lack of an example like that.

/Alejandro

0 项奖励

785 次查看
binjiao
Contributor I

Hi

0 项奖励