Moved vp8_encode_bool into boolhuff.h
allowing the compiler to inline this function. For real-time encodes, this gave a boost of 1% to 2.5%, depending on the speed setting. Change-Id: I3929d176cca086b4261267b848419d5bcff21c02
This commit is contained in:
parent
b5ea2fbc2c
commit
a25f6a9c88
@ -26,8 +26,32 @@ typedef vp8_prob Prob;
|
|||||||
|
|
||||||
#include "coefupdateprobs.h"
|
#include "coefupdateprobs.h"
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, cuchar, vp8_coef_bands[16]) = { 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7};
|
DECLARE_ALIGNED(16, const unsigned char, vp8_norm[256]) =
|
||||||
DECLARE_ALIGNED(16, cuchar, vp8_prev_token_class[MAX_ENTROPY_TOKENS]) = { 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0};
|
{
|
||||||
|
0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||||
|
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||||
|
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||||
|
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
DECLARE_ALIGNED(16, cuchar, vp8_coef_bands[16]) =
|
||||||
|
{ 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7};
|
||||||
|
|
||||||
|
DECLARE_ALIGNED(16, cuchar, vp8_prev_token_class[MAX_ENTROPY_TOKENS]) =
|
||||||
|
{ 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0};
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, const int, vp8_default_zig_zag1d[16]) =
|
DECLARE_ALIGNED(16, const int, vp8_default_zig_zag1d[16]) =
|
||||||
{
|
{
|
||||||
0, 1, 4, 8,
|
0, 1, 4, 8,
|
||||||
|
@ -13,19 +13,6 @@
|
|||||||
#include "vpx_ports/mem.h"
|
#include "vpx_ports/mem.h"
|
||||||
#include "vpx_mem/vpx_mem.h"
|
#include "vpx_mem/vpx_mem.h"
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, const unsigned char, vp8dx_bitreader_norm[256]) =
|
|
||||||
{
|
|
||||||
0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
int vp8dx_start_decode(BOOL_DECODER *br,
|
int vp8dx_start_decode(BOOL_DECODER *br,
|
||||||
const unsigned char *source,
|
const unsigned char *source,
|
||||||
unsigned int source_sz)
|
unsigned int source_sz)
|
||||||
|
@ -34,7 +34,7 @@ typedef struct
|
|||||||
unsigned int range;
|
unsigned int range;
|
||||||
} BOOL_DECODER;
|
} BOOL_DECODER;
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]);
|
DECLARE_ALIGNED(16, extern const unsigned char, vp8_norm[256]);
|
||||||
|
|
||||||
int vp8dx_start_decode(BOOL_DECODER *br,
|
int vp8dx_start_decode(BOOL_DECODER *br,
|
||||||
const unsigned char *source,
|
const unsigned char *source,
|
||||||
@ -101,7 +101,7 @@ static int vp8dx_decode_bool(BOOL_DECODER *br, int probability) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
register unsigned int shift = vp8dx_bitreader_norm[range];
|
register unsigned int shift = vp8_norm[range];
|
||||||
range <<= shift;
|
range <<= shift;
|
||||||
value <<= shift;
|
value <<= shift;
|
||||||
count -= shift;
|
count -= shift;
|
||||||
|
@ -80,7 +80,7 @@ void vp8_reset_mb_tokens_context(MACROBLOCKD *x)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]);
|
DECLARE_ALIGNED(16, extern const unsigned char, vp8_norm[256]);
|
||||||
#define FILL \
|
#define FILL \
|
||||||
if(count < 0) \
|
if(count < 0) \
|
||||||
VP8DX_BOOL_DECODER_FILL(count, value, bufptr, bufend);
|
VP8DX_BOOL_DECODER_FILL(count, value, bufptr, bufend);
|
||||||
@ -88,7 +88,7 @@ DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]);
|
|||||||
#define NORMALIZE \
|
#define NORMALIZE \
|
||||||
/*if(range < 0x80)*/ \
|
/*if(range < 0x80)*/ \
|
||||||
{ \
|
{ \
|
||||||
shift = vp8dx_bitreader_norm[range]; \
|
shift = vp8_norm[range]; \
|
||||||
range <<= shift; \
|
range <<= shift; \
|
||||||
value <<= shift; \
|
value <<= shift; \
|
||||||
count -= shift; \
|
count -= shift; \
|
||||||
|
@ -158,18 +158,6 @@ static void write_split(vp8_writer *bc, int x)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const unsigned int norm[256] =
|
|
||||||
{
|
|
||||||
0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
static void pack_tokens_c(vp8_writer *w, const TOKENEXTRA *p, int xcount)
|
static void pack_tokens_c(vp8_writer *w, const TOKENEXTRA *p, int xcount)
|
||||||
{
|
{
|
||||||
const TOKENEXTRA *const stop = p + xcount;
|
const TOKENEXTRA *const stop = p + xcount;
|
||||||
@ -211,7 +199,7 @@ static void pack_tokens_c(vp8_writer *w, const TOKENEXTRA *p, int xcount)
|
|||||||
range = split;
|
range = split;
|
||||||
}
|
}
|
||||||
|
|
||||||
shift = norm[range];
|
shift = vp8_norm[range];
|
||||||
range <<= shift;
|
range <<= shift;
|
||||||
count += shift;
|
count += shift;
|
||||||
|
|
||||||
@ -271,7 +259,7 @@ static void pack_tokens_c(vp8_writer *w, const TOKENEXTRA *p, int xcount)
|
|||||||
range = split;
|
range = split;
|
||||||
}
|
}
|
||||||
|
|
||||||
shift = norm[range];
|
shift = vp8_norm[range];
|
||||||
range <<= shift;
|
range <<= shift;
|
||||||
count += shift;
|
count += shift;
|
||||||
|
|
||||||
@ -427,7 +415,7 @@ static void pack_tokens_into_partitions_c(VP8_COMP *cpi, unsigned char *cx_data,
|
|||||||
range = split;
|
range = split;
|
||||||
}
|
}
|
||||||
|
|
||||||
shift = norm[range];
|
shift = vp8_norm[range];
|
||||||
range <<= shift;
|
range <<= shift;
|
||||||
count += shift;
|
count += shift;
|
||||||
|
|
||||||
@ -487,7 +475,7 @@ static void pack_tokens_into_partitions_c(VP8_COMP *cpi, unsigned char *cx_data,
|
|||||||
range = split;
|
range = split;
|
||||||
}
|
}
|
||||||
|
|
||||||
shift = norm[range];
|
shift = vp8_norm[range];
|
||||||
range <<= shift;
|
range <<= shift;
|
||||||
count += shift;
|
count += shift;
|
||||||
|
|
||||||
@ -634,7 +622,7 @@ static void pack_mb_row_tokens_c(VP8_COMP *cpi, vp8_writer *w)
|
|||||||
range = split;
|
range = split;
|
||||||
}
|
}
|
||||||
|
|
||||||
shift = norm[range];
|
shift = vp8_norm[range];
|
||||||
range <<= shift;
|
range <<= shift;
|
||||||
count += shift;
|
count += shift;
|
||||||
|
|
||||||
@ -694,7 +682,7 @@ static void pack_mb_row_tokens_c(VP8_COMP *cpi, vp8_writer *w)
|
|||||||
range = split;
|
range = split;
|
||||||
}
|
}
|
||||||
|
|
||||||
shift = norm[range];
|
shift = vp8_norm[range];
|
||||||
range <<= shift;
|
range <<= shift;
|
||||||
count += shift;
|
count += shift;
|
||||||
|
|
||||||
|
@ -10,9 +10,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "boolhuff.h"
|
#include "boolhuff.h"
|
||||||
#include "vp8/common/blockd.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(SECTIONBITS_OUTPUT)
|
#if defined(SECTIONBITS_OUTPUT)
|
||||||
unsigned __int64 Sectionbits[500];
|
unsigned __int64 Sectionbits[500];
|
||||||
@ -62,81 +59,6 @@ void vp8_stop_encode(BOOL_CODER *br)
|
|||||||
vp8_encode_bool(br, 0, 128);
|
vp8_encode_bool(br, 0, 128);
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, static const unsigned int, norm[256]) =
|
|
||||||
{
|
|
||||||
0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
|
||||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
void vp8_encode_bool(BOOL_CODER *br, int bit, int probability)
|
|
||||||
{
|
|
||||||
unsigned int split;
|
|
||||||
int count = br->count;
|
|
||||||
unsigned int range = br->range;
|
|
||||||
unsigned int lowvalue = br->lowvalue;
|
|
||||||
register unsigned int shift;
|
|
||||||
|
|
||||||
#ifdef ENTROPY_STATS
|
|
||||||
#if defined(SECTIONBITS_OUTPUT)
|
|
||||||
|
|
||||||
if (bit)
|
|
||||||
Sectionbits[active_section] += vp8_prob_cost[255-probability];
|
|
||||||
else
|
|
||||||
Sectionbits[active_section] += vp8_prob_cost[probability];
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
split = 1 + (((range - 1) * probability) >> 8);
|
|
||||||
|
|
||||||
range = split;
|
|
||||||
|
|
||||||
if (bit)
|
|
||||||
{
|
|
||||||
lowvalue += split;
|
|
||||||
range = br->range - split;
|
|
||||||
}
|
|
||||||
|
|
||||||
shift = norm[range];
|
|
||||||
|
|
||||||
range <<= shift;
|
|
||||||
count += shift;
|
|
||||||
|
|
||||||
if (count >= 0)
|
|
||||||
{
|
|
||||||
int offset = shift - count;
|
|
||||||
|
|
||||||
if ((lowvalue << (offset - 1)) & 0x80000000)
|
|
||||||
{
|
|
||||||
int x = br->pos - 1;
|
|
||||||
|
|
||||||
while (x >= 0 && br->buffer[x] == 0xff)
|
|
||||||
{
|
|
||||||
br->buffer[x] = (unsigned char)0;
|
|
||||||
x--;
|
|
||||||
}
|
|
||||||
|
|
||||||
br->buffer[x] += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
br->buffer[br->pos++] = (lowvalue >> (24 - offset));
|
|
||||||
lowvalue <<= offset;
|
|
||||||
shift = count;
|
|
||||||
lowvalue &= 0xffffff;
|
|
||||||
count -= 8 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
lowvalue <<= shift;
|
|
||||||
br->count = count;
|
|
||||||
br->lowvalue = lowvalue;
|
|
||||||
br->range = range;
|
|
||||||
}
|
|
||||||
|
|
||||||
void vp8_encode_value(BOOL_CODER *br, int data, int bits)
|
void vp8_encode_value(BOOL_CODER *br, int data, int bits)
|
||||||
{
|
{
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#ifndef __INC_BOOLHUFF_H
|
#ifndef __INC_BOOLHUFF_H
|
||||||
#define __INC_BOOLHUFF_H
|
#define __INC_BOOLHUFF_H
|
||||||
|
|
||||||
|
#include "vpx_ports/mem.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@ -35,9 +36,77 @@ typedef struct
|
|||||||
} BOOL_CODER;
|
} BOOL_CODER;
|
||||||
|
|
||||||
extern void vp8_start_encode(BOOL_CODER *bc, unsigned char *buffer);
|
extern void vp8_start_encode(BOOL_CODER *bc, unsigned char *buffer);
|
||||||
extern void vp8_encode_bool(BOOL_CODER *bc, int x, int context);
|
|
||||||
extern void vp8_encode_value(BOOL_CODER *br, int data, int bits);
|
extern void vp8_encode_value(BOOL_CODER *br, int data, int bits);
|
||||||
extern void vp8_stop_encode(BOOL_CODER *bc);
|
extern void vp8_stop_encode(BOOL_CODER *bc);
|
||||||
extern const unsigned int vp8_prob_cost[256];
|
extern const unsigned int vp8_prob_cost[256];
|
||||||
|
|
||||||
|
|
||||||
|
DECLARE_ALIGNED(16, extern const unsigned char, vp8_norm[256]);
|
||||||
|
|
||||||
|
|
||||||
|
static void vp8_encode_bool(BOOL_CODER *br, int bit, int probability)
|
||||||
|
{
|
||||||
|
unsigned int split;
|
||||||
|
int count = br->count;
|
||||||
|
unsigned int range = br->range;
|
||||||
|
unsigned int lowvalue = br->lowvalue;
|
||||||
|
register unsigned int shift;
|
||||||
|
|
||||||
|
#ifdef ENTROPY_STATS
|
||||||
|
#if defined(SECTIONBITS_OUTPUT)
|
||||||
|
|
||||||
|
if (bit)
|
||||||
|
Sectionbits[active_section] += vp8_prob_cost[255-probability];
|
||||||
|
else
|
||||||
|
Sectionbits[active_section] += vp8_prob_cost[probability];
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
split = 1 + (((range - 1) * probability) >> 8);
|
||||||
|
|
||||||
|
range = split;
|
||||||
|
|
||||||
|
if (bit)
|
||||||
|
{
|
||||||
|
lowvalue += split;
|
||||||
|
range = br->range - split;
|
||||||
|
}
|
||||||
|
|
||||||
|
shift = vp8_norm[range];
|
||||||
|
|
||||||
|
range <<= shift;
|
||||||
|
count += shift;
|
||||||
|
|
||||||
|
if (count >= 0)
|
||||||
|
{
|
||||||
|
int offset = shift - count;
|
||||||
|
|
||||||
|
if ((lowvalue << (offset - 1)) & 0x80000000)
|
||||||
|
{
|
||||||
|
int x = br->pos - 1;
|
||||||
|
|
||||||
|
while (x >= 0 && br->buffer[x] == 0xff)
|
||||||
|
{
|
||||||
|
br->buffer[x] = (unsigned char)0;
|
||||||
|
x--;
|
||||||
|
}
|
||||||
|
|
||||||
|
br->buffer[x] += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
br->buffer[br->pos++] = (lowvalue >> (24 - offset));
|
||||||
|
lowvalue <<= offset;
|
||||||
|
shift = count;
|
||||||
|
lowvalue &= 0xffffff;
|
||||||
|
count -= 8 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
lowvalue <<= shift;
|
||||||
|
br->count = count;
|
||||||
|
br->lowvalue = lowvalue;
|
||||||
|
br->range = range;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user