xref: /aosp_15_r20/external/libavc/encoder/svc/isvce_mode_stat_visualiser.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1 /******************************************************************************
2  *
3  * Copyright (C) 2022 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19  */
20 
21 /**
22 *******************************************************************************
23 * @file
24 *  isvce_mode_stat_visualiser.c
25 *
26 * @brief
27 *  Contains functions used for synthesising analysis YUV
28 *
29 *******************************************************************************
30 */
31 #include "isvce_defs.h"
32 
33 #if ENABLE_MODE_STAT_VISUALISER
34 #include "ih264_typedefs.h"
35 #include "isvc_macros.h"
36 #include "ih264_debug.h"
37 #include "isvc_defs.h"
38 #include "isvc_structs.h"
39 #include "isvce_structs.h"
40 #include "isvce_structs.h"
41 #include "ih264e_fmt_conv.h"
42 #include "isvce_mode_stat_visualiser.h"
43 
44 #define MAX_NUM_MB_MODE_VISUALISATIONS 1
45 
46 static const UWORD8 gau1_output_file_path[] = "out.yuv";
47 
48 static const double gd_alpha = 0.5;
49 
50 static const UWORD8 gau1_colors[MAX_NUM_MB_MODE_VISUALISATIONS][NUM_COMPONENTS] = {
51     /* Red */
52     {81, 90, 240},
53 };
54 
isvce_get_msv_ctxt_size(UWORD32 u4_wd,UWORD32 u4_ht)55 UWORD32 isvce_get_msv_ctxt_size(UWORD32 u4_wd, UWORD32 u4_ht)
56 {
57     UWORD32 u4_size = sizeof(mode_stat_visualiser_t);
58     WORD32 i4_num_luma_samples = u4_wd * u4_ht;
59     WORD32 i4_num_chroma_samples = i4_num_luma_samples / 4;
60 
61     u4_size += (i4_num_luma_samples + i4_num_chroma_samples * 2) * sizeof(UWORD8);
62 
63     return u4_size;
64 }
65 
isvce_msv_ctxt_init(isvce_codec_t * ps_codec,iv_mem_rec_t * ps_mem_rec)66 void isvce_msv_ctxt_init(isvce_codec_t *ps_codec, iv_mem_rec_t *ps_mem_rec)
67 {
68     mode_stat_visualiser_t *ps_mode_stat_visualiser;
69     yuv_buf_props_t *ps_frame_buf;
70 
71     WORD32 i;
72 
73     UWORD32 u4_wd = ps_codec->s_cfg.u4_wd;
74     UWORD32 u4_ht = ps_codec->s_cfg.u4_ht;
75     WORD32 i4_num_luma_samples = u4_wd * u4_ht;
76     WORD32 i4_num_chroma_samples = i4_num_luma_samples / 4;
77     UWORD8 *pu1_buf = ps_mem_rec->pv_base;
78     WORD64 i8_alloc_mem_size = isvce_get_msv_ctxt_size(u4_wd, u4_ht);
79 
80     ps_mode_stat_visualiser = ps_codec->ps_mode_stat_visualiser =
81         (mode_stat_visualiser_t *) pu1_buf;
82     pu1_buf += sizeof(ps_mode_stat_visualiser[0]);
83     i8_alloc_mem_size -= sizeof(ps_mode_stat_visualiser[0]);
84 
85     ps_frame_buf = &ps_mode_stat_visualiser->s_frame_buf;
86 
87     ps_mode_stat_visualiser->ps_output_file = fopen((const char *) gau1_output_file_path, "w");
88 
89     ps_frame_buf->e_color_format = IV_YUV_420P;
90     ps_frame_buf->u1_bit_depth = 8;
91     ps_frame_buf->u4_width = u4_wd;
92     ps_frame_buf->u4_height = u4_ht;
93 
94     for(i = 0; i < NUM_COMPONENTS; i++)
95     {
96         UWORD8 u1_is_chroma = (((COMPONENT_TYPE) i) != Y);
97         UWORD32 u4_buf_size = u1_is_chroma ? i4_num_chroma_samples : i4_num_luma_samples;
98         UWORD32 u4_stride = u4_wd >> u1_is_chroma;
99 
100         ps_frame_buf->as_component_bufs[i].pv_data = pu1_buf;
101         ps_frame_buf->as_component_bufs[i].i4_data_stride = u4_stride;
102 
103         pu1_buf += u4_buf_size;
104         i8_alloc_mem_size -= u4_buf_size;
105     }
106 
107     ASSERT(i8_alloc_mem_size >= 0);
108 }
109 
isvce_msv_ctxt_delete(mode_stat_visualiser_t * ps_mode_stat_visualiser)110 void isvce_msv_ctxt_delete(mode_stat_visualiser_t *ps_mode_stat_visualiser)
111 {
112     fclose(ps_mode_stat_visualiser->ps_output_file);
113 }
114 
isvce_msv_get_input_frame(mode_stat_visualiser_t * ps_mode_stat_visualiser,isvce_inp_buf_t * ps_inp_buf)115 void isvce_msv_get_input_frame(mode_stat_visualiser_t *ps_mode_stat_visualiser,
116                                isvce_inp_buf_t *ps_inp_buf)
117 {
118     svc_params_t *ps_svc_params = &ps_inp_buf->s_svc_params;
119     yuv_buf_props_t *ps_target_layer_yuv_buf =
120         &ps_inp_buf->as_layer_yuv_buf_props[ps_svc_params->u1_num_spatial_layers - 1];
121     yuv_buf_props_t *ps_frame_buf = &ps_mode_stat_visualiser->s_frame_buf;
122 
123     ASSERT(ps_target_layer_yuv_buf->u4_width == ps_frame_buf->u4_width);
124     ASSERT(ps_target_layer_yuv_buf->u4_height == ps_frame_buf->u4_height);
125     ASSERT(ps_target_layer_yuv_buf->u1_bit_depth == ps_frame_buf->u1_bit_depth);
126     ASSERT(ps_target_layer_yuv_buf->e_color_format == IV_YUV_420SP_UV);
127     ASSERT(ps_frame_buf->u1_bit_depth == IV_YUV_420P);
128     ASSERT(ps_target_layer_yuv_buf->as_component_bufs[U].i4_data_stride ==
129            ps_target_layer_yuv_buf->as_component_bufs[V].i4_data_stride);
130 
131     isvce_fmt_conv_420sp_to_420p(
132         ps_target_layer_yuv_buf->as_component_bufs[Y].pv_data,
133         ps_target_layer_yuv_buf->as_component_bufs[UV].pv_data,
134         ps_frame_buf->as_component_bufs[Y].pv_data, ps_frame_buf->as_component_bufs[U].pv_data,
135         ps_frame_buf->as_component_bufs[V].pv_data, ps_frame_buf->u4_width, ps_frame_buf->u4_height,
136         ps_target_layer_yuv_buf->as_component_bufs[Y].i4_data_stride,
137         ps_target_layer_yuv_buf->as_component_bufs[UV].i4_data_stride,
138         ps_frame_buf->as_component_bufs[Y].i4_data_stride,
139         ps_frame_buf->as_component_bufs[U].i4_data_stride, 1, 0);
140 }
141 
isvce_msv_set_mode(mode_stat_visualiser_t * ps_mode_stat_visualiser,isvce_mb_info_t * ps_mb_info,coordinates_t * ps_mb_pos)142 void isvce_msv_set_mode(mode_stat_visualiser_t *ps_mode_stat_visualiser,
143                         isvce_mb_info_t *ps_mb_info, coordinates_t *ps_mb_pos)
144 {
145     UWORD32 i, j, k;
146 
147     for(i = 0; i < NUM_COMPONENTS; i++)
148     {
149         UWORD8 u1_is_chroma = (((COMPONENT_TYPE) i) != Y);
150         UWORD32 u4_wd = MB_SIZE >> u1_is_chroma;
151         UWORD32 u4_ht = MB_SIZE >> u1_is_chroma;
152         UWORD8 *pu1_buf = ps_mode_stat_visualiser->s_frame_buf.as_component_bufs[i].pv_data;
153         WORD32 i4_stride = ps_mode_stat_visualiser->s_frame_buf.as_component_bufs[i].i4_data_stride;
154 
155         pu1_buf += ps_mb_pos->i4_abscissa * u4_wd + ps_mb_pos->i4_ordinate * u4_ht * i4_stride;
156 
157         for(j = 0; j < u4_ht; j++)
158         {
159             for(k = 0; k < u4_wd; k++)
160             {
161                 if(ps_mb_info->u1_residual_prediction_flag)
162                 {
163                     pu1_buf[k + j * i4_stride] =
164                         (UWORD8) (gd_alpha * gau1_colors[0][i] +
165                                   (1. - gd_alpha) * pu1_buf[k + j * i4_stride] + 0.5);
166                 }
167             }
168         }
169     }
170 }
171 
isvce_msv_dump_visualisation(mode_stat_visualiser_t * ps_mode_stat_visualiser)172 void isvce_msv_dump_visualisation(mode_stat_visualiser_t *ps_mode_stat_visualiser)
173 {
174     WORD32 i;
175 
176     FILE *ps_output_file = ps_mode_stat_visualiser->ps_output_file;
177     yuv_buf_props_t *ps_frame_buf = &ps_mode_stat_visualiser->s_frame_buf;
178 
179     for(i = 0; i < NUM_COMPONENTS; i++)
180     {
181         UWORD8 u1_is_chroma = (((COMPONENT_TYPE) i) != Y);
182         UWORD32 u4_wd = ps_frame_buf->u4_width >> u1_is_chroma;
183         UWORD32 u4_ht = ps_frame_buf->u4_height >> u1_is_chroma;
184         UWORD32 u4_size = u4_wd * u4_ht;
185 
186         ASSERT(u4_wd == ps_frame_buf->as_component_bufs[i].i4_data_stride);
187 
188         fwrite(ps_frame_buf->as_component_bufs[i].pv_data, sizeof(UWORD8), u4_size, ps_output_file);
189     }
190 }
191 #endif
192