* prefixication (due Kabi's request)

* generic optimization:
  - enable ALT and ALIGNED stream
  - move "if(const)" out from loops
  - supress duplicated computing
* first attempt to fix problem with strides

Originally committed as revision 734 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Nick Kurshev 2002-07-10 16:37:08 +00:00
parent f197d19a21
commit 82dd7d0dec

View File

@ -25,13 +25,13 @@
#include <string.h>
#include <unistd.h>
#define ALT_BITSTREAM_READER
#define ALIGNED_BITSTREAM
#include "common.h"
#include "avcodec.h"
#include "dsputil.h"
#include "mpegvideo.h"
#include "bswap.h"
//#define ALT_BITSTREAM_READER
//#define ALIGNED_BITSTREAM
#include "common.h"
#define bit_buffer_t GetBitContext
#define get_bit_cache(buf) (show_bits(buf,24)<<8)
@ -41,8 +41,6 @@ typedef struct vlc_code_s {
length :6;
} vlc_code_t;
#define VIDEOBUFSIZE 1280 * 1024
#define MEDIAN(a,b,c) ((a < b != b >= c) ? b : ((a < c != c > b) ? c : a))
#define SVQ1_BLOCK_SKIP 0
@ -61,7 +59,7 @@ typedef struct svq1_pmv_s {
} svq1_pmv_t;
/* 6x16-entry codebook for inter-coded 4x2 vectors */
static int8_t inter_codebook_4x2[768] = {
static int8_t svq1_inter_codebook_4x2[768] = {
7, 2, -6, -7, 7, 3, -3, -4, -7, -2, 7, 8, -8, -4, 3, 4,
19, 17, 9, 3,-14,-16,-12, -8,-18,-16, -8, -3, 11, 14, 12, 8,
7,-16,-10, 20, 7,-17,-10, 20, -6, 18, 8,-21, -7, 18, 9,-20,
@ -113,7 +111,7 @@ static int8_t inter_codebook_4x2[768] = {
};
/* 6x16-entry codebook for inter-coded 4x4 vectors */
static int8_t inter_codebook_4x4[1536] = {
static int8_t svq1_inter_codebook_4x4[1536] = {
4, 0, -6, -7, -4, -8,-13, -9, -8, -8, -1, 6, -2, 5, 22, 27,
-16, -7, 11, 10,-18, -7, 13, 10,-15, -4, 12, 8, -9, -1, 9, 5,
-2, 2, 15,-16, -3, 2, 19,-19, -3, 2, 19,-19, -2, 3, 15,-14,
@ -213,7 +211,7 @@ static int8_t inter_codebook_4x4[1536] = {
};
/* 6x16-entry codebook for inter-coded 8x4 vectors */
static int8_t inter_codebook_8x4[3072] = {
static int8_t svq1_inter_codebook_8x4[3072] = {
9, 8, 4, 0, -3, -4, -4, -3, 9, 8, 4, -1, -4, -5, -5, -3,
8, 7, 3, -2, -5, -5, -5, -4, 6, 4, 1, -2, -4, -5, -4, -3,
-12,-14,-11, -4, 1, 5, 6, 6, -8,-10, -7, -5, -2, 1, 1, 1,
@ -409,7 +407,7 @@ static int8_t inter_codebook_8x4[3072] = {
};
/* 6x16-entry codebook for inter-coded 8x8 vectors */
static int8_t inter_codebook_8x8[6144] = {
static int8_t svq1_inter_codebook_8x8[6144] = {
-4, -3, 4, 5, 2, 1, 1, 0, -5, -3, 5, 5, 2, 1, 0, 0,
-6, -4, 5, 5, 2, 1, 0, 0, -7, -4, 4, 5, 2, 1, 0, 0,
-8, -5, 3, 4, 2, 1, 0, 0, -8, -6, 3, 4, 1, 1, 1, 0,
@ -797,12 +795,13 @@ static int8_t inter_codebook_8x8[6144] = {
};
/* list of codebooks for inter-coded vectors */
static uint8_t *inter_codebooks[4] = {
inter_codebook_4x2, inter_codebook_4x4, inter_codebook_8x4, inter_codebook_8x8
static uint8_t *svq1_inter_codebooks[4] = {
svq1_inter_codebook_4x2, svq1_inter_codebook_4x4,
svq1_inter_codebook_8x4, svq1_inter_codebook_8x8
};
/* 6x16-entry codebook for intra-coded 4x2 vectors */
static int8_t intra_codebook_4x2[768] = {
static int8_t svq1_intra_codebook_4x2[768] = {
12, 13, 13, 11, -7,-10,-15,-17,-16,-15,-12,-10, 11, 15, 15, 12,
2, 17, 20, 15,-45,-24, 2, 13, 21, 20, -6,-36, 12, 16, -1,-27,
-18,-21, 10, 45,-11,-20, -7, 21, 43, -8,-28, 0, 33,-16,-28, 3,
@ -854,7 +853,7 @@ static int8_t intra_codebook_4x2[768] = {
};
/* 6x16-entry codebook for intra-coded 4x4 vectors */
static int8_t intra_codebook_4x4[1536] = {
static int8_t svq1_intra_codebook_4x4[1536] = {
-11, -3, 3, 6,-10, -1, 5, 7, -9, -1, 6, 7, -9, -1, 4, 6,
5, 7, 0,-14, 6, 9, 2,-15, 6, 9, 2,-15, 4, 6, 0,-14,
16, 3, -5, -6, 16, 1, -8, -8, 14, -1, -9, -9, 12, 0, -8, -8,
@ -954,7 +953,7 @@ static int8_t intra_codebook_4x4[1536] = {
};
/* 6x16-entry codebook for intra-coded 8x4 vectors */
static int8_t intra_codebook_8x4[3072] = {
static int8_t svq1_intra_codebook_8x4[3072] = {
5, 6, 6, 6, 7, 7, 8, 8, 0, 0, 0, 0, 0, 1, 2, 3,
-3, -4, -4, -5, -5, -4, -3, -2, -4, -4, -4, -5, -4, -4, -3, -3,
1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 4, 4, 5, 5, 5,
@ -1150,7 +1149,7 @@ static int8_t intra_codebook_8x4[3072] = {
};
/* 6x16-entry codebook for intra-coded 8x8 vectors */
static int8_t intra_codebook_8x8[6144] = {
static int8_t svq1_intra_codebook_8x8[6144] = {
4, 4, 3, 2, 2, 1, 0, -1, 4, 3, 3, 2, 1, 0, -1, -1,
3, 3, 2, 2, 1, 0, -1, -2, 3, 2, 2, 1, 0, -1, -2, -3,
2, 2, 1, 0, -1, -1, -2, -3, 2, 1, 0, 0, -1, -2, -3, -4,
@ -1538,12 +1537,13 @@ static int8_t intra_codebook_8x8[6144] = {
};
/* list of codebooks for intra-coded vectors */
static uint8_t *intra_codebooks[4] = {
intra_codebook_4x2, intra_codebook_4x4, intra_codebook_8x4, intra_codebook_8x8
static uint8_t *svq1_intra_codebooks[4] = {
svq1_intra_codebook_4x2, svq1_intra_codebook_4x4,
svq1_intra_codebook_8x4, svq1_intra_codebook_8x8
};
/* block type, codes 000 .. 1xx */
static vlc_code_t block_type_table[8] = {
static vlc_code_t svq1_block_type_table[8] = {
{ SVQ1_BLOCK_INTRA, 3 }, { SVQ1_BLOCK_INTER_4V, 3 },
{ SVQ1_BLOCK_INTER, 2 }, { SVQ1_BLOCK_INTER, 2 },
{ SVQ1_BLOCK_SKIP, 1 }, { SVQ1_BLOCK_SKIP, 1 },
@ -1551,7 +1551,7 @@ static vlc_code_t block_type_table[8] = {
};
/* motion vector, codes 0000011 .. 011xxxx */
static vlc_code_t motion_table_0[61] = {
static vlc_code_t svq1_motion_table_0[61] = {
{ 7, 8 }, { 6, 8 }, { 5, 8 }, { 4, 7 }, { 4, 7 },
{ 3, 5 }, { 3, 5 }, { 3, 5 }, { 3, 5 }, { 3, 5 }, { 3, 5 }, { 3, 5 }, { 3, 5 },
{ 2, 4 }, { 2, 4 }, { 2, 4 }, { 2, 4 }, { 2, 4 }, { 2, 4 }, { 2, 4 }, { 2, 4 },
@ -1563,7 +1563,7 @@ static vlc_code_t motion_table_0[61] = {
};
/* motion vector, codes 000000000010 ... 0000010111xx */
static vlc_code_t motion_table_1[94] = {
static vlc_code_t svq1_motion_table_1[94] = {
{32, 13}, {31, 13}, {30, 12}, {30, 12}, {29, 12}, {29, 12},
{28, 12}, {28, 12}, {27, 12}, {27, 12}, {26, 12}, {26, 12}, {25, 12}, {25, 12},
{24, 11}, {24, 11}, {24, 11}, {24, 11}, {23, 11}, {23, 11}, {23, 11}, {23, 11},
@ -1579,7 +1579,7 @@ static vlc_code_t motion_table_1[94] = {
};
/* inter-coded vector codebook count tables, codes 000000 ... 111111 */
static vlc_code_t inter_vector_tables[6][64] = {
static vlc_code_t svq1_inter_vector_tables[6][64] = {
/* 4x2 vector, codes 0000xxx ... 11xxxxx */
{ { 6, 4 }, { 6, 4 }, { 6, 4 }, { 6, 4 }, { 5, 4 }, { 5, 4 }, { 5, 4 }, { 5, 4 },
{ 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 }, { 4, 3 },
@ -1642,7 +1642,7 @@ static vlc_code_t inter_vector_tables[6][64] = {
};
/* vector codebook count tables, codes 0000000 ... 1111111 */
static vlc_code_t intra_vector_tables[6][128] = {
static vlc_code_t svq1_intra_vector_tables[6][128] = {
/* 4x2 vector, codes 00000xx ... 1xxxxxx */
{ { 5, 5 }, { 5, 5 }, { 5, 5 }, { 5, 5 }, {-1, 5 }, {-1, 5 }, {-1, 5 }, {-1, 5 },
{ 6, 4 }, { 6, 4 }, { 6, 4 }, { 6, 4 }, { 6, 4 }, { 6, 4 }, { 6, 4 }, { 6, 4 },
@ -1753,7 +1753,7 @@ static vlc_code_t intra_vector_tables[6][128] = {
};
/* intra mean value, codes 00100101 ... 1111xxxx */
static vlc_code_t intra_mean_table_0[219] = {
static vlc_code_t svq1_intra_mean_table_0[219] = {
{135, 8 }, {136, 8 }, {165, 8 },
{134, 8 }, {129, 8 }, {164, 8 }, {163, 8 }, {133, 8 }, {162, 8 }, {174, 8 }, {175, 8 },
{161, 8 }, {160, 8 }, {159, 8 }, {158, 8 }, {157, 8 }, {156, 8 }, {155, 8 }, {154, 8 },
@ -1785,7 +1785,7 @@ static vlc_code_t intra_mean_table_0[219] = {
};
/* intra mean value, codes 0000001101 ... 001001001x */
static vlc_code_t intra_mean_table_1[135] = {
static vlc_code_t svq1_intra_mean_table_1[135] = {
{218, 10}, {219, 10}, {220, 10},
{221, 10}, {222, 10}, {217, 10}, {230, 10}, {215, 10}, {208, 10}, {207, 10}, {206, 10},
{214, 10}, {204, 10}, {223, 10}, {224, 10}, {225, 10}, {226, 10}, {227, 10}, {228, 10},
@ -1807,7 +1807,7 @@ static vlc_code_t intra_mean_table_1[135] = {
};
/* intra mean value, codes 00000000000001 ... 00000011001xxx */
static vlc_code_t intra_mean_table_2[207] = {
static vlc_code_t svq1_intra_mean_table_2[207] = {
{255, 14}, { 14, 14}, { 13, 14}, { 17, 12}, { 17, 12}, { 17, 12}, { 17, 12},
{243, 11}, {243, 11}, {243, 11}, {243, 11}, {243, 11}, {243, 11}, {243, 11}, {243, 11},
{242, 11}, {242, 11}, {242, 11}, {242, 11}, {242, 11}, {242, 11}, {242, 11}, {242, 11},
@ -1837,7 +1837,7 @@ static vlc_code_t intra_mean_table_2[207] = {
};
/* intra mean value, codes 00000000000000000000 ... 000000000000001xxxxx */
static vlc_code_t intra_mean_table_3[64] = {
static vlc_code_t svq1_intra_mean_table_3[64] = {
{ 6, 20}, { 3, 20}, { 4, 20}, { 5, 20}, { 7, 20}, { 8, 20}, { 9, 19}, { 9, 19},
{ 2, 17}, { 2, 17}, { 2, 17}, { 2, 17}, { 2, 17}, { 2, 17}, { 2, 17}, { 2, 17},
{ 16, 16}, { 16, 16}, { 16, 16}, { 16, 16}, { 16, 16}, { 16, 16}, { 16, 16}, { 16, 16},
@ -1849,7 +1849,7 @@ static vlc_code_t intra_mean_table_3[64] = {
};
/* inter mean value, codes 00001011 ... 1xxxxxxx */
static vlc_code_t inter_mean_table_0[245] = {
static vlc_code_t svq1_inter_mean_table_0[245] = {
{ 10, 8 }, { 12, 8 }, { 11, 8 }, {-11, 8 }, {-12, 8 },
{-10, 8 }, { -9, 8 }, { -7, 7 }, { -7, 7 }, { -6, 7 }, { -6, 7 }, { 8, 7 }, { 8, 7 },
{ -8, 7 }, { -8, 7 }, { 9, 7 }, { 9, 7 }, { 6, 7 }, { 6, 7 }, { 7, 7 }, { 7, 7 },
@ -1884,7 +1884,7 @@ static vlc_code_t inter_mean_table_0[245] = {
};
/* inter mean value, codes 000000010010 ... 00001011xxxx */
static vlc_code_t inter_mean_table_1[158] = {
static vlc_code_t svq1_inter_mean_table_1[158] = {
{-30, 12}, {-31, 12}, {-32, 12}, {-33, 12}, { 31, 12}, {-34, 12},
{-35, 12}, { 29, 12}, { 30, 12}, { 33, 12}, { 34, 12}, { 32, 12}, {-29, 11}, {-29, 11},
{-28, 11}, {-28, 11}, { 28, 11}, { 28, 11}, {-27, 11}, {-27, 11}, {-26, 11}, {-26, 11},
@ -1908,7 +1908,7 @@ static vlc_code_t inter_mean_table_1[158] = {
};
/* inter mean value, codes 000000000010111 ... 0000000100011xx */
static vlc_code_t inter_mean_table_2[121] = {
static vlc_code_t svq1_inter_mean_table_2[121] = {
{ 61, 15},
{ 52, 15}, { 58, 15}, {-56, 15}, {-57, 15}, { 59, 15}, {-55, 15}, { 60, 15}, {-54, 15},
{ 53, 15}, {-62, 15}, {-60, 15}, {-59, 15}, {-58, 15}, { 57, 15}, { 56, 15}, {-53, 15},
@ -1928,7 +1928,7 @@ static vlc_code_t inter_mean_table_2[121] = {
};
/* inter mean value, codes 000000000000100101 ... 0000000000101101xx */
static vlc_code_t inter_mean_table_3[147] = {
static vlc_code_t svq1_inter_mean_table_3[147] = {
{111, 18}, {102, 18}, { 99, 18},
{-86, 18}, { 97, 18}, {-97, 18}, { 96, 18}, {-95, 18}, {-76, 18}, {-77, 18}, {-78, 18},
{-85, 18}, {-80, 18}, {-81, 18}, { 89, 18}, { 90, 18}, {-84, 18}, {-89, 18}, { 80, 18},
@ -1951,7 +1951,7 @@ static vlc_code_t inter_mean_table_3[147] = {
};
/* inter mean value, codes 00000000000001001001 ... 0000000000001001001x */
static vlc_code_t inter_mean_table_4[75] = {
static vlc_code_t svq1_inter_mean_table_4[75] = {
{142, 20}, {135, 20}, {125, 20}, {123, 20}, {122, 20}, {119, 20}, {117, 20},
{113, 20}, {104, 20}, {103, 20}, {-120,20}, {-114,20}, {-108,20}, {-104,20}, {-102,20},
{-101,20}, {-93, 20}, {-91, 19}, {-91, 19}, {-96, 19}, {-96, 19}, { 88, 19}, { 88, 19},
@ -1965,7 +1965,7 @@ static vlc_code_t inter_mean_table_4[75] = {
};
/* inter mean value, codes 0000000000000000000000 ... 000000000000010010001x */
static vlc_code_t inter_mean_table_5[292] = {
static vlc_code_t svq1_inter_mean_table_5[292] = {
{255, 22}, {254, 22}, {253, 22}, {252, 22}, {251, 22}, {250, 22}, {249, 22}, {248, 22},
{247, 22}, {246, 22}, {245, 22}, {244, 22}, {243, 22}, {242, 22}, {241, 22}, {240, 22},
{239, 22}, {238, 22}, {237, 22}, {236, 22}, {235, 22}, {234, 22}, {233, 22}, {232, 22},
@ -2005,9 +2005,82 @@ static vlc_code_t inter_mean_table_5[292] = {
{-119,21}, {-119,21}, {-117,21}, {-117,21}
};
#define SVQ1_PROCESS_VECTOR()\
for (; level > 0; i++) {\
/* process next depth */\
if (i == m) {\
m = n;\
if (--level == 0)\
break;\
}\
/* divide block if next bit set */\
if (get_bits (bitbuf, 1) == 0)\
break;\
/* add child nodes */\
list[n++] = list[i];\
list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
}
#define SVQ1_ADD_CODEBOOK()\
/* add codebook entries to vector */\
for (j=0; j < stages; j++) {\
n3 = codebook[entries[j]] ^ 0x80808080;\
n1 += ((n3 & 0xFF00FF00) >> 8);\
n2 += (n3 & 0x00FF00FF);\
}\
\
/* clip to [0..255] */\
if (n1 & 0xFF00FF00) {\
n3 = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
n1 += 0x7F007F00;\
n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
n1 &= (n3 & 0x00FF00FF);\
}\
\
if (n2 & 0xFF00FF00) {\
n3 = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
n2 += 0x7F007F00;\
n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
n2 &= (n3 & 0x00FF00FF);\
}
static int decode_svq1_block (bit_buffer_t *bitbuf, uint8_t *pixels, int pitch, int intra) {
#define SVQ1_DO_CODEBOOK_INTRA()\
for (y=0; y < height; y++) {\
for (x=0; x < (width / 4); x++, codebook++) {\
n1 = n4;\
n2 = n4;\
SVQ1_ADD_CODEBOOK()\
/* store result */\
dst[x] = (n1 << 8) | n2;\
}\
dst += (pitch / 4);\
}
#define SVQ1_DO_CODEBOOK_NONINTRA()\
for (y=0; y < height; y++) {\
for (x=0; x < (width / 4); x++, codebook++) {\
n3 = dst[x];\
/* add mean value to vector */\
n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
n2 = (n3 & 0x00FF00FF) + n4;\
SVQ1_ADD_CODEBOOK()\
/* store result */\
dst[x] = (n1 << 8) | n2;\
}\
dst += (pitch / 4);\
}
#define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
codebook = (uint32_t *) cbook[level];\
bit_cache = get_bits (bitbuf, 4*stages);\
/* calculate codebook entries for this vector */\
for (j=0; j < stages; j++) {\
entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
}\
mean -= (stages * 128);\
n4 = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
static int svq1_decode_block_intra (bit_buffer_t *bitbuf, uint8_t *pixels, int pitch ) {
uint32_t bit_cache;
vlc_code_t *vlc;
uint8_t *list[63];
@ -2024,24 +2097,7 @@ static int decode_svq1_block (bit_buffer_t *bitbuf, uint8_t *pixels, int pitch,
/* recursively process vector */
for (i=0, m=1, n=1, level=5; i < n; i++) {
for (; level > 0; i++) {
/* process next depth */
if (i == m) {
m = n;
if (--level == 0)
break;
}
/* divide block if next bit set */
if (get_bits (bitbuf, 1) == 0)
break;
/* add child nodes */
list[n++] = list[i];
list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));
}
SVQ1_PROCESS_VECTOR();
/* destination address and vector size */
dst = (uint32_t *) list[i];
@ -2051,27 +2107,22 @@ static int decode_svq1_block (bit_buffer_t *bitbuf, uint8_t *pixels, int pitch,
/* get number of stages (-1 skips vector, 0 for mean only) */
bit_cache = get_bit_cache (bitbuf);
if (intra)
vlc = &intra_vector_tables[level][bit_cache >> (32 - 7)];
else
vlc = &inter_vector_tables[level][bit_cache >> (32 - 6)];
vlc = &svq1_intra_vector_tables[level][bit_cache >> (32 - 7)];
/* flush bits */
stages = vlc->value;
skip_bits(bitbuf,vlc->length);
if (stages == -1) {
if (intra) {
for (y=0; y < height; y++) {
memset (&dst[y*(pitch / 4)], 0, width);
}
}
continue; /* skip vector */
}
if ((stages > 0) && (level >= 4)) {
#ifdef DEBUG_SVQ1
printf("Error (decode_svq1_block): invalid vector: stages=%i level=%i\n",stages,level);
printf("Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",stages,level);
#endif
return -1; /* invalid vector */
}
@ -2079,98 +2130,101 @@ static int decode_svq1_block (bit_buffer_t *bitbuf, uint8_t *pixels, int pitch,
/* get mean value for vector */
bit_cache = get_bit_cache (bitbuf);
if (intra) {
if (bit_cache >= 0x25000000)
vlc = &intra_mean_table_0[(bit_cache >> (32 - 8)) - 37];
else if (bit_cache >= 0x03400000)
vlc = &intra_mean_table_1[(bit_cache >> (32 - 10)) - 13];
else if (bit_cache >= 0x00040000)
vlc = &intra_mean_table_2[(bit_cache >> (32 - 14)) - 1];
else
vlc = &intra_mean_table_3[bit_cache >> (32 - 20)];
} else {
if (bit_cache >= 0x0B000000)
vlc = &inter_mean_table_0[(bit_cache >> (32 - 8)) - 11];
else if (bit_cache >= 0x01200000)
vlc = &inter_mean_table_1[(bit_cache >> (32 - 12)) - 18];
else if (bit_cache >= 0x002E0000)
vlc = &inter_mean_table_2[(bit_cache >> (32 - 15)) - 23];
else if (bit_cache >= 0x00094000)
vlc = &inter_mean_table_3[(bit_cache >> (32 - 18)) - 37];
else if (bit_cache >= 0x00049000)
vlc = &inter_mean_table_4[(bit_cache >> (32 - 20)) - 73];
else
vlc = &inter_mean_table_5[bit_cache >> (32 - 22)];
}
if (bit_cache >= 0x25000000)
vlc = &svq1_intra_mean_table_0[(bit_cache >> (32 - 8)) - 37];
else if (bit_cache >= 0x03400000)
vlc = &svq1_intra_mean_table_1[(bit_cache >> (32 - 10)) - 13];
else if (bit_cache >= 0x00040000)
vlc = &svq1_intra_mean_table_2[(bit_cache >> (32 - 14)) - 1];
else
vlc = &svq1_intra_mean_table_3[bit_cache >> (32 - 20)];
/* flush bits */
mean = vlc->value;
skip_bits(bitbuf,vlc->length);
if (intra && stages == 0) {
if (stages == 0) {
for (y=0; y < height; y++) {
memset (&dst[y*(pitch / 4)], mean, width);
}
} else {
codebook = (uint32_t *) (intra ? intra_codebooks[level] : inter_codebooks[level]);
bit_cache = get_bits (bitbuf, 4*stages);
/* calculate codebook entries for this vector */
for (j=0; j < stages; j++) {
entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);
}
mean -= (stages * 128);
n4 = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
for (y=0; y < height; y++) {
for (x=0; x < (width / 4); x++, codebook++) {
if (intra) {
n1 = n4;
n2 = n4;
} else {
n3 = dst[x];
/* add mean value to vector */
n1 = ((n3 & 0xFF00FF00) >> 8) + n4;
n2 = (n3 & 0x00FF00FF) + n4;
}
/* add codebook entries to vector */
for (j=0; j < stages; j++) {
n3 = codebook[entries[j]] ^ 0x80808080;
n1 += ((n3 & 0xFF00FF00) >> 8);
n2 += (n3 & 0x00FF00FF);
}
/* clip to [0..255] */
if (n1 & 0xFF00FF00) {
n3 = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;
n1 += 0x7F007F00;
n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;
n1 &= (n3 & 0x00FF00FF);
}
if (n2 & 0xFF00FF00) {
n3 = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;
n2 += 0x7F007F00;
n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;
n2 &= (n3 & 0x00FF00FF);
}
/* store result */
dst[x] = (n1 << 8) | n2;
}
dst += (pitch / 4);
}
SVQ1_CALC_CODEBOOK_ENTRIES(svq1_intra_codebooks);
SVQ1_DO_CODEBOOK_INTRA()
}
}
return 0;
}
static int decode_motion_vector (bit_buffer_t *bitbuf, svq1_pmv_t *mv, svq1_pmv_t **pmv) {
static int svq1_decode_block_non_intra (bit_buffer_t *bitbuf, uint8_t *pixels, int pitch ) {
uint32_t bit_cache;
vlc_code_t *vlc;
uint8_t *list[63];
uint32_t *dst;
uint32_t *codebook;
int entries[6];
int i, j, m, n;
int mean, stages;
int x, y, width, height, level;
uint32_t n1, n2, n3, n4;
/* initialize list for breadth first processing of vectors */
list[0] = pixels;
/* recursively process vector */
for (i=0, m=1, n=1, level=5; i < n; i++) {
SVQ1_PROCESS_VECTOR();
/* destination address and vector size */
dst = (uint32_t *) list[i];
width = 1 << ((4 + level) /2);
height = 1 << ((3 + level) /2);
/* get number of stages (-1 skips vector, 0 for mean only) */
bit_cache = get_bit_cache (bitbuf);
vlc = &svq1_inter_vector_tables[level][bit_cache >> (32 - 6)];
/* flush bits */
stages = vlc->value;
skip_bits(bitbuf,vlc->length);
if (stages == -1) continue; /* skip vector */
if ((stages > 0) && (level >= 4)) {
#ifdef DEBUG_SVQ1
printf("Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",stages,level);
#endif
return -1; /* invalid vector */
}
/* get mean value for vector */
bit_cache = get_bit_cache (bitbuf);
if (bit_cache >= 0x0B000000)
vlc = &svq1_inter_mean_table_0[(bit_cache >> (32 - 8)) - 11];
else if (bit_cache >= 0x01200000)
vlc = &svq1_inter_mean_table_1[(bit_cache >> (32 - 12)) - 18];
else if (bit_cache >= 0x002E0000)
vlc = &svq1_inter_mean_table_2[(bit_cache >> (32 - 15)) - 23];
else if (bit_cache >= 0x00094000)
vlc = &svq1_inter_mean_table_3[(bit_cache >> (32 - 18)) - 37];
else if (bit_cache >= 0x00049000)
vlc = &svq1_inter_mean_table_4[(bit_cache >> (32 - 20)) - 73];
else
vlc = &svq1_inter_mean_table_5[bit_cache >> (32 - 22)];
/* flush bits */
mean = vlc->value;
skip_bits(bitbuf,vlc->length);
SVQ1_CALC_CODEBOOK_ENTRIES(svq1_inter_codebooks);
SVQ1_DO_CODEBOOK_NONINTRA()
}
return 0;
}
static int svq1_decode_motion_vector (bit_buffer_t *bitbuf, svq1_pmv_t *mv, svq1_pmv_t **pmv) {
uint32_t bit_cache;
vlc_code_t *vlc;
int diff, sign;
@ -2192,9 +2246,9 @@ static int decode_motion_vector (bit_buffer_t *bitbuf, svq1_pmv_t *mv, svq1_pmv_
} else {
if (bit_cache >= 0x06000000) {
vlc = &motion_table_0[(bit_cache >> (32 - 7)) - 3];
vlc = &svq1_motion_table_0[(bit_cache >> (32 - 7)) - 3];
} else {
vlc = &motion_table_1[(bit_cache >> (32 - 12)) - 2];
vlc = &svq1_motion_table_1[(bit_cache >> (32 - 12)) - 2];
}
/* decode motion vector differential */
@ -2215,7 +2269,7 @@ static int decode_motion_vector (bit_buffer_t *bitbuf, svq1_pmv_t *mv, svq1_pmv_
return 0;
}
static void skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
uint8_t *src;
uint8_t *dst;
int i;
@ -2230,7 +2284,7 @@ static void skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, i
}
}
static int motion_inter_block (bit_buffer_t *bitbuf,
static int svq1_motion_inter_block (bit_buffer_t *bitbuf,
uint8_t *current, uint8_t *previous, int pitch,
svq1_pmv_t *motion, int x, int y) {
uint8_t *src;
@ -2241,24 +2295,25 @@ static int motion_inter_block (bit_buffer_t *bitbuf,
/* predict and decode motion vector */
pmv[0] = &motion[0];
pmv[1] = &motion[(x / 8) + 2];
pmv[2] = &motion[(x / 8) + 4];
if (y == 0) {
pmv[1] = pmv[0];
pmv[1] =
pmv[2] = pmv[0];
}
else {
pmv[1] = &motion[(x / 8) + 2];
pmv[2] = &motion[(x / 8) + 4];
}
result = decode_motion_vector (bitbuf, &mv, pmv);
result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
if (result != 0)
return result;
motion[0].x = mv.x;
motion[0].y = mv.y;
motion[(x / 8) + 2].x = mv.x;
motion[(x / 8) + 2].y = mv.y;
motion[0].x =
motion[(x / 8) + 2].x =
motion[(x / 8) + 3].x = mv.x;
motion[0].y =
motion[(x / 8) + 2].y =
motion[(x / 8) + 3].y = mv.y;
src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
@ -2270,7 +2325,7 @@ static int motion_inter_block (bit_buffer_t *bitbuf,
return 0;
}
static int motion_inter_4v_block (bit_buffer_t *bitbuf,
static int svq1_motion_inter_4v_block (bit_buffer_t *bitbuf,
uint8_t *current, uint8_t *previous, int pitch,
svq1_pmv_t *motion,int x, int y) {
uint8_t *src;
@ -2281,29 +2336,30 @@ static int motion_inter_4v_block (bit_buffer_t *bitbuf,
/* predict and decode motion vector (0) */
pmv[0] = &motion[0];
pmv[1] = &motion[(x / 8) + 2];
pmv[2] = &motion[(x / 8) + 4];
if (y == 0) {
pmv[1] = pmv[0];
pmv[1] =
pmv[2] = pmv[0];
}
else {
pmv[1] = &motion[(x / 8) + 2];
pmv[2] = &motion[(x / 8) + 4];
}
result = decode_motion_vector (bitbuf, &mv, pmv);
result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
if (result != 0)
return result;
/* predict and decode motion vector (1) */
pmv[0] = &mv;
pmv[1] = &motion[(x / 8) + 3];
if (y == 0) {
pmv[1] = pmv[0];
pmv[1] =
pmv[2] = pmv[0];
}
result = decode_motion_vector (bitbuf, &motion[0], pmv);
else {
pmv[1] = &motion[(x / 8) + 3];
}
result = svq1_decode_motion_vector (bitbuf, &motion[0], pmv);
if (result != 0)
return result;
@ -2312,7 +2368,7 @@ static int motion_inter_4v_block (bit_buffer_t *bitbuf,
pmv[1] = &motion[0];
pmv[2] = &motion[(x / 8) + 1];
result = decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
result = svq1_decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
if (result != 0)
return result;
@ -2321,7 +2377,7 @@ static int motion_inter_4v_block (bit_buffer_t *bitbuf,
pmv[2] = &motion[(x / 8) + 2];
pmv[3] = &motion[(x / 8) + 3];
result = decode_motion_vector (bitbuf, pmv[3], pmv);
result = svq1_decode_motion_vector (bitbuf, pmv[3], pmv);
if (result != 0)
return result;
@ -2346,7 +2402,7 @@ static int motion_inter_4v_block (bit_buffer_t *bitbuf,
return 0;
}
static int decode_delta_block (bit_buffer_t *bitbuf,
static int svq1_decode_delta_block (bit_buffer_t *bitbuf,
uint8_t *current, uint8_t *previous, int pitch,
svq1_pmv_t *motion, int x, int y) {
uint32_t bit_cache;
@ -2357,52 +2413,52 @@ static int decode_delta_block (bit_buffer_t *bitbuf,
bit_cache = get_bit_cache (bitbuf);
bit_cache >>= (32 - 3);
block_type = block_type_table[bit_cache].value;
skip_bits(bitbuf,block_type_table[bit_cache].length);
block_type = svq1_block_type_table[bit_cache].value;
skip_bits(bitbuf,svq1_block_type_table[bit_cache].length);
/* reset motion vectors */
if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
motion[0].x = 0;
motion[0].y = 0;
motion[(x / 8) + 2].x = 0;
motion[(x / 8) + 2].y = 0;
motion[(x / 8) + 3].x = 0;
motion[0].x =
motion[0].y =
motion[(x / 8) + 2].x =
motion[(x / 8) + 2].y =
motion[(x / 8) + 3].x =
motion[(x / 8) + 3].y = 0;
}
switch (block_type) {
case SVQ1_BLOCK_SKIP:
skip_block (current, previous, pitch, x, y);
svq1_skip_block (current, previous, pitch, x, y);
break;
case SVQ1_BLOCK_INTER:
result = motion_inter_block (bitbuf, current, previous, pitch, motion, x, y);
result = svq1_motion_inter_block (bitbuf, current, previous, pitch, motion, x, y);
if (result != 0)
{
#ifdef DEBUG_SVQ1
printf("Error in motion_inter_block %i\n",result);
printf("Error in svq1_motion_inter_block %i\n",result);
#endif
break;
}
result = decode_svq1_block (bitbuf, current, pitch, 0);
result = svq1_decode_block_non_intra (bitbuf, current, pitch);
break;
case SVQ1_BLOCK_INTER_4V:
result = motion_inter_4v_block (bitbuf, current, previous, pitch, motion, x, y);
result = svq1_motion_inter_4v_block (bitbuf, current, previous, pitch, motion, x, y);
if (result != 0)
{
#ifdef DEBUG_SVQ1
printf("Error in motion_inter_4v_block %i\n",result);
printf("Error in svq1_motion_inter_4v_block %i\n",result);
#endif
break;
}
result = decode_svq1_block (bitbuf, current, pitch, 0);
result = svq1_decode_block_non_intra (bitbuf, current, pitch);
break;
case SVQ1_BLOCK_INTRA:
result = decode_svq1_block (bitbuf, current, pitch, 1);
result = svq1_decode_block_intra (bitbuf, current, pitch);
break;
}
@ -2410,12 +2466,12 @@ static int decode_delta_block (bit_buffer_t *bitbuf,
}
/* standard video sizes */
static struct { int width; int height; } frame_size_table[8] = {
static struct { int width; int height; } svq1_frame_size_table[8] = {
{ 160, 120 }, { 128, 96 }, { 176, 144 }, { 352, 288 },
{ 704, 576 }, { 240, 180 }, { 320, 240 }, { -1, -1 }
};
static int decode_frame_header (bit_buffer_t *bitbuf,MpegEncContext *s) {
static int svq1_decode_frame_header (bit_buffer_t *bitbuf,MpegEncContext *s) {
int frame_size_code;
/* unknown field */
@ -2454,8 +2510,8 @@ static int decode_frame_header (bit_buffer_t *bitbuf,MpegEncContext *s) {
return -1;
} else {
/* get width, height from table */
s->width = frame_size_table[frame_size_code].width;
s->height = frame_size_table[frame_size_code].height;
s->width = svq1_frame_size_table[frame_size_code].width;
s->height = svq1_frame_size_table[frame_size_code].height;
}
}
@ -2491,8 +2547,6 @@ static int svq1_decode_frame(AVCodecContext *avctx,
int result, i, x, y, width, height;
AVPicture *pict = data;
// memcpy(temp_buf,buffer,buffer_len); buffer=temp_buf;
/* initialize bit buffer */
init_get_bits(&s->gb,buf,buf_size);
@ -2511,12 +2565,12 @@ static int svq1_decode_frame(AVCodecContext *avctx,
}
}
result = decode_frame_header (&s->gb, s);
result = svq1_decode_frame_header (&s->gb, s);
if (result != 0)
{
#ifdef DEBUG_SVQ1
printf("Error in decode_frame_header %i\n",result);
printf("Error in svq1_decode_frame_header %i\n",result);
#endif
return result;
}
@ -2524,11 +2578,11 @@ static int svq1_decode_frame(AVCodecContext *avctx,
/* decode y, u and v components */
for (i=0; i < 3; i++) {
if (i == 0) {
width = s->width;
height = s->height;
width = (s->width+15)&~15;
height = (s->height+15)&~15;
} else {
width = s->width/4;
height = s->height/4;
width = (s->width/4+15)&~15;
height = (s->height/4+15)&~15;
}
current = s->current_picture[i];
@ -2538,11 +2592,11 @@ static int svq1_decode_frame(AVCodecContext *avctx,
/* keyframe */
for (y=0; y < height; y+=16) {
for (x=0; x < width; x+=16) {
result = decode_svq1_block (&s->gb, &current[x], width, 1);
result = svq1_decode_block_intra (&s->gb, &current[x], width);
if (result != 0)
{
#ifdef DEBUG_SVQ1
printf("Error in decode_svq1_block %i (keyframe)\n",result);
printf("Error in svq1_decode_block %i (keyframe)\n",result);
#endif
return result;
}
@ -2555,42 +2609,35 @@ static int svq1_decode_frame(AVCodecContext *avctx,
for (y=0; y < height; y+=16) {
for (x=0; x < width; x+=16) {
result = decode_delta_block (&s->gb, &current[x], previous,
result = svq1_decode_delta_block (&s->gb, &current[x], previous,
width, s->opaque, x, y);
if (result != 0)
{
#ifdef DEBUG_SVQ1
printf("Error in decode_delta_block %i\n",result);
printf("Error in svq1_decode_delta_block %i\n",result);
#endif
return result;
}
}
((svq1_pmv_t *)s->opaque)[0].x = 0;
((svq1_pmv_t *)s->opaque)[0].x =
((svq1_pmv_t *)s->opaque)[0].y = 0;
current += 16*width;
}
}
}
/* update backward reference frame */
if (!s->hurry_up)
{
pict->data[0] = s->current_picture[0];
pict->data[1] = s->current_picture[1];
pict->data[2] = s->current_picture[2];
pict->linesize[0] = s->width;
pict->linesize[1] = s->width / 4;
pict->linesize[2] = s->width / 4;
for(i=0;i<3;i++)
{
uint8_t *tmp = s->last_picture[i];
s->last_picture[i] = s->current_picture[i];
s->current_picture[i] = tmp;
}
*data_size=1;
/* update backward reference frame */
if (!s->hurry_up)
{
uint8_t *tmp = s->last_picture[i];
pict->data[i] = s->current_picture[i];
pict->linesize[i] = width;
s->last_picture[i] = s->current_picture[i];
s->current_picture[i] = tmp;
}
}
*data_size=sizeof(AVPicture);
return 0;
}