|
|
@ -320,6 +320,7 @@ typedef struct VC1Context{ |
|
|
|
int mv_type_is_raw; ///< mv type mb plane is not coded
|
|
|
|
int mv_type_is_raw; ///< mv type mb plane is not coded
|
|
|
|
int skip_is_raw; ///< skip mb plane is not coded
|
|
|
|
int skip_is_raw; ///< skip mb plane is not coded
|
|
|
|
uint8_t luty[256], lutuv[256]; // lookup tables used for intensity compensation
|
|
|
|
uint8_t luty[256], lutuv[256]; // lookup tables used for intensity compensation
|
|
|
|
|
|
|
|
int rnd; ///< rounding control
|
|
|
|
|
|
|
|
|
|
|
|
/** Frame decoding info for S/M profiles only */ |
|
|
|
/** Frame decoding info for S/M profiles only */ |
|
|
|
//@{
|
|
|
|
//@{
|
|
|
@ -978,19 +979,27 @@ static void vc1_mc_1mv(VC1Context *v) |
|
|
|
my >>= 1; |
|
|
|
my >>= 1; |
|
|
|
dxy = ((my & 1) << 1) | (mx & 1); |
|
|
|
dxy = ((my & 1) << 1) | (mx & 1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!v->rnd) |
|
|
|
|
|
|
|
dsp->put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); |
|
|
|
|
|
|
|
else |
|
|
|
dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); |
|
|
|
dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
dxy = ((my & 3) << 2) | (mx & 3); |
|
|
|
dxy = ((my & 3) << 2) | (mx & 3); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!v->rnd) |
|
|
|
|
|
|
|
dsp->put_qpel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize); |
|
|
|
|
|
|
|
else |
|
|
|
dsp->put_no_rnd_qpel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize); |
|
|
|
dsp->put_no_rnd_qpel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize); |
|
|
|
} |
|
|
|
} |
|
|
|
uvmx >>= 1; |
|
|
|
/* Chroma MC always uses qpel blilinear */ |
|
|
|
uvmy >>= 1; |
|
|
|
uvdxy = ((uvmy & 3) << 2) | (uvmx & 3); |
|
|
|
uvdxy = ((uvmy & 1) << 1) | (uvmx & 1); |
|
|
|
if(!v->rnd){ |
|
|
|
dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize, 8); |
|
|
|
dsp->put_qpel_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize); |
|
|
|
dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize, 8); |
|
|
|
dsp->put_qpel_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize); |
|
|
|
// dsp->put_mspel_pixels_tab[uvdxy](s->dest[1], srcU, s->uvlinesize);
|
|
|
|
}else{ |
|
|
|
// dsp->put_mspel_pixels_tab[uvdxy](s->dest[2], srcV, s->uvlinesize);
|
|
|
|
dsp->put_no_rnd_qpel_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize); |
|
|
|
|
|
|
|
dsp->put_no_rnd_qpel_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** Do motion compensation for 4-MV macroblock - luminance block
|
|
|
|
/** Do motion compensation for 4-MV macroblock - luminance block
|
|
|
@ -1030,10 +1039,16 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n) |
|
|
|
my >>= 1; |
|
|
|
my >>= 1; |
|
|
|
dxy = ((my & 1) << 1) | (mx & 1); |
|
|
|
dxy = ((my & 1) << 1) | (mx & 1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!v->rnd) |
|
|
|
|
|
|
|
dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8); |
|
|
|
|
|
|
|
else |
|
|
|
dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8); |
|
|
|
dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
dxy = ((my & 3) << 2) | (mx & 3); |
|
|
|
dxy = ((my & 3) << 2) | (mx & 3); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!v->rnd) |
|
|
|
|
|
|
|
dsp->put_qpel_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize); |
|
|
|
|
|
|
|
else |
|
|
|
dsp->put_no_rnd_qpel_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize); |
|
|
|
dsp->put_no_rnd_qpel_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -1128,11 +1143,15 @@ static void vc1_mc_4mv_chroma(VC1Context *v) |
|
|
|
uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); |
|
|
|
uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
uvmx >>= 1; |
|
|
|
/* Chroma MC always uses qpel blilinear */ |
|
|
|
uvmy >>= 1; |
|
|
|
uvdxy = ((uvmy & 3) << 2) | (uvmx & 3); |
|
|
|
uvdxy = ((uvmy & 1) << 1) | (uvmx & 1); |
|
|
|
if(!v->rnd){ |
|
|
|
dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize, 8); |
|
|
|
dsp->put_qpel_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize); |
|
|
|
dsp->put_no_rnd_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize, 8); |
|
|
|
dsp->put_qpel_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize); |
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
|
|
dsp->put_no_rnd_qpel_pixels_tab[1][uvdxy](s->dest[1], srcU, s->uvlinesize); |
|
|
|
|
|
|
|
dsp->put_no_rnd_qpel_pixels_tab[1][uvdxy](s->dest[2], srcV, s->uvlinesize); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -1299,6 +1318,12 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) |
|
|
|
if(v->s.pict_type == I_TYPE) |
|
|
|
if(v->s.pict_type == I_TYPE) |
|
|
|
get_bits(gb, 7); // skip buffer fullness
|
|
|
|
get_bits(gb, 7); // skip buffer fullness
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* calculate RND */ |
|
|
|
|
|
|
|
if(v->s.pict_type == I_TYPE) |
|
|
|
|
|
|
|
v->rnd = 1; |
|
|
|
|
|
|
|
if(v->s.pict_type == P_TYPE) |
|
|
|
|
|
|
|
v->rnd ^= 1; |
|
|
|
|
|
|
|
|
|
|
|
/* Quantizer stuff */ |
|
|
|
/* Quantizer stuff */ |
|
|
|
pqindex = get_bits(gb, 5); |
|
|
|
pqindex = get_bits(gb, 5); |
|
|
|
if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
|
|
|
if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) |
|
|
|