510 lines
17 KiB
C
510 lines
17 KiB
C
/******************************************************************************
|
|
*
|
|
* Copyright (C) 2015 The Android Open Source Project
|
|
*
|
|
* 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.
|
|
*
|
|
*****************************************************************************
|
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
|
*/
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
#include "iv_datatypedef.h"
|
|
#include "iv.h"
|
|
#include "ivd.h"
|
|
#include "impeg2d.h"
|
|
|
|
#include "impeg2_buf_mgr.h"
|
|
#include "impeg2_disp_mgr.h"
|
|
#include "impeg2_macros.h"
|
|
#include "impeg2_defs.h"
|
|
#include "impeg2_platform_macros.h"
|
|
#include "impeg2_inter_pred.h"
|
|
#include "impeg2_idct.h"
|
|
#include "impeg2_format_conv.h"
|
|
#include "impeg2_mem_func.h"
|
|
#include "impeg2_globals.h"
|
|
|
|
#include "impeg2d_bitstream.h"
|
|
#include "impeg2d_api.h"
|
|
#include "impeg2d_structs.h"
|
|
#include "impeg2d_debug.h"
|
|
|
|
#if STATISTICS
|
|
WORD32 gai4_impeg2d_idct_inp_last_nonzero_histogram[64] = {0};
|
|
WORD32 gai4_impeg2d_idct_inp_num_nonzero_histogram[64] = {0};
|
|
WORD32 gai4_impeg2d_idct_inp_last_non_zero_row_histogram[8] = {0};
|
|
|
|
WORD32 gai4_impeg2d_iqnt_inp_last_nonzero_histogram[64] = {0};
|
|
WORD32 gai4_impeg2d_iqnt_inp_num_nonzero_histogram[64] = {0};
|
|
WORD32 gai4_impeg2d_iqnt_inp_last_non_zero_row_histogram[8] = {0};
|
|
|
|
WORD32 gi4_impeg2d_idct_inp_only_first_coeff = 0;
|
|
WORD32 gi4_impeg2d_idct_inp_only_last_coeff = 0;
|
|
WORD32 gi4_impeg2d_idct_inp_only_first_n_last_coeff = 0;
|
|
WORD32 gi4_impeg2d_idct_cnt = 0;
|
|
|
|
|
|
WORD32 gi4_impeg2d_iqnt_inp_only_first_coeff = 0;
|
|
WORD32 gi4_impeg2d_iqnt_inp_only_last_coeff = 0;
|
|
WORD32 gi4_impeg2d_iqnt_inp_only_first_n_last_coeff = 0;
|
|
WORD32 gi4_impeg2d_iqnt_cnt = 0;
|
|
|
|
|
|
void impeg2d_iqnt_inp_statistics(WORD16 *pi2_iqnt_inp,
|
|
WORD32 i4_non_zero_cols,
|
|
WORD32 i4_non_zero_rows)
|
|
{
|
|
WORD32 i, j;
|
|
WORD32 i4_last_row = 0, i4_last_col = 0;
|
|
WORD32 i4_num_non_zero = 0;
|
|
WORD32 i4_non_zero_cols_computed = 0;
|
|
WORD32 i4_non_zero_rows_computed = 0;
|
|
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
if(pi2_iqnt_inp[i * 8 + j])
|
|
{
|
|
i4_non_zero_cols_computed |= (1 << j);
|
|
i4_non_zero_rows_computed |= (1 << i);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(i4_non_zero_cols_computed != i4_non_zero_cols)
|
|
{
|
|
printf("IQ Input: Invalid non_zero_cols 0x%x non_zero_cols_computed 0x%x\n", i4_non_zero_cols, i4_non_zero_cols_computed);
|
|
}
|
|
if(i4_non_zero_rows_computed != i4_non_zero_rows)
|
|
{
|
|
printf("IQ Input: Invalid non_zero_rows 0x%x non_zero_rows_computed 0x%x\n", i4_non_zero_rows, i4_non_zero_rows_computed);
|
|
}
|
|
{
|
|
WORD32 last_non_zero_row = 32 - CLZ(i4_non_zero_rows);
|
|
gai4_impeg2d_iqnt_inp_last_non_zero_row_histogram[last_non_zero_row - 1]++;
|
|
}
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
if(pi2_iqnt_inp[i * 8 + j])
|
|
{
|
|
i4_last_col = MAX(i4_last_col, j);
|
|
i4_last_row = MAX(i4_last_row, i);
|
|
i4_num_non_zero++;
|
|
}
|
|
}
|
|
}
|
|
gai4_impeg2d_iqnt_inp_last_nonzero_histogram[i4_last_row * 8 + i4_last_col]++;
|
|
gai4_impeg2d_iqnt_inp_num_nonzero_histogram[i4_num_non_zero]++;
|
|
gi4_impeg2d_iqnt_cnt++;
|
|
/* Check if only (0,0) and (7,7) are non zero */
|
|
if(i4_num_non_zero == 1)
|
|
{
|
|
if(pi2_iqnt_inp[7 * 8 + 7])
|
|
gi4_impeg2d_iqnt_inp_only_last_coeff++;
|
|
}
|
|
if(i4_num_non_zero == 1)
|
|
{
|
|
if(pi2_iqnt_inp[0])
|
|
gi4_impeg2d_iqnt_inp_only_first_coeff++;
|
|
}
|
|
|
|
if(i4_num_non_zero == 2)
|
|
{
|
|
if((pi2_iqnt_inp[0]) && (1 == pi2_iqnt_inp[7 * 8 + 7]))
|
|
gi4_impeg2d_iqnt_inp_only_first_n_last_coeff++;
|
|
}
|
|
}
|
|
|
|
void impeg2d_idct_inp_statistics(WORD16 *pi2_idct_inp,
|
|
WORD32 i4_non_zero_cols,
|
|
WORD32 i4_non_zero_rows)
|
|
{
|
|
WORD32 i, j;
|
|
WORD32 i4_last_row = 0, i4_last_col = 0;
|
|
WORD32 i4_num_non_zero = 0;
|
|
WORD32 i4_non_zero_cols_computed = 0;
|
|
WORD32 i4_non_zero_rows_computed = 0;
|
|
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
if(pi2_idct_inp[i * 8 + j])
|
|
{
|
|
i4_non_zero_cols_computed |= (1 << j);
|
|
i4_non_zero_rows_computed |= (1 << i);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(i4_non_zero_cols_computed != i4_non_zero_cols)
|
|
{
|
|
printf("IDCT Input: Invalid non_zero_cols 0x%x non_zero_cols_computed 0x%x\n", i4_non_zero_cols, i4_non_zero_cols_computed);
|
|
}
|
|
if(i4_non_zero_rows_computed != i4_non_zero_rows)
|
|
{
|
|
printf("IDCT Input: Invalid non_zero_rows 0x%x non_zero_rows_computed 0x%x\n", i4_non_zero_rows, i4_non_zero_rows_computed);
|
|
}
|
|
|
|
{
|
|
WORD32 last_non_zero_row = 32 - CLZ(i4_non_zero_rows);
|
|
gai4_impeg2d_idct_inp_last_non_zero_row_histogram[last_non_zero_row - 1]++;
|
|
}
|
|
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
if(pi2_idct_inp[i * 8 + j])
|
|
{
|
|
i4_last_col = MAX(i4_last_col, j);
|
|
i4_last_row = MAX(i4_last_row, i);
|
|
i4_num_non_zero++;
|
|
}
|
|
}
|
|
}
|
|
gai4_impeg2d_idct_inp_last_nonzero_histogram[i4_last_row * 8 + i4_last_col]++;
|
|
gai4_impeg2d_idct_inp_num_nonzero_histogram[i4_num_non_zero]++;
|
|
gi4_impeg2d_idct_cnt++;
|
|
/* Check if only (0,0) and (7,7) are non zero */
|
|
if(i4_num_non_zero == 1)
|
|
{
|
|
if(pi2_idct_inp[7 * 8 + 7])
|
|
gi4_impeg2d_idct_inp_only_last_coeff++;
|
|
}
|
|
if(i4_num_non_zero == 1)
|
|
{
|
|
if(pi2_idct_inp[0])
|
|
gi4_impeg2d_idct_inp_only_first_coeff++;
|
|
}
|
|
|
|
if(i4_num_non_zero == 2)
|
|
{
|
|
if((pi2_idct_inp[0]) && (1 == pi2_idct_inp[7 * 8 + 7]))
|
|
gi4_impeg2d_idct_inp_only_first_n_last_coeff++;
|
|
}
|
|
}
|
|
void impeg2d_print_idct_inp_statistics()
|
|
{
|
|
WORD32 i, j;
|
|
WORD32 i4_sum;
|
|
WORD32 i4_accumulator;
|
|
i4_sum = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
i4_sum += gai4_impeg2d_idct_inp_last_nonzero_histogram[i * 8 + j];
|
|
}
|
|
}
|
|
printf("IDCT input : Only last coeff non-zero %8.2f\n", (gi4_impeg2d_idct_inp_only_last_coeff * 100.0) / gi4_impeg2d_idct_cnt);
|
|
printf("IDCT input : Only first coeff non-zero (Includes DC + mismatch) %8.2f\n", (gi4_impeg2d_idct_inp_only_first_coeff * 100.0) / gi4_impeg2d_idct_cnt);
|
|
|
|
printf("IDCT input : Last non-zero coeff histogram\n");
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
double val = gai4_impeg2d_idct_inp_last_nonzero_histogram[i * 8 + j] * 100.0 / i4_sum;
|
|
printf("%8.2f \t", val);
|
|
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
printf("IDCT input : Cumulative Last non-zero coeff histogram\n");
|
|
i4_accumulator = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
double val;
|
|
i4_accumulator += gai4_impeg2d_idct_inp_last_nonzero_histogram[i * 8 + j];
|
|
val = i4_accumulator * 100.0 / i4_sum;
|
|
|
|
printf("%8.2f \t", val);
|
|
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
|
|
|
|
printf("IDCT input : Number of non-zero coeff histogram\n");
|
|
i4_sum = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
i4_sum += gai4_impeg2d_idct_inp_num_nonzero_histogram[i * 8 + j];
|
|
}
|
|
}
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
double val = gai4_impeg2d_idct_inp_num_nonzero_histogram[i * 8 + j] * 100.0 / i4_sum;
|
|
printf("%8.2f \t", val);
|
|
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
printf("IDCT input : Cumulative number of non-zero coeffs histogram\n");
|
|
i4_accumulator = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
double val;
|
|
i4_accumulator += gai4_impeg2d_idct_inp_num_nonzero_histogram[i * 8 + j];
|
|
val = i4_accumulator * 100.0 / i4_sum;
|
|
printf("%8.2f \t", val);
|
|
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
printf("IDCT input : Last non-zero row histogram\n");
|
|
|
|
|
|
{
|
|
i4_accumulator = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
i4_accumulator += gai4_impeg2d_idct_inp_last_non_zero_row_histogram[i];
|
|
}
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
double val = gai4_impeg2d_idct_inp_last_non_zero_row_histogram[i] * 100.0 / i4_accumulator;
|
|
printf("%8.2f \t", val);
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
void impeg2d_print_iqnt_inp_statistics()
|
|
{
|
|
WORD32 i, j;
|
|
WORD32 i4_sum;
|
|
WORD32 i4_accumulator;
|
|
i4_sum = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
i4_sum += gai4_impeg2d_iqnt_inp_last_nonzero_histogram[i * 8 + j];
|
|
}
|
|
}
|
|
printf("IQnt input : Only last coeff non-zero %8.2f\n", (gi4_impeg2d_iqnt_inp_only_last_coeff * 100.0) / gi4_impeg2d_iqnt_cnt);
|
|
printf("IQnt input : Only first coeff non-zero (Includes DC + mismatch) %8.2f\n", (gi4_impeg2d_iqnt_inp_only_first_coeff * 100.0) / gi4_impeg2d_idct_cnt);
|
|
|
|
printf("IQnt input : Last non-zero coeff histogram\n");
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
double val = gai4_impeg2d_iqnt_inp_last_nonzero_histogram[i * 8 + j] * 100.0 / i4_sum;
|
|
printf("%8.2f \t", val);
|
|
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
printf("IQnt input : Cumulative Last non-zero coeff histogram\n");
|
|
i4_accumulator = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
double val;
|
|
i4_accumulator += gai4_impeg2d_iqnt_inp_last_nonzero_histogram[i * 8 + j];
|
|
val = i4_accumulator * 100.0 / i4_sum;
|
|
|
|
printf("%8.2f \t", val);
|
|
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
|
|
|
|
printf("IQnt input : Number of non-zero coeff histogram\n");
|
|
i4_sum = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
i4_sum += gai4_impeg2d_iqnt_inp_num_nonzero_histogram[i * 8 + j];
|
|
}
|
|
}
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
double val = gai4_impeg2d_iqnt_inp_num_nonzero_histogram[i * 8 + j] * 100.0 / i4_sum;
|
|
printf("%8.2f \t", val);
|
|
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
printf("IQnt input : Cumulative number of non-zero coeffs histogram\n");
|
|
i4_accumulator = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
for(j = 0; j < 8; j++)
|
|
{
|
|
double val;
|
|
i4_accumulator += gai4_impeg2d_iqnt_inp_num_nonzero_histogram[i * 8 + j];
|
|
val = i4_accumulator * 100.0 / i4_sum;
|
|
printf("%8.2f \t", val);
|
|
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
printf("IQnt input : Last non-zero row histogram\n");
|
|
|
|
|
|
{
|
|
i4_accumulator = 0;
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
i4_accumulator += gai4_impeg2d_iqnt_inp_last_non_zero_row_histogram[i];
|
|
}
|
|
for(i = 0; i < 8; i++)
|
|
{
|
|
double val = gai4_impeg2d_iqnt_inp_last_non_zero_row_histogram[i] * 100.0 / i4_accumulator;
|
|
printf("%8.2f \t", val);
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
}
|
|
|
|
void impeg2d_print_statistics()
|
|
{
|
|
impeg2d_print_idct_inp_statistics();
|
|
impeg2d_print_iqnt_inp_statistics();
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
#if DEBUG_MB
|
|
|
|
static UWORD32 u4_debug_frm = 12;
|
|
static UWORD32 u4_debug_mb_x = 3;
|
|
static UWORD32 u4_debug_mb_y = 0;
|
|
|
|
static UWORD32 u4_debug_frm_num = 0;
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function Name : example_of_a_function */
|
|
/* */
|
|
/* Description : This function illustrates the use of C coding standards. */
|
|
/* switch/case, if, for, block comments have been shown */
|
|
/* here. */
|
|
/* Inputs : <What inputs does the function take?> */
|
|
/* Globals : <Does it use any global variables?> */
|
|
/* Processing : <Describe how the function operates - include algorithm */
|
|
/* description> */
|
|
/* Outputs : <What does the function produce?> */
|
|
/* Returns : <What does the function return?> */
|
|
/* */
|
|
/* Issues : <List any issues or problems with this function> */
|
|
/* */
|
|
/* Revision History: */
|
|
/* */
|
|
/* DD MM YYYY Author(s) Changes (Describe the changes made) */
|
|
/* 13 07 2002 Ittiam Draft */
|
|
/* */
|
|
/*****************************************************************************/
|
|
void impeg2d_trace_mb_start(UWORD32 u4_mb_x, UWORD32 u4_mb_y)
|
|
{
|
|
UWORD32 u4_frm_num = impeg2d_frm_num_get();
|
|
|
|
if(u4_frm_num == u4_debug_frm && u4_mb_x == u4_debug_mb_x && u4_mb_y == u4_debug_mb_y)
|
|
{
|
|
// printf("");
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function Name : example_of_a_function */
|
|
/* */
|
|
/* Description : This function illustrates the use of C coding standards. */
|
|
/* switch/case, if, for, block comments have been shown */
|
|
/* here. */
|
|
/* Inputs : <What inputs does the function take?> */
|
|
/* Globals : <Does it use any global variables?> */
|
|
/* Processing : <Describe how the function operates - include algorithm */
|
|
/* description> */
|
|
/* Outputs : <What does the function produce?> */
|
|
/* Returns : <What does the function return?> */
|
|
/* */
|
|
/* Issues : <List any issues or problems with this function> */
|
|
/* */
|
|
/* Revision History: */
|
|
/* */
|
|
/* DD MM YYYY Author(s) Changes (Describe the changes made) */
|
|
/* 13 07 2002 Ittiam Draft */
|
|
/* */
|
|
/*****************************************************************************/
|
|
void impeg2d_frm_num_set(void)
|
|
{
|
|
u4_debug_frm_num++;
|
|
}
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Function Name : example_of_a_function */
|
|
/* */
|
|
/* Description : This function illustrates the use of C coding standards. */
|
|
/* switch/case, if, for, block comments have been shown */
|
|
/* here. */
|
|
/* Inputs : <What inputs does the function take?> */
|
|
/* Globals : <Does it use any global variables?> */
|
|
/* Processing : <Describe how the function operates - include algorithm */
|
|
/* description> */
|
|
/* Outputs : <What does the function produce?> */
|
|
/* Returns : <What does the function return?> */
|
|
/* */
|
|
/* Issues : <List any issues or problems with this function> */
|
|
/* */
|
|
/* Revision History: */
|
|
/* */
|
|
/* DD MM YYYY Author(s) Changes (Describe the changes made) */
|
|
/* 13 07 2002 Ittiam Draft */
|
|
/* */
|
|
/*****************************************************************************/
|
|
UWORD32 impeg2d_frm_num_get(void)
|
|
{
|
|
return(u4_debug_frm_num);
|
|
}
|
|
|
|
#endif
|