Commit d2264740 authored by Vittorio Giovara's avatar Vittorio Giovara

VP3: K&R formatting cosmetics

parent 66d04c06
...@@ -34,20 +34,21 @@ ...@@ -34,20 +34,21 @@
#include <string.h> #include <string.h>
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "avcodec.h" #include "avcodec.h"
#include "internal.h"
#include "get_bits.h" #include "get_bits.h"
#include "hpeldsp.h" #include "hpeldsp.h"
#include "internal.h"
#include "mathops.h" #include "mathops.h"
#include "thread.h"
#include "videodsp.h" #include "videodsp.h"
#include "vp3data.h" #include "vp3data.h"
#include "vp3dsp.h" #include "vp3dsp.h"
#include "xiph.h" #include "xiph.h"
#include "thread.h"
#define FRAGMENT_PIXELS 8 #define FRAGMENT_PIXELS 8
//FIXME split things out into their own arrays // FIXME split things out into their own arrays
typedef struct Vp3Fragment { typedef struct Vp3Fragment {
int16_t dc; int16_t dc;
uint8_t coding_method; uint8_t coding_method;
...@@ -77,8 +78,7 @@ typedef struct Vp3Fragment { ...@@ -77,8 +78,7 @@ typedef struct Vp3Fragment {
#define MODE_COPY 8 #define MODE_COPY 8
/* There are 6 preset schemes, plus a free-form scheme */ /* There are 6 preset schemes, plus a free-form scheme */
static const int ModeAlphabet[6][CODING_MODE_COUNT] = static const int ModeAlphabet[6][CODING_MODE_COUNT] = {
{
/* scheme 1: Last motion vector dominates */ /* scheme 1: Last motion vector dominates */
{ MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, { MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST,
MODE_INTER_PLUS_MV, MODE_INTER_NO_MV, MODE_INTER_PLUS_MV, MODE_INTER_NO_MV,
...@@ -114,14 +114,13 @@ static const int ModeAlphabet[6][CODING_MODE_COUNT] = ...@@ -114,14 +114,13 @@ static const int ModeAlphabet[6][CODING_MODE_COUNT] =
MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST,
MODE_INTER_PLUS_MV, MODE_INTRA, MODE_INTER_PLUS_MV, MODE_INTRA,
MODE_GOLDEN_MV, MODE_INTER_FOURMV }, MODE_GOLDEN_MV, MODE_INTER_FOURMV },
}; };
static const uint8_t hilbert_offset[16][2] = { static const uint8_t hilbert_offset[16][2] = {
{0,0}, {1,0}, {1,1}, {0,1}, { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 },
{0,2}, {0,3}, {1,3}, {1,2}, { 0, 2 }, { 0, 3 }, { 1, 3 }, { 1, 2 },
{2,2}, {2,3}, {3,3}, {3,2}, { 2, 2 }, { 2, 3 }, { 3, 3 }, { 3, 2 },
{3,1}, {2,1}, {2,0}, {3,0} { 3, 1 }, { 2, 1 }, { 2, 0 }, { 3, 0 }
}; };
#define MIN_DEQUANT_VAL 2 #define MIN_DEQUANT_VAL 2
...@@ -180,7 +179,7 @@ typedef struct Vp3DecodeContext { ...@@ -180,7 +179,7 @@ typedef struct Vp3DecodeContext {
uint32_t coded_ac_scale_factor[64]; uint32_t coded_ac_scale_factor[64];
uint8_t base_matrix[384][64]; uint8_t base_matrix[384][64];
uint8_t qr_count[2][3]; uint8_t qr_count[2][3];
uint8_t qr_size [2][3][64]; uint8_t qr_size[2][3][64];
uint16_t qr_base[2][3][64]; uint16_t qr_base[2][3][64];
/** /**
...@@ -207,7 +206,8 @@ typedef struct Vp3DecodeContext { ...@@ -207,7 +206,8 @@ typedef struct Vp3DecodeContext {
#define TOKEN_COEFF(coeff) (((coeff) << 2) + 2) #define TOKEN_COEFF(coeff) (((coeff) << 2) + 2)
/** /**
* number of blocks that contain DCT coefficients at the given level or higher * number of blocks that contain DCT coefficients at
* the given level or higher
*/ */
int num_coded_frags[3][64]; int num_coded_frags[3][64];
int total_num_coded_frags; int total_num_coded_frags;
...@@ -251,7 +251,7 @@ typedef struct Vp3DecodeContext { ...@@ -251,7 +251,7 @@ typedef struct Vp3DecodeContext {
uint32_t huffman_table[80][32][2]; uint32_t huffman_table[80][32][2];
uint8_t filter_limit_values[64]; uint8_t filter_limit_values[64];
DECLARE_ALIGNED(8, int, bounding_values_array)[256+2]; DECLARE_ALIGNED(8, int, bounding_values_array)[256 + 2];
} Vp3DecodeContext; } Vp3DecodeContext;
/************************************************************************ /************************************************************************
...@@ -307,7 +307,6 @@ static av_cold int vp3_decode_end(AVCodecContext *avctx) ...@@ -307,7 +307,6 @@ static av_cold int vp3_decode_end(AVCodecContext *avctx)
ff_free_vlc(&s->mode_code_vlc); ff_free_vlc(&s->mode_code_vlc);
ff_free_vlc(&s->motion_vector_vlc); ff_free_vlc(&s->motion_vector_vlc);
return 0; return 0;
} }
...@@ -324,19 +323,22 @@ static int init_block_mapping(Vp3DecodeContext *s) ...@@ -324,19 +323,22 @@ static int init_block_mapping(Vp3DecodeContext *s)
int x, y, i, j = 0; int x, y, i, j = 0;
for (plane = 0; plane < 3; plane++) { for (plane = 0; plane < 3; plane++) {
int sb_width = plane ? s->c_superblock_width : s->y_superblock_width; int sb_width = plane ? s->c_superblock_width
int sb_height = plane ? s->c_superblock_height : s->y_superblock_height; : s->y_superblock_width;
int sb_height = plane ? s->c_superblock_height
: s->y_superblock_height;
int frag_width = s->fragment_width[!!plane]; int frag_width = s->fragment_width[!!plane];
int frag_height = s->fragment_height[!!plane]; int frag_height = s->fragment_height[!!plane];
for (sb_y = 0; sb_y < sb_height; sb_y++) for (sb_y = 0; sb_y < sb_height; sb_y++)
for (sb_x = 0; sb_x < sb_width; sb_x++) for (sb_x = 0; sb_x < sb_width; sb_x++)
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
x = 4*sb_x + hilbert_offset[i][0]; x = 4 * sb_x + hilbert_offset[i][0];
y = 4*sb_y + hilbert_offset[i][1]; y = 4 * sb_y + hilbert_offset[i][1];
if (x < frag_width && y < frag_height) if (x < frag_width && y < frag_height)
s->superblock_fragments[j++] = s->fragment_start[plane] + y*frag_width + x; s->superblock_fragments[j++] = s->fragment_start[plane] +
y * frag_width + x;
else else
s->superblock_fragments[j++] = -1; s->superblock_fragments[j++] = -1;
} }
...@@ -355,30 +357,31 @@ static void init_dequantizer(Vp3DecodeContext *s, int qpi) ...@@ -355,30 +357,31 @@ static void init_dequantizer(Vp3DecodeContext *s, int qpi)
int dc_scale_factor = s->coded_dc_scale_factor[s->qps[qpi]]; int dc_scale_factor = s->coded_dc_scale_factor[s->qps[qpi]];
int i, plane, inter, qri, bmi, bmj, qistart; int i, plane, inter, qri, bmi, bmj, qistart;
for(inter=0; inter<2; inter++){ for (inter = 0; inter < 2; inter++) {
for(plane=0; plane<3; plane++){ for (plane = 0; plane < 3; plane++) {
int sum=0; int sum = 0;
for(qri=0; qri<s->qr_count[inter][plane]; qri++){ for (qri = 0; qri < s->qr_count[inter][plane]; qri++) {
sum+= s->qr_size[inter][plane][qri]; sum += s->qr_size[inter][plane][qri];
if(s->qps[qpi] <= sum) if (s->qps[qpi] <= sum)
break; break;
} }
qistart= sum - s->qr_size[inter][plane][qri]; qistart = sum - s->qr_size[inter][plane][qri];
bmi= s->qr_base[inter][plane][qri ]; bmi = s->qr_base[inter][plane][qri];
bmj= s->qr_base[inter][plane][qri+1]; bmj = s->qr_base[inter][plane][qri + 1];
for(i=0; i<64; i++){ for (i = 0; i < 64; i++) {
int coeff= ( 2*(sum -s->qps[qpi])*s->base_matrix[bmi][i] int coeff = (2 * (sum - s->qps[qpi]) * s->base_matrix[bmi][i] -
- 2*(qistart-s->qps[qpi])*s->base_matrix[bmj][i] 2 * (qistart - s->qps[qpi]) * s->base_matrix[bmj][i] +
+ s->qr_size[inter][plane][qri]) s->qr_size[inter][plane][qri]) /
/ (2*s->qr_size[inter][plane][qri]); (2 * s->qr_size[inter][plane][qri]);
int qmin= 8<<(inter + !i); int qmin = 8 << (inter + !i);
int qscale= i ? ac_scale_factor : dc_scale_factor; int qscale = i ? ac_scale_factor : dc_scale_factor;
s->qmat[qpi][inter][plane][s->idct_permutation[i]] = s->qmat[qpi][inter][plane][s->idct_permutation[i]] =
av_clip((qscale * coeff) / 100 * 4, qmin, 4096); av_clip((qscale * coeff) / 100 * 4, qmin, 4096);
} }
// all DC coefficients use the same quant so as not to interfere with DC prediction /* all DC coefficients use the same quant so as not to interfere
* with DC prediction */
s->qmat[qpi][inter][plane][0] = s->qmat[0][inter][plane][0]; s->qmat[qpi][inter][plane][0] = s->qmat[0][inter][plane][0];
} }
} }
...@@ -392,7 +395,7 @@ static void init_dequantizer(Vp3DecodeContext *s, int qpi) ...@@ -392,7 +395,7 @@ static void init_dequantizer(Vp3DecodeContext *s, int qpi)
*/ */
static void init_loop_filter(Vp3DecodeContext *s) static void init_loop_filter(Vp3DecodeContext *s)
{ {
int *bounding_values= s->bounding_values_array+127; int *bounding_values = s->bounding_values_array + 127;
int filter_limit; int filter_limit;
int x; int x;
int value; int value;
...@@ -421,7 +424,9 @@ static void init_loop_filter(Vp3DecodeContext *s) ...@@ -421,7 +424,9 @@ static void init_loop_filter(Vp3DecodeContext *s)
*/ */
static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
{ {
int superblock_starts[3] = { 0, s->u_superblock_start, s->v_superblock_start }; int superblock_starts[3] = {
0, s->u_superblock_start, s->v_superblock_start
};
int bit = 0; int bit = 0;
int current_superblock = 0; int current_superblock = 0;
int current_run = 0; int current_run = 0;
...@@ -433,9 +438,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -433,9 +438,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
if (s->keyframe) { if (s->keyframe) {
memset(s->superblock_coding, SB_FULLY_CODED, s->superblock_count); memset(s->superblock_coding, SB_FULLY_CODED, s->superblock_count);
} else { } else {
/* unpack the list of partially-coded superblocks */ /* unpack the list of partially-coded superblocks */
bit = get_bits1(gb) ^ 1; bit = get_bits1(gb) ^ 1;
current_run = 0; current_run = 0;
...@@ -446,13 +449,14 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -446,13 +449,14 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
else else
bit ^= 1; bit ^= 1;
current_run = get_vlc2(gb, current_run = get_vlc2(gb, s->superblock_run_length_vlc.table,
s->superblock_run_length_vlc.table, 6, 2) + 1; 6, 2) + 1;
if (current_run == 34) if (current_run == 34)
current_run += get_bits(gb, 12); current_run += get_bits(gb, 12);
if (current_superblock + current_run > s->superblock_count) { if (current_superblock + current_run > s->superblock_count) {
av_log(s->avctx, AV_LOG_ERROR, "Invalid partially coded superblock run length\n"); av_log(s->avctx, AV_LOG_ERROR,
"Invalid partially coded superblock run length\n");
return -1; return -1;
} }
...@@ -472,28 +476,28 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -472,28 +476,28 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
bit = get_bits1(gb) ^ 1; bit = get_bits1(gb) ^ 1;
current_run = 0; current_run = 0;
while (superblocks_decoded < s->superblock_count - num_partial_superblocks while (superblocks_decoded < s->superblock_count - num_partial_superblocks &&
&& get_bits_left(gb) > 0) { get_bits_left(gb) > 0) {
if (s->theora && current_run == MAXIMUM_LONG_BIT_RUN) if (s->theora && current_run == MAXIMUM_LONG_BIT_RUN)
bit = get_bits1(gb); bit = get_bits1(gb);
else else
bit ^= 1; bit ^= 1;
current_run = get_vlc2(gb, current_run = get_vlc2(gb, s->superblock_run_length_vlc.table,
s->superblock_run_length_vlc.table, 6, 2) + 1; 6, 2) + 1;
if (current_run == 34) if (current_run == 34)
current_run += get_bits(gb, 12); current_run += get_bits(gb, 12);
for (j = 0; j < current_run; current_superblock++) { for (j = 0; j < current_run; current_superblock++) {
if (current_superblock >= s->superblock_count) { if (current_superblock >= s->superblock_count) {
av_log(s->avctx, AV_LOG_ERROR, "Invalid fully coded superblock run length\n"); av_log(s->avctx, AV_LOG_ERROR,
"Invalid fully coded superblock run length\n");
return -1; return -1;
} }
/* skip any superblocks already marked as partially coded */ /* skip any superblocks already marked as partially coded */
if (s->superblock_coding[current_superblock] == SB_NOT_CODED) { if (s->superblock_coding[current_superblock] == SB_NOT_CODED) {
s->superblock_coding[current_superblock] = 2*bit; s->superblock_coding[current_superblock] = 2 * bit;
j++; j++;
} }
} }
...@@ -504,7 +508,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -504,7 +508,6 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
/* if there were partial blocks, initialize bitstream for /* if there were partial blocks, initialize bitstream for
* unpacking fragment codings */ * unpacking fragment codings */
if (num_partial_superblocks) { if (num_partial_superblocks) {
current_run = 0; current_run = 0;
bit = get_bits1(gb); bit = get_bits1(gb);
/* toggle the bit because as soon as the first run length is /* toggle the bit because as soon as the first run length is
...@@ -520,27 +523,24 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -520,27 +523,24 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
for (plane = 0; plane < 3; plane++) { for (plane = 0; plane < 3; plane++) {
int sb_start = superblock_starts[plane]; int sb_start = superblock_starts[plane];
int sb_end = sb_start + (plane ? s->c_superblock_count : s->y_superblock_count); int sb_end = sb_start + (plane ? s->c_superblock_count
: s->y_superblock_count);
int num_coded_frags = 0; int num_coded_frags = 0;
for (i = sb_start; i < sb_end && get_bits_left(gb) > 0; i++) { for (i = sb_start; i < sb_end && get_bits_left(gb) > 0; i++) {
/* iterate through all 16 fragments in a superblock */ /* iterate through all 16 fragments in a superblock */
for (j = 0; j < 16; j++) { for (j = 0; j < 16; j++) {
/* if the fragment is in bounds, check its coding status */ /* if the fragment is in bounds, check its coding status */
current_fragment = s->superblock_fragments[i * 16 + j]; current_fragment = s->superblock_fragments[i * 16 + j];
if (current_fragment != -1) { if (current_fragment != -1) {
int coded = s->superblock_coding[i]; int coded = s->superblock_coding[i];
if (s->superblock_coding[i] == SB_PARTIALLY_CODED) { if (s->superblock_coding[i] == SB_PARTIALLY_CODED) {
/* fragment may or may not be coded; this is the case /* fragment may or may not be coded; this is the case
* that cares about the fragment coding runs */ * that cares about the fragment coding runs */
if (current_run-- == 0) { if (current_run-- == 0) {
bit ^= 1; bit ^= 1;
current_run = get_vlc2(gb, current_run = get_vlc2(gb, s->fragment_run_length_vlc.table, 5, 2);
s->fragment_run_length_vlc.table, 5, 2);
} }
coded = bit; coded = bit;
} }
...@@ -564,7 +564,8 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -564,7 +564,8 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
for (i = 0; i < 64; i++) for (i = 0; i < 64; i++)
s->num_coded_frags[plane][i] = num_coded_frags; s->num_coded_frags[plane][i] = num_coded_frags;
if (plane < 2) if (plane < 2)
s->coded_fragment_list[plane+1] = s->coded_fragment_list[plane] + num_coded_frags; s->coded_fragment_list[plane + 1] = s->coded_fragment_list[plane] +
num_coded_frags;
} }
return 0; return 0;
} }
...@@ -587,9 +588,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -587,9 +588,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
if (s->keyframe) { if (s->keyframe) {
for (i = 0; i < s->fragment_count; i++) for (i = 0; i < s->fragment_count; i++)
s->all_fragments[i].coding_method = MODE_INTRA; s->all_fragments[i].coding_method = MODE_INTRA;
} else { } else {
/* fetch the mode coding scheme for this frame */ /* fetch the mode coding scheme for this frame */
scheme = get_bits(gb, 3); scheme = get_bits(gb, 3);
...@@ -601,7 +600,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -601,7 +600,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
custom_mode_alphabet[get_bits(gb, 3)] = i; custom_mode_alphabet[get_bits(gb, 3)] = i;
alphabet = custom_mode_alphabet; alphabet = custom_mode_alphabet;
} else } else
alphabet = ModeAlphabet[scheme-1]; alphabet = ModeAlphabet[scheme - 1];
/* iterate through all of the macroblocks that contain 1 or more /* iterate through all of the macroblocks that contain 1 or more
* coded fragments */ * coded fragments */
...@@ -611,19 +610,22 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -611,19 +610,22 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
return -1; return -1;
for (j = 0; j < 4; j++) { for (j = 0; j < 4; j++) {
int mb_x = 2*sb_x + (j>>1); int mb_x = 2 * sb_x + (j >> 1);
int mb_y = 2*sb_y + (((j>>1)+j)&1); int mb_y = 2 * sb_y + (((j >> 1) + j) & 1);
current_macroblock = mb_y * s->macroblock_width + mb_x; current_macroblock = mb_y * s->macroblock_width + mb_x;
if (mb_x >= s->macroblock_width || mb_y >= s->macroblock_height) if (mb_x >= s->macroblock_width ||
mb_y >= s->macroblock_height)
continue; continue;
#define BLOCK_X (2*mb_x + (k&1)) #define BLOCK_X (2 * mb_x + (k & 1))
#define BLOCK_Y (2*mb_y + (k>>1)) #define BLOCK_Y (2 * mb_y + (k >> 1))
/* coding modes are only stored if the macroblock has at least one /* coding modes are only stored if the macroblock has
* luma block coded, otherwise it must be INTER_NO_MV */ * at least one luma block coded, otherwise it must be
* INTER_NO_MV */
for (k = 0; k < 4; k++) { for (k = 0; k < 4; k++) {
current_fragment = BLOCK_Y*s->fragment_width[0] + BLOCK_X; current_fragment = BLOCK_Y *
s->fragment_width[0] + BLOCK_X;
if (s->all_fragments[current_fragment].coding_method != MODE_COPY) if (s->all_fragments[current_fragment].coding_method != MODE_COPY)
break; break;
} }
...@@ -636,34 +638,36 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -636,34 +638,36 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
if (scheme == 7) if (scheme == 7)
coding_mode = get_bits(gb, 3); coding_mode = get_bits(gb, 3);
else else
coding_mode = alphabet coding_mode = alphabet[get_vlc2(gb, s->mode_code_vlc.table, 3, 3)];
[get_vlc2(gb, s->mode_code_vlc.table, 3, 3)];
s->macroblock_coding[current_macroblock] = coding_mode; s->macroblock_coding[current_macroblock] = coding_mode;
for (k = 0; k < 4; k++) { for (k = 0; k < 4; k++) {
frag = s->all_fragments + BLOCK_Y*s->fragment_width[0] + BLOCK_X; frag = s->all_fragments + BLOCK_Y * s->fragment_width[0] + BLOCK_X;
if (frag->coding_method != MODE_COPY) if (frag->coding_method != MODE_COPY)
frag->coding_method = coding_mode; frag->coding_method = coding_mode;
} }
#define SET_CHROMA_MODES \ #define SET_CHROMA_MODES \
if (frag[s->fragment_start[1]].coding_method != MODE_COPY) \ if (frag[s->fragment_start[1]].coding_method != MODE_COPY) \
frag[s->fragment_start[1]].coding_method = coding_mode;\ frag[s->fragment_start[1]].coding_method = coding_mode; \
if (frag[s->fragment_start[2]].coding_method != MODE_COPY) \ if (frag[s->fragment_start[2]].coding_method != MODE_COPY) \
frag[s->fragment_start[2]].coding_method = coding_mode; frag[s->fragment_start[2]].coding_method = coding_mode;
if (s->chroma_y_shift) { if (s->chroma_y_shift) {
frag = s->all_fragments + mb_y*s->fragment_width[1] + mb_x; frag = s->all_fragments + mb_y *
s->fragment_width[1] + mb_x;
SET_CHROMA_MODES SET_CHROMA_MODES
} else if (s->chroma_x_shift) { } else if (s->chroma_x_shift) {
frag = s->all_fragments + 2*mb_y*s->fragment_width[1] + mb_x; frag = s->all_fragments +
2 * mb_y * s->fragment_width[1] + mb_x;
for (k = 0; k < 2; k++) { for (k = 0; k < 2; k++) {
SET_CHROMA_MODES SET_CHROMA_MODES
frag += s->fragment_width[1]; frag += s->fragment_width[1];
} }
} else { } else {
for (k = 0; k < 4; k++) { for (k = 0; k < 4; k++) {
frag = s->all_fragments + BLOCK_Y*s->fragment_width[1] + BLOCK_X; frag = s->all_fragments +
BLOCK_Y * s->fragment_width[1] + BLOCK_X;
SET_CHROMA_MODES SET_CHROMA_MODES
} }
} }
...@@ -707,16 +711,16 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -707,16 +711,16 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
return -1; return -1;
for (j = 0; j < 4; j++) { for (j = 0; j < 4; j++) {
int mb_x = 2*sb_x + (j>>1); int mb_x = 2 * sb_x + (j >> 1);
int mb_y = 2*sb_y + (((j>>1)+j)&1); int mb_y = 2 * sb_y + (((j >> 1) + j) & 1);
current_macroblock = mb_y * s->macroblock_width + mb_x; current_macroblock = mb_y * s->macroblock_width + mb_x;
if (mb_x >= s->macroblock_width || mb_y >= s->macroblock_height || if (mb_x >= s->macroblock_width ||
(s->macroblock_coding[current_macroblock] == MODE_COPY)) mb_y >= s->macroblock_height ||
s->macroblock_coding[current_macroblock] == MODE_COPY)
continue; continue;
switch (s->macroblock_coding[current_macroblock]) { switch (s->macroblock_coding[current_macroblock]) {
case MODE_INTER_PLUS_MV: case MODE_INTER_PLUS_MV:
case MODE_GOLDEN_MV: case MODE_GOLDEN_MV:
/* all 6 fragments use the same motion vector */ /* all 6 fragments use the same motion vector */
...@@ -729,8 +733,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -729,8 +733,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
} }
/* vector maintenance, only on MODE_INTER_PLUS_MV */ /* vector maintenance, only on MODE_INTER_PLUS_MV */
if (s->macroblock_coding[current_macroblock] == if (s->macroblock_coding[current_macroblock] == MODE_INTER_PLUS_MV) {
MODE_INTER_PLUS_MV) {
prior_last_motion_x = last_motion_x; prior_last_motion_x = last_motion_x;
prior_last_motion_y = last_motion_y; prior_last_motion_y = last_motion_y;
last_motion_x = motion_x[0]; last_motion_x = motion_x[0];
...@@ -746,7 +749,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -746,7 +749,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
/* fetch 4 vectors from the bitstream, one for each /* fetch 4 vectors from the bitstream, one for each
* Y fragment, then average for the C fragment vectors */ * Y fragment, then average for the C fragment vectors */
for (k = 0; k < 4; k++) { for (k = 0; k < 4; k++) {
current_fragment = BLOCK_Y*s->fragment_width[0] + BLOCK_X; current_fragment = BLOCK_Y * s->fragment_width[0] + BLOCK_X;
if (s->all_fragments[current_fragment].coding_method != MODE_COPY) { if (s->all_fragments[current_fragment].coding_method != MODE_COPY) {
if (coding_mode == 0) { if (coding_mode == 0) {
motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
...@@ -798,7 +801,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -798,7 +801,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
/* assign the motion vectors to the correct fragments */ /* assign the motion vectors to the correct fragments */
for (k = 0; k < 4; k++) { for (k = 0; k < 4; k++) {
current_fragment = current_fragment =
BLOCK_Y*s->fragment_width[0] + BLOCK_X; BLOCK_Y * s->fragment_width[0] + BLOCK_X;
if (s->macroblock_coding[current_macroblock] == MODE_INTER_FOURMV) { if (s->macroblock_coding[current_macroblock] == MODE_INTER_FOURMV) {
s->motion_val[0][current_fragment][0] = motion_x[k]; s->motion_val[0][current_fragment][0] = motion_x[k];
s->motion_val[0][current_fragment][1] = motion_y[k]; s->motion_val[0][current_fragment][1] = motion_y[k];
...@@ -810,12 +813,14 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -810,12 +813,14 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
if (s->chroma_y_shift) { if (s->chroma_y_shift) {
if (s->macroblock_coding[current_macroblock] == MODE_INTER_FOURMV) { if (s->macroblock_coding[current_macroblock] == MODE_INTER_FOURMV) {
motion_x[0] = RSHIFT(motion_x[0] + motion_x[1] + motion_x[2] + motion_x[3], 2); motion_x[0] = RSHIFT(motion_x[0] + motion_x[1] +
motion_y[0] = RSHIFT(motion_y[0] + motion_y[1] + motion_y[2] + motion_y[3], 2); motion_x[2] + motion_x[3], 2);
} motion_y[0] = RSHIFT(motion_y[0] + motion_y[1] +
motion_x[0] = (motion_x[0]>>1) | (motion_x[0]&1); motion_y[2] + motion_y[3], 2);
motion_y[0] = (motion_y[0]>>1) | (motion_y[0]&1); }
frag = mb_y*s->fragment_width[1] + mb_x; motion_x[0] = (motion_x[0] >> 1) | (motion_x[0] & 1);
motion_y[0] = (motion_y[0] >> 1) | (motion_y[0] & 1);
frag = mb_y * s->fragment_width[1] + mb_x;
s->motion_val[1][frag][0] = motion_x[0]; s->motion_val[1][frag][0] = motion_x[0];
s->motion_val[1][frag][1] = motion_y[0]; s->motion_val[1][frag][1] = motion_y[0];
} else if (s->chroma_x_shift) { } else if (s->chroma_x_shift) {
...@@ -828,10 +833,10 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -828,10 +833,10 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
motion_x[1] = motion_x[0]; motion_x[1] = motion_x[0];
motion_y[1] = motion_y[0]; motion_y[1] = motion_y[0];
} }
motion_x[0] = (motion_x[0]>>1) | (motion_x[0]&1); motion_x[0] = (motion_x[0] >> 1) | (motion_x[0] & 1);
motion_x[1] = (motion_x[1]>>1) | (motion_x[1]&1); motion_x[1] = (motion_x[1] >> 1) | (motion_x[1] & 1);
frag = 2*mb_y*s->fragment_width[1] + mb_x; frag = 2 * mb_y * s->fragment_width[1] + mb_x;
for (k = 0; k < 2; k++) { for (k = 0; k < 2; k++) {
s->motion_val[1][frag][0] = motion_x[k]; s->motion_val[1][frag][0] = motion_x[k];
s->motion_val[1][frag][1] = motion_y[k]; s->motion_val[1][frag][1] = motion_y[k];
...@@ -839,7 +844,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -839,7 +844,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
} }
} else { } else {
for (k = 0; k < 4; k++) { for (k = 0; k < 4; k++) {
frag = BLOCK_Y*s->fragment_width[1] + BLOCK_X; frag = BLOCK_Y * s->fragment_width[1] + BLOCK_X;
if (s->macroblock_coding[current_macroblock] == MODE_INTER_FOURMV) { if (s->macroblock_coding[current_macroblock] == MODE_INTER_FOURMV) {
s->motion_val[1][frag][0] = motion_x[k]; s->motion_val[1][frag][0] = motion_x[k];
s->motion_val[1][frag][1] = motion_y[k]; s->motion_val[1][frag][1] = motion_y[k];
...@@ -861,7 +866,7 @@ static int unpack_block_qpis(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -861,7 +866,7 @@ static int unpack_block_qpis(Vp3DecodeContext *s, GetBitContext *gb)
int qpi, i, j, bit, run_length, blocks_decoded, num_blocks_at_qpi; int qpi, i, j, bit, run_length, blocks_decoded, num_blocks_at_qpi;
int num_blocks = s->total_num_coded_frags; int num_blocks = s->total_num_coded_frags;
for (qpi = 0; qpi < s->nqps-1 && num_blocks > 0; qpi++) { for (qpi = 0; qpi < s->nqps - 1 && num_blocks > 0; qpi++) {
i = blocks_decoded = num_blocks_at_qpi = 0; i = blocks_decoded = num_blocks_at_qpi = 0;
bit = get_bits1(gb) ^ 1; bit = get_bits1(gb) ^ 1;
...@@ -928,16 +933,19 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb, ...@@ -928,16 +933,19 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
/* local references to structure members to avoid repeated deferences */ /* local references to structure members to avoid repeated deferences */
int *coded_fragment_list = s->coded_fragment_list[plane]; int *coded_fragment_list = s->coded_fragment_list[plane];
Vp3Fragment *all_fragments = s->all_fragments; Vp3Fragment *all_fragments = s->all_fragments;
VLC_TYPE (*vlc_table)[2] = table->table; VLC_TYPE(*vlc_table)[2] = table->table;
if (num_coeffs < 0) if (num_coeffs < 0)
av_log(s->avctx, AV_LOG_ERROR, "Invalid number of coefficents at level %d\n", coeff_index); av_log(s->avctx, AV_LOG_ERROR,
"Invalid number of coefficents at level %d\n", coeff_index);
if (eob_run > num_coeffs) { if (eob_run > num_coeffs) {
coeff_i = blocks_ended = num_coeffs; coeff_i =
blocks_ended = num_coeffs;
eob_run -= num_coeffs; eob_run -= num_coeffs;
} else { } else {
coeff_i = blocks_ended = eob_run; coeff_i =
blocks_ended = eob_run;
eob_run = 0; eob_run = 0;
} }
...@@ -991,19 +999,19 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb, ...@@ -991,19 +999,19 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
} }
if (coeff_index + zero_run > 64) { if (coeff_index + zero_run > 64) {
av_log(s->avctx, AV_LOG_DEBUG, "Invalid zero run of %d with" av_log(s->avctx, AV_LOG_DEBUG,
" %d coeffs left\n", zero_run, 64-coeff_index); "Invalid zero run of %d with %d coeffs left\n",
zero_run, 64 - coeff_index);
zero_run = 64 - coeff_index; zero_run = 64 - coeff_index;
} }
// zero runs code multiple coefficients, // zero runs code multiple coefficients,
// so don't try to decode coeffs for those higher levels // so don't try to decode coeffs for those higher levels
for (i = coeff_index+1; i <= coeff_index+zero_run; i++) for (i = coeff_index + 1; i <= coeff_index + zero_run; i++)
s->num_coded_frags[plane][i]--; s->num_coded_frags[plane][i]--;
coeff_i++; coeff_i++;
} else { } else {
av_log(s->avctx, AV_LOG_ERROR, av_log(s->avctx, AV_LOG_ERROR, "Invalid token %d\n", token);
"Invalid token %d\n", token);
return -1; return -1;
} }
} }
...@@ -1014,14 +1022,14 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb, ...@@ -1014,14 +1022,14 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
// decrement the number of blocks that have higher coeffecients for each // decrement the number of blocks that have higher coeffecients for each
// EOB run at this level // EOB run at this level
if (blocks_ended) if (blocks_ended)
for (i = coeff_index+1; i < 64; i++) for (i = coeff_index + 1; i < 64; i++)
s->num_coded_frags[plane][i] -= blocks_ended; s->num_coded_frags[plane][i] -= blocks_ended;
// setup the next buffer // setup the next buffer
if (plane < 2) if (plane < 2)
s->dct_tokens[plane+1][coeff_index] = dct_tokens + j; s->dct_tokens[plane + 1][coeff_index] = dct_tokens + j;
else if (coeff_index < 63) else if (coeff_index < 63)
s->dct_tokens[0][coeff_index+1] = dct_tokens + j; s->dct_tokens[0][coeff_index + 1] = dct_tokens + j;
return eob_run; return eob_run;
} }
...@@ -1071,8 +1079,7 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb) ...@@ -1071,8 +1079,7 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
return residual_eob_run; return residual_eob_run;
/* reverse prediction of the C-plane DC coefficients */ /* reverse prediction of the C-plane DC coefficients */
if (!(s->avctx->flags & CODEC_FLAG_GRAY)) if (!(s->avctx->flags & CODEC_FLAG_GRAY)) {
{
reverse_dc_prediction(s, s->fragment_start[1], reverse_dc_prediction(s, s->fragment_start[1],
s->fragment_width[1], s->fragment_height[1]); s->fragment_width[1], s->fragment_height[1]);
reverse_dc_prediction(s, s->fragment_start[2], reverse_dc_prediction(s, s->fragment_start[2],
...@@ -1135,7 +1142,6 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, ...@@ -1135,7 +1142,6 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
int fragment_width, int fragment_width,
int fragment_height) int fragment_height)
{ {
#define PUL 8 #define PUL 8
#define PU 4 #define PU 4
#define PUR 2 #define PUR 2
...@@ -1160,22 +1166,22 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, ...@@ -1160,22 +1166,22 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
* 3: left multiplier * 3: left multiplier
*/ */
static const int predictor_transform[16][4] = { static const int predictor_transform[16][4] = {
{ 0, 0, 0, 0}, { 0, 0, 0, 0 },
{ 0, 0, 0,128}, // PL { 0, 0, 0, 128 }, // PL
{ 0, 0,128, 0}, // PUR { 0, 0, 128, 0 }, // PUR
{ 0, 0, 53, 75}, // PUR|PL { 0, 0, 53, 75 }, // PUR|PL
{ 0,128, 0, 0}, // PU { 0, 128, 0, 0 }, // PU
{ 0, 64, 0, 64}, // PU|PL { 0, 64, 0, 64 }, // PU |PL
{ 0,128, 0, 0}, // PU|PUR { 0, 128, 0, 0 }, // PU |PUR
{ 0, 0, 53, 75}, // PU|PUR|PL { 0, 0, 53, 75 }, // PU |PUR|PL
{128, 0, 0, 0}, // PUL { 128, 0, 0, 0 }, // PUL
{ 0, 0, 0,128}, // PUL|PL { 0, 0, 0, 128 }, // PUL|PL
{ 64, 0, 64, 0}, // PUL|PUR { 64, 0, 64, 0 }, // PUL|PUR
{ 0, 0, 53, 75}, // PUL|PUR|PL { 0, 0, 53, 75 }, // PUL|PUR|PL
{ 0,128, 0, 0}, // PUL|PU { 0, 128, 0, 0 }, // PUL|PU
{-104,116, 0,116}, // PUL|PU|PL { -104, 116, 0, 116 }, // PUL|PU |PL
{ 24, 80, 24, 0}, // PUL|PU|PUR { 24, 80, 24, 0 }, // PUL|PU |PUR
{-104,116, 0,116} // PUL|PU|PUR|PL { -104, 116, 0, 116 } // PUL|PU |PUR|PL
}; };
/* This table shows which types of blocks can use other blocks for /* This table shows which types of blocks can use other blocks for
...@@ -1202,54 +1208,55 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, ...@@ -1202,54 +1208,55 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
int transform = 0; int transform = 0;
vul = vu = vur = vl = 0; vul =
last_dc[0] = last_dc[1] = last_dc[2] = 0; vu =
vur =
vl = 0;
last_dc[0] =
last_dc[1] =
last_dc[2] = 0;
/* for each fragment row... */ /* for each fragment row... */
for (y = 0; y < fragment_height; y++) { for (y = 0; y < fragment_height; y++) {
/* for each fragment in a row... */ /* for each fragment in a row... */
for (x = 0; x < fragment_width; x++, i++) { for (x = 0; x < fragment_width; x++, i++) {
/* reverse prediction if this block was coded */ /* reverse prediction if this block was coded */
if (s->all_fragments[i].coding_method != MODE_COPY) { if (s->all_fragments[i].coding_method != MODE_COPY) {
current_frame_type = current_frame_type =
compatible_frame[s->all_fragments[i].coding_method]; compatible_frame[s->all_fragments[i].coding_method];
transform= 0; transform = 0;
if(x){ if (x) {
l= i-1; l = i - 1;
vl = DC_COEFF(l); vl = DC_COEFF(l);
if(COMPATIBLE_FRAME(l)) if (COMPATIBLE_FRAME(l))
transform |= PL; transform |= PL;
} }
if(y){ if (y) {
u= i-fragment_width; u = i - fragment_width;
vu = DC_COEFF(u); vu = DC_COEFF(u);
if(COMPATIBLE_FRAME(u)) if (COMPATIBLE_FRAME(u))
transform |= PU; transform |= PU;
if(x){ if (x) {
ul= i-fragment_width-1; ul = i - fragment_width - 1;
vul = DC_COEFF(ul); vul = DC_COEFF(ul);
if(COMPATIBLE_FRAME(ul)) if (COMPATIBLE_FRAME(ul))
transform |= PUL; transform |= PUL;
} }
if(x + 1 < fragment_width){ if (x + 1 < fragment_width) {
ur= i-fragment_width+1; ur = i - fragment_width + 1;
vur = DC_COEFF(ur); vur = DC_COEFF(ur);
if(COMPATIBLE_FRAME(ur)) if (COMPATIBLE_FRAME(ur))
transform |= PUR; transform |= PUR;
} }
} }
if (transform == 0) { if (transform == 0) {
/* if there were no fragments to predict from, use last /* if there were no fragments to predict from, use last
* DC saved */ * DC saved */
predicted_dc = last_dc[current_frame_type]; predicted_dc = last_dc[current_frame_type];
} else { } else {
/* apply the appropriate predictor transform */ /* apply the appropriate predictor transform */
predicted_dc = predicted_dc =
(predictor_transform[transform][0] * vul) + (predictor_transform[transform][0] * vul) +
...@@ -1280,39 +1287,39 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, ...@@ -1280,39 +1287,39 @@ static void reverse_dc_prediction(Vp3DecodeContext *s,
} }
} }
static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int yend) static void apply_loop_filter(Vp3DecodeContext *s, int plane,
int ystart, int yend)
{ {
int x, y; int x, y;
int *bounding_values= s->bounding_values_array+127; int *bounding_values = s->bounding_values_array + 127;
int width = s->fragment_width[!!plane]; int width = s->fragment_width[!!plane];
int height = s->fragment_height[!!plane]; int height = s->fragment_height[!!plane];
int fragment = s->fragment_start [plane] + ystart * width; int fragment = s->fragment_start[plane] + ystart * width;
ptrdiff_t stride = s->current_frame.f->linesize[plane]; ptrdiff_t stride = s->current_frame.f->linesize[plane];
uint8_t *plane_data = s->current_frame.f->data [plane]; uint8_t *plane_data = s->current_frame.f->data[plane];
if (!s->flipped_image) stride = -stride; if (!s->flipped_image)
plane_data += s->data_offset[plane] + 8*ystart*stride; stride = -stride;
plane_data += s->data_offset[plane] + 8 * ystart * stride;
for (y = ystart; y < yend; y++) { for (y = ystart; y < yend; y++) {
for (x = 0; x < width; x++) { for (x = 0; x < width; x++) {
/* This code basically just deblocks on the edges of coded blocks. /* This code basically just deblocks on the edges of coded blocks.
* However, it has to be much more complicated because of the * However, it has to be much more complicated because of the
* braindamaged deblock ordering used in VP3/Theora. Order matters * braindamaged deblock ordering used in VP3/Theora. Order matters
* because some pixels get filtered twice. */ * because some pixels get filtered twice. */
if( s->all_fragments[fragment].coding_method != MODE_COPY ) if (s->all_fragments[fragment].coding_method != MODE_COPY) {
{
/* do not perform left edge filter for left columns frags */ /* do not perform left edge filter for left columns frags */
if (x > 0) { if (x > 0) {
s->vp3dsp.h_loop_filter( s->vp3dsp.h_loop_filter(
plane_data + 8*x, plane_data + 8 * x,
stride, bounding_values); stride, bounding_values);
} }
/* do not perform top edge filter for top row fragments */ /* do not perform top edge filter for top row fragments */
if (y > 0) { if (y > 0) {
s->vp3dsp.v_loop_filter( s->vp3dsp.v_loop_filter(
plane_data + 8*x, plane_data + 8 * x,
stride, bounding_values); stride, bounding_values);
} }
...@@ -1322,7 +1329,7 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye ...@@ -1322,7 +1329,7 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye
if ((x < width - 1) && if ((x < width - 1) &&
(s->all_fragments[fragment + 1].coding_method == MODE_COPY)) { (s->all_fragments[fragment + 1].coding_method == MODE_COPY)) {
s->vp3dsp.h_loop_filter( s->vp3dsp.h_loop_filter(
plane_data + 8*x + 8, plane_data + 8 * x + 8,
stride, bounding_values); stride, bounding_values);
} }
...@@ -1332,14 +1339,14 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye ...@@ -1332,14 +1339,14 @@ static void apply_loop_filter(Vp3DecodeContext *s, int plane, int ystart, int ye
if ((y < height - 1) && if ((y < height - 1) &&
(s->all_fragments[fragment + width].coding_method == MODE_COPY)) { (s->all_fragments[fragment + width].coding_method == MODE_COPY)) {
s->vp3dsp.v_loop_filter( s->vp3dsp.v_loop_filter(
plane_data + 8*x + 8*stride, plane_data + 8 * x + 8 * stride,
stride, bounding_values); stride, bounding_values);
} }
} }
fragment++; fragment++;
} }
plane_data += 8*stride; plane_data += 8 * stride;
} }
} }
...@@ -1358,7 +1365,7 @@ static inline int vp3_dequant(Vp3DecodeContext *s, Vp3Fragment *frag, ...@@ -1358,7 +1365,7 @@ static inline int vp3_dequant(Vp3DecodeContext *s, Vp3Fragment *frag,
int token = *s->dct_tokens[plane][i]; int token = *s->dct_tokens[plane][i];
switch (token & 3) { switch (token & 3) {
case 0: // EOB case 0: // EOB
if (--token < 4) // 0-3 are token types, so the EOB run must now be 0 if (--token < 4) // 0-3 are token types so the EOB run must now be 0
s->dct_tokens[plane][i]++; s->dct_tokens[plane][i]++;
else else
*s->dct_tokens[plane][i] = token & ~3; *s->dct_tokens[plane][i] = token & ~3;
...@@ -1397,30 +1404,32 @@ static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y) ...@@ -1397,30 +1404,32 @@ static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y)
int h, cy, i; int h, cy, i;
int offset[AV_NUM_DATA_POINTERS]; int offset[AV_NUM_DATA_POINTERS];
if (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) { if (HAVE_THREADS && s->avctx->active_thread_type & FF_THREAD_FRAME) {
int y_flipped = s->flipped_image ? s->avctx->height-y : y; int y_flipped = s->flipped_image ? s->avctx->height - y : y;
// At the end of the frame, report INT_MAX instead of the height of the frame. /* At the end of the frame, report INT_MAX instead of the height of
// This makes the other threads' ff_thread_await_progress() calls cheaper, because * the frame. This makes the other threads' ff_thread_await_progress()
// they don't have to clip their values. * calls cheaper, because they don't have to clip their values. */
ff_thread_report_progress(&s->current_frame, y_flipped==s->avctx->height ? INT_MAX : y_flipped-1, 0); ff_thread_report_progress(&s->current_frame,
y_flipped == s->avctx->height ? INT_MAX
: y_flipped - 1,
0);
} }
if(s->avctx->draw_horiz_band==NULL) if (s->avctx->draw_horiz_band == NULL)
return; return;
h= y - s->last_slice_end; h = y - s->last_slice_end;
s->last_slice_end= y; s->last_slice_end = y;
y -= h; y -= h;
if (!s->flipped_image) { if (!s->flipped_image)
y = s->avctx->height - y - h; y = s->avctx->height - y - h;
}
cy = y >> s->chroma_y_shift; cy = y >> s->chroma_y_shift;
offset[0] = s->current_frame.f->linesize[0]*y; offset[0] = s->current_frame.f->linesize[0] * y;
offset[1] = s->current_frame.f->linesize[1]*cy; offset[1] = s->current_frame.f->linesize[1] * cy;
offset[2] = s->current_frame.f->linesize[2]*cy; offset[2] = s->current_frame.f->linesize[2] * cy;
for (i = 3; i < AV_NUM_DATA_POINTERS; i++) for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
offset[i] = 0; offset[i] = 0;
...@@ -1432,11 +1441,12 @@ static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y) ...@@ -1432,11 +1441,12 @@ static void vp3_draw_horiz_band(Vp3DecodeContext *s, int y)
* Wait for the reference frame of the current fragment. * Wait for the reference frame of the current fragment.
* The progress value is in luma pixel rows. * The progress value is in luma pixel rows.
*/ */
static void await_reference_row(Vp3DecodeContext *s, Vp3Fragment *fragment, int motion_y, int y) static void await_reference_row(Vp3DecodeContext *s, Vp3Fragment *fragment,
int motion_y, int y)
{ {
ThreadFrame *ref_frame; ThreadFrame *ref_frame;
int ref_row; int ref_row;
int border = motion_y&1; int border = motion_y & 1;
if (fragment->coding_method == MODE_USING_GOLDEN || if (fragment->coding_method == MODE_USING_GOLDEN ||
fragment->coding_method == MODE_GOLDEN_MV) fragment->coding_method == MODE_GOLDEN_MV)
...@@ -1444,7 +1454,7 @@ static void await_reference_row(Vp3DecodeContext *s, Vp3Fragment *fragment, int ...@@ -1444,7 +1454,7 @@ static void await_reference_row(Vp3DecodeContext *s, Vp3Fragment *fragment, int
else else
ref_frame = &s->last_frame; ref_frame = &s->last_frame;
ref_row = y + (motion_y>>1); ref_row = y + (motion_y >> 1);
ref_row = FFMAX(FFABS(ref_row), ref_row + 8 + border); ref_row = FFMAX(FFABS(ref_row), ref_row + 8 + border);
ff_thread_await_progress(ref_frame, ref_row, 0); ff_thread_await_progress(ref_frame, ref_row, 0);
...@@ -1467,38 +1477,43 @@ static void render_slice(Vp3DecodeContext *s, int slice) ...@@ -1467,38 +1477,43 @@ static void render_slice(Vp3DecodeContext *s, int slice)
return; return;
for (plane = 0; plane < 3; plane++) { for (plane = 0; plane < 3; plane++) {
uint8_t *output_plane = s->current_frame.f->data [plane] + s->data_offset[plane]; uint8_t *output_plane = s->current_frame.f->data[plane] +
uint8_t * last_plane = s-> last_frame.f->data [plane] + s->data_offset[plane]; s->data_offset[plane];
uint8_t *golden_plane = s-> golden_frame.f->data [plane] + s->data_offset[plane]; uint8_t *last_plane = s->last_frame.f->data[plane] +
s->data_offset[plane];
uint8_t *golden_plane = s->golden_frame.f->data[plane] +
s->data_offset[plane];
ptrdiff_t stride = s->current_frame.f->linesize[plane]; ptrdiff_t stride = s->current_frame.f->linesize[plane];
int plane_width = s->width >> (plane && s->chroma_x_shift); int plane_width = s->width >> (plane && s->chroma_x_shift);
int plane_height = s->height >> (plane && s->chroma_y_shift); int plane_height = s->height >> (plane && s->chroma_y_shift);
int8_t (*motion_val)[2] = s->motion_val[!!plane]; int8_t(*motion_val)[2] = s->motion_val[!!plane];
int sb_x, sb_y = slice << (!plane && s->chroma_y_shift); int sb_x, sb_y = slice << (!plane && s->chroma_y_shift);
int slice_height = sb_y + 1 + (!plane && s->chroma_y_shift); int slice_height = sb_y + 1 + (!plane && s->chroma_y_shift);
int slice_width = plane ? s->c_superblock_width : s->y_superblock_width; int slice_width = plane ? s->c_superblock_width
: s->y_superblock_width;
int fragment_width = s->fragment_width[!!plane]; int fragment_width = s->fragment_width[!!plane];
int fragment_height = s->fragment_height[!!plane]; int fragment_height = s->fragment_height[!!plane];
int fragment_start = s->fragment_start[plane]; int fragment_start = s->fragment_start[plane];
int do_await = !plane && HAVE_THREADS && (s->avctx->active_thread_type&FF_THREAD_FRAME);
if (!s->flipped_image) stride = -stride; int do_await = !plane && HAVE_THREADS &&
(s->avctx->active_thread_type & FF_THREAD_FRAME);
if (!s->flipped_image)
stride = -stride;
if (CONFIG_GRAY && plane && (s->avctx->flags & CODEC_FLAG_GRAY)) if (CONFIG_GRAY && plane && (s->avctx->flags & CODEC_FLAG_GRAY))
continue; continue;
/* for each superblock row in the slice (both of them)... */ /* for each superblock row in the slice (both of them)... */
for (; sb_y < slice_height; sb_y++) { for (; sb_y < slice_height; sb_y++) {
/* for each superblock in a row... */ /* for each superblock in a row... */
for (sb_x = 0; sb_x < slice_width; sb_x++) { for (sb_x = 0; sb_x < slice_width; sb_x++) {
/* for each block in a superblock... */ /* for each block in a superblock... */
for (j = 0; j < 16; j++) { for (j = 0; j < 16; j++) {
x = 4*sb_x + hilbert_offset[j][0]; x = 4 * sb_x + hilbert_offset[j][0];
y = 4*sb_y + hilbert_offset[j][1]; y = 4 * sb_y + hilbert_offset[j][1];
fragment = y*fragment_width + x; fragment = y * fragment_width + x;
i = fragment_start + fragment; i = fragment_start + fragment;
...@@ -1506,18 +1521,21 @@ static void render_slice(Vp3DecodeContext *s, int slice) ...@@ -1506,18 +1521,21 @@ static void render_slice(Vp3DecodeContext *s, int slice)
if (x >= fragment_width || y >= fragment_height) if (x >= fragment_width || y >= fragment_height)
continue; continue;
first_pixel = 8*y*stride + 8*x; first_pixel = 8 * y * stride + 8 * x;
if (do_await && s->all_fragments[i].coding_method != MODE_INTRA) if (do_await &&
await_reference_row(s, &s->all_fragments[i], motion_val[fragment][1], (16*y) >> s->chroma_y_shift); s->all_fragments[i].coding_method != MODE_INTRA)
await_reference_row(s, &s->all_fragments[i],
motion_val[fragment][1],
(16 * y) >> s->chroma_y_shift);
/* transform if this block was coded */ /* transform if this block was coded */
if (s->all_fragments[i].coding_method != MODE_COPY) { if (s->all_fragments[i].coding_method != MODE_COPY) {
if ((s->all_fragments[i].coding_method == MODE_USING_GOLDEN) || if ((s->all_fragments[i].coding_method == MODE_USING_GOLDEN) ||
(s->all_fragments[i].coding_method == MODE_GOLDEN_MV)) (s->all_fragments[i].coding_method == MODE_GOLDEN_MV))
motion_source= golden_plane; motion_source = golden_plane;
else else
motion_source= last_plane; motion_source = last_plane;
motion_source += first_pixel; motion_source += first_pixel;
motion_halfpel_index = 0; motion_halfpel_index = 0;
...@@ -1530,8 +1548,8 @@ static void render_slice(Vp3DecodeContext *s, int slice) ...@@ -1530,8 +1548,8 @@ static void render_slice(Vp3DecodeContext *s, int slice)
motion_x = motion_val[fragment][0]; motion_x = motion_val[fragment][0];
motion_y = motion_val[fragment][1]; motion_y = motion_val[fragment][1];
src_x= (motion_x>>1) + 8*x; src_x = (motion_x >> 1) + 8 * x;
src_y= (motion_y>>1) + 8*y; src_y = (motion_y >> 1) + 8 * y;
motion_halfpel_index = motion_x & 0x01; motion_halfpel_index = motion_x & 0x01;
motion_source += (motion_x >> 1); motion_source += (motion_x >> 1);
...@@ -1539,35 +1557,38 @@ static void render_slice(Vp3DecodeContext *s, int slice) ...@@ -1539,35 +1557,38 @@ static void render_slice(Vp3DecodeContext *s, int slice)
motion_halfpel_index |= (motion_y & 0x01) << 1; motion_halfpel_index |= (motion_y & 0x01) << 1;
motion_source += ((motion_y >> 1) * stride); motion_source += ((motion_y >> 1) * stride);
if(src_x<0 || src_y<0 || src_x + 9 >= plane_width || src_y + 9 >= plane_height){ if (src_x < 0 || src_y < 0 ||
uint8_t *temp= s->edge_emu_buffer; src_x + 9 >= plane_width ||
if(stride<0) temp -= 8*stride; src_y + 9 >= plane_height) {
uint8_t *temp = s->edge_emu_buffer;
if (stride < 0)
temp -= 8 * stride;
s->vdsp.emulated_edge_mc(temp, motion_source, s->vdsp.emulated_edge_mc(temp, motion_source,
stride, stride, stride, stride,
9, 9, src_x, src_y, 9, 9, src_x, src_y,
plane_width, plane_width,
plane_height); plane_height);
motion_source= temp; motion_source = temp;
} }
} }
/* first, take care of copying a block from either the /* first, take care of copying a block from either the
* previous or the golden frame */ * previous or the golden frame */
if (s->all_fragments[i].coding_method != MODE_INTRA) { if (s->all_fragments[i].coding_method != MODE_INTRA) {
/* Note, it is possible to implement all MC cases with /* Note, it is possible to implement all MC cases
put_no_rnd_pixels_l2 which would look more like the * with put_no_rnd_pixels_l2 which would look more
VP3 source but this would be slower as * like the VP3 source but this would be slower as
put_no_rnd_pixels_tab is better optimzed */ * put_no_rnd_pixels_tab is better optimzed */
if(motion_halfpel_index != 3){ if (motion_halfpel_index != 3) {
s->hdsp.put_no_rnd_pixels_tab[1][motion_halfpel_index]( s->hdsp.put_no_rnd_pixels_tab[1][motion_halfpel_index](
output_plane + first_pixel, output_plane + first_pixel,
motion_source, stride, 8); motion_source, stride, 8);
}else{ } else {
int d= (motion_x ^ motion_y)>>31; // d is 0 if motion_x and _y have the same sign, else -1 /* d is 0 if motion_x and _y have the same sign,
s->vp3dsp.put_no_rnd_pixels_l2( * else -1 */
output_plane + first_pixel, int d = (motion_x ^ motion_y) >> 31;
s->vp3dsp.put_no_rnd_pixels_l2(output_plane + first_pixel,
motion_source - d, motion_source - d,
motion_source + stride + 1 + d, motion_source + stride + 1 + d,
stride, 8); stride, 8);
...@@ -1578,41 +1599,41 @@ static void render_slice(Vp3DecodeContext *s, int slice) ...@@ -1578,41 +1599,41 @@ static void render_slice(Vp3DecodeContext *s, int slice)
if (s->all_fragments[i].coding_method == MODE_INTRA) { if (s->all_fragments[i].coding_method == MODE_INTRA) {
int index; int index;
index = vp3_dequant(s, s->all_fragments + i, plane, 0, block); index = vp3_dequant(s, s->all_fragments + i,
plane, 0, block);
if (index > 63) if (index > 63)
continue; continue;
s->vp3dsp.idct_put( s->vp3dsp.idct_put(output_plane + first_pixel,
output_plane + first_pixel,
stride, stride,
block); block);
} else { } else {
int index = vp3_dequant(s, s->all_fragments + i, plane, 1, block); int index = vp3_dequant(s, s->all_fragments + i,
plane, 1, block);
if (index > 63) if (index > 63)
continue; continue;
if (index > 0) { if (index > 0) {
s->vp3dsp.idct_add( s->vp3dsp.idct_add(output_plane + first_pixel,
output_plane + first_pixel,
stride, stride,
block); block);
} else { } else {
s->vp3dsp.idct_dc_add(output_plane + first_pixel, stride, block); s->vp3dsp.idct_dc_add(output_plane + first_pixel,
stride, block);
} }
} }
} else { } else {
/* copy directly from the previous frame */ /* copy directly from the previous frame */
s->hdsp.put_pixels_tab[1][0]( s->hdsp.put_pixels_tab[1][0](
output_plane + first_pixel, output_plane + first_pixel,
last_plane + first_pixel, last_plane + first_pixel,
stride, 8); stride, 8);
} }
} }
} }
// Filter up to the last row in the superblock row // Filter up to the last row in the superblock row
if (!s->skip_loop_filter) if (!s->skip_loop_filter)
apply_loop_filter(s, plane, 4*sb_y - !!sb_y, FFMIN(4*sb_y+3, fragment_height-1)); apply_loop_filter(s, plane, 4 * sb_y - !!sb_y,
FFMIN(4 * sb_y + 3, fragment_height - 1));
} }
} }
...@@ -1624,7 +1645,8 @@ static void render_slice(Vp3DecodeContext *s, int slice) ...@@ -1624,7 +1645,8 @@ static void render_slice(Vp3DecodeContext *s, int slice)
* dispatch (slice - 1); * dispatch (slice - 1);
*/ */
vp3_draw_horiz_band(s, FFMIN((32 << s->chroma_y_shift) * (slice + 1) -16, s->height-16)); vp3_draw_horiz_band(s, FFMIN((32 << s->chroma_y_shift) * (slice + 1) - 16,
s->height - 16));
} }
/// Allocate tables for per-frame data in Vp3DecodeContext /// Allocate tables for per-frame data in Vp3DecodeContext
...@@ -1638,8 +1660,11 @@ static av_cold int allocate_tables(AVCodecContext *avctx) ...@@ -1638,8 +1660,11 @@ static av_cold int allocate_tables(AVCodecContext *avctx)
s->superblock_coding = av_malloc(s->superblock_count); s->superblock_coding = av_malloc(s->superblock_count);
s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment)); s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment));
s->coded_fragment_list[0] = av_malloc(s->fragment_count * sizeof(int)); s->coded_fragment_list[0] = av_malloc(s->fragment_count * sizeof(int));
s->dct_tokens_base = av_malloc(64*s->fragment_count * sizeof(*s->dct_tokens_base));
s->dct_tokens_base = av_malloc(64 * s->fragment_count *
sizeof(*s->dct_tokens_base));
s->motion_val[0] = av_malloc(y_fragment_count * sizeof(*s->motion_val[0])); s->motion_val[0] = av_malloc(y_fragment_count * sizeof(*s->motion_val[0]));
s->motion_val[1] = av_malloc(c_fragment_count * sizeof(*s->motion_val[1])); s->motion_val[1] = av_malloc(c_fragment_count * sizeof(*s->motion_val[1]));
...@@ -1647,8 +1672,9 @@ static av_cold int allocate_tables(AVCodecContext *avctx) ...@@ -1647,8 +1672,9 @@ static av_cold int allocate_tables(AVCodecContext *avctx)
s->superblock_fragments = av_malloc(s->superblock_count * 16 * sizeof(int)); s->superblock_fragments = av_malloc(s->superblock_count * 16 * sizeof(int));
s->macroblock_coding = av_malloc(s->macroblock_count + 1); s->macroblock_coding = av_malloc(s->macroblock_count + 1);
if (!s->superblock_coding || !s->all_fragments || !s->dct_tokens_base || if (!s->superblock_coding || !s->all_fragments ||
!s->coded_fragment_list[0] || !s->superblock_fragments || !s->macroblock_coding || !s->dct_tokens_base || !s->coded_fragment_list[0] ||
!s->superblock_fragments || !s->macroblock_coding ||
!s->motion_val[0] || !s->motion_val[1]) { !s->motion_val[0] || !s->motion_val[1]) {
vp3_decode_end(avctx); vp3_decode_end(avctx);
return -1; return -1;
...@@ -1689,7 +1715,7 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx) ...@@ -1689,7 +1715,7 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
avctx->internal->allocate_progress = 1; avctx->internal->allocate_progress = 1;
if (avctx->codec_tag == MKTAG('V','P','3','0')) if (avctx->codec_tag == MKTAG('V', 'P', '3', '0'))
s->version = 0; s->version = 0;
else else
s->version = 1; s->version = 1;
...@@ -1746,12 +1772,11 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx) ...@@ -1746,12 +1772,11 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
/* fragment count covers all 8x8 blocks for all 3 planes */ /* fragment count covers all 8x8 blocks for all 3 planes */
y_fragment_count = s->fragment_width[0] * s->fragment_height[0]; y_fragment_count = s->fragment_width[0] * s->fragment_height[0];
c_fragment_count = s->fragment_width[1] * s->fragment_height[1]; c_fragment_count = s->fragment_width[1] * s->fragment_height[1];
s->fragment_count = y_fragment_count + 2*c_fragment_count; s->fragment_count = y_fragment_count + 2 * c_fragment_count;
s->fragment_start[1] = y_fragment_count; s->fragment_start[1] = y_fragment_count;
s->fragment_start[2] = y_fragment_count + c_fragment_count; s->fragment_start[2] = y_fragment_count + c_fragment_count;
if (!s->theora_tables) if (!s->theora_tables) {
{
for (i = 0; i < 64; i++) { for (i = 0; i < 64; i++) {
s->coded_dc_scale_factor[i] = vp31_dc_scale_factor[i]; s->coded_dc_scale_factor[i] = vp31_dc_scale_factor[i];
s->coded_ac_scale_factor[i] = vp31_ac_scale_factor[i]; s->coded_ac_scale_factor[i] = vp31_ac_scale_factor[i];
...@@ -1761,18 +1786,17 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx) ...@@ -1761,18 +1786,17 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
s->filter_limit_values[i] = vp31_filter_limit_values[i]; s->filter_limit_values[i] = vp31_filter_limit_values[i];
} }
for(inter=0; inter<2; inter++){ for (inter = 0; inter < 2; inter++) {
for(plane=0; plane<3; plane++){ for (plane = 0; plane < 3; plane++) {
s->qr_count[inter][plane]= 1; s->qr_count[inter][plane] = 1;
s->qr_size [inter][plane][0]= 63; s->qr_size[inter][plane][0] = 63;
s->qr_base [inter][plane][0]= s->qr_base[inter][plane][0] =
s->qr_base [inter][plane][1]= 2*inter + (!!plane)*!inter; s->qr_base[inter][plane][1] = 2 * inter + (!!plane) * !inter;
} }
} }
/* init VLC tables */ /* init VLC tables */
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
/* DC histograms */ /* DC histograms */
init_vlc(&s->dc_vlc[i], 11, 32, init_vlc(&s->dc_vlc[i], 11, 32,
&dc_bias[i][0][1], 4, 2, &dc_bias[i][0][1], 4, 2,
...@@ -1799,7 +1823,6 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx) ...@@ -1799,7 +1823,6 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
&ac_bias_3[i][0][0], 4, 2, 0); &ac_bias_3[i][0][0], 4, 2, 0);
} }
} else { } else {
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
/* DC histograms */ /* DC histograms */
if (init_vlc(&s->dc_vlc[i], 11, 32, if (init_vlc(&s->dc_vlc[i], 11, 32,
...@@ -1809,26 +1832,26 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx) ...@@ -1809,26 +1832,26 @@ static av_cold int vp3_decode_init(AVCodecContext *avctx)
/* group 1 AC histograms */ /* group 1 AC histograms */
if (init_vlc(&s->ac_vlc_1[i], 11, 32, if (init_vlc(&s->ac_vlc_1[i], 11, 32,
&s->huffman_table[i+16][0][1], 8, 4, &s->huffman_table[i + 16][0][1], 8, 4,
&s->huffman_table[i+16][0][0], 8, 4, 0) < 0) &s->huffman_table[i + 16][0][0], 8, 4, 0) < 0)
goto vlc_fail; goto vlc_fail;
/* group 2 AC histograms */ /* group 2 AC histograms */
if (init_vlc(&s->ac_vlc_2[i], 11, 32, if (init_vlc(&s->ac_vlc_2[i], 11, 32,
&s->huffman_table[i+16*2][0][1], 8, 4, &s->huffman_table[i + 16 * 2][0][1], 8, 4,
&s->huffman_table[i+16*2][0][0], 8, 4, 0) < 0) &s->huffman_table[i + 16 * 2][0][0], 8, 4, 0) < 0)
goto vlc_fail; goto vlc_fail;
/* group 3 AC histograms */ /* group 3 AC histograms */
if (init_vlc(&s->ac_vlc_3[i], 11, 32, if (init_vlc(&s->ac_vlc_3[i], 11, 32,
&s->huffman_table[i+16*3][0][1], 8, 4, &s->huffman_table[i + 16 * 3][0][1], 8, 4,
&s->huffman_table[i+16*3][0][0], 8, 4, 0) < 0) &s->huffman_table[i + 16 * 3][0][0], 8, 4, 0) < 0)
goto vlc_fail; goto vlc_fail;
/* group 4 AC histograms */ /* group 4 AC histograms */
if (init_vlc(&s->ac_vlc_4[i], 11, 32, if (init_vlc(&s->ac_vlc_4[i], 11, 32,
&s->huffman_table[i+16*4][0][1], 8, 4, &s->huffman_table[i + 16 * 4][0][1], 8, 4,
&s->huffman_table[i+16*4][0][0], 8, 4, 0) < 0) &s->huffman_table[i + 16 * 4][0][0], 8, 4, 0) < 0)
goto vlc_fail; goto vlc_fail;
} }
} }
...@@ -1862,7 +1885,6 @@ static int update_frames(AVCodecContext *avctx) ...@@ -1862,7 +1885,6 @@ static int update_frames(AVCodecContext *avctx)
Vp3DecodeContext *s = avctx->priv_data; Vp3DecodeContext *s = avctx->priv_data;
int ret = 0; int ret = 0;
/* shuffle frames (last = current) */ /* shuffle frames (last = current) */
ff_thread_release_buffer(avctx, &s->last_frame); ff_thread_release_buffer(avctx, &s->last_frame);
ret = ff_thread_ref_frame(&s->last_frame, &s->current_frame); ret = ff_thread_ref_frame(&s->last_frame, &s->current_frame);
...@@ -1902,11 +1924,12 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext * ...@@ -1902,11 +1924,12 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
Vp3DecodeContext *s = dst->priv_data, *s1 = src->priv_data; Vp3DecodeContext *s = dst->priv_data, *s1 = src->priv_data;
int qps_changed = 0, i, err; int qps_changed = 0, i, err;
#define copy_fields(to, from, start_field, end_field) memcpy(&to->start_field, &from->start_field, (char*)&to->end_field - (char*)&to->start_field) #define copy_fields(to, from, start_field, end_field) \
memcpy(&to->start_field, &from->start_field, \
(char *) &to->end_field - (char *) &to->start_field)
if (!s1->current_frame.f->data[0] if (!s1->current_frame.f->data[0] ||
||s->width != s1->width s->width != s1->width || s->height != s1->height) {
||s->height!= s1->height) {
if (s != s1) if (s != s1)
ref_frames(s, s1); ref_frames(s, s1);
return -1; return -1;
...@@ -1922,8 +1945,10 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext * ...@@ -1922,8 +1945,10 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
return err; return err;
y_fragment_count = s->fragment_width[0] * s->fragment_height[0]; y_fragment_count = s->fragment_width[0] * s->fragment_height[0];
c_fragment_count = s->fragment_width[1] * s->fragment_height[1]; c_fragment_count = s->fragment_width[1] * s->fragment_height[1];
memcpy(s->motion_val[0], s1->motion_val[0], y_fragment_count * sizeof(*s->motion_val[0])); memcpy(s->motion_val[0], s1->motion_val[0],
memcpy(s->motion_val[1], s1->motion_val[1], c_fragment_count * sizeof(*s->motion_val[1])); y_fragment_count * sizeof(*s->motion_val[0]));
memcpy(s->motion_val[1], s1->motion_val[1],
c_fragment_count * sizeof(*s->motion_val[1]));
} }
// copy previous frame data // copy previous frame data
...@@ -1941,7 +1966,8 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext * ...@@ -1941,7 +1966,8 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
} }
if (s->qps[0] != s1->qps[0]) if (s->qps[0] != s1->qps[0])
memcpy(&s->bounding_values_array, &s1->bounding_values_array, sizeof(s->bounding_values_array)); memcpy(&s->bounding_values_array, &s1->bounding_values_array,
sizeof(s->bounding_values_array));
if (qps_changed) if (qps_changed)
copy_fields(s, s1, qps, superblock_count); copy_fields(s, s1, qps, superblock_count);
...@@ -1963,9 +1989,9 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -1963,9 +1989,9 @@ static int vp3_decode_frame(AVCodecContext *avctx,
init_get_bits(&gb, buf, buf_size * 8); init_get_bits(&gb, buf, buf_size * 8);
if (s->theora && get_bits1(&gb)) if (s->theora && get_bits1(&gb)) {
{ av_log(avctx, AV_LOG_ERROR,
av_log(avctx, AV_LOG_ERROR, "Header packet passed to frame decoder, skipping\n"); "Header packet passed to frame decoder, skipping\n");
return -1; return -1;
} }
...@@ -1975,19 +2001,20 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -1975,19 +2001,20 @@ static int vp3_decode_frame(AVCodecContext *avctx,
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
s->last_qps[i] = s->qps[i]; s->last_qps[i] = s->qps[i];
s->nqps=0; s->nqps = 0;
do{ do {
s->qps[s->nqps++]= get_bits(&gb, 6); s->qps[s->nqps++] = get_bits(&gb, 6);
} while(s->theora >= 0x030200 && s->nqps<3 && get_bits1(&gb)); } while (s->theora >= 0x030200 && s->nqps < 3 && get_bits1(&gb));
for (i = s->nqps; i < 3; i++) for (i = s->nqps; i < 3; i++)
s->qps[i] = -1; s->qps[i] = -1;
if (s->avctx->debug & FF_DEBUG_PICT_INFO) if (s->avctx->debug & FF_DEBUG_PICT_INFO)
av_log(s->avctx, AV_LOG_INFO, " VP3 %sframe #%d: Q index = %d\n", av_log(s->avctx, AV_LOG_INFO, " VP3 %sframe #%d: Q index = %d\n",
s->keyframe?"key":"", avctx->frame_number+1, s->qps[0]); s->keyframe ? "key" : "", avctx->frame_number + 1, s->qps[0]);
s->skip_loop_filter = !s->filter_limit_values[s->qps[0]] || s->skip_loop_filter = !s->filter_limit_values[s->qps[0]] ||
avctx->skip_loop_filter >= (s->keyframe ? AVDISCARD_ALL : AVDISCARD_NONKEY); avctx->skip_loop_filter >= (s->keyframe ? AVDISCARD_ALL
: AVDISCARD_NONKEY);
if (s->qps[0] != s->last_qps[0]) if (s->qps[0] != s->last_qps[0])
init_loop_filter(s); init_loop_filter(s);
...@@ -2001,44 +2028,47 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -2001,44 +2028,47 @@ static int vp3_decode_frame(AVCodecContext *avctx,
if (avctx->skip_frame >= AVDISCARD_NONKEY && !s->keyframe) if (avctx->skip_frame >= AVDISCARD_NONKEY && !s->keyframe)
return buf_size; return buf_size;
s->current_frame.f->pict_type = s->keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; s->current_frame.f->pict_type = s->keyframe ? AV_PICTURE_TYPE_I
: AV_PICTURE_TYPE_P;
if (ff_thread_get_buffer(avctx, &s->current_frame, AV_GET_BUFFER_FLAG_REF) < 0) { if (ff_thread_get_buffer(avctx, &s->current_frame, AV_GET_BUFFER_FLAG_REF) < 0) {
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
goto error; goto error;
} }
if (!s->edge_emu_buffer) if (!s->edge_emu_buffer)
s->edge_emu_buffer = av_malloc(9*FFABS(s->current_frame.f->linesize[0])); s->edge_emu_buffer = av_malloc(9 * FFABS(s->current_frame.f->linesize[0]));
if (s->keyframe) { if (s->keyframe) {
if (!s->theora) if (!s->theora) {
{
skip_bits(&gb, 4); /* width code */ skip_bits(&gb, 4); /* width code */
skip_bits(&gb, 4); /* height code */ skip_bits(&gb, 4); /* height code */
if (s->version) if (s->version) {
{
s->version = get_bits(&gb, 5); s->version = get_bits(&gb, 5);
if (avctx->frame_number == 0) if (avctx->frame_number == 0)
av_log(s->avctx, AV_LOG_DEBUG, "VP version: %d\n", s->version); av_log(s->avctx, AV_LOG_DEBUG,
"VP version: %d\n", s->version);
} }
} }
if (s->version || s->theora) if (s->version || s->theora) {
{
if (get_bits1(&gb)) if (get_bits1(&gb))
av_log(s->avctx, AV_LOG_ERROR, "Warning, unsupported keyframe coding type?!\n"); av_log(s->avctx, AV_LOG_ERROR,
"Warning, unsupported keyframe coding type?!\n");
skip_bits(&gb, 2); /* reserved? */ skip_bits(&gb, 2); /* reserved? */
} }
} else { } else {
if (!s->golden_frame.f->data[0]) { if (!s->golden_frame.f->data[0]) {
av_log(s->avctx, AV_LOG_WARNING, "vp3: first frame not a keyframe\n"); av_log(s->avctx, AV_LOG_WARNING,
"vp3: first frame not a keyframe\n");
s->golden_frame.f->pict_type = AV_PICTURE_TYPE_I; s->golden_frame.f->pict_type = AV_PICTURE_TYPE_I;
if (ff_thread_get_buffer(avctx, &s->golden_frame, AV_GET_BUFFER_FLAG_REF) < 0) { if (ff_thread_get_buffer(avctx, &s->golden_frame,
AV_GET_BUFFER_FLAG_REF) < 0) {
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
goto error; goto error;
} }
ff_thread_release_buffer(avctx, &s->last_frame); ff_thread_release_buffer(avctx, &s->last_frame);
if ((ret = ff_thread_ref_frame(&s->last_frame, &s->golden_frame)) < 0) if ((ret = ff_thread_ref_frame(&s->last_frame,
&s->golden_frame)) < 0)
goto error; goto error;
ff_thread_report_progress(&s->last_frame, INT_MAX, 0); ff_thread_report_progress(&s->last_frame, INT_MAX, 0);
} }
...@@ -2047,23 +2077,23 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -2047,23 +2077,23 @@ static int vp3_decode_frame(AVCodecContext *avctx,
memset(s->all_fragments, 0, s->fragment_count * sizeof(Vp3Fragment)); memset(s->all_fragments, 0, s->fragment_count * sizeof(Vp3Fragment));
ff_thread_finish_setup(avctx); ff_thread_finish_setup(avctx);
if (unpack_superblocks(s, &gb)){ if (unpack_superblocks(s, &gb)) {
av_log(s->avctx, AV_LOG_ERROR, "error in unpack_superblocks\n"); av_log(s->avctx, AV_LOG_ERROR, "error in unpack_superblocks\n");
goto error; goto error;
} }
if (unpack_modes(s, &gb)){ if (unpack_modes(s, &gb)) {
av_log(s->avctx, AV_LOG_ERROR, "error in unpack_modes\n"); av_log(s->avctx, AV_LOG_ERROR, "error in unpack_modes\n");
goto error; goto error;
} }
if (unpack_vectors(s, &gb)){ if (unpack_vectors(s, &gb)) {
av_log(s->avctx, AV_LOG_ERROR, "error in unpack_vectors\n"); av_log(s->avctx, AV_LOG_ERROR, "error in unpack_vectors\n");
goto error; goto error;
} }
if (unpack_block_qpis(s, &gb)){ if (unpack_block_qpis(s, &gb)) {
av_log(s->avctx, AV_LOG_ERROR, "error in unpack_block_qpis\n"); av_log(s->avctx, AV_LOG_ERROR, "error in unpack_block_qpis\n");
goto error; goto error;
} }
if (unpack_dct_coeffs(s, &gb)){ if (unpack_dct_coeffs(s, &gb)) {
av_log(s->avctx, AV_LOG_ERROR, "error in unpack_dct_coeffs\n"); av_log(s->avctx, AV_LOG_ERROR, "error in unpack_dct_coeffs\n");
goto error; goto error;
} }
...@@ -2073,7 +2103,7 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -2073,7 +2103,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
if (s->flipped_image) if (s->flipped_image)
s->data_offset[i] = 0; s->data_offset[i] = 0;
else else
s->data_offset[i] = (height-1) * s->current_frame.f->linesize[i]; s->data_offset[i] = (height - 1) * s->current_frame.f->linesize[i];
} }
s->last_slice_end = 0; s->last_slice_end = 0;
...@@ -2082,8 +2112,8 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -2082,8 +2112,8 @@ static int vp3_decode_frame(AVCodecContext *avctx,
// filter the last row // filter the last row
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
int row = (s->height >> (3+(i && s->chroma_y_shift))) - 1; int row = (s->height >> (3 + (i && s->chroma_y_shift))) - 1;
apply_loop_filter(s, i, row, row+1); apply_loop_filter(s, i, row, row + 1);
} }
vp3_draw_horiz_band(s, s->avctx->height); vp3_draw_horiz_band(s, s->avctx->height);
...@@ -2091,7 +2121,7 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -2091,7 +2121,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
return ret; return ret;
*got_frame = 1; *got_frame = 1;
if (!HAVE_THREADS || !(s->avctx->active_thread_type&FF_THREAD_FRAME)) { if (!HAVE_THREADS || !(s->avctx->active_thread_type & FF_THREAD_FRAME)) {
ret = update_frames(avctx); ret = update_frames(avctx);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -2102,7 +2132,7 @@ static int vp3_decode_frame(AVCodecContext *avctx, ...@@ -2102,7 +2132,7 @@ static int vp3_decode_frame(AVCodecContext *avctx,
error: error:
ff_thread_report_progress(&s->current_frame, INT_MAX, 0); ff_thread_report_progress(&s->current_frame, INT_MAX, 0);
if (!HAVE_THREADS || !(s->avctx->active_thread_type&FF_THREAD_FRAME)) if (!HAVE_THREADS || !(s->avctx->active_thread_type & FF_THREAD_FRAME))
av_frame_unref(s->current_frame.f); av_frame_unref(s->current_frame.f);
return -1; return -1;
...@@ -2124,9 +2154,8 @@ static int read_huffman_tree(AVCodecContext *avctx, GetBitContext *gb) ...@@ -2124,9 +2154,8 @@ static int read_huffman_tree(AVCodecContext *avctx, GetBitContext *gb)
s->huffman_table[s->hti][token][0] = s->hbits; s->huffman_table[s->hti][token][0] = s->hbits;
s->huffman_table[s->hti][token][1] = s->huff_code_size; s->huffman_table[s->hti][token][1] = s->huff_code_size;
s->entries++; s->entries++;
} } else {
else { if (s->huff_code_size >= 32) { /* overflow */
if (s->huff_code_size >= 32) {/* overflow */
av_log(avctx, AV_LOG_ERROR, "huffman tree overflow\n"); av_log(avctx, AV_LOG_ERROR, "huffman tree overflow\n");
return -1; return -1;
} }
...@@ -2176,16 +2205,18 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb) ...@@ -2176,16 +2205,18 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
s->theora = get_bits_long(gb, 24); s->theora = get_bits_long(gb, 24);
av_log(avctx, AV_LOG_DEBUG, "Theora bitstream version %X\n", s->theora); av_log(avctx, AV_LOG_DEBUG, "Theora bitstream version %X\n", s->theora);
/* 3.2.0 aka alpha3 has the same frame orientation as original vp3 */ /* 3.2.0 aka alpha3 has the same frame orientation as original vp3
/* but previous versions have the image flipped relative to vp3 */ * but previous versions have the image flipped relative to vp3 */
if (s->theora < 0x030200) if (s->theora < 0x030200) {
{
s->flipped_image = 1; s->flipped_image = 1;
av_log(avctx, AV_LOG_DEBUG, "Old (<alpha3) Theora bitstream, flipped image\n"); av_log(avctx, AV_LOG_DEBUG,
"Old (<alpha3) Theora bitstream, flipped image\n");
} }
visible_width = s->width = get_bits(gb, 16) << 4; visible_width =
visible_height = s->height = get_bits(gb, 16) << 4; s->width = get_bits(gb, 16) << 4;
visible_height =
s->height = get_bits(gb, 16) << 4;
if (s->theora >= 0x030200) { if (s->theora >= 0x030200) {
visible_width = get_bits_long(gb, 24); visible_width = get_bits_long(gb, 24);
...@@ -2203,7 +2234,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb) ...@@ -2203,7 +2234,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
av_reduce(&avctx->time_base.num, &avctx->time_base.den, av_reduce(&avctx->time_base.num, &avctx->time_base.den,
fps.den, fps.num, 1<<30); fps.den, fps.num, 1 << 30);
} }
aspect.num = get_bits_long(gb, 24); aspect.num = get_bits_long(gb, 24);
...@@ -2211,7 +2242,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb) ...@@ -2211,7 +2242,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
if (aspect.num && aspect.den) { if (aspect.num && aspect.den) {
av_reduce(&avctx->sample_aspect_ratio.num, av_reduce(&avctx->sample_aspect_ratio.num,
&avctx->sample_aspect_ratio.den, &avctx->sample_aspect_ratio.den,
aspect.num, aspect.den, 1<<30); aspect.num, aspect.den, 1 << 30);
} }
if (s->theora < 0x030200) if (s->theora < 0x030200)
...@@ -2221,8 +2252,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb) ...@@ -2221,8 +2252,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
skip_bits(gb, 6); /* quality hint */ skip_bits(gb, 6); /* quality hint */
if (s->theora >= 0x030200) if (s->theora >= 0x030200) {
{
skip_bits(gb, 5); /* keyframe frequency force */ skip_bits(gb, 5); /* keyframe frequency force */
avctx->pix_fmt = theora_pix_fmts[get_bits(gb, 2)]; avctx->pix_fmt = theora_pix_fmts[get_bits(gb, 2)];
skip_bits(gb, 3); /* reserved */ skip_bits(gb, 3); /* reserved */
...@@ -2230,20 +2260,20 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb) ...@@ -2230,20 +2260,20 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
// align_get_bits(gb); // align_get_bits(gb);
if ( visible_width <= s->width && visible_width > s->width-16 if (visible_width <= s->width && visible_width > s->width - 16 &&
&& visible_height <= s->height && visible_height > s->height-16 visible_height <= s->height && visible_height > s->height - 16 &&
&& !offset_x && (offset_y == s->height - visible_height)) !offset_x && (offset_y == s->height - visible_height))
ret = ff_set_dimensions(avctx, visible_width, visible_height); ret = ff_set_dimensions(avctx, visible_width, visible_height);
else else
ret = ff_set_dimensions(avctx, s->width, s->height); ret = ff_set_dimensions(avctx, s->width, s->height);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (colorspace == 1) { if (colorspace == 1)
avctx->color_primaries = AVCOL_PRI_BT470M; avctx->color_primaries = AVCOL_PRI_BT470M;
} else if (colorspace == 2) { else if (colorspace == 2)
avctx->color_primaries = AVCOL_PRI_BT470BG; avctx->color_primaries = AVCOL_PRI_BT470BG;
}
if (colorspace == 1 || colorspace == 2) { if (colorspace == 1 || colorspace == 2) {
avctx->colorspace = AVCOL_SPC_BT470BG; avctx->colorspace = AVCOL_SPC_BT470BG;
avctx->color_trc = AVCOL_TRC_BT709; avctx->color_trc = AVCOL_TRC_BT709;
...@@ -2286,48 +2316,50 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb) ...@@ -2286,48 +2316,50 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
else else
matrices = 3; matrices = 3;
if(matrices > 384){ if (matrices > 384) {
av_log(avctx, AV_LOG_ERROR, "invalid number of base matrixes\n"); av_log(avctx, AV_LOG_ERROR, "invalid number of base matrixes\n");
return -1; return -1;
} }
for(n=0; n<matrices; n++){ for (n = 0; n < matrices; n++)
for (i = 0; i < 64; i++) for (i = 0; i < 64; i++)
s->base_matrix[n][i]= get_bits(gb, 8); s->base_matrix[n][i] = get_bits(gb, 8);
}
for (inter = 0; inter <= 1; inter++) { for (inter = 0; inter <= 1; inter++) {
for (plane = 0; plane <= 2; plane++) { for (plane = 0; plane <= 2; plane++) {
int newqr= 1; int newqr = 1;
if (inter || plane > 0) if (inter || plane > 0)
newqr = get_bits1(gb); newqr = get_bits1(gb);
if (!newqr) { if (!newqr) {
int qtj, plj; int qtj, plj;
if(inter && get_bits1(gb)){ if (inter && get_bits1(gb)) {
qtj = 0; qtj = 0;
plj = plane; plj = plane;
}else{
qtj= (3*inter + plane - 1) / 3;
plj= (plane + 2) % 3;
}
s->qr_count[inter][plane]= s->qr_count[qtj][plj];
memcpy(s->qr_size[inter][plane], s->qr_size[qtj][plj], sizeof(s->qr_size[0][0]));
memcpy(s->qr_base[inter][plane], s->qr_base[qtj][plj], sizeof(s->qr_base[0][0]));
} else { } else {
int qri= 0; qtj = (3 * inter + plane - 1) / 3;
plj = (plane + 2) % 3;
}
s->qr_count[inter][plane] = s->qr_count[qtj][plj];
memcpy(s->qr_size[inter][plane], s->qr_size[qtj][plj],
sizeof(s->qr_size[0][0]));
memcpy(s->qr_base[inter][plane], s->qr_base[qtj][plj],
sizeof(s->qr_base[0][0]));
} else {
int qri = 0;
int qi = 0; int qi = 0;
for(;;){ for (;;) {
i= get_bits(gb, av_log2(matrices-1)+1); i = get_bits(gb, av_log2(matrices - 1) + 1);
if(i>= matrices){ if (i >= matrices) {
av_log(avctx, AV_LOG_ERROR, "invalid base matrix index\n"); av_log(avctx, AV_LOG_ERROR,
"invalid base matrix index\n");
return -1; return -1;
} }
s->qr_base[inter][plane][qri]= i; s->qr_base[inter][plane][qri] = i;
if(qi >= 63) if (qi >= 63)
break; break;
i = get_bits(gb, av_log2(63-qi)+1) + 1; i = get_bits(gb, av_log2(63 - qi) + 1) + 1;
s->qr_size[inter][plane][qri++]= i; s->qr_size[inter][plane][qri++] = i;
qi += i; qi += i;
} }
...@@ -2335,7 +2367,7 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb) ...@@ -2335,7 +2367,7 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
av_log(avctx, AV_LOG_ERROR, "invalid qi %d > 63\n", qi); av_log(avctx, AV_LOG_ERROR, "invalid qi %d > 63\n", qi);
return -1; return -1;
} }
s->qr_count[inter][plane]= qri; s->qr_count[inter][plane] = qri;
} }
} }
} }
...@@ -2346,10 +2378,10 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb) ...@@ -2346,10 +2378,10 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
s->huff_code_size = 1; s->huff_code_size = 1;
if (!get_bits1(gb)) { if (!get_bits1(gb)) {
s->hbits = 0; s->hbits = 0;
if(read_huffman_tree(avctx, gb)) if (read_huffman_tree(avctx, gb))
return -1; return -1;
s->hbits = 1; s->hbits = 1;
if(read_huffman_tree(avctx, gb)) if (read_huffman_tree(avctx, gb))
return -1; return -1;
} }
} }
...@@ -2370,8 +2402,7 @@ static av_cold int theora_decode_init(AVCodecContext *avctx) ...@@ -2370,8 +2402,7 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
s->theora = 1; s->theora = 1;
if (!avctx->extradata_size) if (!avctx->extradata_size) {
{
av_log(avctx, AV_LOG_ERROR, "Missing extradata!\n"); av_log(avctx, AV_LOG_ERROR, "Missing extradata!\n");
return -1; return -1;
} }
...@@ -2382,24 +2413,22 @@ static av_cold int theora_decode_init(AVCodecContext *avctx) ...@@ -2382,24 +2413,22 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
return -1; return -1;
} }
for(i=0;i<3;i++) { for (i = 0; i < 3; i++) {
if (header_len[i] <= 0) if (header_len[i] <= 0)
continue; continue;
init_get_bits(&gb, header_start[i], header_len[i] * 8); init_get_bits(&gb, header_start[i], header_len[i] * 8);
ptype = get_bits(&gb, 8); ptype = get_bits(&gb, 8);
if (!(ptype & 0x80)) if (!(ptype & 0x80)) {
{
av_log(avctx, AV_LOG_ERROR, "Invalid extradata!\n"); av_log(avctx, AV_LOG_ERROR, "Invalid extradata!\n");
// return -1; // return -1;
} }
// FIXME: Check for this as well. // FIXME: Check for this as well.
skip_bits_long(&gb, 6*8); /* "theora" */ skip_bits_long(&gb, 6 * 8); /* "theora" */
switch(ptype) switch (ptype) {
{
case 0x80: case 0x80:
theora_decode_header(avctx, &gb); theora_decode_header(avctx, &gb);
break; break;
...@@ -2412,11 +2441,14 @@ static av_cold int theora_decode_init(AVCodecContext *avctx) ...@@ -2412,11 +2441,14 @@ static av_cold int theora_decode_init(AVCodecContext *avctx)
return -1; return -1;
break; break;
default: default:
av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype&~0x80); av_log(avctx, AV_LOG_ERROR,
"Unknown Theora config packet: %d\n", ptype & ~0x80);
break; break;
} }
if(ptype != 0x81 && 8*header_len[i] != get_bits_count(&gb)) if (ptype != 0x81 && 8 * header_len[i] != get_bits_count(&gb))
av_log(avctx, AV_LOG_WARNING, "%d bits left in packet %X\n", 8*header_len[i] - get_bits_count(&gb), ptype); av_log(avctx, AV_LOG_WARNING,
"%d bits left in packet %X\n",
8 * header_len[i] - get_bits_count(&gb), ptype);
if (s->theora < 0x030200) if (s->theora < 0x030200)
break; break;
} }
......
...@@ -25,10 +25,10 @@ static int parse(AVCodecParserContext *s, ...@@ -25,10 +25,10 @@ static int parse(AVCodecParserContext *s,
const uint8_t **poutbuf, int *poutbuf_size, const uint8_t **poutbuf, int *poutbuf_size,
const uint8_t *buf, int buf_size) const uint8_t *buf, int buf_size)
{ {
if(avctx->codec_id == AV_CODEC_ID_THEORA) if (avctx->codec_id == AV_CODEC_ID_THEORA)
s->pict_type= (buf[0]&0x40) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I; s->pict_type = (buf[0] & 0x40) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
else else
s->pict_type= (buf[0]&0x80) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I; s->pict_type = (buf[0] & 0x80) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
*poutbuf = buf; *poutbuf = buf;
*poutbuf_size = buf_size; *poutbuf_size = buf_size;
...@@ -36,7 +36,9 @@ static int parse(AVCodecParserContext *s, ...@@ -36,7 +36,9 @@ static int parse(AVCodecParserContext *s,
} }
AVCodecParser ff_vp3_parser = { AVCodecParser ff_vp3_parser = {
.codec_ids = { AV_CODEC_ID_THEORA, AV_CODEC_ID_VP3, AV_CODEC_ID_VP6, .codec_ids = {
AV_CODEC_ID_VP6F, AV_CODEC_ID_VP6A }, AV_CODEC_ID_THEORA, AV_CODEC_ID_VP3,
AV_CODEC_ID_VP6, AV_CODEC_ID_VP6F, AV_CODEC_ID_VP6A
},
.parser_parse = parse, .parser_parse = parse,
}; };
...@@ -26,8 +26,8 @@ ...@@ -26,8 +26,8 @@
/* these coefficients dequantize intraframe Y plane coefficients /* these coefficients dequantize intraframe Y plane coefficients
* (note: same as JPEG) */ * (note: same as JPEG) */
static const int16_t vp31_intra_y_dequant[64] = static const int16_t vp31_intra_y_dequant[64] = {
{ 16, 11, 10, 16, 24, 40, 51, 61, 16, 11, 10, 16, 24, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55, 12, 12, 14, 19, 26, 58, 60, 55,
14, 13, 16, 24, 40, 57, 69, 56, 14, 13, 16, 24, 40, 57, 69, 56,
14, 17, 22, 29, 51, 87, 80, 62, 14, 17, 22, 29, 51, 87, 80, 62,
...@@ -39,8 +39,8 @@ static const int16_t vp31_intra_y_dequant[64] = ...@@ -39,8 +39,8 @@ static const int16_t vp31_intra_y_dequant[64] =
/* these coefficients dequantize intraframe C plane coefficients /* these coefficients dequantize intraframe C plane coefficients
* (note: same as JPEG) */ * (note: same as JPEG) */
static const int16_t vp31_intra_c_dequant[64] = static const int16_t vp31_intra_c_dequant[64] = {
{ 17, 18, 24, 47, 99, 99, 99, 99, 17, 18, 24, 47, 99, 99, 99, 99,
18, 21, 26, 66, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99,
24, 26, 56, 99, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99,
47, 66, 99, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99,
...@@ -51,8 +51,8 @@ static const int16_t vp31_intra_c_dequant[64] = ...@@ -51,8 +51,8 @@ static const int16_t vp31_intra_c_dequant[64] =
}; };
/* these coefficients dequantize interframe coefficients (all planes) */ /* these coefficients dequantize interframe coefficients (all planes) */
static const int16_t vp31_inter_dequant[64] = static const int16_t vp31_inter_dequant[64] = {
{ 16, 16, 16, 20, 24, 28, 32, 40, 16, 16, 16, 20, 24, 28, 32, 40,
16, 16, 20, 24, 28, 32, 40, 48, 16, 16, 20, 24, 28, 32, 40, 48,
16, 20, 24, 28, 32, 40, 48, 64, 16, 20, 24, 28, 32, 40, 48, 64,
20, 24, 28, 32, 40, 48, 64, 64, 20, 24, 28, 32, 40, 48, 64, 64,
...@@ -62,8 +62,8 @@ static const int16_t vp31_inter_dequant[64] = ...@@ -62,8 +62,8 @@ static const int16_t vp31_inter_dequant[64] =
40, 48, 64, 64, 64, 96, 128, 128 40, 48, 64, 64, 64, 96, 128, 128
}; };
static const int16_t vp31_dc_scale_factor[64] = static const int16_t vp31_dc_scale_factor[64] = {
{ 220, 200, 190, 180, 170, 170, 160, 160, 220, 200, 190, 180, 170, 170, 160, 160,
150, 150, 140, 140, 130, 130, 120, 120, 150, 150, 140, 140, 130, 130, 120, 120,
110, 110, 100, 100, 90, 90, 90, 80, 110, 110, 100, 100, 90, 90, 90, 80,
80, 80, 70, 70, 70, 60, 60, 60, 80, 80, 70, 70, 70, 60, 60, 60,
...@@ -73,8 +73,8 @@ static const int16_t vp31_dc_scale_factor[64] = ...@@ -73,8 +73,8 @@ static const int16_t vp31_dc_scale_factor[64] =
20, 10, 10, 10, 10, 10, 10, 10 20, 10, 10, 10, 10, 10, 10, 10
}; };
static const uint32_t vp31_ac_scale_factor[64] = static const uint32_t vp31_ac_scale_factor[64] = {
{ 500, 450, 400, 370, 340, 310, 285, 265, 500, 450, 400, 370, 340, 310, 285, 265,
245, 225, 210, 195, 185, 180, 170, 160, 245, 225, 210, 195, 185, 180, 170, 160,
150, 145, 135, 130, 125, 115, 110, 107, 150, 145, 135, 130, 125, 115, 110, 107,
100, 96, 93, 89, 85, 82, 75, 74, 100, 96, 93, 89, 85, 82, 75, 74,
...@@ -84,8 +84,8 @@ static const uint32_t vp31_ac_scale_factor[64] = ...@@ -84,8 +84,8 @@ static const uint32_t vp31_ac_scale_factor[64] =
21, 19, 18, 17, 15, 13, 12, 10 21, 19, 18, 17, 15, 13, 12, 10
}; };
static const uint8_t vp31_filter_limit_values[64] = static const uint8_t vp31_filter_limit_values[64] = {
{ 30, 25, 20, 20, 15, 15, 14, 14, 30, 25, 20, 20, 15, 15, 14, 14,
13, 13, 12, 12, 11, 11, 10, 10, 13, 13, 12, 12, 11, 11, 10, 10,
9, 9, 8, 8, 7, 7, 7, 7, 9, 9, 8, 8, 7, 7, 7, 7,
6, 6, 6, 6, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5,
...@@ -113,7 +113,7 @@ static const uint16_t superblock_run_length_vlc_table[34][2] = { ...@@ -113,7 +113,7 @@ static const uint16_t superblock_run_length_vlc_table[34][2] = {
{ 0x3EC, 10 }, { 0x3ED, 10 }, { 0x3EE, 10 }, { 0x3EF, 10 }, { 0x3EC, 10 }, { 0x3ED, 10 }, { 0x3EE, 10 }, { 0x3EF, 10 },
{ 0x3F, 6 } /* this last VLC is a special case for reading 12 more { 0x3F, 6 } /* this last VLC is a special case for reading 12 more
bits from stream and adding the value 34 */ * bits from stream and adding the value 34 */
}; };
static const uint16_t fragment_run_length_vlc_table[30][2] = { static const uint16_t fragment_run_length_vlc_table[30][2] = {
...@@ -224,7 +224,7 @@ static const int coeff_get_bits[32] = { ...@@ -224,7 +224,7 @@ static const int coeff_get_bits[32] = {
0, 0, 0, 0, 0, 0, 0, /* 0..6 are never used */ 0, 0, 0, 0, 0, 0, 0, /* 0..6 are never used */
0, 0, 0, 0, 0, 0, /* 7..12 use constant coeffs */ 0, 0, 0, 0, 0, 0, /* 7..12 use constant coeffs */
1, 1, 1, 1, /* 13..16 are constants but still need sign bit */ 1, 1, 1, 1, /* 13..16 are constants but still need sign bit */
2, 3, 4, 5, 6, 10, /* 17..22, for reading large coeffs */ 2, 3, 4, 5, 6,10, /* 17..22, for reading large coeffs */
1, 1, 1, 1, 1, 1, 1, /* 23..29 are constants but still need sign bit */ 1, 1, 1, 1, 1, 1, 1, /* 23..29 are constants but still need sign bit */
2, 2 /* 30..31 */ 2, 2 /* 30..31 */
}; };
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/common.h" #include "libavutil/common.h"
#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "avcodec.h" #include "avcodec.h"
#include "dsputil.h" #include "dsputil.h"
#include "rnd_avg.h" #include "rnd_avg.h"
...@@ -41,9 +42,10 @@ ...@@ -41,9 +42,10 @@
#define xC6S2 25080 #define xC6S2 25080
#define xC7S1 12785 #define xC7S1 12785
#define M(a,b) (((a) * (b))>>16) #define M(a, b) (((a) * (b)) >> 16)
static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int type) static av_always_inline void idct(uint8_t *dst, int stride,
int16_t *input, int type)
{ {
int16_t *ip = input; int16_t *ip = input;
...@@ -55,8 +57,8 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int ...@@ -55,8 +57,8 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
/* Inverse DCT on the rows now */ /* Inverse DCT on the rows now */
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
/* Check for non-zero values */ /* Check for non-zero values */
if ( ip[0 * 8] | ip[1 * 8] | ip[2 * 8] | ip[3 * 8] | if (ip[0 * 8] | ip[1 * 8] | ip[2 * 8] | ip[3 * 8] |
ip[4 * 8] | ip[5 * 8] | ip[6 * 8] | ip[7 * 8] ) { ip[4 * 8] | ip[5 * 8] | ip[6 * 8] | ip[7 * 8]) {
A = M(xC1S7, ip[1 * 8]) + M(xC7S1, ip[7 * 8]); A = M(xC1S7, ip[1 * 8]) + M(xC7S1, ip[7 * 8]);
B = M(xC7S1, ip[1 * 8]) - M(xC1S7, ip[7 * 8]); B = M(xC7S1, ip[1 * 8]) - M(xC1S7, ip[7 * 8]);
C = M(xC3S5, ip[3 * 8]) + M(xC5S3, ip[5 * 8]); C = M(xC3S5, ip[3 * 8]) + M(xC5S3, ip[5 * 8]);
...@@ -84,14 +86,14 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int ...@@ -84,14 +86,14 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
Hd = Bd + H; Hd = Bd + H;
/* Final sequence of operations over-write original inputs. */ /* Final sequence of operations over-write original inputs. */
ip[0 * 8] = Gd + Cd ; ip[0 * 8] = Gd + Cd;
ip[7 * 8] = Gd - Cd ; ip[7 * 8] = Gd - Cd;
ip[1 * 8] = Add + Hd; ip[1 * 8] = Add + Hd;
ip[2 * 8] = Add - Hd; ip[2 * 8] = Add - Hd;
ip[3 * 8] = Ed + Dd ; ip[3 * 8] = Ed + Dd;
ip[4 * 8] = Ed - Dd ; ip[4 * 8] = Ed - Dd;
ip[5 * 8] = Fd + Bdd; ip[5 * 8] = Fd + Bdd;
ip[6 * 8] = Fd - Bdd; ip[6 * 8] = Fd - Bdd;
...@@ -102,11 +104,10 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int ...@@ -102,11 +104,10 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
ip = input; ip = input;
for ( i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
/* Check for non-zero values (bitwise or faster than ||) */ /* Check for non-zero values (bitwise or faster than ||) */
if ( ip[1] | ip[2] | ip[3] | if (ip[1] | ip[2] | ip[3] |
ip[4] | ip[5] | ip[6] | ip[7] ) { ip[4] | ip[5] | ip[6] | ip[7]) {
A = M(xC1S7, ip[1]) + M(xC7S1, ip[7]); A = M(xC1S7, ip[1]) + M(xC7S1, ip[7]);
B = M(xC7S1, ip[1]) - M(xC1S7, ip[7]); B = M(xC7S1, ip[1]) - M(xC1S7, ip[7]);
C = M(xC3S5, ip[3]) + M(xC5S3, ip[5]); C = M(xC3S5, ip[3]) + M(xC5S3, ip[5]);
...@@ -121,9 +122,9 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int ...@@ -121,9 +122,9 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
E = M(xC4S4, (ip[0] + ip[4])) + 8; E = M(xC4S4, (ip[0] + ip[4])) + 8;
F = M(xC4S4, (ip[0] - ip[4])) + 8; F = M(xC4S4, (ip[0] - ip[4])) + 8;
if(type==1){ //HACK if (type == 1) { // HACK
E += 16*128; E += 16 * 128;
F += 16*128; F += 16 * 128;
} }
G = M(xC2S6, ip[2]) + M(xC6S2, ip[6]); G = M(xC2S6, ip[2]) + M(xC6S2, ip[6]);
...@@ -140,52 +141,51 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int ...@@ -140,52 +141,51 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
/* Final sequence of operations over-write original inputs. */ /* Final sequence of operations over-write original inputs. */
if (type == 1) { if (type == 1) {
dst[0*stride] = av_clip_uint8((Gd + Cd ) >> 4); dst[0 * stride] = av_clip_uint8((Gd + Cd) >> 4);
dst[7*stride] = av_clip_uint8((Gd - Cd ) >> 4); dst[7 * stride] = av_clip_uint8((Gd - Cd) >> 4);
dst[1*stride] = av_clip_uint8((Add + Hd ) >> 4); dst[1 * stride] = av_clip_uint8((Add + Hd) >> 4);
dst[2*stride] = av_clip_uint8((Add - Hd ) >> 4); dst[2 * stride] = av_clip_uint8((Add - Hd) >> 4);
dst[3*stride] = av_clip_uint8((Ed + Dd ) >> 4); dst[3 * stride] = av_clip_uint8((Ed + Dd) >> 4);
dst[4*stride] = av_clip_uint8((Ed - Dd ) >> 4); dst[4 * stride] = av_clip_uint8((Ed - Dd) >> 4);
dst[5*stride] = av_clip_uint8((Fd + Bdd ) >> 4); dst[5 * stride] = av_clip_uint8((Fd + Bdd) >> 4);
dst[6*stride] = av_clip_uint8((Fd - Bdd ) >> 4); dst[6 * stride] = av_clip_uint8((Fd - Bdd) >> 4);
}else{ } else {
dst[0*stride] = av_clip_uint8(dst[0*stride] + ((Gd + Cd ) >> 4)); dst[0 * stride] = av_clip_uint8(dst[0 * stride] + ((Gd + Cd) >> 4));
dst[7*stride] = av_clip_uint8(dst[7*stride] + ((Gd - Cd ) >> 4)); dst[7 * stride] = av_clip_uint8(dst[7 * stride] + ((Gd - Cd) >> 4));
dst[1*stride] = av_clip_uint8(dst[1*stride] + ((Add + Hd ) >> 4)); dst[1 * stride] = av_clip_uint8(dst[1 * stride] + ((Add + Hd) >> 4));
dst[2*stride] = av_clip_uint8(dst[2*stride] + ((Add - Hd ) >> 4)); dst[2 * stride] = av_clip_uint8(dst[2 * stride] + ((Add - Hd) >> 4));
dst[3*stride] = av_clip_uint8(dst[3*stride] + ((Ed + Dd ) >> 4)); dst[3 * stride] = av_clip_uint8(dst[3 * stride] + ((Ed + Dd) >> 4));
dst[4*stride] = av_clip_uint8(dst[4*stride] + ((Ed - Dd ) >> 4)); dst[4 * stride] = av_clip_uint8(dst[4 * stride] + ((Ed - Dd) >> 4));
dst[5*stride] = av_clip_uint8(dst[5*stride] + ((Fd + Bdd ) >> 4)); dst[5 * stride] = av_clip_uint8(dst[5 * stride] + ((Fd + Bdd) >> 4));
dst[6*stride] = av_clip_uint8(dst[6*stride] + ((Fd - Bdd ) >> 4)); dst[6 * stride] = av_clip_uint8(dst[6 * stride] + ((Fd - Bdd) >> 4));
} }
} else { } else {
if (type == 1) { if (type == 1) {
dst[0*stride]= dst[0*stride] =
dst[1*stride]= dst[1*stride] =
dst[2*stride]= dst[2*stride] =
dst[3*stride]= dst[3*stride] =
dst[4*stride]= dst[4*stride] =
dst[5*stride]= dst[5*stride] =
dst[6*stride]= dst[6*stride] =
dst[7*stride]= av_clip_uint8(128 + ((xC4S4 * ip[0] + (IdctAdjustBeforeShift<<16))>>20)); dst[7*stride] = av_clip_uint8(128 + ((xC4S4 * ip[0] + (IdctAdjustBeforeShift << 16)) >> 20));
}else{ } else {
if(ip[0]){ if (ip[0]) {
int v= ((xC4S4 * ip[0] + (IdctAdjustBeforeShift<<16))>>20); int v = (xC4S4 * ip[0] + (IdctAdjustBeforeShift << 16)) >> 20;
dst[0*stride] = av_clip_uint8(dst[0*stride] + v); dst[0 * stride] = av_clip_uint8(dst[0 * stride] + v);
dst[1*stride] = av_clip_uint8(dst[1*stride] + v); dst[1 * stride] = av_clip_uint8(dst[1 * stride] + v);
dst[2*stride] = av_clip_uint8(dst[2*stride] + v); dst[2 * stride] = av_clip_uint8(dst[2 * stride] + v);
dst[3*stride] = av_clip_uint8(dst[3*stride] + v); dst[3 * stride] = av_clip_uint8(dst[3 * stride] + v);
dst[4*stride] = av_clip_uint8(dst[4*stride] + v); dst[4 * stride] = av_clip_uint8(dst[4 * stride] + v);
dst[5*stride] = av_clip_uint8(dst[5*stride] + v); dst[5 * stride] = av_clip_uint8(dst[5 * stride] + v);
dst[6*stride] = av_clip_uint8(dst[6*stride] + v); dst[6 * stride] = av_clip_uint8(dst[6 * stride] + v);
dst[7*stride] = av_clip_uint8(dst[7*stride] + v); dst[7 * stride] = av_clip_uint8(dst[7 * stride] + v);
} }
} }
} }
...@@ -195,26 +195,26 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int ...@@ -195,26 +195,26 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
} }
} }
static void vp3_idct_put_c(uint8_t *dest/*align 8*/, int line_size, static void vp3_idct_put_c(uint8_t *dest /* align 8 */, int line_size,
int16_t *block/*align 16*/) int16_t *block /* align 16 */)
{ {
idct(dest, line_size, block, 1); idct(dest, line_size, block, 1);
memset(block, 0, sizeof(*block) * 64); memset(block, 0, sizeof(*block) * 64);
} }
static void vp3_idct_add_c(uint8_t *dest/*align 8*/, int line_size, static void vp3_idct_add_c(uint8_t *dest /* align 8 */, int line_size,
int16_t *block/*align 16*/) int16_t *block /* align 16 */)
{ {
idct(dest, line_size, block, 2); idct(dest, line_size, block, 2);
memset(block, 0, sizeof(*block) * 64); memset(block, 0, sizeof(*block) * 64);
} }
static void vp3_idct_dc_add_c(uint8_t *dest/*align 8*/, int line_size, static void vp3_idct_dc_add_c(uint8_t *dest /* align 8 */, int line_size,
int16_t *block/*align 16*/) int16_t *block /* align 16 */)
{ {
int i, dc = (block[0] + 15) >> 5; int i, dc = (block[0] + 15) >> 5;
for(i = 0; i < 8; i++){ for (i = 0; i < 8; i++) {
dest[0] = av_clip_uint8(dest[0] + dc); dest[0] = av_clip_uint8(dest[0] + dc);
dest[1] = av_clip_uint8(dest[1] + dc); dest[1] = av_clip_uint8(dest[1] + dc);
dest[2] = av_clip_uint8(dest[2] + dc); dest[2] = av_clip_uint8(dest[2] + dc);
...@@ -233,13 +233,13 @@ static void vp3_v_loop_filter_c(uint8_t *first_pixel, int stride, ...@@ -233,13 +233,13 @@ static void vp3_v_loop_filter_c(uint8_t *first_pixel, int stride,
{ {
unsigned char *end; unsigned char *end;
int filter_value; int filter_value;
const int nstride= -stride; const int nstride = -stride;
for (end= first_pixel + 8; first_pixel < end; first_pixel++) { for (end = first_pixel + 8; first_pixel < end; first_pixel++) {
filter_value = filter_value = (first_pixel[2 * nstride] - first_pixel[stride]) +
(first_pixel[2 * nstride] - first_pixel[ stride]) (first_pixel[0] - first_pixel[nstride]) * 3;
+3*(first_pixel[0 ] - first_pixel[nstride]);
filter_value = bounding_values[(filter_value + 4) >> 3]; filter_value = bounding_values[(filter_value + 4) >> 3];
first_pixel[nstride] = av_clip_uint8(first_pixel[nstride] + filter_value); first_pixel[nstride] = av_clip_uint8(first_pixel[nstride] + filter_value);
first_pixel[0] = av_clip_uint8(first_pixel[0] - filter_value); first_pixel[0] = av_clip_uint8(first_pixel[0] - filter_value);
} }
...@@ -251,11 +251,11 @@ static void vp3_h_loop_filter_c(uint8_t *first_pixel, int stride, ...@@ -251,11 +251,11 @@ static void vp3_h_loop_filter_c(uint8_t *first_pixel, int stride,
unsigned char *end; unsigned char *end;
int filter_value; int filter_value;
for (end= first_pixel + 8*stride; first_pixel != end; first_pixel += stride) { for (end = first_pixel + 8 * stride; first_pixel != end; first_pixel += stride) {
filter_value = filter_value = (first_pixel[-2] - first_pixel[1]) +
(first_pixel[-2] - first_pixel[ 1]) (first_pixel[ 0] - first_pixel[-1]) * 3;
+3*(first_pixel[ 0] - first_pixel[-1]);
filter_value = bounding_values[(filter_value + 4) >> 3]; filter_value = bounding_values[(filter_value + 4) >> 3];
first_pixel[-1] = av_clip_uint8(first_pixel[-1] + filter_value); first_pixel[-1] = av_clip_uint8(first_pixel[-1] + filter_value);
first_pixel[ 0] = av_clip_uint8(first_pixel[ 0] - filter_value); first_pixel[ 0] = av_clip_uint8(first_pixel[ 0] - filter_value);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment