libvmx
VMX Codec
Loading...
Searching...
No Matches
vmxcodec_common.h File Reference
#include "vmxcodec.h"
#include <math.h>

Go to the source code of this file.

Data Structures

struct  ShortRGB
struct  GolombZeroCodeLookup
struct  GolombLookup

Macros

#define VMX_ALIGNMENT   (64)
#define VMX_BITSSIZE   (64)
#define VMX_ALIGN(val, alignment)
#define BITS_INV_ACC   5
#define SHIFT_INV_ROW   16 - BITS_INV_ACC
#define SHIFT_INV_COL   1 + BITS_INV_ACC
#define BITS_INV_ACC10   4
#define SHIFT_INV_ROW10   16 - BITS_INV_ACC10
#define SHIFT_INV_COL10   1 + BITS_INV_ACC10
#define BITS_FRW_ACC   3
#define SHIFT_FRW_COL   BITS_FRW_ACC
#define SHIFT_FRW_ROW   (BITS_FRW_ACC + 17) - 4
#define RND_FRW_ROW   (1 << (SHIFT_FRW_ROW-1))
#define BITS_FRW_ACC10   1
#define SHIFT_FRW_COL10   BITS_FRW_ACC10
#define SHIFT_FRW_ROW10   (BITS_FRW_ACC10 + 17) - 2
#define RND_FRW_ROW10   (1 << (SHIFT_FRW_ROW10-1))
#define GetIntFrom2MagSign(i)
#define FLUSHREADBITS(data)
#define GETBIT(data, val)
#define GETBITB(data, val)
#define RELOADBITS(data)
#define GETZEROS(data, nz)
#define GETBITSB(data, numBits, n)
#define GETBITS(data, numBits, n)
#define GETZEROSB(data, nz)
#define REWINDOVERREAD(data)
#define FLUSHREMAININGREADBITS(data)
#define FlushRemainingBits(data)
#define Get2MagSign(input)
#define EncodeDC(data, val)
#define EmitBits32(data)
#define EmitBitsMax(data)
#define EncodeZeros(data)
#define EncodeZerosSmall(data)
#define EncodeValue(data, input)

Functions

 __declspec (align(16)) static const BYTE GolombLengthLut[]
void VMX_CreateAlignedStrideBuffer (BYTE *src, int srcStride, VMX_SIZE srcSize, BYTE **aligned, int *alignedStride, int alignment, int bytesPerPixel)
void VMX_CopyFromAlignedStrideBufferAndFree (BYTE *aligned, int alignedStride, BYTE *dstBuffer, int dstStride, VMX_SIZE dstSize, int bytesPerPixel)
void VMX_FreeAlignedStrideBuffer (BYTE *aligned, int alignedStride, int srcStride)
void VMX_CopyToAlignedStrideBuffer (BYTE *aligned, int alignedStride, BYTE *srcBuffer, int srcStride, VMX_SIZE srcSize, int bytesPerPixel)

Variables

const int VMX_MIN_WIDTH = 16
const int VMX_MIN_HEIGHT = 16
const int VMX_MAX_WIDTH = 7680
const int VMX_MAX_HEIGHT = 4320
const BYTE VMX_ZIGZAG [64]
const short IRND_INV_ROW = 1024 * (6 - BITS_INV_ACC)
const short IRND_INV_COL = 16 * (BITS_INV_ACC - 3)
const short IRND_INV_CORR = IRND_INV_COL - 1
const short IRND_INV_ROW10 = 1024 * (6 - BITS_INV_ACC10)
const short IRND_INV_COL10 = 16 * (BITS_INV_ACC10 - 3)
const short IRND_INV_CORR10 = IRND_INV_COL10 - 1
const unsigned short FDCT_ROUND1 = 1
const unsigned short FDCT_TAN1 = 13036
const unsigned short FDCT_TAN2 = 27146
const unsigned short FDCT_TAN3 = 43790
const unsigned short FDCT_SQRT2 = 23170

Macro Definition Documentation

◆ BITS_FRW_ACC

#define BITS_FRW_ACC   3

◆ BITS_FRW_ACC10

#define BITS_FRW_ACC10   1

◆ BITS_INV_ACC

#define BITS_INV_ACC   5

◆ BITS_INV_ACC10

#define BITS_INV_ACC10   4

◆ EmitBits32

#define EmitBits32 ( data)
Value:
{ \
if (data.BitsLeft < 33) { \
\
buffer_t* s = (buffer_t*)data.StreamPos; \
* s = VMX_BUFFERSWAP(data.Temp); \
data.Temp <<= 32; \
data.StreamPos += 4; \
data.BitsLeft += 32; \
} \
}
unsigned long long buffer_t
Definition vmxcodec.h:47

◆ EmitBitsMax

#define EmitBitsMax ( data)
Value:
{ \
buffer_t* s = (buffer_t*)data.StreamPos; \
* s = VMX_BUFFERSWAP(data.Temp); \
int bytes = (64 - data.BitsLeft) >> 3; \
data.Temp <<= (bytes * 8); \
data.StreamPos += bytes; \
data.BitsLeft += (bytes * 8); \
}

◆ EncodeDC

#define EncodeDC ( data,
val )
Value:
{ \
if (val) \
{ \
input = Get2MagSign(val) + 1; \
data.BitsLeft -= GolombLengthLut[input]; \
buffer_t t = input; \
t <<= data.BitsLeft; \
data.Temp |= t; \
} \
else \
{ data.BitsLeft -= 2; \
buffer_t t = 3; \
t <<= data.BitsLeft; \
data.Temp |= t; \
} \
}
#define Get2MagSign(input)
Definition vmxcodec_common.h:563

◆ EncodeValue

#define EncodeValue ( data,
input )
Value:
{ \
data.BitsLeft -= GolombLengthLut[input]; \
buffer_t t = input; \
t <<= data.BitsLeft; \
data.Temp |= t; \
}

◆ EncodeZeros

#define EncodeZeros ( data)
Value:
{ \
if (numZeros) { \
bc = 32 - __lzcnt(numZeros); \
data.Temp |= BitsLeftLookup[data.BitsLeft]; \
data.BitsLeft -= bc + bc; \
buffer_t t = numZeros; \
t <<= data.BitsLeft; \
data.Temp |= t; \
numZeros = 0; \
pos += nz; \
} \
}

◆ EncodeZerosSmall

#define EncodeZerosSmall ( data)
Value:
{ \
zeroLut = GolombZeroCodeLut[nz]; \
pos += nz; \
data.BitsLeft -= zeroLut.length; \
data.Temp |= (zeroLut.value << data.BitsLeft); \
}

◆ FLUSHREADBITS

#define FLUSHREADBITS ( data)
Value:
{ \
if (data.BitsLeft == 0U) \
{ \
data.BitsLeft = VMX_BITSSIZE; \
data.StreamPos += 8; \
buffer_t * s = (buffer_t *)data.StreamPos; \
data.TempRead = VMX_BUFFERSWAP(*s); \
} \
}
#define VMX_BITSSIZE
Definition vmxcodec_common.h:30

◆ FlushRemainingBits

#define FlushRemainingBits ( data)
Value:
{ \
if (data.BitsLeft < VMX_BITSSIZE) \
{ \
int bitsToWrite = VMX_BITSSIZE - data.BitsLeft; \
while (bitsToWrite > 0) \
{ \
data.StreamPos[0] = data.Temp >> (VMX_BITSSIZE - 8); \
data.StreamPos += 1; \
data.Temp <<= 8; \
bitsToWrite -= 8; \
} \
data.BitsLeft = VMX_BITSSIZE; \
data.Temp = 0; \
} \
}

◆ FLUSHREMAININGREADBITS

#define FLUSHREMAININGREADBITS ( data)
Value:
{ \
if (data.BitsLeft < VMX_BITSSIZE) \
{ \
unsigned int n; \
buffer_t r = data.BitsLeft & 7U; \
GETBITS(data, r, n); \
} \
FLUSHREADBITS(data); \
}

◆ Get2MagSign

#define Get2MagSign ( input)
Value:
((input + input) ^ (input >> 15))

◆ GETBIT

#define GETBIT ( data,
val )
Value:
{ \
data.BitsLeft -= 1; \
val = ((data.TempRead >> data.BitsLeft) & 1); \
FLUSHREADBITS(data); \
}

◆ GETBITB

#define GETBITB ( data,
val )
Value:
{ \
data.BitsLeft -= 1; \
val = ((data.TempRead >> data.BitsLeft) & 1); \
}

◆ GETBITS

#define GETBITS ( data,
numBits,
n )
Value:
{ \
n = 0; \
while (numBits > 0U) \
{ \
b = numBits; \
if (b > data.BitsLeft) \
{ \
b = data.BitsLeft; \
} \
if (n) \
{ \
n <<= b; \
} \
data.BitsLeft -= b; \
n |= (data.TempRead >> data.BitsLeft) & ((1 << b) - 1); \
numBits -= b; \
FLUSHREADBITS(data); \
} \
}

◆ GETBITSB

#define GETBITSB ( data,
numBits,
n )
Value:
{ \
data.BitsLeft -= numBits; \
n = (data.TempRead >> data.BitsLeft) & ((1 << numBits) - 1); \
}

◆ GetIntFrom2MagSign

#define GetIntFrom2MagSign ( i)
Value:
(((i + (i & 1)) >> 1) - ((i + (i & 1)) * (i & 1)))

◆ GETZEROS

#define GETZEROS ( data,
nz )
Value:
{ \
nz = __lzcnt64(data.TempRead << (VMX_BITSSIZE - data.BitsLeft)); \
if (nz >= data.BitsLeft) { \
nz = data.BitsLeft; \
data.BitsLeft = 0; \
FLUSHREADBITS(data); \
buffer_t nz2 = __lzcnt64(data.TempRead); \
data.BitsLeft -= nz2; \
nz += nz2; \
} \
else { \
data.BitsLeft -= nz; \
} \
}

◆ GETZEROSB

#define GETZEROSB ( data,
nz )
Value:
{ \
nz = __lzcnt64(data.TempRead << (VMX_BITSSIZE - data.BitsLeft)); \
data.BitsLeft -= nz; \
}

◆ RELOADBITS

#define RELOADBITS ( data)
Value:
{ \
if (data.BitsLeft < 32) \
{ \
int n = (VMX_BITSSIZE - data.BitsLeft) >> 3; \
data.StreamPos += n; \
buffer_t * s = (buffer_t *)data.StreamPos; \
data.TempRead = VMX_BUFFERSWAP(*s); \
data.BitsLeft += (n<<3); \
} \
}

◆ REWINDOVERREAD

#define REWINDOVERREAD ( data)
Value:
{ \
if (termsToDecode > 0 && termsToDecode < 64) { \
GolombZeroCodeLookup l = GolombZeroCodeLut[termsToDecode]; \
data.BitsLeft += l.length; \
} \
}
Definition vmxcodec_common.h:291
buffer_t length
Definition vmxcodec_common.h:293

◆ RND_FRW_ROW

#define RND_FRW_ROW   (1 << (SHIFT_FRW_ROW-1))

◆ RND_FRW_ROW10

#define RND_FRW_ROW10   (1 << (SHIFT_FRW_ROW10-1))

◆ SHIFT_FRW_COL

#define SHIFT_FRW_COL   BITS_FRW_ACC

◆ SHIFT_FRW_COL10

#define SHIFT_FRW_COL10   BITS_FRW_ACC10

◆ SHIFT_FRW_ROW

#define SHIFT_FRW_ROW   (BITS_FRW_ACC + 17) - 4

◆ SHIFT_FRW_ROW10

#define SHIFT_FRW_ROW10   (BITS_FRW_ACC10 + 17) - 2

◆ SHIFT_INV_COL

#define SHIFT_INV_COL   1 + BITS_INV_ACC

◆ SHIFT_INV_COL10

#define SHIFT_INV_COL10   1 + BITS_INV_ACC10

◆ SHIFT_INV_ROW

#define SHIFT_INV_ROW   16 - BITS_INV_ACC

◆ SHIFT_INV_ROW10

#define SHIFT_INV_ROW10   16 - BITS_INV_ACC10

◆ VMX_ALIGN

#define VMX_ALIGN ( val,
alignment )
Value:
{ \
while (val % alignment) \
{ \
val++; \
} \
}

◆ VMX_ALIGNMENT

#define VMX_ALIGNMENT   (64)

◆ VMX_BITSSIZE

#define VMX_BITSSIZE   (64)

Function Documentation

◆ __declspec()

__declspec ( align(16) ) const
Initial value:
= {
{0,0},{3,2},{10,4},{11,4},{36,6},{37,6},{38,6},{39,6},{136,8},{137,8},{138,8},{139,8},{140,8},{141,8},{142,8},{143,8},{528,10},{529,10},{530,10},{531,10},{532,10},{533,10},{534,10},{535,10},{536,10},{537,10},{538,10},{539,10},{540,10},{541,10},{542,10},{543,10},{2080,12},{2081,12},{2082,12},{2083,12},{2084,12},{2085,12},{2086,12},{2087,12},{2088,12},{2089,12},{2090,12},{2091,12},{2092,12},{2093,12},{2094,12},{2095,12},{2096,12},{2097,12},{2098,12},{2099,12},{2100,12},{2101,12},{2102,12},{2103,12},{2104,12},{2105,12},{2106,12},{2107,12},{2108,12},{2109,12},{2110,12},{2111,12} }

◆ VMX_CopyFromAlignedStrideBufferAndFree()

void VMX_CopyFromAlignedStrideBufferAndFree ( BYTE * aligned,
int alignedStride,
BYTE * dstBuffer,
int dstStride,
VMX_SIZE dstSize,
int bytesPerPixel )
inline

◆ VMX_CopyToAlignedStrideBuffer()

void VMX_CopyToAlignedStrideBuffer ( BYTE * aligned,
int alignedStride,
BYTE * srcBuffer,
int srcStride,
VMX_SIZE srcSize,
int bytesPerPixel )
inline

◆ VMX_CreateAlignedStrideBuffer()

void VMX_CreateAlignedStrideBuffer ( BYTE * src,
int srcStride,
VMX_SIZE srcSize,
BYTE ** aligned,
int * alignedStride,
int alignment,
int bytesPerPixel )
inline

◆ VMX_FreeAlignedStrideBuffer()

void VMX_FreeAlignedStrideBuffer ( BYTE * aligned,
int alignedStride,
int srcStride )
inline

Variable Documentation

◆ FDCT_ROUND1

const unsigned short FDCT_ROUND1 = 1

◆ FDCT_SQRT2

const unsigned short FDCT_SQRT2 = 23170

◆ FDCT_TAN1

const unsigned short FDCT_TAN1 = 13036

◆ FDCT_TAN2

const unsigned short FDCT_TAN2 = 27146

◆ FDCT_TAN3

const unsigned short FDCT_TAN3 = 43790

◆ IRND_INV_COL

const short IRND_INV_COL = 16 * (BITS_INV_ACC - 3)

◆ IRND_INV_COL10

const short IRND_INV_COL10 = 16 * (BITS_INV_ACC10 - 3)

◆ IRND_INV_CORR

const short IRND_INV_CORR = IRND_INV_COL - 1

◆ IRND_INV_CORR10

const short IRND_INV_CORR10 = IRND_INV_COL10 - 1

◆ IRND_INV_ROW

const short IRND_INV_ROW = 1024 * (6 - BITS_INV_ACC)

◆ IRND_INV_ROW10

const short IRND_INV_ROW10 = 1024 * (6 - BITS_INV_ACC10)

◆ VMX_MAX_HEIGHT

const int VMX_MAX_HEIGHT = 4320

◆ VMX_MAX_WIDTH

const int VMX_MAX_WIDTH = 7680

◆ VMX_MIN_HEIGHT

const int VMX_MIN_HEIGHT = 16

◆ VMX_MIN_WIDTH

const int VMX_MIN_WIDTH = 16

◆ VMX_ZIGZAG

const BYTE VMX_ZIGZAG[64]
Initial value:
= {
0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 32, 25, 18, 11, 4, 5,
12, 19, 26, 33, 40, 48, 41, 34,
27, 20, 13, 6, 7, 14, 21, 28,
35, 42, 49, 56, 57, 50, 43, 36,
29, 22, 15, 23, 30, 37, 44, 51,
58, 59, 52, 45, 38, 31, 39, 46,
53, 60, 61, 54, 47, 55, 62, 63
}