diff options
Diffstat (limited to 'vp9/common/vp9_onyxc_int.h')
-rw-r--r-- | vp9/common/vp9_onyxc_int.h | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h new file mode 100644 index 000000000..18750e767 --- /dev/null +++ b/vp9/common/vp9_onyxc_int.h @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2010 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + + +#ifndef __INC_ONYXC_INT_H +#define __INC_ONYXC_INT_H + +#include "vpx_config.h" +#include "vpx/internal/vpx_codec_internal.h" +#include "vp9_rtcd.h" +#include "vp9_loopfilter.h" +#include "vp9_entropymv.h" +#include "vp9_entropy.h" +#include "vp9_entropymode.h" +#if CONFIG_POSTPROC +#include "vp9_postproc.h" +#endif + +/*#ifdef PACKET_TESTING*/ +#include "vp9_header.h" +/*#endif*/ + +/* Create/destroy static data structures. */ + +void vp9_initialize_common(void); + +#define MINQ 0 + +#define MAXQ 255 +#define QINDEX_BITS 8 + +#define QINDEX_RANGE (MAXQ + 1) + +#define NUM_YV12_BUFFERS 4 + +#define COMP_PRED_CONTEXTS 2 + +typedef struct frame_contexts { + vp9_prob bmode_prob[VP9_NKF_BINTRAMODES - 1]; + vp9_prob ymode_prob[VP9_YMODES - 1]; /* interframe intra mode probs */ +#if CONFIG_SUPERBLOCKS + vp9_prob sb_ymode_prob[VP9_I32X32_MODES - 1]; +#endif + vp9_prob uv_mode_prob[VP9_YMODES][VP9_UV_MODES - 1]; + vp9_prob i8x8_mode_prob[VP9_I8X8_MODES - 1]; + vp9_prob sub_mv_ref_prob[SUBMVREF_COUNT][VP9_SUBMVREFS - 1]; + vp9_prob mbsplit_prob[VP9_NUMMBSPLITS - 1]; + vp9_prob coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + vp9_prob hybrid_coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + vp9_prob coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + vp9_prob hybrid_coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + vp9_prob coef_probs_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + vp9_prob hybrid_coef_probs_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + + nmv_context nmvc; + nmv_context pre_nmvc; + vp9_prob pre_bmode_prob[VP9_NKF_BINTRAMODES - 1]; + vp9_prob pre_ymode_prob[VP9_YMODES - 1]; /* interframe intra mode probs */ +#if CONFIG_SUPERBLOCKS + vp9_prob pre_sb_ymode_prob[VP9_I32X32_MODES - 1]; +#endif + vp9_prob pre_uv_mode_prob[VP9_YMODES][VP9_UV_MODES - 1]; + vp9_prob pre_i8x8_mode_prob[VP9_I8X8_MODES - 1]; + vp9_prob pre_sub_mv_ref_prob[SUBMVREF_COUNT][VP9_SUBMVREFS - 1]; + vp9_prob pre_mbsplit_prob[VP9_NUMMBSPLITS - 1]; + unsigned int bmode_counts[VP9_NKF_BINTRAMODES]; + unsigned int ymode_counts[VP9_YMODES]; /* interframe intra mode probs */ +#if CONFIG_SUPERBLOCKS + unsigned int sb_ymode_counts[VP9_I32X32_MODES]; +#endif + unsigned int uv_mode_counts[VP9_YMODES][VP9_UV_MODES]; + unsigned int i8x8_mode_counts[VP9_I8X8_MODES]; /* interframe intra probs */ + unsigned int sub_mv_ref_counts[SUBMVREF_COUNT][VP9_SUBMVREFS]; + unsigned int mbsplit_counts[VP9_NUMMBSPLITS]; + + vp9_prob pre_coef_probs [BLOCK_TYPES] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + vp9_prob pre_hybrid_coef_probs [BLOCK_TYPES] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + + vp9_prob pre_coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + vp9_prob pre_hybrid_coef_probs_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + + vp9_prob pre_coef_probs_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + vp9_prob pre_hybrid_coef_probs_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [ENTROPY_NODES]; + + unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; + unsigned int hybrid_coef_counts [BLOCK_TYPES] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; + + unsigned int coef_counts_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; + unsigned int hybrid_coef_counts_8x8 [BLOCK_TYPES_8X8] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; + + unsigned int coef_counts_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; + unsigned int hybrid_coef_counts_16x16 [BLOCK_TYPES_16X16] [COEF_BANDS] + [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; + + nmv_context_counts NMVcount; + vp9_prob switchable_interp_prob[VP9_SWITCHABLE_FILTERS + 1] + [VP9_SWITCHABLE_FILTERS - 1]; +#if CONFIG_COMP_INTERINTRA_PRED + unsigned int interintra_counts[2]; + vp9_prob interintra_prob; + vp9_prob pre_interintra_prob; +#endif + + int mode_context[INTER_MODE_CONTEXTS][4]; + int mode_context_a[INTER_MODE_CONTEXTS][4]; + int vp9_mode_contexts[INTER_MODE_CONTEXTS][4]; + int mv_ref_ct[INTER_MODE_CONTEXTS][4][2]; +} FRAME_CONTEXT; + +typedef enum { + RECON_CLAMP_REQUIRED = 0, + RECON_CLAMP_NOTREQUIRED = 1 +} CLAMP_TYPE; + +typedef enum { + SINGLE_PREDICTION_ONLY = 0, + COMP_PREDICTION_ONLY = 1, + HYBRID_PREDICTION = 2, + NB_PREDICTION_TYPES = 3, +} COMPPREDMODE_TYPE; + +typedef enum { + ONLY_4X4 = 0, + ALLOW_8X8 = 1, + ALLOW_16X16 = 2, + TX_MODE_SELECT = 3, + NB_TXFM_MODES = 4, +} TXFM_MODE; + +typedef struct VP9_COMMON_RTCD { +#if CONFIG_RUNTIME_CPU_DETECT +#if CONFIG_POSTPROC + vp9_postproc_rtcd_vtable_t postproc; +#endif + int flags; +#else + int unused; +#endif +} VP9_COMMON_RTCD; + +typedef struct VP9Common { + struct vpx_internal_error_info error; + + DECLARE_ALIGNED(16, short, Y1dequant[QINDEX_RANGE][16]); + DECLARE_ALIGNED(16, short, Y2dequant[QINDEX_RANGE][16]); + DECLARE_ALIGNED(16, short, UVdequant[QINDEX_RANGE][16]); + + int Width; + int Height; + int horiz_scale; + int vert_scale; + + YUV_TYPE clr_type; + CLAMP_TYPE clamp_type; + + YV12_BUFFER_CONFIG *frame_to_show; + + YV12_BUFFER_CONFIG yv12_fb[NUM_YV12_BUFFERS]; + int fb_idx_ref_cnt[NUM_YV12_BUFFERS]; + int new_fb_idx, lst_fb_idx, gld_fb_idx, alt_fb_idx; + + YV12_BUFFER_CONFIG post_proc_buffer; + YV12_BUFFER_CONFIG temp_scale_frame; + + + FRAME_TYPE last_frame_type; /* Save last frame's frame type for motion search. */ + FRAME_TYPE frame_type; + + int show_frame; + + int frame_flags; + int MBs; + int mb_rows; + int mb_cols; + int mode_info_stride; + + /* profile settings */ + int experimental; + int mb_no_coeff_skip; + TXFM_MODE txfm_mode; + COMPPREDMODE_TYPE comp_pred_mode; + int no_lpf; + int use_bilinear_mc_filter; + int full_pixel; + + int base_qindex; + int last_kf_gf_q; /* Q used on the last GF or KF */ + + int y1dc_delta_q; + int y2dc_delta_q; + int y2ac_delta_q; + int uvdc_delta_q; + int uvac_delta_q; + + unsigned int frames_since_golden; + unsigned int frames_till_alt_ref_frame; + + /* We allocate a MODE_INFO struct for each macroblock, together with + an extra row on top and column on the left to simplify prediction. */ + + MODE_INFO *mip; /* Base of allocated array */ + MODE_INFO *mi; /* Corresponds to upper left visible macroblock */ + MODE_INFO *prev_mip; /* MODE_INFO array 'mip' from last decoded frame */ + MODE_INFO *prev_mi; /* 'mi' from last frame (points into prev_mip) */ + + + // Persistent mb segment id map used in prediction. + unsigned char *last_frame_seg_map; + + INTERPOLATIONFILTERTYPE mcomp_filter_type; + LOOPFILTERTYPE filter_type; + + loop_filter_info_n lf_info; + + int filter_level; + int last_sharpness_level; + int sharpness_level; + + int refresh_last_frame; /* Two state 0 = NO, 1 = YES */ + int refresh_golden_frame; /* Two state 0 = NO, 1 = YES */ + int refresh_alt_ref_frame; /* Two state 0 = NO, 1 = YES */ + + int copy_buffer_to_gf; /* 0 none, 1 Last to GF, 2 ARF to GF */ + int copy_buffer_to_arf; /* 0 none, 1 Last to ARF, 2 GF to ARF */ + + int refresh_entropy_probs; /* Two state 0 = NO, 1 = YES */ + + int ref_frame_sign_bias[MAX_REF_FRAMES]; /* Two state 0, 1 */ + + /* Y,U,V,Y2 */ + ENTROPY_CONTEXT_PLANES *above_context; /* row of context for each plane */ + ENTROPY_CONTEXT_PLANES left_context[2]; /* (up to) 4 contexts "" */ + + /* keyframe block modes are predicted by their above, left neighbors */ + + vp9_prob kf_bmode_prob[VP9_KF_BINTRAMODES] + [VP9_KF_BINTRAMODES] + [VP9_KF_BINTRAMODES - 1]; + vp9_prob kf_ymode_prob[8][VP9_YMODES - 1]; /* keyframe "" */ +#if CONFIG_SUPERBLOCKS + vp9_prob sb_kf_ymode_prob[8][VP9_I32X32_MODES - 1]; +#endif + int kf_ymode_probs_index; + int kf_ymode_probs_update; + vp9_prob kf_uv_mode_prob[VP9_YMODES] [VP9_UV_MODES - 1]; + + vp9_prob prob_intra_coded; + vp9_prob prob_last_coded; + vp9_prob prob_gf_coded; +#if CONFIG_SUPERBLOCKS + vp9_prob sb_coded; +#endif + + // Context probabilities when using predictive coding of segment id + vp9_prob segment_pred_probs[PREDICTION_PROBS]; + unsigned char temporal_update; + + // Context probabilities for reference frame prediction + unsigned char ref_scores[MAX_REF_FRAMES]; + vp9_prob ref_pred_probs[PREDICTION_PROBS]; + vp9_prob mod_refprobs[MAX_REF_FRAMES][PREDICTION_PROBS]; + + vp9_prob prob_comppred[COMP_PRED_CONTEXTS]; + + // FIXME contextualize + vp9_prob prob_tx[TX_SIZE_MAX - 1]; + + vp9_prob mbskip_pred_probs[MBSKIP_CONTEXTS]; + + FRAME_CONTEXT lfc_a; /* last alt ref entropy */ + FRAME_CONTEXT lfc; /* last frame entropy */ + FRAME_CONTEXT fc; /* this frame entropy */ + + unsigned int current_video_frame; + int near_boffset[3]; + int version; + +#ifdef PACKET_TESTING + VP9_HEADER oh; +#endif + double bitrate; + double framerate; + +#if CONFIG_RUNTIME_CPU_DETECT + VP9_COMMON_RTCD rtcd; +#endif + +#if CONFIG_POSTPROC + struct postproc_state postproc_state; +#endif + +#if CONFIG_PRED_FILTER + /* Prediction filter variables */ + int pred_filter_mode; // 0=disabled at the frame level (no MB filtered) + // 1=enabled at the frame level (all MB filtered) + // 2=specified per MB (1=filtered, 0=non-filtered) + vp9_prob prob_pred_filter_off; +#endif +#if CONFIG_COMP_INTERINTRA_PRED + int use_interintra; +#endif + +} VP9_COMMON; + +#endif // __INC_ONYX_INT_H |