@@ -1240,18 +1240,18 @@ static int hls_transform_unit(HEVCContext *s, int x0, int y0, | |||||
int trafo_size = 1 << log2_trafo_size; | int trafo_size = 1 << log2_trafo_size; | ||||
ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size); | ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size); | ||||
s->hpc.intra_pred(s, x0, y0, log2_trafo_size, 0); | |||||
s->hpc.intra_pred[log2_trafo_size - 2](s, x0, y0, 0); | |||||
if (log2_trafo_size > 2) { | if (log2_trafo_size > 2) { | ||||
trafo_size = trafo_size << (s->sps->hshift[1] - 1); | trafo_size = trafo_size << (s->sps->hshift[1] - 1); | ||||
ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size); | ff_hevc_set_neighbour_available(s, x0, y0, trafo_size, trafo_size); | ||||
s->hpc.intra_pred(s, x0, y0, log2_trafo_size - 1, 1); | |||||
s->hpc.intra_pred(s, x0, y0, log2_trafo_size - 1, 2); | |||||
s->hpc.intra_pred[log2_trafo_size - 3](s, x0, y0, 1); | |||||
s->hpc.intra_pred[log2_trafo_size - 3](s, x0, y0, 2); | |||||
} else if (blk_idx == 3) { | } else if (blk_idx == 3) { | ||||
trafo_size = trafo_size << s->sps->hshift[1]; | trafo_size = trafo_size << s->sps->hshift[1]; | ||||
ff_hevc_set_neighbour_available(s, xBase, yBase, | ff_hevc_set_neighbour_available(s, xBase, yBase, | ||||
trafo_size, trafo_size); | trafo_size, trafo_size); | ||||
s->hpc.intra_pred(s, xBase, yBase, log2_trafo_size, 1); | |||||
s->hpc.intra_pred(s, xBase, yBase, log2_trafo_size, 2); | |||||
s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 1); | |||||
s->hpc.intra_pred[log2_trafo_size - 2](s, xBase, yBase, 2); | |||||
} | } | ||||
} | } | ||||
@@ -712,8 +712,7 @@ typedef struct HEVCNAL { | |||||
struct HEVCContext; | struct HEVCContext; | ||||
typedef struct HEVCPredContext { | typedef struct HEVCPredContext { | ||||
void (*intra_pred)(struct HEVCContext *s, int x0, int y0, | |||||
int log2_size, int c_idx); | |||||
void (*intra_pred[4])(struct HEVCContext *s, int x0, int y0, int c_idx); | |||||
void (*pred_planar[4])(uint8_t *src, const uint8_t *top, | void (*pred_planar[4])(uint8_t *src, const uint8_t *top, | ||||
const uint8_t *left, ptrdiff_t stride); | const uint8_t *left, ptrdiff_t stride); | ||||
@@ -40,7 +40,10 @@ void ff_hevc_pred_init(HEVCPredContext *hpc, int bit_depth) | |||||
#define FUNC(a, depth) a ## _ ## depth | #define FUNC(a, depth) a ## _ ## depth | ||||
#define HEVC_PRED(depth) \ | #define HEVC_PRED(depth) \ | ||||
hpc->intra_pred = FUNC(intra_pred, depth); \ | |||||
hpc->intra_pred[0] = FUNC(intra_pred_2, depth); \ | |||||
hpc->intra_pred[1] = FUNC(intra_pred_3, depth); \ | |||||
hpc->intra_pred[2] = FUNC(intra_pred_4, depth); \ | |||||
hpc->intra_pred[3] = FUNC(intra_pred_5, depth); \ | |||||
hpc->pred_planar[0] = FUNC(pred_planar_0, depth); \ | hpc->pred_planar[0] = FUNC(pred_planar_0, depth); \ | ||||
hpc->pred_planar[1] = FUNC(pred_planar_1, depth); \ | hpc->pred_planar[1] = FUNC(pred_planar_1, depth); \ | ||||
hpc->pred_planar[2] = FUNC(pred_planar_2, depth); \ | hpc->pred_planar[2] = FUNC(pred_planar_2, depth); \ | ||||
@@ -28,7 +28,8 @@ | |||||
#define POS(x, y) src[(x) + stride * (y)] | #define POS(x, y) src[(x) + stride * (y)] | ||||
static void FUNC(intra_pred)(HEVCContext *s, int x0, int y0, int log2_size, int c_idx) | |||||
static av_always_inline void FUNC(intra_pred)(HEVCContext *s, int x0, int y0, | |||||
int log2_size, int c_idx) | |||||
{ | { | ||||
#define PU(x) \ | #define PU(x) \ | ||||
((x) >> s->sps->log2_min_pu_size) | ((x) >> s->sps->log2_min_pu_size) | ||||
@@ -349,6 +350,19 @@ static void FUNC(intra_pred)(HEVCContext *s, int x0, int y0, int log2_size, int | |||||
} | } | ||||
} | } | ||||
#define INTRA_PRED(size) \ | |||||
static void FUNC(intra_pred_ ## size)(HEVCContext *s, int x0, int y0, int c_idx) \ | |||||
{ \ | |||||
FUNC(intra_pred)(s, x0, y0, size, c_idx); \ | |||||
} | |||||
INTRA_PRED(2) | |||||
INTRA_PRED(3) | |||||
INTRA_PRED(4) | |||||
INTRA_PRED(5) | |||||
#undef INTRA_PRED | |||||
static av_always_inline void FUNC(pred_planar)(uint8_t *_src, const uint8_t *_top, | static av_always_inline void FUNC(pred_planar)(uint8_t *_src, const uint8_t *_top, | ||||
const uint8_t *_left, ptrdiff_t stride, | const uint8_t *_left, ptrdiff_t stride, | ||||
int trafo_size) | int trafo_size) | ||||