@@ -2635,6 +2635,7 @@ WORD32 ihevcd_get_status(iv_obj_t *ps_codec_obj,
26352635 WORD32 i ;
26362636 codec_t * ps_codec ;
26372637 WORD32 wd , ht ;
2638+ WORD32 aligned_wd , aligned_ht ;
26382639 ivd_ctl_getstatus_op_t * ps_ctl_op = (ivd_ctl_getstatus_op_t * )pv_api_op ;
26392640
26402641 UNUSED (pv_api_ip );
@@ -2713,39 +2714,38 @@ WORD32 ihevcd_get_status(iv_obj_t *ps_codec_obj,
27132714 }
27142715
27152716 /*!*/
2716- WORD32 aligned_wd = ALIGN2 (wd );
2717- WORD32 aligned_ht = ALIGN2 (ht );
2717+ aligned_wd = ALIGN2 (wd );
2718+ aligned_ht = ALIGN2 (ht );
27182719 if (ps_codec -> e_chroma_fmt == IV_YUV_420P )
27192720 {
27202721 ps_ctl_op -> u4_min_out_buf_size [0 ] = (aligned_wd * aligned_ht );
2721- ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd >> 1 ) * ( aligned_ht >> 1 ) ;
2722- ps_ctl_op -> u4_min_out_buf_size [2 ] = (aligned_wd >> 1 ) * ( aligned_ht >> 1 ) ;
2722+ ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd * aligned_ht ) >> 2 ;
2723+ ps_ctl_op -> u4_min_out_buf_size [2 ] = (aligned_wd * aligned_ht ) >> 2 ;
27232724 }
27242725 else if (ps_codec -> e_chroma_fmt == IV_YUV_444P )
27252726 {
2726- ps_ctl_op -> u4_min_out_buf_size [0 ] = (aligned_wd * aligned_ht );
2727- ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd * aligned_ht );
2728- ps_ctl_op -> u4_min_out_buf_size [2 ] = (aligned_wd * aligned_ht );
2727+ ps_ctl_op -> u4_min_out_buf_size [0 ] = (wd * ht );
2728+ ps_ctl_op -> u4_min_out_buf_size [1 ] = (wd * ht );
2729+ ps_ctl_op -> u4_min_out_buf_size [2 ] = (wd * ht );
27292730 }
27302731 else if ((ps_codec -> e_chroma_fmt == IV_YUV_420SP_UV )
27312732 || (ps_codec -> e_chroma_fmt == IV_YUV_420SP_VU ))
27322733 {
27332734 ps_ctl_op -> u4_min_out_buf_size [0 ] = (aligned_wd * aligned_ht );
2734- ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd >> 1 ) * (aligned_ht >> 1 );
2735- ps_ctl_op -> u4_min_out_buf_size [1 ] <<= 1 ;
2735+ ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd * aligned_ht ) >> 1 ;
27362736 ps_ctl_op -> u4_min_out_buf_size [2 ] = 0 ;
27372737 }
27382738 else if (ps_codec -> e_chroma_fmt == IV_GRAY )
27392739 {
2740- ps_ctl_op -> u4_min_out_buf_size [0 ] = (aligned_wd * aligned_ht );
2740+ ps_ctl_op -> u4_min_out_buf_size [0 ] = (wd * ht );
27412741 ps_ctl_op -> u4_min_out_buf_size [1 ] = 0 ;
27422742 ps_ctl_op -> u4_min_out_buf_size [2 ] = 0 ;
27432743 }
27442744 else if (ps_codec -> e_chroma_fmt == IV_YUV_422P )
27452745 {
27462746 ps_ctl_op -> u4_min_out_buf_size [0 ] = (aligned_wd * aligned_ht );
2747- ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd >> 1 ) * aligned_ht ;
2748- ps_ctl_op -> u4_min_out_buf_size [2 ] = (aligned_wd >> 1 ) * aligned_ht ;
2747+ ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd * aligned_ht ) >> 1 ;
2748+ ps_ctl_op -> u4_min_out_buf_size [2 ] = (aligned_wd * aligned_ht ) >> 1 ;
27492749 }
27502750 ps_ctl_op -> u4_pic_ht = ht ;
27512751 ps_ctl_op -> u4_pic_wd = wd ;
@@ -2798,6 +2798,7 @@ WORD32 ihevcd_get_buf_info(iv_obj_t *ps_codec_obj,
27982798 codec_t * ps_codec ;
27992799 UWORD32 i = 0 ;
28002800 WORD32 wd , ht ;
2801+ WORD32 aligned_wd , aligned_ht ;
28012802 ivd_ctl_getbufinfo_op_t * ps_ctl_op =
28022803 (ivd_ctl_getbufinfo_op_t * )pv_api_op ;
28032804
@@ -2904,38 +2905,38 @@ WORD32 ihevcd_get_buf_info(iv_obj_t *ps_codec_obj,
29042905 }
29052906
29062907 /*!*/
2907- WORD32 aligned_wd = ALIGN2 (wd );
2908- WORD32 aligned_ht = ALIGN2 (ht );
2908+ aligned_wd = ALIGN2 (wd );
2909+ aligned_ht = ALIGN2 (ht );
29092910 if (ps_codec -> e_chroma_fmt == IV_YUV_420P )
29102911 {
29112912 ps_ctl_op -> u4_min_out_buf_size [0 ] = (aligned_wd * aligned_ht );
2912- ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd >> 1 ) * ( aligned_ht >> 1 ) ;
2913- ps_ctl_op -> u4_min_out_buf_size [2 ] = (aligned_wd >> 1 ) * ( aligned_ht >> 1 ) ;
2913+ ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd * aligned_ht ) >> 2 ;
2914+ ps_ctl_op -> u4_min_out_buf_size [2 ] = (aligned_wd * aligned_ht ) >> 2 ;
29142915 }
29152916 else if (ps_codec -> e_chroma_fmt == IV_YUV_444P )
29162917 {
2917- ps_ctl_op -> u4_min_out_buf_size [0 ] = (aligned_wd * aligned_ht );
2918- ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd * aligned_ht );
2919- ps_ctl_op -> u4_min_out_buf_size [2 ] = (aligned_wd * aligned_ht );
2918+ ps_ctl_op -> u4_min_out_buf_size [0 ] = (wd * ht );
2919+ ps_ctl_op -> u4_min_out_buf_size [1 ] = (wd * ht );
2920+ ps_ctl_op -> u4_min_out_buf_size [2 ] = (wd * ht );
29202921 }
29212922 else if ((ps_codec -> e_chroma_fmt == IV_YUV_420SP_UV )
29222923 || (ps_codec -> e_chroma_fmt == IV_YUV_420SP_VU ))
29232924 {
29242925 ps_ctl_op -> u4_min_out_buf_size [0 ] = (aligned_wd * aligned_ht );
2925- ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd >> 1 ) * (aligned_ht >> 1 );
2926- ps_ctl_op -> u4_min_out_buf_size [1 ] <<= 1 ;
2926+ ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd * aligned_ht ) >> 1 ;
29272927 ps_ctl_op -> u4_min_out_buf_size [2 ] = 0 ;
29282928 }
29292929 else if (ps_codec -> e_chroma_fmt == IV_GRAY )
29302930 {
2931- ps_ctl_op -> u4_min_out_buf_size [0 ] = (aligned_wd * aligned_ht );
2932- ps_ctl_op -> u4_min_out_buf_size [1 ] = ps_ctl_op -> u4_min_out_buf_size [2 ] = 0 ;
2931+ ps_ctl_op -> u4_min_out_buf_size [0 ] = (wd * ht );
2932+ ps_ctl_op -> u4_min_out_buf_size [1 ] =
2933+ ps_ctl_op -> u4_min_out_buf_size [2 ] = 0 ;
29332934 }
29342935 else if (ps_codec -> e_chroma_fmt == IV_YUV_422P )
29352936 {
29362937 ps_ctl_op -> u4_min_out_buf_size [0 ] = (aligned_wd * aligned_ht );
2937- ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd >> 1 ) * aligned_ht ;
2938- ps_ctl_op -> u4_min_out_buf_size [2 ] = (aligned_wd >> 1 ) * aligned_ht ;
2938+ ps_ctl_op -> u4_min_out_buf_size [1 ] = (aligned_wd * aligned_ht ) >> 1 ;
2939+ ps_ctl_op -> u4_min_out_buf_size [2 ] = (aligned_wd * aligned_ht ) >> 1 ;
29392940 }
29402941 ps_codec -> i4_num_disp_bufs = ps_ctl_op -> u4_num_disp_bufs ;
29412942
@@ -3029,6 +3030,17 @@ WORD32 ihevcd_set_params(iv_obj_t *ps_codec_obj,
30293030 }
30303031 }
30313032
3033+ // output stride needs to be even for all formats other than 400 and 444
3034+ if (ps_codec -> e_chroma_fmt != IV_GRAY && ps_codec -> e_chroma_fmt != IV_YUV_444P )
3035+ {
3036+ if (strd & 1 )
3037+ {
3038+ s_ctl_dynparams_op -> u4_error_code |= (1 << IVD_UNSUPPORTEDPARAM );
3039+ s_ctl_dynparams_op -> u4_error_code |= IHEVCD_INVALID_DISP_STRD ;
3040+ ret = IV_FAIL ;
3041+ }
3042+ }
3043+
30323044 ps_codec -> i4_disp_strd = strd ;
30333045 if (1 == ps_codec -> i4_share_disp_buf )
30343046 {
@@ -3306,9 +3318,9 @@ WORD32 ihevcd_get_frame_dimensions(iv_obj_t *ps_codec_obj,
33063318 >> 1 );
33073319 ps_op -> u4_disp_ht [1 ] = ps_op -> u4_disp_ht [2 ] = ((ps_op -> u4_disp_ht [0 ] + 1 )
33083320 >> 1 );
3309- ps_op -> u4_buffer_wd [1 ] = ps_op -> u4_buffer_wd [2 ] = (( ps_op -> u4_buffer_wd [0 ] + 1 )
3321+ ps_op -> u4_buffer_wd [1 ] = ps_op -> u4_buffer_wd [2 ] = (ps_op -> u4_buffer_wd [0 ]
33103322 >> 1 );
3311- ps_op -> u4_buffer_ht [1 ] = ps_op -> u4_buffer_ht [2 ] = (( ps_op -> u4_buffer_ht [0 ] + 1 )
3323+ ps_op -> u4_buffer_ht [1 ] = ps_op -> u4_buffer_ht [2 ] = (ps_op -> u4_buffer_ht [0 ]
33123324 >> 1 );
33133325 ps_op -> u4_x_offset [1 ] = ps_op -> u4_x_offset [2 ] = (ps_op -> u4_x_offset [0 ]
33143326 >> 1 );
0 commit comments