1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VP8_COMMON_ONYXC_INT_H_
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP8_COMMON_ONYXC_INT_H_
14233d2500723e5594f3e7c70896ffeeef32b9c950ywan
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h"
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8_rtcd.h"
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx/internal/vpx_codec_internal.h"
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "loopfilter.h"
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "entropymv.h"
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "entropy.h"
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_POSTPROC
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "postproc.h"
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
24233d2500723e5594f3e7c70896ffeeef32b9c950ywan
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*#ifdef PACKET_TESTING*/
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "header.h"
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*#endif*/
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus
30233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" {
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MINQ 0
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAXQ 127
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define QINDEX_RANGE (MAXQ + 1)
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define NUM_YV12_BUFFERS 4
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAX_PARTITIONS 9
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan
41233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct frame_contexts
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_prob bmode_prob [VP8_BINTRAMODES-1];
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_prob ymode_prob [VP8_YMODES-1];   /* interframe intra mode probs */
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_prob uv_mode_prob [VP8_UV_MODES-1];
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_prob sub_mv_ref_prob [VP8_SUBMVREFS-1];
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_prob coef_probs [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY_NODES];
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MV_CONTEXT mvc[2];
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan} FRAME_CONTEXT;
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan
51233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef enum
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ONE_PARTITION  = 0,
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TWO_PARTITION  = 1,
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan    FOUR_PARTITION = 2,
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan    EIGHT_PARTITION = 3
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan} TOKEN_PARTITION;
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan
59233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef enum
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    RECON_CLAMP_REQUIRED        = 0,
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan    RECON_CLAMP_NOTREQUIRED     = 1
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan} CLAMP_TYPE;
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan
65233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct VP8Common
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan    struct vpx_internal_error_info  error;
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DECLARE_ALIGNED(16, short, Y1dequant[QINDEX_RANGE][2]);
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DECLARE_ALIGNED(16, short, Y2dequant[QINDEX_RANGE][2]);
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan    DECLARE_ALIGNED(16, short, UVdequant[QINDEX_RANGE][2]);
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int Width;
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int Height;
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int horiz_scale;
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int vert_scale;
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan    CLAMP_TYPE  clamp_type;
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan    YV12_BUFFER_CONFIG *frame_to_show;
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan    YV12_BUFFER_CONFIG yv12_fb[NUM_YV12_BUFFERS];
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int fb_idx_ref_cnt[NUM_YV12_BUFFERS];
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int new_fb_idx, lst_fb_idx, gld_fb_idx, alt_fb_idx;
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan    YV12_BUFFER_CONFIG temp_scale_frame;
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_POSTPROC
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan    YV12_BUFFER_CONFIG post_proc_buffer;
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan    YV12_BUFFER_CONFIG post_proc_buffer_int;
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int post_proc_buffer_int_used;
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned char *pp_limits_buffer;   /* post-processing filter coefficients */
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan    FRAME_TYPE last_frame_type;  /* Save last frame's frame type for motion search. */
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan    FRAME_TYPE frame_type;
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int show_frame;
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int frame_flags;
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int MBs;
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int mb_rows;
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int mb_cols;
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int mode_info_stride;
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* profile settings */
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int mb_no_coeff_skip;
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int no_lpf;
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int use_bilinear_mc_filter;
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int full_pixel;
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int base_qindex;
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int y1dc_delta_q;
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int y2dc_delta_q;
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int y2ac_delta_q;
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int uvdc_delta_q;
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int uvac_delta_q;
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* We allocate a MODE_INFO struct for each macroblock, together with
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan       an extra row on top and column on the left to simplify prediction. */
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MODE_INFO *mip; /* Base of allocated array */
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MODE_INFO *mi;  /* Corresponds to upper left visible macroblock */
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_ERROR_CONCEALMENT
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MODE_INFO *prev_mip; /* MODE_INFO array 'mip' from last decoded frame */
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MODE_INFO *prev_mi;  /* 'mi' from last frame (points into prev_mip) */
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MODE_INFO *show_frame_mi;  /* MODE_INFO for the last decoded frame
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan                                  to show */
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan    LOOPFILTERTYPE filter_type;
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    loop_filter_info_n lf_info;
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int filter_level;
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int last_sharpness_level;
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int sharpness_level;
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan
140233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int refresh_last_frame;       /* Two state 0 = NO, 1 = YES */
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int refresh_golden_frame;     /* Two state 0 = NO, 1 = YES */
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int refresh_alt_ref_frame;     /* Two state 0 = NO, 1 = YES */
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int copy_buffer_to_gf;         /* 0 none, 1 Last to GF, 2 ARF to GF */
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int copy_buffer_to_arf;        /* 0 none, 1 Last to ARF, 2 GF to ARF */
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int refresh_entropy_probs;    /* Two state 0 = NO, 1 = YES */
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan
149233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int ref_frame_sign_bias[MAX_REF_FRAMES];    /* Two state 0, 1 */
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Y,U,V,Y2 */
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ENTROPY_CONTEXT_PLANES *above_context;   /* row of context for each plane */
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan    ENTROPY_CONTEXT_PLANES left_context;  /* (up to) 4 contexts "" */
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    FRAME_CONTEXT lfc; /* last frame entropy */
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan    FRAME_CONTEXT fc;  /* this frame entropy */
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan    unsigned int current_video_frame;
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int version;
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    TOKEN_PARTITION multi_token_partition;
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef PACKET_TESTING
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan    VP8_HEADER oh;
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_POSTPROC_VISUALIZER
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan    double bitrate;
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan    double framerate;
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_MULTITHREAD
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int processor_core_count;
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_POSTPROC
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan    struct postproc_state  postproc_state;
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int cpu_caps;
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan} VP8_COMMON;
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus
182233d2500723e5594f3e7c70896ffeeef32b9c950ywan}  // extern "C"
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif  // VP8_COMMON_ONYXC_INT_H_
186