1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP8_ENCODER_RDOPT_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP8_ENCODER_RDOPT_H_
13*fb1b10abSAndroid Build Coastguard Worker
14*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
15*fb1b10abSAndroid Build Coastguard Worker
16*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
17*fb1b10abSAndroid Build Coastguard Worker extern "C" {
18*fb1b10abSAndroid Build Coastguard Worker #endif
19*fb1b10abSAndroid Build Coastguard Worker
20*fb1b10abSAndroid Build Coastguard Worker #define RDCOST(RM, DM, R, D) (((128 + (R) * (RM)) >> 8) + (DM) * (D))
21*fb1b10abSAndroid Build Coastguard Worker
22*fb1b10abSAndroid Build Coastguard Worker void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex);
23*fb1b10abSAndroid Build Coastguard Worker void vp8_auto_select_speed(VP8_COMP *cpi);
24*fb1b10abSAndroid Build Coastguard Worker
insertsortmv(int arr[],int len)25*fb1b10abSAndroid Build Coastguard Worker static INLINE void insertsortmv(int arr[], int len) {
26*fb1b10abSAndroid Build Coastguard Worker int i, j, k;
27*fb1b10abSAndroid Build Coastguard Worker
28*fb1b10abSAndroid Build Coastguard Worker for (i = 1; i <= len - 1; ++i) {
29*fb1b10abSAndroid Build Coastguard Worker for (j = 0; j < i; ++j) {
30*fb1b10abSAndroid Build Coastguard Worker if (arr[j] > arr[i]) {
31*fb1b10abSAndroid Build Coastguard Worker int temp;
32*fb1b10abSAndroid Build Coastguard Worker
33*fb1b10abSAndroid Build Coastguard Worker temp = arr[i];
34*fb1b10abSAndroid Build Coastguard Worker
35*fb1b10abSAndroid Build Coastguard Worker for (k = i; k > j; k--) arr[k] = arr[k - 1];
36*fb1b10abSAndroid Build Coastguard Worker
37*fb1b10abSAndroid Build Coastguard Worker arr[j] = temp;
38*fb1b10abSAndroid Build Coastguard Worker }
39*fb1b10abSAndroid Build Coastguard Worker }
40*fb1b10abSAndroid Build Coastguard Worker }
41*fb1b10abSAndroid Build Coastguard Worker }
42*fb1b10abSAndroid Build Coastguard Worker
insertsortsad(int arr[],int idx[],int len)43*fb1b10abSAndroid Build Coastguard Worker static INLINE void insertsortsad(int arr[], int idx[], int len) {
44*fb1b10abSAndroid Build Coastguard Worker int i, j, k;
45*fb1b10abSAndroid Build Coastguard Worker
46*fb1b10abSAndroid Build Coastguard Worker for (i = 1; i <= len - 1; ++i) {
47*fb1b10abSAndroid Build Coastguard Worker for (j = 0; j < i; ++j) {
48*fb1b10abSAndroid Build Coastguard Worker if (arr[j] > arr[i]) {
49*fb1b10abSAndroid Build Coastguard Worker int temp, tempi;
50*fb1b10abSAndroid Build Coastguard Worker
51*fb1b10abSAndroid Build Coastguard Worker temp = arr[i];
52*fb1b10abSAndroid Build Coastguard Worker tempi = idx[i];
53*fb1b10abSAndroid Build Coastguard Worker
54*fb1b10abSAndroid Build Coastguard Worker for (k = i; k > j; k--) {
55*fb1b10abSAndroid Build Coastguard Worker arr[k] = arr[k - 1];
56*fb1b10abSAndroid Build Coastguard Worker idx[k] = idx[k - 1];
57*fb1b10abSAndroid Build Coastguard Worker }
58*fb1b10abSAndroid Build Coastguard Worker
59*fb1b10abSAndroid Build Coastguard Worker arr[j] = temp;
60*fb1b10abSAndroid Build Coastguard Worker idx[j] = tempi;
61*fb1b10abSAndroid Build Coastguard Worker }
62*fb1b10abSAndroid Build Coastguard Worker }
63*fb1b10abSAndroid Build Coastguard Worker }
64*fb1b10abSAndroid Build Coastguard Worker }
65*fb1b10abSAndroid Build Coastguard Worker
66*fb1b10abSAndroid Build Coastguard Worker void vp8_initialize_rd_consts(VP8_COMP *cpi, MACROBLOCK *x, int Qvalue);
67*fb1b10abSAndroid Build Coastguard Worker void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset,
68*fb1b10abSAndroid Build Coastguard Worker int recon_uvoffset, int *returnrate,
69*fb1b10abSAndroid Build Coastguard Worker int *returndistortion, int *returnintra, int mb_row,
70*fb1b10abSAndroid Build Coastguard Worker int mb_col);
71*fb1b10abSAndroid Build Coastguard Worker void vp8_rd_pick_intra_mode(MACROBLOCK *x, int *rate);
72*fb1b10abSAndroid Build Coastguard Worker
get_plane_pointers(const YV12_BUFFER_CONFIG * fb,unsigned char * plane[3],unsigned int recon_yoffset,unsigned int recon_uvoffset)73*fb1b10abSAndroid Build Coastguard Worker static INLINE void get_plane_pointers(const YV12_BUFFER_CONFIG *fb,
74*fb1b10abSAndroid Build Coastguard Worker unsigned char *plane[3],
75*fb1b10abSAndroid Build Coastguard Worker unsigned int recon_yoffset,
76*fb1b10abSAndroid Build Coastguard Worker unsigned int recon_uvoffset) {
77*fb1b10abSAndroid Build Coastguard Worker plane[0] = fb->y_buffer + recon_yoffset;
78*fb1b10abSAndroid Build Coastguard Worker plane[1] = fb->u_buffer + recon_uvoffset;
79*fb1b10abSAndroid Build Coastguard Worker plane[2] = fb->v_buffer + recon_uvoffset;
80*fb1b10abSAndroid Build Coastguard Worker }
81*fb1b10abSAndroid Build Coastguard Worker
get_predictor_pointers(const VP8_COMP * cpi,unsigned char * plane[4][3],unsigned int recon_yoffset,unsigned int recon_uvoffset)82*fb1b10abSAndroid Build Coastguard Worker static INLINE void get_predictor_pointers(const VP8_COMP *cpi,
83*fb1b10abSAndroid Build Coastguard Worker unsigned char *plane[4][3],
84*fb1b10abSAndroid Build Coastguard Worker unsigned int recon_yoffset,
85*fb1b10abSAndroid Build Coastguard Worker unsigned int recon_uvoffset) {
86*fb1b10abSAndroid Build Coastguard Worker if (cpi->ref_frame_flags & VP8_LAST_FRAME) {
87*fb1b10abSAndroid Build Coastguard Worker get_plane_pointers(&cpi->common.yv12_fb[cpi->common.lst_fb_idx],
88*fb1b10abSAndroid Build Coastguard Worker plane[LAST_FRAME], recon_yoffset, recon_uvoffset);
89*fb1b10abSAndroid Build Coastguard Worker }
90*fb1b10abSAndroid Build Coastguard Worker
91*fb1b10abSAndroid Build Coastguard Worker if (cpi->ref_frame_flags & VP8_GOLD_FRAME) {
92*fb1b10abSAndroid Build Coastguard Worker get_plane_pointers(&cpi->common.yv12_fb[cpi->common.gld_fb_idx],
93*fb1b10abSAndroid Build Coastguard Worker plane[GOLDEN_FRAME], recon_yoffset, recon_uvoffset);
94*fb1b10abSAndroid Build Coastguard Worker }
95*fb1b10abSAndroid Build Coastguard Worker
96*fb1b10abSAndroid Build Coastguard Worker if (cpi->ref_frame_flags & VP8_ALTR_FRAME) {
97*fb1b10abSAndroid Build Coastguard Worker get_plane_pointers(&cpi->common.yv12_fb[cpi->common.alt_fb_idx],
98*fb1b10abSAndroid Build Coastguard Worker plane[ALTREF_FRAME], recon_yoffset, recon_uvoffset);
99*fb1b10abSAndroid Build Coastguard Worker }
100*fb1b10abSAndroid Build Coastguard Worker }
101*fb1b10abSAndroid Build Coastguard Worker
get_reference_search_order(const VP8_COMP * cpi,int ref_frame_map[4])102*fb1b10abSAndroid Build Coastguard Worker static INLINE void get_reference_search_order(const VP8_COMP *cpi,
103*fb1b10abSAndroid Build Coastguard Worker int ref_frame_map[4]) {
104*fb1b10abSAndroid Build Coastguard Worker int i = 0;
105*fb1b10abSAndroid Build Coastguard Worker
106*fb1b10abSAndroid Build Coastguard Worker ref_frame_map[i++] = INTRA_FRAME;
107*fb1b10abSAndroid Build Coastguard Worker if (cpi->ref_frame_flags & VP8_LAST_FRAME) ref_frame_map[i++] = LAST_FRAME;
108*fb1b10abSAndroid Build Coastguard Worker if (cpi->ref_frame_flags & VP8_GOLD_FRAME) ref_frame_map[i++] = GOLDEN_FRAME;
109*fb1b10abSAndroid Build Coastguard Worker if (cpi->ref_frame_flags & VP8_ALTR_FRAME) ref_frame_map[i++] = ALTREF_FRAME;
110*fb1b10abSAndroid Build Coastguard Worker for (; i < 4; ++i) ref_frame_map[i] = -1;
111*fb1b10abSAndroid Build Coastguard Worker }
112*fb1b10abSAndroid Build Coastguard Worker
113*fb1b10abSAndroid Build Coastguard Worker void vp8_mv_pred(VP8_COMP *cpi, MACROBLOCKD *xd, const MODE_INFO *here,
114*fb1b10abSAndroid Build Coastguard Worker int_mv *mvp, int refframe, int *ref_frame_sign_bias, int *sr,
115*fb1b10abSAndroid Build Coastguard Worker int near_sadidx[]);
116*fb1b10abSAndroid Build Coastguard Worker void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x,
117*fb1b10abSAndroid Build Coastguard Worker int recon_yoffset, int near_sadidx[]);
118*fb1b10abSAndroid Build Coastguard Worker int VP8_UVSSE(MACROBLOCK *x);
119*fb1b10abSAndroid Build Coastguard Worker int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]);
120*fb1b10abSAndroid Build Coastguard Worker void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv);
121*fb1b10abSAndroid Build Coastguard Worker
122*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
123*fb1b10abSAndroid Build Coastguard Worker } // extern "C"
124*fb1b10abSAndroid Build Coastguard Worker #endif
125*fb1b10abSAndroid Build Coastguard Worker
126*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VP8_ENCODER_RDOPT_H_
127