Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
external
libvpx
Commits
8c1b516d
Commit
8c1b516d
authored
May 07, 2013
by
Paul Wilkins
Committed by
Gerrit Code Review
May 07, 2013
Browse files
Deprecate the newbintramode experiment.
Clean out code relating to newbintramode. Change-Id: Ie91f4f156cdf60ce0da8ca407c1c9cb00c7d0705
parent
9afb6700
Changes
14
Hide whitespace changes
Inline
Side-by-side
configure
View file @
8c1b516d
...
...
@@ -240,7 +240,6 @@ HAVE_LIST="
EXPERIMENT_LIST
=
"
csm
implicit_segmentation
newbintramodes
comp_interintra_pred
enable_6tap
modelcoefprob
...
...
vp9/common/vp9_blockd.h
View file @
8c1b516d
...
...
@@ -142,9 +142,6 @@ typedef enum {
B_D27_PRED
,
B_D63_PRED
,
B_TM_PRED
,
#if CONFIG_NEWBINTRAMODES
B_CONTEXT_PRED
,
#endif
LEFT4X4
,
ABOVE4X4
,
...
...
@@ -157,15 +154,8 @@ typedef enum {
#define VP9_BINTRAMODES (LEFT4X4)
#define VP9_SUBMVREFS (1 + NEW4X4 - LEFT4X4)
#if CONFIG_NEWBINTRAMODES
/* The number of I4X4_PRED intra modes that are replaced by B_CONTEXT_PRED */
#define CONTEXT_PRED_REPLACEMENTS 0
#define VP9_KF_BINTRAMODES (VP9_BINTRAMODES - 1)
#define VP9_NKF_BINTRAMODES (VP9_BINTRAMODES - CONTEXT_PRED_REPLACEMENTS)
#else
#define VP9_KF_BINTRAMODES (VP9_BINTRAMODES)
/* 10 */
#define VP9_NKF_BINTRAMODES (VP9_BINTRAMODES)
/* 10 */
#endif
/* For keyframes, intra block modes are predicted by the (already decoded)
modes for the Y blocks to the left and above us; for interframes, there
...
...
@@ -174,9 +164,6 @@ typedef enum {
union
b_mode_info
{
struct
{
B_PREDICTION_MODE
first
;
#if CONFIG_NEWBINTRAMODES
B_PREDICTION_MODE
context
;
#endif
}
as_mode
;
int_mv
as_mv
[
2
];
// first, second inter predictor motion vectors
};
...
...
@@ -580,12 +567,6 @@ static TX_TYPE txfm_map(B_PREDICTION_MODE bmode) {
case
B_D27_PRED
:
return
DCT_ADST
;
#if CONFIG_NEWBINTRAMODES
case
B_CONTEXT_PRED
:
assert
(
0
);
break
;
#endif
default:
return
DCT_DCT
;
}
...
...
@@ -615,10 +596,6 @@ static TX_TYPE get_tx_type_4x4(const MACROBLOCKD *xd, int ib) {
if
(
xd
->
mode_info_context
->
mbmi
.
mode
==
I4X4_PRED
&&
xd
->
q_index
<
ACTIVE_HT
)
{
tx_type
=
txfm_map
(
#if CONFIG_NEWBINTRAMODES
xd
->
mode_info_context
->
bmi
[
ib
].
as_mode
.
first
==
B_CONTEXT_PRED
?
xd
->
mode_info_context
->
bmi
[
ib
].
as_mode
.
context
:
#endif
xd
->
mode_info_context
->
bmi
[
ib
].
as_mode
.
first
);
}
else
if
(
xd
->
mode_info_context
->
mbmi
.
mode
<=
TM_PRED
&&
xd
->
q_index
<
ACTIVE_HT
)
{
...
...
vp9/common/vp9_entropymode.c
View file @
8c1b516d
...
...
@@ -63,21 +63,8 @@ static const unsigned int kf_uv_mode_cts [VP9_YMODES] [VP9_UV_MODES] = {
};
static
const
unsigned
int
bmode_cts
[
VP9_NKF_BINTRAMODES
]
=
{
#if CONFIG_NEWBINTRAMODES
#if CONTEXT_PRED_REPLACEMENTS == 6
/* DC TM V H CONTEXT */
43891
,
17694
,
10036
,
3920
,
20000
#elif CONTEXT_PRED_REPLACEMENTS == 4
/* DC TM V H D45 D135 CONTEXT */
43891
,
17694
,
10036
,
3920
,
3363
,
2546
,
14000
#elif CONTEXT_PRED_REPLACEMENTS == 0
/* DC V H D45 D135 D117 D153 D27 D63 TM CONTEXT */
43891
,
10036
,
3920
,
3363
,
2546
,
5119
,
2471
,
1723
,
3221
,
17694
,
50000
#endif
#else
/* DC V H D45 D135 D117 D153 D27 D63 TM */
43891
,
10036
,
3920
,
3363
,
2546
,
5119
,
2471
,
1723
,
3221
,
17694
#endif
};
typedef
enum
{
...
...
@@ -148,32 +135,6 @@ const vp9_tree_index vp9_kf_bmode_tree[VP9_KF_BINTRAMODES * 2 - 2] = {
};
const
vp9_tree_index
vp9_bmode_tree
[
VP9_NKF_BINTRAMODES
*
2
-
2
]
=
{
#if CONFIG_NEWBINTRAMODES
#if CONTEXT_PRED_REPLACEMENTS == 6
-
B_DC_PRED
,
2
,
-
B_TM_PRED
,
4
,
6
,
-
(
B_CONTEXT_PRED
-
CONTEXT_PRED_REPLACEMENTS
),
-
B_V_PRED
,
-
B_H_PRED
#elif CONTEXT_PRED_REPLACEMENTS == 4
-
B_DC_PRED
,
2
,
-
B_TM_PRED
,
4
,
6
,
8
,
-
B_V_PRED
,
-
B_H_PRED
,
10
,
-
(
B_CONTEXT_PRED
-
CONTEXT_PRED_REPLACEMENTS
),
-
B_D135_PRED
,
-
B_D45_PRED
,
#elif CONTEXT_PRED_REPLACEMENTS == 0
-
B_DC_PRED
,
2
,
/* 0 = DC_NODE */
-
B_TM_PRED
,
4
,
/* 1 = TM_NODE */
-
B_V_PRED
,
6
,
/* 2 = V_NODE */
8
,
12
,
/* 3 = COM_NODE */
-
B_H_PRED
,
10
,
/* 4 = H_NODE */
-
B_D135_PRED
,
-
B_D117_PRED
,
/* 5 = D135_NODE */
-
B_D45_PRED
,
14
,
/* 6 = D45_NODE */
-
B_D63_PRED
,
16
,
/* 7 = D63_NODE */
-
B_D153_PRED
,
18
,
/* 8 = D153_NODE */
-
B_D27_PRED
,
-
B_CONTEXT_PRED
/* 9 = D27_NODE */
#endif
#else
-
B_DC_PRED
,
2
,
/* 0 = DC_NODE */
-
B_TM_PRED
,
4
,
/* 1 = TM_NODE */
-
B_V_PRED
,
6
,
/* 2 = V_NODE */
...
...
@@ -183,7 +144,6 @@ const vp9_tree_index vp9_bmode_tree[VP9_NKF_BINTRAMODES * 2 - 2] = {
-
B_D45_PRED
,
14
,
/* 6 = D45_NODE */
-
B_D63_PRED
,
16
,
/* 7 = D63_NODE */
-
B_D153_PRED
,
-
B_D27_PRED
/* 8 = D153_NODE */
#endif
};
/* Again, these trees use the same probability indices as their
...
...
vp9/common/vp9_reconintra.c
View file @
8c1b516d
...
...
@@ -573,7 +573,6 @@ void vp9_build_intra_predictors_sbuv_s(MACROBLOCKD *xd,
xd
->
left_available
,
0
/*xd->right_available*/
);
}
#if !CONFIG_NEWBINTRAMODES
void
vp9_intra4x4_predict
(
MACROBLOCKD
*
xd
,
int
block_idx
,
BLOCK_SIZE_TYPE
bsize
,
...
...
@@ -592,4 +591,3 @@ void vp9_intra4x4_predict(MACROBLOCKD *xd,
mode
,
4
,
4
,
have_top
,
have_left
,
have_right
);
}
#endif
vp9/common/vp9_reconintra4x4.c
deleted
100644 → 0
View file @
9afb6700
/*
* 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.
*/
#include "./vpx_config.h"
#include "vpx_mem/vpx_mem.h"
#include "vp9/common/vp9_reconintra.h"
#include "vp9_rtcd.h"
#if CONFIG_NEWBINTRAMODES
static
int
find_grad_measure
(
uint8_t
*
x
,
int
stride
,
int
n
,
int
tx
,
int
ty
,
int
dx
,
int
dy
)
{
int
i
,
j
;
int
count
=
0
,
gsum
=
0
,
gdiv
;
/* TODO: Make this code more efficient by breaking up into two loops */
for
(
i
=
-
ty
;
i
<
n
;
++
i
)
for
(
j
=
-
tx
;
j
<
n
;
++
j
)
{
int
g
;
if
(
i
>=
0
&&
j
>=
0
)
continue
;
if
(
i
+
dy
>=
0
&&
j
+
dx
>=
0
)
continue
;
if
(
i
+
dy
<
-
ty
||
i
+
dy
>=
n
||
j
+
dx
<
-
tx
||
j
+
dx
>=
n
)
continue
;
g
=
abs
(
x
[(
i
+
dy
)
*
stride
+
j
+
dx
]
-
x
[
i
*
stride
+
j
]);
gsum
+=
g
*
g
;
count
++
;
}
gdiv
=
(
dx
*
dx
+
dy
*
dy
)
*
count
;
return
((
gsum
<<
8
)
+
(
gdiv
>>
1
))
/
gdiv
;
}
#if CONTEXT_PRED_REPLACEMENTS == 6
B_PREDICTION_MODE
vp9_find_dominant_direction
(
uint8_t
*
ptr
,
int
stride
,
int
n
,
int
tx
,
int
ty
)
{
int
g
[
8
],
i
,
imin
,
imax
;
g
[
1
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
2
,
1
);
g
[
2
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
1
,
1
);
g
[
3
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
1
,
2
);
g
[
5
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
-
1
,
2
);
g
[
6
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
-
1
,
1
);
g
[
7
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
-
2
,
1
);
imin
=
1
;
for
(
i
=
2
;
i
<
8
;
i
+=
1
+
(
i
==
3
))
imin
=
(
g
[
i
]
<
g
[
imin
]
?
i
:
imin
);
imax
=
1
;
for
(
i
=
2
;
i
<
8
;
i
+=
1
+
(
i
==
3
))
imax
=
(
g
[
i
]
>
g
[
imax
]
?
i
:
imax
);
/*
printf("%d %d %d %d %d %d = %d %d\n",
g[1], g[2], g[3], g[5], g[6], g[7], imin, imax);
*/
switch
(
imin
)
{
case
1
:
return
B_D153_PRED
;
case
2
:
return
B_D135_PRED
;
case
3
:
return
B_D117_PRED
;
case
5
:
return
B_D63_PRED
;
case
6
:
return
B_D45_PRED
;
case
7
:
return
B_D27_PRED
;
default:
assert
(
0
);
}
}
#elif CONTEXT_PRED_REPLACEMENTS == 4
B_PREDICTION_MODE
vp9_find_dominant_direction
(
uint8_t
*
ptr
,
int
stride
,
int
n
,
int
tx
,
int
ty
)
{
int
g
[
8
],
i
,
imin
,
imax
;
g
[
1
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
2
,
1
);
g
[
3
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
1
,
2
);
g
[
5
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
-
1
,
2
);
g
[
7
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
-
2
,
1
);
imin
=
1
;
for
(
i
=
3
;
i
<
8
;
i
+=
2
)
imin
=
(
g
[
i
]
<
g
[
imin
]
?
i
:
imin
);
imax
=
1
;
for
(
i
=
3
;
i
<
8
;
i
+=
2
)
imax
=
(
g
[
i
]
>
g
[
imax
]
?
i
:
imax
);
/*
printf("%d %d %d %d = %d %d\n",
g[1], g[3], g[5], g[7], imin, imax);
*/
switch
(
imin
)
{
case
1
:
return
B_D153_PRED
;
case
3
:
return
B_D117_PRED
;
case
5
:
return
B_D63_PRED
;
case
7
:
return
B_D27_PRED
;
default:
assert
(
0
);
}
}
#elif CONTEXT_PRED_REPLACEMENTS == 0
B_PREDICTION_MODE
vp9_find_dominant_direction
(
uint8_t
*
ptr
,
int
stride
,
int
n
,
int
tx
,
int
ty
)
{
int
g
[
8
],
i
,
imin
,
imax
;
g
[
0
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
1
,
0
);
g
[
1
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
2
,
1
);
g
[
2
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
1
,
1
);
g
[
3
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
1
,
2
);
g
[
4
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
0
,
1
);
g
[
5
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
-
1
,
2
);
g
[
6
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
-
1
,
1
);
g
[
7
]
=
find_grad_measure
(
ptr
,
stride
,
n
,
tx
,
ty
,
-
2
,
1
);
imax
=
0
;
for
(
i
=
1
;
i
<
8
;
i
++
)
imax
=
(
g
[
i
]
>
g
[
imax
]
?
i
:
imax
);
imin
=
0
;
for
(
i
=
1
;
i
<
8
;
i
++
)
imin
=
(
g
[
i
]
<
g
[
imin
]
?
i
:
imin
);
switch
(
imin
)
{
case
0
:
return
B_H_PRED
;
case
1
:
return
B_D153_PRED
;
case
2
:
return
B_D135_PRED
;
case
3
:
return
B_D117_PRED
;
case
4
:
return
B_V_PRED
;
case
5
:
return
B_D63_PRED
;
case
6
:
return
B_D45_PRED
;
case
7
:
return
B_D27_PRED
;
default:
assert
(
0
);
}
}
#endif
B_PREDICTION_MODE
vp9_find_bpred_context
(
MACROBLOCKD
*
xd
,
int
block_idx
,
uint8_t
*
ptr
,
int
stride
)
{
const
int
have_top
=
(
block_idx
>>
2
)
||
xd
->
up_available
;
const
int
have_left
=
(
block_idx
&
3
)
||
xd
->
left_available
;
int
tx
=
have_left
?
4
:
0
;
int
ty
=
have_top
?
4
:
0
;
if
(
!
have_left
&&
!
have_top
)
return
B_DC_PRED
;
return
vp9_find_dominant_direction
(
ptr
,
stride
,
4
,
tx
,
ty
);
}
void
vp9_intra4x4_predict
(
MACROBLOCKD
*
xd
,
int
block_idx
,
BLOCK_SIZE_TYPE
bsize
,
int
b_mode
,
uint8_t
*
predictor
,
int
ps
)
{
const
int
bwl
=
b_width_log2
(
bsize
);
const
int
wmask
=
(
1
<<
bwl
)
-
1
;
int
i
,
r
,
c
;
const
int
have_top
=
(
block_idx
>>
bwl
)
||
xd
->
up_available
;
const
int
have_left
=
(
block_idx
&
wmask
)
||
xd
->
left_available
;
const
int
have_right
=
(
block_idx
&
wmask
)
!=
wmask
||
xd
->
right_available
;
uint8_t
left
[
4
],
above
[
8
],
top_left
;
/*
* 127 127 127 .. 127 127 127 127 127 127
* 129 A B .. Y Z
* 129 C D .. W X
* 129 E F .. U V
* 129 G H .. S T T T T T
* ..
*/
if
(
have_left
)
{
uint8_t
*
left_ptr
=
predictor
-
1
;
const
int
stride
=
ps
;
left
[
0
]
=
left_ptr
[
0
*
stride
];
left
[
1
]
=
left_ptr
[
1
*
stride
];
left
[
2
]
=
left_ptr
[
2
*
stride
];
left
[
3
]
=
left_ptr
[
3
*
stride
];
}
else
{
left
[
0
]
=
left
[
1
]
=
left
[
2
]
=
left
[
3
]
=
129
;
}
if
(
have_top
)
{
uint8_t
*
above_ptr
=
predictor
-
ps
;
top_left
=
have_left
?
above_ptr
[
-
1
]
:
127
;
above
[
0
]
=
above_ptr
[
0
];
above
[
1
]
=
above_ptr
[
1
];
above
[
2
]
=
above_ptr
[
2
];
above
[
3
]
=
above_ptr
[
3
];
if
(((
block_idx
&
wmask
)
!=
wmask
)
||
(
have_right
&&
block_idx
==
wmask
&&
((
xd
->
mb_index
!=
3
&&
xd
->
sb_index
!=
3
)
||
((
xd
->
mb_index
&
1
)
==
0
&&
xd
->
sb_index
==
3
))))
{
above
[
4
]
=
above_ptr
[
4
];
above
[
5
]
=
above_ptr
[
5
];
above
[
6
]
=
above_ptr
[
6
];
above
[
7
]
=
above_ptr
[
7
];
}
else
if
(
have_right
)
{
uint8_t
*
above_right
=
above_ptr
+
4
;
if
(
xd
->
sb_index
==
3
&&
(
xd
->
mb_index
&
1
))
above_right
-=
32
*
ps
;
if
(
xd
->
mb_index
==
3
)
above_right
-=
16
*
ps
;
above_right
-=
4
*
(
block_idx
>>
bwl
)
*
ps
;
/* use a more distant above-right (from closest available top-right
* corner), but with a "localized DC" (similar'ish to TM-pred):
*
* A B C D E F G H
* I J K L
* M N O P
* Q R S T
* U V W X x1 x2 x3 x4
*
* Where:
* x1 = clip_pixel(E + X - D)
* x2 = clip_pixel(F + X - D)
* x3 = clip_pixel(G + X - D)
* x4 = clip_pixel(H + X - D)
*
* This is applied anytime when we use a "distant" above-right edge
* that is not immediately top-right to the block that we're going
* to do intra prediction for.
*/
above
[
4
]
=
clip_pixel
(
above_right
[
0
]
+
above_ptr
[
3
]
-
above_right
[
-
1
]);
above
[
5
]
=
clip_pixel
(
above_right
[
1
]
+
above_ptr
[
3
]
-
above_right
[
-
1
]);
above
[
6
]
=
clip_pixel
(
above_right
[
2
]
+
above_ptr
[
3
]
-
above_right
[
-
1
]);
above
[
7
]
=
clip_pixel
(
above_right
[
3
]
+
above_ptr
[
3
]
-
above_right
[
-
1
]);
}
else
{
// extend edge
above
[
4
]
=
above
[
5
]
=
above
[
6
]
=
above
[
7
]
=
above
[
3
];
}
}
else
{
above
[
0
]
=
above
[
1
]
=
above
[
2
]
=
above
[
3
]
=
127
;
above
[
4
]
=
above
[
5
]
=
above
[
6
]
=
above
[
7
]
=
127
;
top_left
=
127
;
}
#if CONFIG_NEWBINTRAMODES
if
(
b_mode
==
B_CONTEXT_PRED
)
b_mode
=
xd
->
mode_info_context
->
bmi
[
block_idx
].
as_mode
.
context
;
#endif
switch
(
b_mode
)
{
case
B_DC_PRED
:
{
int
expected_dc
=
128
;
if
(
have_top
||
have_left
)
{
int
average
=
0
;
int
count
=
0
;
if
(
have_top
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
average
+=
above
[
i
];
count
+=
4
;
}
if
(
have_left
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
average
+=
left
[
i
];
count
+=
4
;
}
expected_dc
=
(
average
+
(
count
>>
1
))
/
count
;
}
for
(
r
=
0
;
r
<
4
;
r
++
)
{
for
(
c
=
0
;
c
<
4
;
c
++
)
predictor
[
c
]
=
expected_dc
;
predictor
+=
ps
;
}
}
break
;
case
B_TM_PRED
:
{
/* prediction similar to true_motion prediction */
for
(
r
=
0
;
r
<
4
;
r
++
)
{
for
(
c
=
0
;
c
<
4
;
c
++
)
predictor
[
c
]
=
clip_pixel
(
above
[
c
]
-
top_left
+
left
[
r
]);
predictor
+=
ps
;
}
}
break
;
case
B_V_PRED
:
for
(
r
=
0
;
r
<
4
;
r
++
)
{
for
(
c
=
0
;
c
<
4
;
c
++
)
predictor
[
c
]
=
above
[
c
];
predictor
+=
ps
;
}
break
;
case
B_H_PRED
:
for
(
r
=
0
;
r
<
4
;
r
++
)
{
for
(
c
=
0
;
c
<
4
;
c
++
)
predictor
[
c
]
=
left
[
r
];
predictor
+=
ps
;
}
break
;
case
B_D45_PRED
:
{
uint8_t
*
p
=
above
;
predictor
[
0
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
0
]
+
p
[
1
]
*
2
+
p
[
2
],
2
);
predictor
[
0
*
ps
+
1
]
=
predictor
[
1
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
1
]
+
p
[
2
]
*
2
+
p
[
3
],
2
);
predictor
[
0
*
ps
+
2
]
=
predictor
[
1
*
ps
+
1
]
=
predictor
[
2
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
2
]
+
p
[
3
]
*
2
+
p
[
4
],
2
);
predictor
[
0
*
ps
+
3
]
=
predictor
[
1
*
ps
+
2
]
=
predictor
[
2
*
ps
+
1
]
=
predictor
[
3
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
3
]
+
p
[
4
]
*
2
+
p
[
5
],
2
);
predictor
[
1
*
ps
+
3
]
=
predictor
[
2
*
ps
+
2
]
=
predictor
[
3
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
4
]
+
p
[
5
]
*
2
+
p
[
6
],
2
);
predictor
[
2
*
ps
+
3
]
=
predictor
[
3
*
ps
+
2
]
=
ROUND_POWER_OF_TWO
(
p
[
5
]
+
p
[
6
]
*
2
+
p
[
7
],
2
);
predictor
[
3
*
ps
+
3
]
=
ROUND_POWER_OF_TWO
(
p
[
6
]
+
p
[
7
]
*
2
+
p
[
7
],
2
);
}
break
;
case
B_D135_PRED
:
{
uint8_t
p
[
9
]
=
{
left
[
3
],
left
[
2
],
left
[
1
],
left
[
0
],
top_left
,
above
[
0
],
above
[
1
],
above
[
2
],
above
[
3
]
};
predictor
[
3
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
0
]
+
p
[
1
]
*
2
+
p
[
2
],
2
);
predictor
[
3
*
ps
+
1
]
=
predictor
[
2
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
1
]
+
p
[
2
]
*
2
+
p
[
3
],
2
);
predictor
[
3
*
ps
+
2
]
=
predictor
[
2
*
ps
+
1
]
=
predictor
[
1
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
2
]
+
p
[
3
]
*
2
+
p
[
4
],
2
);
predictor
[
3
*
ps
+
3
]
=
predictor
[
2
*
ps
+
2
]
=
predictor
[
1
*
ps
+
1
]
=
predictor
[
0
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
3
]
+
p
[
4
]
*
2
+
p
[
5
],
2
);
predictor
[
2
*
ps
+
3
]
=
predictor
[
1
*
ps
+
2
]
=
predictor
[
0
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
4
]
+
p
[
5
]
*
2
+
p
[
6
],
2
);
predictor
[
1
*
ps
+
3
]
=
predictor
[
0
*
ps
+
2
]
=
ROUND_POWER_OF_TWO
(
p
[
5
]
+
p
[
6
]
*
2
+
p
[
7
],
2
);
predictor
[
0
*
ps
+
3
]
=
ROUND_POWER_OF_TWO
(
p
[
6
]
+
p
[
7
]
*
2
+
p
[
8
],
2
);
}
break
;
case
B_D117_PRED
:
{
uint8_t
p
[
9
]
=
{
left
[
3
],
left
[
2
],
left
[
1
],
left
[
0
],
top_left
,
above
[
0
],
above
[
1
],
above
[
2
],
above
[
3
]
};
predictor
[
3
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
1
]
+
p
[
2
]
*
2
+
p
[
3
],
2
);
predictor
[
2
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
2
]
+
p
[
3
]
*
2
+
p
[
4
],
2
);
predictor
[
3
*
ps
+
1
]
=
predictor
[
1
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
3
]
+
p
[
4
]
*
2
+
p
[
5
],
2
);
predictor
[
2
*
ps
+
1
]
=
predictor
[
0
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
4
]
+
p
[
5
],
1
);
predictor
[
3
*
ps
+
2
]
=
predictor
[
1
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
4
]
+
p
[
5
]
*
2
+
p
[
6
],
2
);
predictor
[
2
*
ps
+
2
]
=
predictor
[
0
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
5
]
+
p
[
6
],
1
);
predictor
[
3
*
ps
+
3
]
=
predictor
[
1
*
ps
+
2
]
=
ROUND_POWER_OF_TWO
(
p
[
5
]
+
p
[
6
]
*
2
+
p
[
7
],
2
);
predictor
[
2
*
ps
+
3
]
=
predictor
[
0
*
ps
+
2
]
=
ROUND_POWER_OF_TWO
(
p
[
6
]
+
p
[
7
],
1
);
predictor
[
1
*
ps
+
3
]
=
ROUND_POWER_OF_TWO
(
p
[
6
]
+
p
[
7
]
*
2
+
p
[
8
],
2
);
predictor
[
0
*
ps
+
3
]
=
ROUND_POWER_OF_TWO
(
p
[
7
]
+
p
[
8
],
1
);
}
break
;
case
B_D63_PRED
:
{
uint8_t
*
p
=
above
;
predictor
[
0
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
0
]
+
p
[
1
],
1
);
predictor
[
1
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
0
]
+
p
[
1
]
*
2
+
p
[
2
],
2
);
predictor
[
2
*
ps
+
0
]
=
predictor
[
0
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
1
]
+
p
[
2
],
1
);
predictor
[
1
*
ps
+
1
]
=
predictor
[
3
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
1
]
+
p
[
2
]
*
2
+
p
[
3
],
2
);
predictor
[
2
*
ps
+
1
]
=
predictor
[
0
*
ps
+
2
]
=
ROUND_POWER_OF_TWO
(
p
[
2
]
+
p
[
3
],
1
);
predictor
[
3
*
ps
+
1
]
=
predictor
[
1
*
ps
+
2
]
=
ROUND_POWER_OF_TWO
(
p
[
2
]
+
p
[
3
]
*
2
+
p
[
4
],
2
);
predictor
[
0
*
ps
+
3
]
=
predictor
[
2
*
ps
+
2
]
=
ROUND_POWER_OF_TWO
(
p
[
3
]
+
p
[
4
],
1
);
predictor
[
1
*
ps
+
3
]
=
predictor
[
3
*
ps
+
2
]
=
ROUND_POWER_OF_TWO
(
p
[
3
]
+
p
[
4
]
*
2
+
p
[
5
],
2
);
predictor
[
2
*
ps
+
3
]
=
ROUND_POWER_OF_TWO
(
p
[
4
]
+
p
[
5
]
*
2
+
p
[
6
],
2
);
predictor
[
3
*
ps
+
3
]
=
ROUND_POWER_OF_TWO
(
p
[
5
]
+
p
[
6
]
*
2
+
p
[
7
],
2
);
}
break
;
case
B_D153_PRED
:
{
uint8_t
p
[
9
]
=
{
left
[
3
],
left
[
2
],
left
[
1
],
left
[
0
],
top_left
,
above
[
0
],
above
[
1
],
above
[
2
],
above
[
3
]
};
predictor
[
3
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
0
]
+
p
[
1
],
1
);
predictor
[
3
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
0
]
+
p
[
1
]
*
2
+
p
[
2
],
2
);
predictor
[
2
*
ps
+
0
]
=
predictor
[
3
*
ps
+
2
]
=
ROUND_POWER_OF_TWO
(
p
[
1
]
+
p
[
2
],
1
);
predictor
[
2
*
ps
+
1
]
=
predictor
[
3
*
ps
+
3
]
=
ROUND_POWER_OF_TWO
(
p
[
1
]
+
p
[
2
]
*
2
+
p
[
3
],
2
);
predictor
[
2
*
ps
+
2
]
=
predictor
[
1
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
2
]
+
p
[
3
],
1
);
predictor
[
2
*
ps
+
3
]
=
predictor
[
1
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
2
]
+
p
[
3
]
*
2
+
p
[
4
],
2
);
predictor
[
1
*
ps
+
2
]
=
predictor
[
0
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
3
]
+
p
[
4
],
1
);
predictor
[
1
*
ps
+
3
]
=
predictor
[
0
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
3
]
+
p
[
4
]
*
2
+
p
[
5
],
2
);
predictor
[
0
*
ps
+
2
]
=
ROUND_POWER_OF_TWO
(
p
[
4
]
+
p
[
5
]
*
2
+
p
[
6
],
2
);
predictor
[
0
*
ps
+
3
]
=
ROUND_POWER_OF_TWO
(
p
[
5
]
+
p
[
6
]
*
2
+
p
[
7
],
2
);
}
break
;
case
B_D27_PRED
:
{
uint8_t
*
p
=
left
;
predictor
[
0
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
0
]
+
p
[
1
],
1
);
predictor
[
0
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
0
]
+
p
[
1
]
*
2
+
p
[
2
],
2
);
predictor
[
0
*
ps
+
2
]
=
predictor
[
1
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
1
]
+
p
[
2
],
1
);
predictor
[
0
*
ps
+
3
]
=
predictor
[
1
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
1
]
+
p
[
2
]
*
2
+
p
[
3
],
2
);
predictor
[
1
*
ps
+
2
]
=
predictor
[
2
*
ps
+
0
]
=
ROUND_POWER_OF_TWO
(
p
[
2
]
+
p
[
3
],
1
);
predictor
[
1
*
ps
+
3
]
=
predictor
[
2
*
ps
+
1
]
=
ROUND_POWER_OF_TWO
(
p
[
2
]
+
p
[
3
]
*
2
+
p
[
3
],
2
);
predictor
[
2
*
ps
+
2
]
=
predictor
[
2
*
ps
+
3
]
=
predictor
[
3
*
ps
+
0
]
=
predictor
[
3
*
ps
+
1
]
=