xref: /aosp_15_r20/external/libavc/encoder/svc/isvce_fmt_conv.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker *  isvce_fmt_conv.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker *  Contains functions for format conversion or frame copy of output buffer
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * @author
30*495ae853SAndroid Build Coastguard Worker *  ittiam
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
33*495ae853SAndroid Build Coastguard Worker *  - isvce_fmt_conv()
34*495ae853SAndroid Build Coastguard Worker *
35*495ae853SAndroid Build Coastguard Worker * @remarks
36*495ae853SAndroid Build Coastguard Worker *  None
37*495ae853SAndroid Build Coastguard Worker *
38*495ae853SAndroid Build Coastguard Worker *******************************************************************************
39*495ae853SAndroid Build Coastguard Worker */
40*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
41*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
42*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264_buf_mgr.h */
43*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264_list.h */
44*495ae853SAndroid Build Coastguard Worker #include "ih264_error.h"
45*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264_common_tables.h */
46*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
47*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
48*495ae853SAndroid Build Coastguard Worker #include "ih264_buf_mgr.h"
49*495ae853SAndroid Build Coastguard Worker #include "ih264_common_tables.h"
50*495ae853SAndroid Build Coastguard Worker #include "ih264_list.h"
51*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
52*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_data.h"
53*495ae853SAndroid Build Coastguard Worker #include "ih264_size_defs.h"
54*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264e_cabac_structs.h */
55*495ae853SAndroid Build Coastguard Worker #include "ih264_cabac_tables.h"
56*495ae853SAndroid Build Coastguard Worker /* Dependencies of ime_structs.h */
57*495ae853SAndroid Build Coastguard Worker #include "ime_defs.h"
58*495ae853SAndroid Build Coastguard Worker #include "ime_distortion_metrics.h"
59*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264e_structs.h */
60*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
61*495ae853SAndroid Build Coastguard Worker #include "ive2.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264_deblk_edge_filters.h"
64*495ae853SAndroid Build Coastguard Worker #include "ih264_inter_pred_filters.h"
65*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_quant_itrans_iquant.h"
67*495ae853SAndroid Build Coastguard Worker /* Dependencies of ih264e_bitstream.h */
68*495ae853SAndroid Build Coastguard Worker #include "ih264e_error.h"
69*495ae853SAndroid Build Coastguard Worker #include "ih264e_bitstream.h"
70*495ae853SAndroid Build Coastguard Worker #include "ih264e_cabac_structs.h"
71*495ae853SAndroid Build Coastguard Worker #include "irc_cntrl_param.h"
72*495ae853SAndroid Build Coastguard Worker #include "irc_frame_info_collector.h"
73*495ae853SAndroid Build Coastguard Worker #include "ime_statistics.h"
74*495ae853SAndroid Build Coastguard Worker #include "ime_structs.h"
75*495ae853SAndroid Build Coastguard Worker /* Dependencies of 'ih264e_utils.h' */
76*495ae853SAndroid Build Coastguard Worker #include "ih264e_defs.h"
77*495ae853SAndroid Build Coastguard Worker #include "ih264e_structs.h"
78*495ae853SAndroid Build Coastguard Worker #include "ih264e_fmt_conv.h"
79*495ae853SAndroid Build Coastguard Worker #include "isvce_structs.h"
80*495ae853SAndroid Build Coastguard Worker 
isvce_fmt_conv(isvce_codec_t * ps_codec,svc_au_buf_t * ps_pic,UWORD8 * pu1_y_dst,UWORD8 * pu1_u_dst,UWORD8 * pu1_v_dst,UWORD32 u4_dst_y_strd,UWORD32 u4_dst_uv_strd,WORD32 cur_row,WORD32 num_rows)81*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T isvce_fmt_conv(isvce_codec_t *ps_codec, svc_au_buf_t *ps_pic, UWORD8 *pu1_y_dst,
82*495ae853SAndroid Build Coastguard Worker                               UWORD8 *pu1_u_dst, UWORD8 *pu1_v_dst, UWORD32 u4_dst_y_strd,
83*495ae853SAndroid Build Coastguard Worker                               UWORD32 u4_dst_uv_strd, WORD32 cur_row, WORD32 num_rows)
84*495ae853SAndroid Build Coastguard Worker {
85*495ae853SAndroid Build Coastguard Worker     IH264E_ERROR_T ret = IH264E_SUCCESS;
86*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_y_src, *pu1_uv_src;
87*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_y_dst_tmp, *pu1_uv_dst_tmp;
88*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_u_dst_tmp, *pu1_v_dst_tmp;
89*495ae853SAndroid Build Coastguard Worker     WORD32 is_u_first;
90*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_luma;
91*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_chroma;
92*495ae853SAndroid Build Coastguard Worker     WORD32 wd;
93*495ae853SAndroid Build Coastguard Worker 
94*495ae853SAndroid Build Coastguard Worker     WORD32 src_y_strd;
95*495ae853SAndroid Build Coastguard Worker     WORD32 src_uv_strd;
96*495ae853SAndroid Build Coastguard Worker 
97*495ae853SAndroid Build Coastguard Worker     WORD32 layer_id = ps_pic->u1_num_spatial_layers - 1;
98*495ae853SAndroid Build Coastguard Worker 
99*495ae853SAndroid Build Coastguard Worker     if(0 == num_rows)
100*495ae853SAndroid Build Coastguard Worker     {
101*495ae853SAndroid Build Coastguard Worker         return ret;
102*495ae853SAndroid Build Coastguard Worker     }
103*495ae853SAndroid Build Coastguard Worker 
104*495ae853SAndroid Build Coastguard Worker     pu1_luma = ps_pic->ps_layer_yuv_buf_props[layer_id].as_component_bufs[0].pv_data;
105*495ae853SAndroid Build Coastguard Worker     pu1_chroma = ps_pic->ps_layer_yuv_buf_props[layer_id].as_component_bufs[1].pv_data;
106*495ae853SAndroid Build Coastguard Worker 
107*495ae853SAndroid Build Coastguard Worker     src_y_strd = ps_pic->ps_layer_yuv_buf_props[layer_id].as_component_bufs[0].i4_data_stride;
108*495ae853SAndroid Build Coastguard Worker     src_uv_strd = ps_pic->ps_layer_yuv_buf_props[layer_id].as_component_bufs[1].i4_data_stride;
109*495ae853SAndroid Build Coastguard Worker 
110*495ae853SAndroid Build Coastguard Worker     wd = ps_codec->s_cfg.u4_disp_wd;
111*495ae853SAndroid Build Coastguard Worker     is_u_first = (IV_YUV_420SP_UV == ps_codec->e_codec_color_format) ? 1 : 0;
112*495ae853SAndroid Build Coastguard Worker 
113*495ae853SAndroid Build Coastguard Worker     /* In case of 420P output luma copy is disabled for shared mode */
114*495ae853SAndroid Build Coastguard Worker     {
115*495ae853SAndroid Build Coastguard Worker         pu1_y_src = pu1_luma + cur_row * src_y_strd;
116*495ae853SAndroid Build Coastguard Worker         pu1_uv_src = pu1_chroma + (cur_row / 2) * src_uv_strd;
117*495ae853SAndroid Build Coastguard Worker 
118*495ae853SAndroid Build Coastguard Worker         pu1_y_dst_tmp = pu1_y_dst + cur_row * u4_dst_y_strd;
119*495ae853SAndroid Build Coastguard Worker         pu1_uv_dst_tmp = pu1_u_dst + (cur_row / 2) * u4_dst_uv_strd;
120*495ae853SAndroid Build Coastguard Worker         pu1_u_dst_tmp = pu1_u_dst + (cur_row / 2) * u4_dst_uv_strd;
121*495ae853SAndroid Build Coastguard Worker         pu1_v_dst_tmp = pu1_v_dst + (cur_row / 2) * u4_dst_uv_strd;
122*495ae853SAndroid Build Coastguard Worker 
123*495ae853SAndroid Build Coastguard Worker         /* If the call is non-blocking and there are no rows to be copied then
124*495ae853SAndroid Build Coastguard Worker          * return */
125*495ae853SAndroid Build Coastguard Worker         /* In non-shared mode, reference buffers are in 420SP UV format,
126*495ae853SAndroid Build Coastguard Worker          * if output also is in 420SP_UV, then just copy
127*495ae853SAndroid Build Coastguard Worker          * if output is in 420SP_VU then swap UV values
128*495ae853SAndroid Build Coastguard Worker          */
129*495ae853SAndroid Build Coastguard Worker         if((IV_YUV_420SP_UV == ps_codec->s_cfg.e_recon_color_fmt) ||
130*495ae853SAndroid Build Coastguard Worker            (IV_YUV_420SP_VU == ps_codec->s_cfg.e_recon_color_fmt))
131*495ae853SAndroid Build Coastguard Worker         {
132*495ae853SAndroid Build Coastguard Worker             ih264e_fmt_conv_420sp_to_420sp(pu1_y_src, pu1_uv_src, pu1_y_dst_tmp, pu1_uv_dst_tmp, wd,
133*495ae853SAndroid Build Coastguard Worker                                            num_rows, ps_codec->i4_rec_strd, ps_codec->i4_rec_strd,
134*495ae853SAndroid Build Coastguard Worker                                            u4_dst_y_strd, u4_dst_uv_strd);
135*495ae853SAndroid Build Coastguard Worker         }
136*495ae853SAndroid Build Coastguard Worker         else if(IV_YUV_420P == ps_codec->s_cfg.e_recon_color_fmt)
137*495ae853SAndroid Build Coastguard Worker         {
138*495ae853SAndroid Build Coastguard Worker             ih264e_fmt_conv_420sp_to_420p(pu1_y_src, pu1_uv_src, pu1_y_dst_tmp, pu1_u_dst_tmp,
139*495ae853SAndroid Build Coastguard Worker                                           pu1_v_dst_tmp, wd, num_rows, ps_codec->i4_rec_strd,
140*495ae853SAndroid Build Coastguard Worker                                           ps_codec->i4_rec_strd, u4_dst_y_strd, u4_dst_uv_strd,
141*495ae853SAndroid Build Coastguard Worker                                           is_u_first, 0);
142*495ae853SAndroid Build Coastguard Worker         }
143*495ae853SAndroid Build Coastguard Worker     }
144*495ae853SAndroid Build Coastguard Worker     return (ret);
145*495ae853SAndroid Build Coastguard Worker }
146