summaryrefslogtreecommitdiffstats
path: root/decoder/ihevcd_statistics.c
diff options
context:
space:
mode:
Diffstat (limited to 'decoder/ihevcd_statistics.c')
-rw-r--r--decoder/ihevcd_statistics.c688
1 files changed, 688 insertions, 0 deletions
diff --git a/decoder/ihevcd_statistics.c b/decoder/ihevcd_statistics.c
new file mode 100644
index 0000000..f4e5242
--- /dev/null
+++ b/decoder/ihevcd_statistics.c
@@ -0,0 +1,688 @@
+/******************************************************************************
+*
+* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at:
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*
+******************************************************************************/
+/**
+*******************************************************************************
+* @file
+* ihevcd_statistics.c
+*
+* @brief
+* Contains macros for generating stats about hevc decoder
+*
+* @author
+* Naveen SR
+*
+* @par List of Functions:
+*
+* @remarks
+* None
+*
+*******************************************************************************
+*/
+/*****************************************************************************/
+/* File Includes */
+/*****************************************************************************/
+#include <stdio.h>
+#include <string.h>
+
+#include "ihevc_typedefs.h"
+#include "iv.h"
+#include "ivd.h"
+#include "ihevcd_cxa.h"
+#include "ithread.h"
+
+#include "ihevc_defs.h"
+#include "ihevc_structs.h"
+#include "ihevc_macros.h"
+#include "ihevc_platform_macros.h"
+#include "ihevc_cabac_tables.h"
+#include "ihevcd_defs.h"
+
+#include "ihevcd_function_selector.h"
+#include "ihevcd_structs.h"
+#include "ihevcd_iquant_itrans_recon_ctb.h"
+#include "ihevcd_statistics.h"
+
+#if STATISTICS_ENABLE
+statistics_t gs_ihevcd_stat;
+
+void ihevcd_init_trans_stat(stat_trans_t *ps_stat_trans)
+{
+ ps_stat_trans->num_4x4_dst = 0;
+ ps_stat_trans->num_4x4 = 0;
+ ps_stat_trans->num_8x8 = 0;
+ ps_stat_trans->num_16x16 = 0;
+ ps_stat_trans->num_32x32 = 0;
+ ps_stat_trans->num_64x64 = 0;
+};
+
+void ihevcd_sblk_pos_init()
+{
+ gs_ihevcd_stat.last_sblk_pos_x = 0;
+ gs_ihevcd_stat.last_sblk_pos_y = 0;
+ gs_ihevcd_stat.num_coded_sblk = 0;
+ gs_ihevcd_stat.num_coded_coeffs = 0;
+}
+void ihevcd_init_sblk_histogram(stat_sblk_histogram_t *ps_last_sblk_pos_histogram_t)
+{
+ memset(ps_last_sblk_pos_histogram_t->trans_4x4_dst, 0, 1 * sizeof(UWORD32));
+ memset(ps_last_sblk_pos_histogram_t->trans_4x4, 0, 1 * sizeof(UWORD32));
+ memset(ps_last_sblk_pos_histogram_t->trans_8x8, 0, 4 * sizeof(UWORD32));
+ memset(ps_last_sblk_pos_histogram_t->trans_16x16, 0, 16 * sizeof(UWORD32));
+ memset(ps_last_sblk_pos_histogram_t->trans_32x32, 0, 64 * sizeof(UWORD32));
+}
+void ihevcd_init_coeff_histogram(stat_coeff_histogram_t *ps_coeff_histogram)
+{
+ memset(ps_coeff_histogram->trans_4x4_dst, 0, 16 * sizeof(UWORD32));
+ memset(ps_coeff_histogram->trans_4x4, 0, 16 * sizeof(UWORD32));
+ memset(ps_coeff_histogram->trans_8x8, 0, 64 * sizeof(UWORD32));
+ memset(ps_coeff_histogram->trans_16x16, 0, 256 * sizeof(UWORD32));
+ memset(ps_coeff_histogram->trans_32x32, 0, 1024 * sizeof(UWORD32));
+}
+void ihevcd_init_statistics()
+{
+
+ memset(&gs_ihevcd_stat, 0, sizeof(statistics_t));
+ /* Number of transform block init */
+ ihevcd_init_trans_stat(&gs_ihevcd_stat.stat_num_all_trans_block[0]);
+ ihevcd_init_trans_stat(&gs_ihevcd_stat.stat_num_all_trans_block[1]);
+ /* Number of coded transform block init */
+ ihevcd_init_trans_stat(&gs_ihevcd_stat.stat_num_coded_trans_block[0]);
+ ihevcd_init_trans_stat(&gs_ihevcd_stat.stat_num_coded_trans_block[1]);
+ /* Number of coded DC transform block init */
+ ihevcd_init_trans_stat(&gs_ihevcd_stat.stat_num_coded_dc_block[0]);
+ ihevcd_init_trans_stat(&gs_ihevcd_stat.stat_num_coded_dc_block[1]);
+ /* Number of coded one coeff transform block init */
+ ihevcd_init_trans_stat(&gs_ihevcd_stat.stat_num_coded_one_coeff_block[0]);
+ ihevcd_init_trans_stat(&gs_ihevcd_stat.stat_num_coded_one_coeff_block[1]);
+ /* Last sblk histogram init */
+ ihevcd_init_sblk_histogram(&gs_ihevcd_stat.stat_last_sblk_pos_histogram);
+ /* Num Coded sblk histogram init */
+ ihevcd_init_sblk_histogram(&gs_ihevcd_stat.stat_num_coded_sblk_histogram);
+ /* Num Coded coeffs histogram init */
+ ihevcd_init_coeff_histogram(&gs_ihevcd_stat.stat_num_coded_coeff_histogram);
+ /* Last sblk position init */
+ ihevcd_sblk_pos_init();
+
+}
+
+void ihevcd_print_stat_trans(stat_trans_t *ps_stat_trans)
+{
+ WORD32 total_pixels_y, total_pixels_uv;
+ double y_ratio, y_ratio_total, uv_ratio, uv_ratio_total;
+ stat_trans_t *ps_stat_trans_all;
+ total_pixels_y = ps_stat_trans[0].num_4x4_dst * 4 * 4 +
+ ps_stat_trans[0].num_4x4 * 4 * 4 +
+ ps_stat_trans[0].num_8x8 * 8 * 8 +
+ ps_stat_trans[0].num_16x16 * 16 * 16 +
+ ps_stat_trans[0].num_32x32 * 32 * 32 +
+ ps_stat_trans[0].num_64x64 * 64 * 64;
+
+ total_pixels_uv = ps_stat_trans[1].num_4x4_dst * 4 * 4 +
+ ps_stat_trans[1].num_4x4 * 4 * 4 +
+ ps_stat_trans[1].num_8x8 * 8 * 8 +
+ ps_stat_trans[1].num_16x16 * 16 * 16 +
+ ps_stat_trans[1].num_32x32 * 32 * 32 +
+ ps_stat_trans[1].num_64x64 * 64 * 64;
+
+ ps_stat_trans_all = &gs_ihevcd_stat.stat_num_all_trans_block[0];
+
+ printf("\n_ Y Y Y U+V U+V U+V");
+ printf("\nTransform_Type Num_Blocks Percentage %%wrt_total Num_Blocks Percentage %%wrt_total ");
+
+ y_ratio = ps_stat_trans[0].num_4x4_dst * 4 * 4 * 100.0 / total_pixels_y;
+ y_ratio_total = ps_stat_trans[0].num_4x4_dst * 100.0 / ps_stat_trans_all[0].num_4x4_dst;
+ uv_ratio = ps_stat_trans[1].num_4x4_dst * 4 * 4 * 100.0 / total_pixels_uv;
+ uv_ratio_total = ps_stat_trans[1].num_4x4_dst * 100.0 / ps_stat_trans_all[1].num_4x4_dst;
+ printf("\nDST_4x4 %6d %6.2f %6.2f %6d %6.2f %6.2f ", ps_stat_trans[0].num_4x4_dst, y_ratio, y_ratio_total, ps_stat_trans[1].num_4x4_dst, uv_ratio, uv_ratio_total);
+
+ y_ratio = ps_stat_trans[0].num_4x4 * 4 * 4 * 100.0 / total_pixels_y;
+ y_ratio_total = ps_stat_trans[0].num_4x4 * 100.0 / ps_stat_trans_all[0].num_4x4;
+ uv_ratio = ps_stat_trans[1].num_4x4 * 4 * 4 * 100.0 / total_pixels_uv;
+ uv_ratio_total = ps_stat_trans[1].num_4x4 * 100.0 / ps_stat_trans_all[1].num_4x4;
+ printf("\nDCT_4x4 %6d %6.2f %6.2f %6d %6.2f %6.2f ", ps_stat_trans[0].num_4x4, y_ratio, y_ratio_total, ps_stat_trans[1].num_4x4, uv_ratio, uv_ratio_total);
+
+
+ y_ratio = ps_stat_trans[0].num_8x8 * 8 * 8 * 100.0 / total_pixels_y;
+ y_ratio_total = ps_stat_trans[0].num_8x8 * 100.0 / ps_stat_trans_all[0].num_8x8;
+ uv_ratio = ps_stat_trans[1].num_8x8 * 8 * 8 * 100.0 / total_pixels_uv;
+ uv_ratio_total = ps_stat_trans[1].num_8x8 * 100.0 / ps_stat_trans_all[1].num_8x8;
+ printf("\nDCT_8x8 %6d %6.2f %6.2f %6d %6.2f %6.2f ", ps_stat_trans[0].num_8x8, y_ratio, y_ratio_total, ps_stat_trans[1].num_8x8, uv_ratio, uv_ratio_total);
+
+ y_ratio = ps_stat_trans[0].num_16x16 * 16 * 16 * 100.0 / total_pixels_y;
+ y_ratio_total = ps_stat_trans[0].num_16x16 * 100.0 / ps_stat_trans_all[0].num_16x16;
+ uv_ratio = ps_stat_trans[1].num_16x16 * 16 * 16 * 100.0 / total_pixels_uv;
+ uv_ratio_total = ps_stat_trans[1].num_16x16 * 100.0 / ps_stat_trans_all[1].num_16x16;
+ printf("\nDCT_16x16 %6d %6.2f %6.2f %6d %6.2f %6.2f ", ps_stat_trans[0].num_16x16, y_ratio, y_ratio_total, ps_stat_trans[1].num_16x16, uv_ratio, uv_ratio_total);
+
+
+ y_ratio = ps_stat_trans[0].num_32x32 * 32 * 32 * 100.0 / total_pixels_y;
+ y_ratio_total = ps_stat_trans[0].num_32x32 * 100.0 / ps_stat_trans_all[0].num_32x32;
+ uv_ratio = ps_stat_trans[1].num_32x32 * 32 * 32 * 100.0 / total_pixels_uv;
+ uv_ratio_total = ps_stat_trans[1].num_32x32 * 100.0 / ps_stat_trans_all[1].num_32x32;
+ printf("\nDCT_32x32 %6d %6.2f %6.2f %6d %6.2f %6.2f ", ps_stat_trans[0].num_32x32, y_ratio, y_ratio_total, ps_stat_trans[1].num_32x32, uv_ratio, uv_ratio_total);
+
+
+ y_ratio = ps_stat_trans[0].num_64x64 * 64 * 64 * 100.0 / total_pixels_y;
+ y_ratio_total = ps_stat_trans[0].num_64x64 * 100.0 / ps_stat_trans_all[0].num_64x64;
+ uv_ratio = ps_stat_trans[1].num_64x64 * 64 * 64 * 100.0 / total_pixels_uv;
+ uv_ratio_total = ps_stat_trans[1].num_64x64 * 100.0 / ps_stat_trans_all[1].num_64x64;
+ printf("\nDCT_64x64 %6d %6.2f %6.2f %6d %6.2f %6.2f ", ps_stat_trans[0].num_64x64, y_ratio, y_ratio_total, ps_stat_trans[1].num_64x64, uv_ratio, uv_ratio_total);
+
+}
+
+void ihevcd_update_stat_num_trans(stat_trans_t *ps_stat_trans, TRANSFORM_TYPE e_trans_type)
+{
+ switch(e_trans_type)
+ {
+ case DST_4x4:
+ ps_stat_trans->num_4x4_dst++;
+ break;
+ case DCT_4x4:
+ ps_stat_trans->num_4x4++;
+ break;
+ case DCT_8x8:
+ ps_stat_trans->num_8x8++;
+ break;
+ case DCT_16x16:
+ ps_stat_trans->num_16x16++;
+ break;
+ case DCT_32x32:
+ ps_stat_trans->num_32x32++;
+ break;
+ case SKIP_64x64:
+ ps_stat_trans->num_64x64++;
+ break;
+ default:
+ break;
+ }
+}
+
+void ihevcd_update_num_all_trans_blocks(TRANSFORM_TYPE e_trans_type, WORD32 c_idx)
+{
+ stat_trans_t *ps_stat_trans;
+
+ ps_stat_trans = &gs_ihevcd_stat.stat_num_all_trans_block[0];
+
+ if(c_idx != 0)
+ {
+ ps_stat_trans++;
+ }
+ ihevcd_update_stat_num_trans(ps_stat_trans, e_trans_type);
+}
+
+void ihevcd_update_num_trans_blocks(TRANSFORM_TYPE e_trans_type, WORD32 c_idx, WORD32 update_type)
+{
+ stat_trans_t *ps_stat_trans;
+
+ if(0 == update_type)
+ ps_stat_trans = &gs_ihevcd_stat.stat_num_coded_trans_block[0];
+ else if(1 == update_type)
+ ps_stat_trans = &gs_ihevcd_stat.stat_num_coded_dc_block[0];
+ else
+ ps_stat_trans = &gs_ihevcd_stat.stat_num_coded_one_coeff_block[0];
+
+ if(c_idx != 0)
+ {
+ ps_stat_trans++;
+ }
+ ihevcd_update_stat_num_trans(ps_stat_trans, e_trans_type);
+}
+
+void ihevcd_print_sblk_histogram_per_transform(UWORD32 *pu4_stat, UWORD32 wd, UWORD32 ht, WORD32 is_2d)
+{
+ UWORD32 i, j, total = 0, val;
+
+ for(i = 0; i < ht; i++)
+ {
+ for(j = 0; j < wd; j++)
+ {
+ val = pu4_stat[j + i * ht];
+ printf("%d\t\t", val);
+ total += val;
+ }
+ if(1 == is_2d)
+ printf("\n");
+ }
+
+ {
+ printf("\n");
+ for(i = 0; i < ht; i++)
+ {
+ for(j = 0; j < wd; j++)
+ {
+ val = pu4_stat[j + i * ht];
+
+ printf("%.2f%%\t\t", val * 100.0 / total);
+ }
+ if(1 == is_2d)
+ printf("\n");
+ }
+ }
+}
+
+void ihevcd_print_sblk_histogram(stat_sblk_histogram_t *ps_stat_sblk_pos_histogram, WORD32 is_2d)
+{
+ printf("\nhistogram_4x4_DST\n");
+ ihevcd_print_sblk_histogram_per_transform(ps_stat_sblk_pos_histogram->trans_4x4_dst, 1, 1, is_2d);
+ printf("\nhistogram_4x4\n");
+ ihevcd_print_sblk_histogram_per_transform(ps_stat_sblk_pos_histogram->trans_4x4, 1, 1, is_2d);
+ printf("\nhistogram_8x8\n");
+ ihevcd_print_sblk_histogram_per_transform(ps_stat_sblk_pos_histogram->trans_8x8, 2, 2, is_2d);
+ printf("\nhistogram_16x16\n");
+ ihevcd_print_sblk_histogram_per_transform(ps_stat_sblk_pos_histogram->trans_16x16, 4, 4, is_2d);
+ printf("\nhistogram_32x32\n");
+ ihevcd_print_sblk_histogram_per_transform(ps_stat_sblk_pos_histogram->trans_32x32, 8, 8, is_2d);
+}
+
+void ihevcd_print_coeff_histogram(stat_coeff_histogram_t *ps_stat_coeff_histogram, WORD32 is_2d)
+{
+ printf("\nhistogram_4x4_DST\n");
+ ihevcd_print_sblk_histogram_per_transform(ps_stat_coeff_histogram->trans_4x4_dst, 4, 4, is_2d);
+ printf("\nhistogram_4x4\n");
+ ihevcd_print_sblk_histogram_per_transform(ps_stat_coeff_histogram->trans_4x4, 4, 4, is_2d);
+ printf("\nhistogram_8x8\n");
+ ihevcd_print_sblk_histogram_per_transform(ps_stat_coeff_histogram->trans_8x8, 8, 8, is_2d);
+ printf("\nhistogram_16x16\n");
+ ihevcd_print_sblk_histogram_per_transform(ps_stat_coeff_histogram->trans_16x16, 16, 16, is_2d);
+ printf("\nhistogram_32x32\n");
+ ihevcd_print_sblk_histogram_per_transform(ps_stat_coeff_histogram->trans_32x32, 32, 32, is_2d);
+}
+void ihevcd_print_transform_statistics()
+{
+ stat_trans_t *ps_stat_trans;
+ WORD32 total_blocks;
+
+ /* Num coded_transform blocks */
+ printf("\nNUM_ALL_TRANSFORM_BLOCKS\n");
+ ps_stat_trans = &gs_ihevcd_stat.stat_num_all_trans_block[0];
+ {
+ /* Updating chroma blocks. As the chroma blocks are not counted if cbf of y,u and v are zero */
+ ps_stat_trans[1].num_4x4 = (ps_stat_trans[0].num_4x4_dst + ps_stat_trans[0].num_4x4) / 4 + ps_stat_trans->num_8x8;
+ ps_stat_trans[1].num_8x8 = ps_stat_trans->num_16x16;
+ ps_stat_trans[1].num_16x16 = ps_stat_trans->num_32x32;
+ ps_stat_trans[1].num_32x32 = ps_stat_trans->num_64x64;
+ }
+ ihevcd_print_stat_trans(ps_stat_trans);
+
+ /* Num coded_transform blocks */
+ printf("\nNUM_CODED_TRANSFORM_BLOCKS(excluding_trans_skip_and_trans_quant_bypass)\n");
+ ps_stat_trans = &gs_ihevcd_stat.stat_num_coded_trans_block[0];
+ ihevcd_print_stat_trans(ps_stat_trans);
+
+ /* Num DC transform blocks */
+ printf("\nNUM_DC_TRANSFORM_BLOCKS(excluding_trans_skip_and_trans_quant_bypass)\n");
+ ps_stat_trans = &gs_ihevcd_stat.stat_num_coded_dc_block[0];
+ ihevcd_print_stat_trans(ps_stat_trans);
+
+ /* Num one coeff transform blocks */
+ printf("\nNUM_ONE_COEFF_TRANSFORM_BLOCKS(excluding_trans_skip_and_trans_quant_bypass)\n");
+ ps_stat_trans = &gs_ihevcd_stat.stat_num_coded_one_coeff_block[0];
+ ihevcd_print_stat_trans(ps_stat_trans);
+
+ /* Last sblk histogram */
+ printf("\nLAST_CODED_SBLK_HISTOGRAM\n");
+ ihevcd_print_sblk_histogram(&gs_ihevcd_stat.stat_last_sblk_pos_histogram, 1);
+
+ /* Num Coded sblks histogram */
+ printf("\nNUM_CODED_SBLK_HISTOGRAM\n");
+ ihevcd_print_sblk_histogram(&gs_ihevcd_stat.stat_num_coded_sblk_histogram, 1);
+
+ /* Num Coded coeff histogram */
+ printf("\nNUM_CODED_COEFF_HISTOGRAM\n");
+ ihevcd_print_coeff_histogram(&gs_ihevcd_stat.stat_num_coded_coeff_histogram, 1);
+}
+
+void ihevcd_update_sblk_histogram(stat_sblk_histogram_t *ps_last_sblk_pos_histogram, TRANSFORM_TYPE e_trans_type, WORD32 last_sblk_x, WORD32 last_sblk_y)
+{
+ switch(e_trans_type)
+ {
+ case DST_4x4:
+ ps_last_sblk_pos_histogram->trans_4x4_dst[last_sblk_x + last_sblk_y * 0]++;
+ break;
+ case DCT_4x4:
+ ps_last_sblk_pos_histogram->trans_4x4[last_sblk_x + last_sblk_y * 0]++;
+ break;
+ case DCT_8x8:
+ ps_last_sblk_pos_histogram->trans_8x8[last_sblk_x + last_sblk_y * 2]++;
+ break;
+ case DCT_16x16:
+ ps_last_sblk_pos_histogram->trans_16x16[last_sblk_x + last_sblk_y * 4]++;
+ break;
+ case DCT_32x32:
+ ps_last_sblk_pos_histogram->trans_32x32[last_sblk_x + last_sblk_y * 8]++;
+ break;
+ default:
+ break;
+ }
+}
+
+void ihevcd_update_num_coded_sblk_histogram(stat_sblk_histogram_t *ps_sblk_histogram, TRANSFORM_TYPE e_trans_type, WORD32 num_coded_blks)
+{
+ switch(e_trans_type)
+ {
+ case DST_4x4:
+ ps_sblk_histogram->trans_4x4_dst[num_coded_blks - 1]++;
+ break;
+ case DCT_4x4:
+ ps_sblk_histogram->trans_4x4[num_coded_blks - 1]++;
+ break;
+ case DCT_8x8:
+ ps_sblk_histogram->trans_8x8[num_coded_blks - 1]++;
+ break;
+ case DCT_16x16:
+ ps_sblk_histogram->trans_16x16[num_coded_blks - 1]++;
+ break;
+ case DCT_32x32:
+ ps_sblk_histogram->trans_32x32[num_coded_blks - 1]++;
+ break;
+ default:
+ break;
+ }
+}
+
+void ihevcd_update_num_coded_coeff_histogram(stat_coeff_histogram_t *ps_coeff_histogram, TRANSFORM_TYPE e_trans_type, WORD32 num_coded_blks)
+{
+ switch(e_trans_type)
+ {
+ case DST_4x4:
+ ps_coeff_histogram->trans_4x4_dst[num_coded_blks - 1]++;
+ break;
+ case DCT_4x4:
+ ps_coeff_histogram->trans_4x4[num_coded_blks - 1]++;
+ break;
+ case DCT_8x8:
+ ps_coeff_histogram->trans_8x8[num_coded_blks - 1]++;
+ break;
+ case DCT_16x16:
+ ps_coeff_histogram->trans_16x16[num_coded_blks - 1]++;
+ break;
+ case DCT_32x32:
+ ps_coeff_histogram->trans_32x32[num_coded_blks - 1]++;
+ break;
+ default:
+ break;
+ }
+}
+
+void ihevcd_sblk_pos_update(TRANSFORM_TYPE e_trans_type, WORD32 t_skip_or_tq_bypass, UWORD32 sblk_x, UWORD32 sblk_y)
+{
+ if(1 == t_skip_or_tq_bypass)
+ return;
+
+ gs_ihevcd_stat.num_coded_sblk++;
+
+ /* Updating the last coded sblk pos */
+#if 0
+ if(gs_ihevcd_stat.last_sblk_pos_y > sblk_y)
+ return;
+ else if(gs_ihevcd_stat.last_sblk_pos_y == sblk_y)
+ {
+ if(gs_ihevcd_stat.last_sblk_pos_x >= sblk_x)
+ return;
+ else
+ gs_ihevcd_stat.last_sblk_pos_x = sblk_x;
+ }
+ else
+ {
+ gs_ihevcd_stat.last_sblk_pos_y = sblk_y;
+ gs_ihevcd_stat.last_sblk_pos_x = sblk_x;
+ }
+#endif
+ if(gs_ihevcd_stat.last_sblk_pos_y < sblk_y)
+ gs_ihevcd_stat.last_sblk_pos_y = sblk_y;
+
+ if(gs_ihevcd_stat.last_sblk_pos_x < sblk_x)
+ gs_ihevcd_stat.last_sblk_pos_x = sblk_x;
+}
+
+void ihevcd_update_coeff_count()
+{
+ gs_ihevcd_stat.num_coded_coeffs++;
+}
+
+void ihevcd_update_sblk_and_coeff_histogram(TRANSFORM_TYPE e_trans_type, WORD32 t_skip_or_tq_bypass)
+{
+ if(0 == t_skip_or_tq_bypass)
+ {
+ ihevcd_update_sblk_histogram(&gs_ihevcd_stat.stat_last_sblk_pos_histogram, e_trans_type, gs_ihevcd_stat.last_sblk_pos_x, gs_ihevcd_stat.last_sblk_pos_y);
+ ihevcd_update_num_coded_sblk_histogram(&gs_ihevcd_stat.stat_num_coded_sblk_histogram, e_trans_type, gs_ihevcd_stat.num_coded_sblk);
+ ihevcd_update_num_coded_coeff_histogram(&gs_ihevcd_stat.stat_num_coded_coeff_histogram, e_trans_type, gs_ihevcd_stat.num_coded_coeffs);
+ }
+}
+
+void ihevcd_update_pu_skip_size(pu_t *ps_pu)
+{
+ WORD32 wd, ht;
+
+ wd = (ps_pu->b4_wd);
+ ht = (ps_pu->b4_ht);
+
+ gs_ihevcd_stat.stat_pu_skip_size_hist[wd][ht]++;
+}
+void ihevcd_update_pu_size(pu_t *ps_pu)
+{
+ WORD32 wd, ht;
+
+ wd = (ps_pu->b4_wd);
+ ht = (ps_pu->b4_ht);
+ gs_ihevcd_stat.stat_pu_all_size_hist[wd][ht]++;
+ if(ps_pu->b1_intra_flag)
+ {
+ gs_ihevcd_stat.stat_pu_intra_size_hist[wd][ht]++;
+ }
+ else
+ {
+ gs_ihevcd_stat.stat_pu_inter_size_hist[wd][ht]++;
+
+
+
+ if(ps_pu->b1_merge_flag)
+ gs_ihevcd_stat.stat_pu_merge_size_hist[wd][ht]++;
+
+ if(ps_pu->b2_pred_mode == PRED_BI)
+ gs_ihevcd_stat.stat_pu_bipred_size_hist[wd][ht]++;
+
+ switch(ps_pu->b2_pred_mode)
+ {
+ case PRED_L0:
+ if((ps_pu->mv.s_l0_mv.i2_mvx == 0) &&
+ (ps_pu->mv.s_l0_mv.i2_mvy == 0))
+ {
+ gs_ihevcd_stat.stat_pu_zeromv_size_hist[wd][ht]++;
+ }
+
+ if((ABS(ps_pu->mv.s_l0_mv.i2_mvx) < 4) &&
+ (ABS(ps_pu->mv.s_l0_mv.i2_mvy) < 4))
+ {
+ gs_ihevcd_stat.stat_pu_zeromvfpel_size_hist[wd][ht]++;
+ }
+
+ break;
+
+ case PRED_L1:
+ if((ps_pu->mv.s_l1_mv.i2_mvx == 0) &&
+ (ps_pu->mv.s_l1_mv.i2_mvy == 0))
+ {
+ gs_ihevcd_stat.stat_pu_zeromv_size_hist[wd][ht]++;
+ }
+
+ if((ABS(ps_pu->mv.s_l1_mv.i2_mvx) < 4) &&
+ (ABS(ps_pu->mv.s_l1_mv.i2_mvy) < 4))
+ {
+ gs_ihevcd_stat.stat_pu_zeromvfpel_size_hist[wd][ht]++;
+ }
+ break;
+
+
+ case PRED_BI:
+ if((ps_pu->mv.s_l0_mv.i2_mvx == 0) &&
+ (ps_pu->mv.s_l0_mv.i2_mvy == 0) &&
+ (ps_pu->mv.s_l1_mv.i2_mvx == 0) &&
+ (ps_pu->mv.s_l1_mv.i2_mvy == 0))
+ {
+ gs_ihevcd_stat.stat_pu_zeromv_size_hist[wd][ht]++;
+ }
+ if((ABS(ps_pu->mv.s_l0_mv.i2_mvx) < 4) &&
+ (ABS(ps_pu->mv.s_l0_mv.i2_mvy) < 4) &&
+ (ABS(ps_pu->mv.s_l1_mv.i2_mvx) < 4) &&
+ (ABS(ps_pu->mv.s_l1_mv.i2_mvy) < 4))
+ {
+ gs_ihevcd_stat.stat_pu_zeromvfpel_size_hist[wd][ht]++;
+ }
+
+ break;
+
+ }
+ }
+}
+
+
+void ihevcd_print_pu_size_hist(UWORD32 *pu4_buf)
+{
+ WORD32 i, j;
+
+
+ for(i = 0; i < (MAX_CTB_SIZE / MIN_PU_SIZE); i++)
+ {
+ for(j = 0; j < (MAX_CTB_SIZE / MIN_PU_SIZE); j++)
+ {
+ printf("%12d ", pu4_buf[j]);
+ }
+ pu4_buf += (MAX_CTB_SIZE / MIN_PU_SIZE);
+ printf("\n");
+ }
+}
+
+void ihevcd_print_pu_size_hist_normalized(UWORD32 *pu4_buf)
+{
+ WORD32 i, j;
+ WORD32 sum;
+ UWORD32 *pu4_buf_orig = pu4_buf;
+ sum = 0;
+
+ for(i = 0; i < (MAX_CTB_SIZE / MIN_PU_SIZE); i++)
+ {
+ for(j = 0; j < (MAX_CTB_SIZE / MIN_PU_SIZE); j++)
+ {
+ sum += pu4_buf[j] * (i + 1) * (j + 1) * 16;
+ }
+ pu4_buf += (MAX_CTB_SIZE / MIN_PU_SIZE);
+ }
+
+ pu4_buf = pu4_buf_orig;
+ for(i = 0; i < (MAX_CTB_SIZE / MIN_PU_SIZE); i++)
+ {
+ for(j = 0; j < (MAX_CTB_SIZE / MIN_PU_SIZE); j++)
+ {
+ double num = pu4_buf[j] * (i + 1) * (j + 1) * 16 * 100.0;
+ printf("%6.2f ", num / sum);
+ }
+ pu4_buf += (MAX_CTB_SIZE / MIN_PU_SIZE);
+ printf("\n");
+ }
+}
+
+void ihevcd_print_pu_size_hist_percentage(UWORD32 *pu4_num, UWORD32 *pu4_denom)
+{
+ WORD32 i, j;
+
+
+ for(i = 0; i < (MAX_CTB_SIZE / MIN_PU_SIZE); i++)
+ {
+ for(j = 0; j < (MAX_CTB_SIZE / MIN_PU_SIZE); j++)
+ {
+ double val;
+ val = 0;
+ if(pu4_denom[j])
+ {
+ val = (pu4_num[j] * 100.0) / pu4_denom[j];
+ printf("%6.2f ", val);
+ }
+ else
+ {
+ if(0 == pu4_num[j])
+ printf("%6.2f ", 0.0);
+ else
+ printf("NaN ");
+ }
+ }
+ pu4_num += (MAX_CTB_SIZE / MIN_PU_SIZE);
+ pu4_denom += (MAX_CTB_SIZE / MIN_PU_SIZE);
+ printf("\n");
+ }
+}
+
+void ihevcd_print_pu_statistics()
+{
+
+ printf("\n\nPU Sizes\n\n");
+ ihevcd_print_pu_size_hist(&gs_ihevcd_stat.stat_pu_all_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Intra\n\n");
+ ihevcd_print_pu_size_hist(&gs_ihevcd_stat.stat_pu_intra_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Inter\n\n");
+ ihevcd_print_pu_size_hist(&gs_ihevcd_stat.stat_pu_inter_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Skip\n\n");
+ ihevcd_print_pu_size_hist(&gs_ihevcd_stat.stat_pu_skip_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Merge\n\n");
+ ihevcd_print_pu_size_hist(&gs_ihevcd_stat.stat_pu_merge_size_hist[0][0]);
+
+ printf("\n\nPU Sizes BiPred\n\n");
+ ihevcd_print_pu_size_hist(&gs_ihevcd_stat.stat_pu_bipred_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Zero MV\n\n");
+ ihevcd_print_pu_size_hist(&gs_ihevcd_stat.stat_pu_zeromv_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Zero MV including subpel MV less than +/- 1 in fullpel units\n\n");
+ ihevcd_print_pu_size_hist(&gs_ihevcd_stat.stat_pu_zeromvfpel_size_hist[0][0]);
+
+ printf("\n\nPU Sizes percentage \n\n");
+ ihevcd_print_pu_size_hist_normalized(&gs_ihevcd_stat.stat_pu_all_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Intra ratio w.r.t all PUs\n\n");
+ ihevcd_print_pu_size_hist_percentage(&gs_ihevcd_stat.stat_pu_intra_size_hist[0][0], &gs_ihevcd_stat.stat_pu_all_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Inter ratio w.r.t all PUs\n\n");
+ ihevcd_print_pu_size_hist_percentage(&gs_ihevcd_stat.stat_pu_inter_size_hist[0][0], &gs_ihevcd_stat.stat_pu_all_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Skip ratio w.r.t all PUs\n\n");
+ ihevcd_print_pu_size_hist_percentage(&gs_ihevcd_stat.stat_pu_skip_size_hist[0][0], &gs_ihevcd_stat.stat_pu_all_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Merge ratio w.r.t all PUs\n\n");
+ ihevcd_print_pu_size_hist_percentage(&gs_ihevcd_stat.stat_pu_merge_size_hist[0][0], &gs_ihevcd_stat.stat_pu_all_size_hist[0][0]);
+
+ printf("\n\nPU Sizes BiPred ratio w.r.t all PUs\n\n");
+ ihevcd_print_pu_size_hist_percentage(&gs_ihevcd_stat.stat_pu_bipred_size_hist[0][0], &gs_ihevcd_stat.stat_pu_all_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Zero MV ratio w.r.t all PUs\n\n");
+ ihevcd_print_pu_size_hist_percentage(&gs_ihevcd_stat.stat_pu_zeromv_size_hist[0][0], &gs_ihevcd_stat.stat_pu_all_size_hist[0][0]);
+
+ printf("\n\nPU Sizes Zero MV including subpel MV less than +/- 1 in fullpel units ratio w.r.t all PUs\n\n");
+ ihevcd_print_pu_size_hist_percentage(&gs_ihevcd_stat.stat_pu_zeromvfpel_size_hist[0][0], &gs_ihevcd_stat.stat_pu_all_size_hist[0][0]);
+
+}
+
+void ihevcd_print_statistics()
+{
+ ihevcd_print_transform_statistics();
+ ihevcd_print_pu_statistics();
+}
+#endif