Commit 0d33db8a authored by anonymous's avatar anonymous Committed by Michael Niedermayer

In that patch:

- avctx and gb elements were removed from VC9Context, hence a larger diff
- some code was added to h263dec.c regarding CODEC_ID_WMV3 (should apply to CODEC_ID_VC9 too)
- VLC tables and other related tables were made global whenever this seemed necessary; appropriate changes were therefore made to other parts of the code using those tables
- the change for the bitplane management to a struct (some of them should eventually be mapped to MpegEncContext arrays) wasn't associated with the proper frees; should be fixed now
patch by anonymous

better names for globalized tables by me

Originally committed as revision 3905 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 093c6e50
...@@ -85,6 +85,11 @@ int ff_h263_decode_init(AVCodecContext *avctx) ...@@ -85,6 +85,11 @@ int ff_h263_decode_init(AVCodecContext *avctx)
s->h263_pred = 1; s->h263_pred = 1;
s->msmpeg4_version=5; s->msmpeg4_version=5;
break; break;
case CODEC_ID_WMV3:
s->h263_msmpeg4 = 1;
s->h263_pred = 1;
s->msmpeg4_version=6;
break;
case CODEC_ID_H263I: case CODEC_ID_H263I:
break; break;
case CODEC_ID_FLV1: case CODEC_ID_FLV1:
......
...@@ -75,6 +75,8 @@ static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); ...@@ -75,6 +75,8 @@ static int msmpeg4v12_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]);
/* vc9 externs */
extern uint8_t wmv3_dc_scale_table[32];
#ifdef DEBUG #ifdef DEBUG
int intra_count = 0; int intra_count = 0;
...@@ -175,6 +177,11 @@ static void common_init(MpegEncContext * s) ...@@ -175,6 +177,11 @@ static void common_init(MpegEncContext * s)
s->y_dc_scale_table= wmv1_y_dc_scale_table; s->y_dc_scale_table= wmv1_y_dc_scale_table;
s->c_dc_scale_table= wmv1_c_dc_scale_table; s->c_dc_scale_table= wmv1_c_dc_scale_table;
break; break;
case 6:
s->y_dc_scale_table= wmv3_dc_scale_table;
s->c_dc_scale_table= wmv3_dc_scale_table;
break;
} }
...@@ -629,7 +636,7 @@ void msmpeg4_encode_mb(MpegEncContext * s, ...@@ -629,7 +636,7 @@ void msmpeg4_encode_mb(MpegEncContext * s,
if (s->pict_type == I_TYPE) { if (s->pict_type == I_TYPE) {
set_stat(ST_INTRA_MB); set_stat(ST_INTRA_MB);
put_bits(&s->pb, put_bits(&s->pb,
table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]); ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
} else { } else {
if (s->use_skip_mb_code) if (s->use_skip_mb_code)
put_bits(&s->pb, 1, 0); /* mb coded */ put_bits(&s->pb, 1, 0); /* mb coded */
...@@ -1030,9 +1037,9 @@ else ...@@ -1030,9 +1037,9 @@ else
/* decoding stuff */ /* decoding stuff */
static VLC mb_non_intra_vlc[4]; static VLC mb_non_intra_vlc[4];
static VLC mb_intra_vlc; VLC ff_msmp4_mb_i_vlc;
static VLC dc_lum_vlc[2]; VLC ff_msmp4_dc_luma_vlc[2];
static VLC dc_chroma_vlc[2]; VLC ff_msmp4_dc_chroma_vlc[2];
static VLC v2_dc_lum_vlc; static VLC v2_dc_lum_vlc;
static VLC v2_dc_chroma_vlc; static VLC v2_dc_chroma_vlc;
static VLC cbpy_vlc; static VLC cbpy_vlc;
...@@ -1121,16 +1128,16 @@ int ff_msmpeg4_decode_init(MpegEncContext *s) ...@@ -1121,16 +1128,16 @@ int ff_msmpeg4_decode_init(MpegEncContext *s)
mv->table_mv_code, 2, 2, 1); mv->table_mv_code, 2, 2, 1);
} }
init_vlc(&dc_lum_vlc[0], DC_VLC_BITS, 120, init_vlc(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
&ff_table0_dc_lum[0][1], 8, 4, &ff_table0_dc_lum[0][1], 8, 4,
&ff_table0_dc_lum[0][0], 8, 4, 1); &ff_table0_dc_lum[0][0], 8, 4, 1);
init_vlc(&dc_chroma_vlc[0], DC_VLC_BITS, 120, init_vlc(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
&ff_table0_dc_chroma[0][1], 8, 4, &ff_table0_dc_chroma[0][1], 8, 4,
&ff_table0_dc_chroma[0][0], 8, 4, 1); &ff_table0_dc_chroma[0][0], 8, 4, 1);
init_vlc(&dc_lum_vlc[1], DC_VLC_BITS, 120, init_vlc(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
&ff_table1_dc_lum[0][1], 8, 4, &ff_table1_dc_lum[0][1], 8, 4,
&ff_table1_dc_lum[0][0], 8, 4, 1); &ff_table1_dc_lum[0][0], 8, 4, 1);
init_vlc(&dc_chroma_vlc[1], DC_VLC_BITS, 120, init_vlc(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
&ff_table1_dc_chroma[0][1], 8, 4, &ff_table1_dc_chroma[0][1], 8, 4,
&ff_table1_dc_chroma[0][0], 8, 4, 1); &ff_table1_dc_chroma[0][0], 8, 4, 1);
...@@ -1160,9 +1167,9 @@ int ff_msmpeg4_decode_init(MpegEncContext *s) ...@@ -1160,9 +1167,9 @@ int ff_msmpeg4_decode_init(MpegEncContext *s)
&wmv2_inter_table[i][0][0], 8, 4, 1); //FIXME name? &wmv2_inter_table[i][0][0], 8, 4, 1); //FIXME name?
} }
init_vlc(&mb_intra_vlc, MB_INTRA_VLC_BITS, 64, init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
&table_mb_intra[0][1], 4, 2, &ff_msmp4_mb_i_table[0][1], 4, 2,
&table_mb_intra[0][0], 4, 2, 1); &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8, init_vlc(&v1_intra_cbpc_vlc, V1_INTRA_CBPC_VLC_BITS, 8,
intra_MCBPC_bits, 1, 1, intra_MCBPC_bits, 1, 1,
...@@ -1187,6 +1194,8 @@ int ff_msmpeg4_decode_init(MpegEncContext *s) ...@@ -1187,6 +1194,8 @@ int ff_msmpeg4_decode_init(MpegEncContext *s)
break; break;
case 5: case 5:
s->decode_mb= wmv2_decode_mb; s->decode_mb= wmv2_decode_mb;
case 6:
//FIXME + TODO VC9 decode mb
break; break;
} }
...@@ -1588,7 +1597,7 @@ static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) ...@@ -1588,7 +1597,7 @@ static int msmpeg4v34_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
} else { } else {
set_stat(ST_INTRA_MB); set_stat(ST_INTRA_MB);
s->mb_intra = 1; s->mb_intra = 1;
code = get_vlc2(&s->gb, mb_intra_vlc.table, MB_INTRA_VLC_BITS, 2); code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
if (code < 0) if (code < 0)
return -1; return -1;
/* predict coded block pattern */ /* predict coded block pattern */
...@@ -1911,9 +1920,9 @@ static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr) ...@@ -1911,9 +1920,9 @@ static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
level-=256; level-=256;
}else{ //FIXME optimize use unified tables & index }else{ //FIXME optimize use unified tables & index
if (n < 4) { if (n < 4) {
level = get_vlc2(&s->gb, dc_lum_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); level = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
} else { } else {
level = get_vlc2(&s->gb, dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3); level = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
} }
if (level < 0){ if (level < 0){
av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n"); av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
*/ */
/* intra picture macro block coded block pattern */ /* intra picture macro block coded block pattern */
static const uint16_t table_mb_intra[64][2] = { const uint16_t ff_msmp4_mb_i_table[64][2] = {
{ 0x1, 1 },{ 0x17, 6 },{ 0x9, 5 },{ 0x5, 5 }, { 0x1, 1 },{ 0x17, 6 },{ 0x9, 5 },{ 0x5, 5 },
{ 0x6, 5 },{ 0x47, 9 },{ 0x20, 7 },{ 0x10, 7 }, { 0x6, 5 },{ 0x47, 9 },{ 0x20, 7 },{ 0x10, 7 },
{ 0x2, 5 },{ 0x7c, 9 },{ 0x3a, 7 },{ 0x1d, 7 }, { 0x2, 5 },{ 0x7c, 9 },{ 0x3a, 7 },{ 0x1d, 7 },
......
...@@ -32,8 +32,14 @@ ...@@ -32,8 +32,14 @@
#include "avcodec.h" #include "avcodec.h"
#include "mpegvideo.h" #include "mpegvideo.h"
#include "vc9data.h" #include "vc9data.h"
extern const uint32_t ff_table0_dc_lum[120][2], ff_table1_dc_lum[120][2]; extern const uint32_t ff_table0_dc_lum[120][2], ff_table1_dc_lum[120][2];
extern const uint32_t ff_table0_dc_chroma[120][2], ff_table1_dc_chroma[120][2]; extern const uint32_t ff_table0_dc_chroma[120][2], ff_table1_dc_chroma[120][2];
extern VLC ff_msmp4_dc_luma_vlc[2], ff_msmp4_dc_chroma_vlc[2];
#define MB_INTRA_VLC_BITS 9
extern VLC ff_msmp4_mb_i_vlc;
#define DC_VLC_BITS 9
static const uint16_t table_mb_intra[64][2];
/* Some inhibiting stuff */ /* Some inhibiting stuff */
#define HAS_ADVANCED_PROFILE 1 #define HAS_ADVANCED_PROFILE 1
...@@ -45,7 +51,7 @@ extern const uint32_t ff_table0_dc_chroma[120][2], ff_table1_dc_chroma[120][2]; ...@@ -45,7 +51,7 @@ extern const uint32_t ff_table0_dc_chroma[120][2], ff_table1_dc_chroma[120][2];
if (init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, \ if (init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, \
codes, codes_wrap, codes_size, use_static) < 0) \ codes, codes_wrap, codes_size, use_static) < 0) \
{ \ { \
av_log(v->avctx, AV_LOG_ERROR, "Error for " # vlc " (%i)\n", i); \ av_log(v->s.avctx, AV_LOG_ERROR, "Error for " # vlc " (%i)\n", i); \
return -1; \ return -1; \
} }
#else #else
...@@ -134,15 +140,10 @@ static VLC vc9_norm6_vlc; ...@@ -134,15 +140,10 @@ static VLC vc9_norm6_vlc;
static VLC vc9_ttmb_vlc[3]; static VLC vc9_ttmb_vlc[3];
#define VC9_MV_DIFF_VLC_BITS 9 //15 #define VC9_MV_DIFF_VLC_BITS 9 //15
static VLC vc9_mv_diff_vlc[4]; static VLC vc9_mv_diff_vlc[4];
#define VC9_CBPCY_I_VLC_BITS 9 //13
static VLC vc9_cbpcy_i_vlc;
#define VC9_CBPCY_P_VLC_BITS 9 //14 #define VC9_CBPCY_P_VLC_BITS 9 //14
static VLC vc9_cbpcy_p_vlc[4]; static VLC vc9_cbpcy_p_vlc[4];
#define VC9_4MV_BLOCK_PATTERN_VLC_BITS 6 #define VC9_4MV_BLOCK_PATTERN_VLC_BITS 6
static VLC vc9_4mv_block_pattern_vlc[4]; static VLC vc9_4mv_block_pattern_vlc[4];
#define VC9_DC_VLC_BITS 9
static VLC vc9_luma_dc_vlc[2];
static VLC vc9_chroma_dc_vlc[2];
//We mainly need data and is_raw, so this struct could be avoided //We mainly need data and is_raw, so this struct could be avoided
//to save a level of indirection; feel free to modify //to save a level of indirection; feel free to modify
...@@ -155,8 +156,7 @@ typedef struct BitPlane { ...@@ -155,8 +156,7 @@ typedef struct BitPlane {
typedef struct VC9Context{ typedef struct VC9Context{
/* No MpegEnc context, might be good to use it */ /* No MpegEnc context, might be good to use it */
GetBitContext gb; MpegEncContext s;
AVCodecContext *avctx;
/***************************/ /***************************/
/* Sequence Header */ /* Sequence Header */
...@@ -167,7 +167,6 @@ typedef struct VC9Context{ ...@@ -167,7 +167,6 @@ typedef struct VC9Context{
int multires; //frame-level RESPIC syntax element present int multires; //frame-level RESPIC syntax element present
int res_fasttx; //always 1 int res_fasttx; //always 1
int res_transtab; //always 0 int res_transtab; //always 0
int syncmarker; //Sync markers presents
int rangered; //RANGEREDFRM (range reduction) syntax element present int rangered; //RANGEREDFRM (range reduction) syntax element present
int res_rtm_flag; //reserved, set to 1 int res_rtm_flag; //reserved, set to 1
int reserved; //duh int reserved; //duh
...@@ -196,8 +195,9 @@ typedef struct VC9Context{ ...@@ -196,8 +195,9 @@ typedef struct VC9Context{
int loopfilter; int loopfilter;
int fastuvmc; //Rounding of qpel vector to hpel ? (not in Simple) int fastuvmc; //Rounding of qpel vector to hpel ? (not in Simple)
int extended_mv; //Ext MV in P/B (not in Simple) int extended_mv; //Ext MV in P/B (not in Simple)
int dquant; //Q varies with MBs, 2bits (not in Simple) int dquant; //How qscale varies with MBs, 2bits (not in Simple)
int vstransform; //variable-size transform46 int vstransform; //variable-size transform46
int overlap; //overlapped transforms in use int overlap; //overlapped transforms in use
int quantizer_mode; //2, quantizer mode used for sequence, see QUANT_* int quantizer_mode; //2, quantizer mode used for sequence, see QUANT_*
...@@ -209,10 +209,8 @@ typedef struct VC9Context{ ...@@ -209,10 +209,8 @@ typedef struct VC9Context{
/*****************************/ /*****************************/
/* All profiles */ /* All profiles */
uint8_t mv_mode, mv_mode2; /* MV coding mode */ uint8_t mv_mode, mv_mode2; /* MV coding mode */
uint8_t pict_type; /* Picture type, mapped on MPEG types */
uint8_t pq, altpq; /* Quantizers */ uint8_t pq, altpq; /* Quantizers */
uint8_t dquantfrm, dqprofile, dqsbedge, dqbilevel; /* pquant parameters */ uint8_t dquantfrm, dqprofile, dqsbedge, dqbilevel; /* pquant parameters */
int width_mb, height_mb;
int tile; /* 3x2 if (width_mb%3) else 2x3 */ int tile; /* 3x2 if (width_mb%3) else 2x3 */
VLC *luma_ac_vlc, *chroma_ac_vlc, VLC *luma_ac_vlc, *chroma_ac_vlc,
*luma_dc_vlc, *chroma_dc_vlc; /* transac/dcfrm bits are indexes */ *luma_dc_vlc, *chroma_dc_vlc; /* transac/dcfrm bits are indexes */
...@@ -251,7 +249,6 @@ typedef struct VC9Context{ ...@@ -251,7 +249,6 @@ typedef struct VC9Context{
uint8_t toplefty; uint8_t toplefty;
uint8_t bottomrightx; uint8_t bottomrightx;
uint8_t bottomrighty; uint8_t bottomrighty;
uint8_t rndctrl;
uint8_t uvsamp; uint8_t uvsamp;
uint8_t postproc; uint8_t postproc;
int hrd_num_leaky_buckets; int hrd_num_leaky_buckets;
...@@ -299,7 +296,7 @@ static int get_prefix(GetBitContext *gb, int stop, int len) ...@@ -299,7 +296,7 @@ static int get_prefix(GetBitContext *gb, int stop, int len)
#endif #endif
} }
static int init_common(VC9Context *v) static int vc9_init_common(VC9Context *v)
{ {
static int done = 0; static int done = 0;
int i; int i;
...@@ -339,24 +336,9 @@ static int init_common(VC9Context *v) ...@@ -339,24 +336,9 @@ static int init_common(VC9Context *v)
INIT_VLC(&vc9_norm6_vlc, VC9_NORM6_VLC_BITS, 64, INIT_VLC(&vc9_norm6_vlc, VC9_NORM6_VLC_BITS, 64,
vc9_norm6_bits, 1, 1, vc9_norm6_bits, 1, 1,
vc9_norm6_codes, 2, 2, 1); vc9_norm6_codes, 2, 2, 1);
INIT_VLC(&vc9_cbpcy_i_vlc, VC9_CBPCY_I_VLC_BITS, 64,
vc9_cbpcy_i_bits, 1, 1,
vc9_cbpcy_i_codes, 2, 2, 1);
INIT_VLC(&vc9_imode_vlc, VC9_IMODE_VLC_BITS, 7, INIT_VLC(&vc9_imode_vlc, VC9_IMODE_VLC_BITS, 7,
vc9_imode_bits, 1, 1, vc9_imode_bits, 1, 1,
vc9_imode_codes, 1, 1, 1); vc9_imode_codes, 1, 1, 1);
INIT_VLC(&vc9_luma_dc_vlc[0], VC9_DC_VLC_BITS, 120,
&ff_table0_dc_lum[0][1], 8, 4,
&ff_table0_dc_lum[0][0], 8, 4, 1);
INIT_VLC(&vc9_chroma_dc_vlc[0], VC9_DC_VLC_BITS, 120,
&ff_table0_dc_chroma[0][1], 8, 4,
&ff_table0_dc_chroma[0][0], 8, 4, 1);
INIT_VLC(&vc9_luma_dc_vlc[1], VC9_DC_VLC_BITS, 120,
&ff_table1_dc_lum[0][1], 8, 4,
&ff_table1_dc_lum[0][0], 8, 4, 1);
INIT_VLC(&vc9_chroma_dc_vlc[1], VC9_DC_VLC_BITS, 120,
&ff_table1_dc_chroma[0][1], 8, 4,
&ff_table1_dc_chroma[0][0], 8, 4, 1);
for (i=0; i<3; i++) for (i=0; i<3; i++)
{ {
INIT_VLC(&vc9_ttmb_vlc[i], VC9_TTMB_VLC_BITS, 16, INIT_VLC(&vc9_ttmb_vlc[i], VC9_TTMB_VLC_BITS, 16,
...@@ -676,11 +658,11 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb) ...@@ -676,11 +658,11 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
if (v->profile <= PROFILE_MAIN) if (v->profile <= PROFILE_MAIN)
#endif #endif
{ {
v->syncmarker = get_bits(gb, 1); v->s.resync_marker = get_bits(gb, 1);
v->rangered = get_bits(gb, 1); v->rangered = get_bits(gb, 1);
} }
avctx->max_b_frames = get_bits(gb, 3); //common v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common
v->quantizer_mode = get_bits(gb, 2); //common v->quantizer_mode = get_bits(gb, 2); //common
#if HAS_ADVANCED_PROFILE #if HAS_ADVANCED_PROFILE
...@@ -703,7 +685,7 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb) ...@@ -703,7 +685,7 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
"DQuant=%i, Quantizer mode=%i, Max B frames=%i\n", "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
v->profile, v->frmrtq_postproc, v->bitrtq_postproc, v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
v->loopfilter, v->multires, v->fastuvmc, v->extended_mv, v->loopfilter, v->multires, v->fastuvmc, v->extended_mv,
v->rangered, v->vstransform, v->overlap, v->syncmarker, v->rangered, v->vstransform, v->overlap, v->s.resync_marker,
v->dquant, v->quantizer_mode, avctx->max_b_frames v->dquant, v->quantizer_mode, avctx->max_b_frames
); );
return 0; return 0;
...@@ -778,15 +760,22 @@ int alloc_bitplane(BitPlane *bp, int width, int height) ...@@ -778,15 +760,22 @@ int alloc_bitplane(BitPlane *bp, int width, int height)
return 0; return 0;
} }
void free_bitplane(BitPlane *bp)
{
bp->width = bp->stride = bp->height = 0;
if (bp->data) av_freep(&bp->data);
}
static void decode_rowskip(uint8_t* plane, int width, int height, int stride, VC9Context *v){ static void decode_rowskip(uint8_t* plane, int width, int height, int stride, VC9Context *v){
int x, y; int x, y;
GetBitContext *gb = &v->s.gb;
for (y=0; y<height; y++){ for (y=0; y<height; y++){
if (!get_bits(&v->gb, 1)) //rowskip if (!get_bits(gb, 1)) //rowskip
memset(plane, 0, width); memset(plane, 0, width);
else else
for (x=0; x<width; x++) for (x=0; x<width; x++)
plane[x] = get_bits(&v->gb, 1); plane[x] = get_bits(gb, 1);
plane += stride; plane += stride;
} }
} }
...@@ -794,14 +783,15 @@ static void decode_rowskip(uint8_t* plane, int width, int height, int stride, VC ...@@ -794,14 +783,15 @@ static void decode_rowskip(uint8_t* plane, int width, int height, int stride, VC
//FIXME optimize //FIXME optimize
static void decode_colskip(uint8_t* plane, int width, int height, int stride, VC9Context *v){ static void decode_colskip(uint8_t* plane, int width, int height, int stride, VC9Context *v){
int x, y; int x, y;
GetBitContext *gb = &v->s.gb;
for (x=0; x<width; x++){ for (x=0; x<width; x++){
if (!get_bits(&v->gb, 1)) //colskip if (!get_bits(gb, 1)) //colskip
for (y=0; y<height; y++) for (y=0; y<height; y++)
plane[y*stride] = 0; plane[y*stride] = 0;
else else
for (y=0; y<height; y++) for (y=0; y<height; y++)
plane[y*stride] = get_bits(&v->gb, 1); plane[y*stride] = get_bits(gb, 1);
plane ++; plane ++;
} }
} }
...@@ -813,11 +803,13 @@ static void decode_colskip(uint8_t* plane, int width, int height, int stride, VC ...@@ -813,11 +803,13 @@ static void decode_colskip(uint8_t* plane, int width, int height, int stride, VC
// later on) // later on)
static int bitplane_decoding(BitPlane *bp, VC9Context *v) static int bitplane_decoding(BitPlane *bp, VC9Context *v)
{ {
GetBitContext *gb = &v->s.gb;
int imode, x, y, code, use_vertical_tile, tile_w, tile_h; int imode, x, y, code, use_vertical_tile, tile_w, tile_h;
uint8_t invert, *planep = bp->data; uint8_t invert, *planep = bp->data;
invert = get_bits(&v->gb, 1); invert = get_bits(gb, 1);
imode = get_vlc2(&v->gb, vc9_imode_vlc.table, VC9_IMODE_VLC_BITS, 2); imode = get_vlc2(gb, vc9_imode_vlc.table, VC9_IMODE_VLC_BITS, 2);
bp->is_raw = 0; bp->is_raw = 0;
switch (imode) switch (imode)
...@@ -828,9 +820,9 @@ static int bitplane_decoding(BitPlane *bp, VC9Context *v) ...@@ -828,9 +820,9 @@ static int bitplane_decoding(BitPlane *bp, VC9Context *v)
return invert; return invert;
case IMODE_DIFF2: case IMODE_DIFF2:
case IMODE_NORM2: case IMODE_NORM2:
if ((bp->height*bp->width) & 1) *(++planep) = get_bits(&v->gb, 1); if ((bp->height*bp->width) & 1) *(++planep) = get_bits(gb, 1);
for(x=0; x<(bp->height*bp->width)>>1; x++){ for(x=0; x<(bp->height*bp->width)>>1; x++){
code = get_vlc2(&v->gb, vc9_norm2_vlc.table, VC9_NORM2_VLC_BITS, 2); code = get_vlc2(gb, vc9_norm2_vlc.table, VC9_NORM2_VLC_BITS, 2);
*(++planep) = code&1; //lsb => left *(++planep) = code&1; //lsb => left
*(++planep) = code&2; //msb => right - bitplane => only !0 matters *(++planep) = code&2; //msb => right - bitplane => only !0 matters
//FIXME width->stride //FIXME width->stride
...@@ -844,9 +836,9 @@ static int bitplane_decoding(BitPlane *bp, VC9Context *v) ...@@ -844,9 +836,9 @@ static int bitplane_decoding(BitPlane *bp, VC9Context *v)
for(y= bp->height%tile_h; y< bp->height; y+=tile_h){ for(y= bp->height%tile_h; y< bp->height; y+=tile_h){
for(x= bp->width%tile_w; x< bp->width; x+=tile_w){ for(x= bp->width%tile_w; x< bp->width; x+=tile_w){
code = get_vlc2(&v->gb, vc9_norm6_vlc.table, VC9_NORM6_VLC_BITS, 2); code = get_vlc2(gb, vc9_norm6_vlc.table, VC9_NORM6_VLC_BITS, 2);
if(code<0){ if(code<0){
av_log(v->avctx, AV_LOG_DEBUG, "inavlid NORM-6 VLC\n"); av_log(v->s.avctx, AV_LOG_DEBUG, "inavlid NORM-6 VLC\n");
return -1; return -1;
} }
//FIXME following is a pure guess and probably wrong //FIXME following is a pure guess and probably wrong
...@@ -912,35 +904,36 @@ static int bitplane_decoding(BitPlane *bp, VC9Context *v) ...@@ -912,35 +904,36 @@ static int bitplane_decoding(BitPlane *bp, VC9Context *v)
/*****************************************************************************/ /*****************************************************************************/
static int vop_dquant_decoding(VC9Context *v) static int vop_dquant_decoding(VC9Context *v)
{ {
GetBitContext *gb = &v->s.gb;
int pqdiff; int pqdiff;
//variable size //variable size
if (v->dquant == 2) if (v->dquant == 2)
{ {
pqdiff = get_bits(&v->gb, 3); pqdiff = get_bits(gb, 3);
if (pqdiff == 7) v->altpq = get_bits(&v->gb, 5); if (pqdiff == 7) v->altpq = get_bits(gb, 5);
else v->altpq = v->pq + pqdiff + 1; else v->altpq = v->pq + pqdiff + 1;
} }
else else
{ {
v->dquantfrm = get_bits(&v->gb, 1); v->dquantfrm = get_bits(gb, 1);
if ( v->dquantfrm ) if ( v->dquantfrm )
{ {
v->dqprofile = get_bits(&v->gb, 2); v->dqprofile = get_bits(gb, 2);
switch (v->dqprofile) switch (v->dqprofile)
{ {
case DQPROFILE_SINGLE_EDGE: case DQPROFILE_SINGLE_EDGE:
case DQPROFILE_DOUBLE_EDGES: case DQPROFILE_DOUBLE_EDGES:
v->dqsbedge = get_bits(&v->gb, 2); v->dqsbedge = get_bits(gb, 2);
break; break;
case DQPROFILE_ALL_MBS: case DQPROFILE_ALL_MBS:
v->dqbilevel = get_bits(&v->gb, 1); v->dqbilevel = get_bits(gb, 1);
default: break; //Forbidden ? default: break; //Forbidden ?
} }
if (!v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) if (!v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS)
{ {
pqdiff = get_bits(&v->gb, 3); pqdiff = get_bits(gb, 3);
if (pqdiff == 7) v->altpq = get_bits(&v->gb, 5); if (pqdiff == 7) v->altpq = get_bits(gb, 5);
else v->altpq = v->pq + pqdiff + 1; else v->altpq = v->pq + pqdiff + 1;
} }
} }
...@@ -961,38 +954,40 @@ static int decode_bi_picture_header(VC9Context *v) ...@@ -961,38 +954,40 @@ static int decode_bi_picture_header(VC9Context *v)
- for A Profile, PTYPE already tells so and we can go - for A Profile, PTYPE already tells so and we can go
directly there directly there
*/ */
GetBitContext *gb = &v->s.gb;
int pqindex; int pqindex;
/* Read the quantization stuff */ /* Read the quantization stuff */
pqindex = get_bits(&v->gb, 5); pqindex = get_bits(gb, 5);
if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
v->pq = pquant_table[0][pqindex]; v->pq = pquant_table[0][pqindex];
else else
{ {
v->pq = pquant_table[v->quantizer_mode-1][pqindex]; v->pq = pquant_table[v->quantizer_mode-1][pqindex];
} }
if (pqindex < 9) v->halfpq = get_bits(&v->gb, 1); if (pqindex < 9) v->halfpq = get_bits(gb, 1);
if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
v->pquantizer = get_bits(&v->gb, 1); v->pquantizer = get_bits(gb, 1);
/* Read the MV type/mode */ /* Read the MV type/mode */
if (v->extended_mv == 1) if (v->extended_mv == 1)
v->mvrange = get_prefix(&v->gb, 0, 3); v->mvrange = get_prefix(gb, 0, 3);
/* FIXME: what table are used in that case ? */ /* FIXME: what table are used in that case ? */
v->mv_diff_vlc = &vc9_mv_diff_vlc[0]; v->mv_diff_vlc = &vc9_mv_diff_vlc[0];
v->cbpcy_vlc = &vc9_cbpcy_i_vlc; v->cbpcy_vlc = &ff_msmp4_mb_i_vlc;
av_log(v->avctx, AV_LOG_DEBUG, "B frame, QP=%i\n", v->pq); av_log(v->s.avctx, AV_LOG_DEBUG, "B frame, QP=%i\n", v->pq);
av_log(v->avctx, AV_LOG_ERROR, "BI_TYPE not supported yet\n"); av_log(v->s.avctx, AV_LOG_ERROR, "BI_TYPE not supported yet\n");
/* Epilog should be done in caller */ /* Epilog should be done in caller */
return -1; return -1;
} }
/* Tables 11+12, p62-65 */ /* Tables 11+12, p62-65 */
static int decode_b_picture_header(VC9Context *v) static int decode_b_picture_primary_header(VC9Context *v)
{ {
int pqindex, status; GetBitContext *gb = &v->s.gb;
int pqindex, status;
/* Prolog common to all frametypes should be done in caller */ /* Prolog common to all frametypes should be done in caller */
if (v->profile == PROFILE_SIMPLE) if (v->profile == PROFILE_SIMPLE)
...@@ -1001,7 +996,7 @@ static int decode_b_picture_header(VC9Context *v) ...@@ -1001,7 +996,7 @@ static int decode_b_picture_header(VC9Context *v)
return FRAME_SKIPED; return FRAME_SKIPED;
} }
v->bfraction = vc9_bfraction_lut[get_vlc2(&v->gb, vc9_bfraction_vlc.table, v->bfraction = vc9_bfraction_lut[get_vlc2(gb, vc9_bfraction_vlc.table,
VC9_BFRACTION_VLC_BITS, 2)]; VC9_BFRACTION_VLC_BITS, 2)];
if (v->bfraction < -1) if (v->bfraction < -1)
{ {
...@@ -1015,26 +1010,26 @@ static int decode_b_picture_header(VC9Context *v) ...@@ -1015,26 +1010,26 @@ static int decode_b_picture_header(VC9Context *v)
} }
/* Read the quantization stuff */ /* Read the quantization stuff */
pqindex = get_bits(&v->gb, 5); pqindex = get_bits(gb, 5);
if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
v->pq = pquant_table[0][pqindex]; v->pq = pquant_table[0][pqindex];
else else
{ {
v->pq = pquant_table[v->quantizer_mode-1][pqindex]; v->pq = pquant_table[v->quantizer_mode-1][pqindex];
} }
if (pqindex < 9) v->halfpq = get_bits(&v->gb, 1); if (pqindex < 9) v->halfpq = get_bits(gb, 1);
if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
v->pquantizer = get_bits(&v->gb, 1); v->pquantizer = get_bits(gb, 1);
/* Read the MV type/mode */ /* Read the MV type/mode */
if (v->extended_mv == 1) if (v->extended_mv == 1)
v->mvrange = get_prefix(&v->gb, 0, 3); v->mvrange = get_prefix(gb, 0, 3);
v->mv_mode = get_bits(&v->gb, 1); v->mv_mode = get_bits(gb, 1);
if (v->pq < 13) if (v->pq < 13)
{ {
if (!v->mv_mode) if (!v->mv_mode)
{ {
v->mv_mode = get_bits(&v->gb, 2); v->mv_mode = get_bits(gb, 2);
if (v->mv_mode) if (v->mv_mode)
av_log(v, AV_LOG_ERROR, av_log(v, AV_LOG_ERROR,
"mv_mode for lowquant B frame was %i\n", v->mv_mode); "mv_mode for lowquant B frame was %i\n", v->mv_mode);
...@@ -1044,20 +1039,31 @@ static int decode_b_picture_header(VC9Context *v) ...@@ -1044,20 +1039,31 @@ static int decode_b_picture_header(VC9Context *v)
{ {
if (!v->mv_mode) if (!v->mv_mode)
{ {
if (get_bits(&v->gb, 1)) if (get_bits(gb, 1))
av_log(v, AV_LOG_ERROR, av_log(v, AV_LOG_ERROR,
"mv_mode for highquant B frame was %i\n", v->mv_mode); "mv_mode for highquant B frame was %i\n", v->mv_mode);
} }
v->mv_mode = 1-v->mv_mode; //To match (pq < 13) mapping v->mv_mode = 1-v->mv_mode; //To match (pq < 13) mapping
} }
return 0;
}
static int decode_b_picture_secondary_header(VC9Context *v)
{
GetBitContext *gb = &v->s.gb;
int status;
bitplane_decoding(&v->skip_mb_plane, v);
if (status < 0) return -1;
#if TRACE
if (v->mv_mode == MV_PMODE_MIXED_MV) if (v->mv_mode == MV_PMODE_MIXED_MV)
{ {
status = bitplane_decoding(&v->mv_type_mb_plane, v); status = bitplane_decoding(&v->mv_type_mb_plane, v);
if (status < 0) if (status < 0)
return -1; return -1;
#if TRACE #if TRACE
av_log(v->avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
"Imode: %i, Invert: %i\n", status>>1, status&1); "Imode: %i, Invert: %i\n", status>>1, status&1);
#endif #endif
} }
...@@ -1066,20 +1072,17 @@ static int decode_b_picture_header(VC9Context *v) ...@@ -1066,20 +1072,17 @@ static int decode_b_picture_header(VC9Context *v)
status = bitplane_decoding(&v->direct_mb_plane, v); status = bitplane_decoding(&v->direct_mb_plane, v);
if (status < 0) return -1; if (status < 0) return -1;
#if TRACE #if TRACE
av_log(v->avctx, AV_LOG_DEBUG, "MB Direct plane encoding: " av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct plane encoding: "
"Imode: %i, Invert: %i\n", status>>1, status&1); "Imode: %i, Invert: %i\n", status>>1, status&1);
#endif #endif
bitplane_decoding(&v->skip_mb_plane, v); av_log(v->s.avctx, AV_LOG_DEBUG, "Skip MB plane encoding: "
if (status < 0) return -1;
#if TRACE
av_log(v->avctx, AV_LOG_DEBUG, "Skip MB plane encoding: "
"Imode: %i, Invert: %i\n", status>>1, status&1); "Imode: %i, Invert: %i\n", status>>1, status&1);
#endif #endif
/* FIXME: what is actually chosen for B frames ? */ /* FIXME: what is actually chosen for B frames ? */
v->mv_diff_vlc = &vc9_mv_diff_vlc[get_bits(&v->gb, 2)]; v->mv_diff_vlc = &vc9_mv_diff_vlc[get_bits(gb, 2)];
v->cbpcy_vlc = &vc9_cbpcy_p_vlc[get_bits(&v->gb, 2)]; v->cbpcy_vlc = &vc9_cbpcy_p_vlc[get_bits(gb, 2)];
if (v->dquant) if (v->dquant)
{ {
vop_dquant_decoding(v); vop_dquant_decoding(v);
...@@ -1087,10 +1090,10 @@ static int decode_b_picture_header(VC9Context *v) ...@@ -1087,10 +1090,10 @@ static int decode_b_picture_header(VC9Context *v)
if (v->vstransform) if (v->vstransform)
{ {
v->ttmbf = get_bits(&v->gb, 1); v->ttmbf = get_bits(gb, 1);
if (v->ttmbf) if (v->ttmbf)
{ {
v->ttfrm = get_bits(&v->gb, 2); v->ttfrm = get_bits(gb, 2);
av_log(v, AV_LOG_INFO, "Transform used: %ix%i\n", av_log(v, AV_LOG_INFO, "Transform used: %ix%i\n",
(v->ttfrm & 2) ? 4 : 8, (v->ttfrm & 1) ? 4 : 8); (v->ttfrm & 2) ? 4 : 8, (v->ttfrm & 1) ? 4 : 8);
} }
...@@ -1102,53 +1105,54 @@ static int decode_b_picture_header(VC9Context *v) ...@@ -1102,53 +1105,54 @@ static int decode_b_picture_header(VC9Context *v)
/* Tables 5+7, p53-54 and 55-57 */ /* Tables 5+7, p53-54 and 55-57 */
static int decode_i_picture_header(VC9Context *v) static int decode_i_picture_header(VC9Context *v)
{ {
int pqindex, status = 0, ac_pred; GetBitContext *gb = &v->s.gb;
int pqindex, status = 0;
/* Prolog common to all frametypes should be done in caller */ /* Prolog common to all frametypes should be done in caller */
//BF = Buffer Fullness //BF = Buffer Fullness
if (v->profile <= PROFILE_MAIN && get_bits(&v->gb, 7)) if (v->profile <= PROFILE_MAIN && get_bits(gb, 7))
{ {
av_log(v, AV_LOG_DEBUG, "I BufferFullness not 0\n"); av_log(v, AV_LOG_DEBUG, "I BufferFullness not 0\n");
} }
/* Quantizer stuff */ /* Quantizer stuff */
pqindex = get_bits(&v->gb, 5); pqindex = get_bits(gb, 5);
if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
v->pq = pquant_table[0][pqindex]; v->pq = pquant_table[0][pqindex];
else else
{ {
v->pq = pquant_table[v->quantizer_mode-1][pqindex]; v->pq = pquant_table[v->quantizer_mode-1][pqindex];
} }
if (pqindex < 9) v->halfpq = get_bits(&v->gb, 1); if (pqindex < 9) v->halfpq = get_bits(gb, 1);
if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
v->pquantizer = get_bits(&v->gb, 1); v->pquantizer = get_bits(gb, 1);
av_log(v->avctx, AV_LOG_DEBUG, "I frame: QP=%i (+%i/2)\n", av_log(v->s.avctx, AV_LOG_DEBUG, "I frame: QP=%i (+%i/2)\n",
v->pq, v->halfpq); v->pq, v->halfpq);
#if HAS_ADVANCED_PROFILE #if HAS_ADVANCED_PROFILE
if (v->profile <= PROFILE_MAIN) if (v->profile <= PROFILE_MAIN)
#endif #endif
{ {
if (v->extended_mv) v->mvrange = get_prefix(&v->gb, 0, 3); if (v->extended_mv) v->mvrange = get_prefix(gb, 0, 3);
if (v->multires) v->respic = get_bits(&v->gb, 2); if (v->multires) v->respic = get_bits(gb, 2);
} }
#if HAS_ADVANCED_PROFILE #if HAS_ADVANCED_PROFILE
else else
{ {
ac_pred = get_bits(&v->gb, 1); v->s.ac_pred = get_bits(gb, 1);
if (v->postprocflag) v->postproc = get_bits(&v->gb, 1); if (v->postprocflag) v->postproc = get_bits(gb, 1);
/* 7.1.1.34 + 8.5.2 */ /* 7.1.1.34 + 8.5.2 */
if (v->overlap && v->pq<9) if (v->overlap && v->pq<9)
{ {
v->condover = get_bits(&v->gb, 1); v->condover = get_bits(gb, 1);
if (v->condover) if (v->condover)
{ {
v->condover = 2+get_bits(&v->gb, 1); v->condover = 2+get_bits(gb, 1);
if (v->condover == 3) if (v->condover == 3)
{ {
status = bitplane_decoding(&v->over_flags_plane, v); status = bitplane_decoding(&v->over_flags_plane, v);
if (status < 0) return -1; if (status < 0) return -1;
#if TRACE #if TRACE
av_log(v->avctx, AV_LOG_DEBUG, "Overflags plane encoding: " av_log(v->s.avctx, AV_LOG_DEBUG, "Overflags plane encoding: "
"Imode: %i, Invert: %i\n", status>>1, status&1); "Imode: %i, Invert: %i\n", status>>1, status&1);
#endif #endif
} }
...@@ -1162,41 +1166,48 @@ static int decode_i_picture_header(VC9Context *v) ...@@ -1162,41 +1166,48 @@ static int decode_i_picture_header(VC9Context *v)
} }
/* Table 9, p58-60 */ /* Table 9, p58-60 */
static int decode_p_picture_header(VC9Context *v) static int decode_p_picture_primary_header(VC9Context *v)
{ {
/* INTERFRM, FRMCNT, RANGEREDFRM read in caller */ /* INTERFRM, FRMCNT, RANGEREDFRM read in caller */
GetBitContext *gb = &v->s.gb;
int lowquant, pqindex, status = 0; int lowquant, pqindex, status = 0;
pqindex = get_bits(&v->gb, 5); pqindex = get_bits(gb, 5);
if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
v->pq = pquant_table[0][pqindex]; v->pq = pquant_table[0][pqindex];
else else
{ {
v->pq = pquant_table[v->quantizer_mode-1][pqindex]; v->pq = pquant_table[v->quantizer_mode-1][pqindex];
} }
if (pqindex < 9) v->halfpq = get_bits(&v->gb, 1); if (pqindex < 9) v->halfpq = get_bits(gb, 1);
if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
v->pquantizer = get_bits(&v->gb, 1); v->pquantizer = get_bits(gb, 1);
av_log(v->avctx, AV_LOG_DEBUG, "P Frame: QP=%i (+%i/2)\n", av_log(v->s.avctx, AV_LOG_DEBUG, "P Frame: QP=%i (+%i/2)\n",
v->pq, v->halfpq); v->pq, v->halfpq);
if (v->extended_mv == 1) v->mvrange = get_prefix(&v->gb, 0, 3); if (v->extended_mv == 1) v->mvrange = get_prefix(gb, 0, 3);
#if HAS_ADVANCED_PROFILE #if HAS_ADVANCED_PROFILE
if (v->profile > PROFILE_MAIN) if (v->profile > PROFILE_MAIN)
{ {
if (v->postprocflag) v->postproc = get_bits(&v->gb, 1); if (v->postprocflag) v->postproc = get_bits(gb, 1);
} }
else else
#endif #endif
if (v->multires) v->respic = get_bits(&v->gb, 2); if (v->multires) v->respic = get_bits(gb, 2);
lowquant = (v->pquantizer>12) ? 0 : 1; lowquant = (v->pquantizer>12) ? 0 : 1;
v->mv_mode = mv_pmode_table[lowquant][get_prefix(&v->gb, 1, 4)]; v->mv_mode = mv_pmode_table[lowquant][get_prefix(gb, 1, 4)];
if (v->mv_mode == MV_PMODE_INTENSITY_COMP) if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
{ {
v->mv_mode2 = mv_pmode_table[lowquant][get_prefix(&v->gb, 1, 3)]; v->mv_mode2 = mv_pmode_table[lowquant][get_prefix(gb, 1, 3)];
v->lumscale = get_bits(&v->gb, 6); v->lumscale = get_bits(gb, 6);
v->lumshift = get_bits(&v->gb, 6); v->lumshift = get_bits(gb, 6);
} }
return 0;
}
static int decode_p_picture_secondary_header(VC9Context *v)
{
GetBitContext *gb = &v->s.gb;
int status = 0;
if ((v->mv_mode == MV_PMODE_INTENSITY_COMP && if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
v->mv_mode2 == MV_PMODE_MIXED_MV) v->mv_mode2 == MV_PMODE_MIXED_MV)
|| v->mv_mode == MV_PMODE_MIXED_MV) || v->mv_mode == MV_PMODE_MIXED_MV)
...@@ -1204,7 +1215,7 @@ static int decode_p_picture_header(VC9Context *v) ...@@ -1204,7 +1215,7 @@ static int decode_p_picture_header(VC9Context *v)
status = bitplane_decoding(&v->mv_type_mb_plane, v); status = bitplane_decoding(&v->mv_type_mb_plane, v);
if (status < 0) return -1; if (status < 0) return -1;
#if TRACE #if TRACE
av_log(v->avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: " av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
"Imode: %i, Invert: %i\n", status>>1, status&1); "Imode: %i, Invert: %i\n", status>>1, status&1);
#endif #endif
} }
...@@ -1212,27 +1223,27 @@ static int decode_p_picture_header(VC9Context *v) ...@@ -1212,27 +1223,27 @@ static int decode_p_picture_header(VC9Context *v)
status = bitplane_decoding(&v->skip_mb_plane, v); status = bitplane_decoding(&v->skip_mb_plane, v);
if (status < 0) return -1; if (status < 0) return -1;
#if TRACE #if TRACE
av_log(v->avctx, AV_LOG_DEBUG, "MB Skip plane encoding: " av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
"Imode: %i, Invert: %i\n", status>>1, status&1); "Imode: %i, Invert: %i\n", status>>1, status&1);
#endif #endif
/* Hopefully this is correct for P frames */ /* Hopefully this is correct for P frames */
v->mv_diff_vlc = &vc9_mv_diff_vlc[get_bits(&v->gb, 2)]; v->mv_diff_vlc = &vc9_mv_diff_vlc[get_bits(gb, 2)];
v->cbpcy_vlc = &vc9_cbpcy_p_vlc[get_bits(&v->gb, 2)]; v->cbpcy_vlc = &vc9_cbpcy_p_vlc[get_bits(gb, 2)];
if (v->dquant) if (v->dquant)
{ {
av_log(v->avctx, AV_LOG_INFO, "VOP DQuant info\n"); av_log(v->s.avctx, AV_LOG_INFO, "VOP DQuant info\n");
vop_dquant_decoding(v); vop_dquant_decoding(v);
} }
if (v->vstransform) if (v->vstransform)
{ {
v->ttmbf = get_bits(&v->gb, 1); v->ttmbf = get_bits(gb, 1);
if (v->ttmbf) if (v->ttmbf)
{ {
v->ttfrm = get_bits(&v->gb, 2); v->ttfrm = get_bits(gb, 2);
av_log(v->avctx, AV_LOG_INFO, "Transform used: %ix%i\n", av_log(v->s.avctx, AV_LOG_INFO, "Transform used: %ix%i\n",
(v->ttfrm & 2) ? 4 : 8, (v->ttfrm & 1) ? 4 : 8); (v->ttfrm & 2) ? 4 : 8, (v->ttfrm & 1) ? 4 : 8);
} }
} }
...@@ -1241,27 +1252,28 @@ static int decode_p_picture_header(VC9Context *v) ...@@ -1241,27 +1252,28 @@ static int decode_p_picture_header(VC9Context *v)
} }
static int standard_decode_picture_header(VC9Context *v) static int standard_decode_picture_primary_header(VC9Context *v)
{ {
int status = 0, index; GetBitContext *gb = &v->s.gb;
int status = 0;
if (v->finterpflag) v->interpfrm = get_bits(&v->gb, 1); if (v->finterpflag) v->interpfrm = get_bits(gb, 1);
skip_bits(&v->gb, 2); //framecnt unused skip_bits(gb, 2); //framecnt unused
if (v->rangered) v->rangeredfrm = get_bits(&v->gb, 1); if (v->rangered) v->rangeredfrm = get_bits(gb, 1);
v->pict_type = get_bits(&v->gb, 1); v->s.pict_type = get_bits(gb, 1);
if (v->avctx->max_b_frames && !v->pict_type) if (v->s.avctx->max_b_frames && !v->s.pict_type)
{ {
if (get_bits(&v->gb, 1)) v->pict_type = I_TYPE; if (get_bits(gb, 1)) v->s.pict_type = I_TYPE;
else v->pict_type = P_TYPE; else v->s.pict_type = P_TYPE;
} }
else v->pict_type++; //P_TYPE else v->s.pict_type++; //P_TYPE
switch (v->pict_type) switch (v->s.pict_type)
{ {
case I_TYPE: status = decode_i_picture_header(v); break; case I_TYPE: status = decode_i_picture_header(v); break;
case BI_TYPE: status = decode_b_picture_header(v); break; case BI_TYPE: status = decode_bi_picture_header(v); break;
case P_TYPE: status = decode_p_picture_header(v); break; case P_TYPE: status = decode_p_picture_primary_header(v); break;
case B_TYPE: status = decode_b_picture_header(v); break; case B_TYPE: status = decode_b_picture_primary_header(v); break;
} }
if (status == FRAME_SKIPED) if (status == FRAME_SKIPED)
...@@ -1269,21 +1281,34 @@ static int standard_decode_picture_header(VC9Context *v) ...@@ -1269,21 +1281,34 @@ static int standard_decode_picture_header(VC9Context *v)
av_log(v, AV_LOG_INFO, "Skipping frame...\n"); av_log(v, AV_LOG_INFO, "Skipping frame...\n");
return status; return status;
} }
return 0;
}
static int standard_decode_picture_secondary_header(VC9Context *v)
{
GetBitContext *gb = &v->s.gb;
int status = 0, index;
switch (v->s.pict_type)
{
case P_TYPE: status = decode_p_picture_secondary_header(v); break;
case B_TYPE: status = decode_b_picture_secondary_header(v); break;
}
/* AC Syntax */ /* AC Syntax */
index = decode012(&v->gb); index = decode012(gb);
v->luma_ac_vlc = NULL + index; //FIXME Add AC table v->luma_ac_vlc = NULL + index; //FIXME Add AC table
v->chroma_ac_vlc = NULL + index; v->chroma_ac_vlc = NULL + index;
if (v->pict_type == I_TYPE || v->pict_type == BI_TYPE) if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
{ {
index = decode012(&v->gb); index = decode012(gb);
v->luma_ac2_vlc = NULL + index; //FIXME Add AC2 table v->luma_ac2_vlc = NULL + index; //FIXME Add AC2 table
v->chroma_ac2_vlc = NULL + index; v->chroma_ac2_vlc = NULL + index;
} }
/* DC Syntax */ /* DC Syntax */
index = decode012(&v->gb); index = decode012(gb);
v->luma_dc_vlc = vc9_luma_dc_vlc + index; v->luma_dc_vlc = &ff_msmp4_dc_luma_vlc[index];
v->chroma_dc_vlc = vc9_chroma_dc_vlc + index; v->chroma_dc_vlc = &ff_msmp4_dc_chroma_vlc[index];
return 0; return 0;
} }
...@@ -1293,30 +1318,31 @@ static int standard_decode_picture_header(VC9Context *v) ...@@ -1293,30 +1318,31 @@ static int standard_decode_picture_header(VC9Context *v)
/******************************************************************************/ /******************************************************************************/
/* Advanced Profile picture header decoding specific functions */ /* Advanced Profile picture header decoding specific functions */
/******************************************************************************/ /******************************************************************************/
static int advanced_decode_picture_header(VC9Context *v) static int advanced_decode_picture_primary_header(VC9Context *v)
{ {
GetBitContext *gb = &v->s.gb;
static const int type_table[4] = { P_TYPE, B_TYPE, I_TYPE, BI_TYPE }; static const int type_table[4] = { P_TYPE, B_TYPE, I_TYPE, BI_TYPE };
int type, i, index; int type, i;
if (v->interlace) if (v->interlace)
{ {
v->fcm = get_bits(&v->gb, 1); v->fcm = get_bits(gb, 1);
if (v->fcm) v->fcm = 2+get_bits(&v->gb, 1); if (v->fcm) v->fcm = 2+get_bits(gb, 1);
} }
type = get_prefix(&v->gb, 0, 4); type = get_prefix(gb, 0, 4);
if (type > 4 || type < 0) return FRAME_SKIPED; if (type > 4 || type < 0) return FRAME_SKIPED;
v->pict_type = type_table[type]; v->s.pict_type = type_table[type];
av_log(v->avctx, AV_LOG_INFO, "AP Frame Type: %i\n", v->pict_type); av_log(v->s.avctx, AV_LOG_INFO, "AP Frame Type: %i\n", v->s.pict_type);
if (v->tfcntrflag) v->tfcntr = get_bits(&v->gb, 8); if (v->tfcntrflag) v->tfcntr = get_bits(gb, 8);
if (v->broadcast) if (v->broadcast)
{ {
if (!v->interlace) v->rptfrm = get_bits(&v->gb, 2); if (!v->interlace) v->rptfrm = get_bits(gb, 2);
else else
{ {
v->tff = get_bits(&v->gb, 1); v->tff = get_bits(gb, 1);
v->rff = get_bits(&v->gb, 1); v->rff = get_bits(gb, 1);
} }
} }
...@@ -1325,42 +1351,56 @@ static int advanced_decode_picture_header(VC9Context *v) ...@@ -1325,42 +1351,56 @@ static int advanced_decode_picture_header(VC9Context *v)
#if 0 #if 0
for (i=0; i<v->numpanscanwin; i++) for (i=0; i<v->numpanscanwin; i++)
{ {
v->topleftx[i] = get_bits(&v->gb, 16); v->topleftx[i] = get_bits(gb, 16);
v->toplefty[i] = get_bits(&v->gb, 16); v->toplefty[i] = get_bits(gb, 16);
v->bottomrightx[i] = get_bits(&v->gb, 16); v->bottomrightx[i] = get_bits(gb, 16);
v->bottomrighty[i] = get_bits(&v->gb, 16); v->bottomrighty[i] = get_bits(gb, 16);
} }
#else #else
skip_bits(&v->gb, 16*4*v->numpanscanwin); skip_bits(gb, 16*4*v->numpanscanwin);
#endif #endif
} }
v->rndctrl = get_bits(&v->gb, 1); v->s.no_rounding = !get_bits(gb, 1);
v->uvsamp = get_bits(&v->gb, 1); v->uvsamp = get_bits(gb, 1);
if (v->finterpflag == 1) v->interpfrm = get_bits(&v->gb, 1); if (v->finterpflag == 1) v->interpfrm = get_bits(gb, 1);
switch(v->pict_type) switch(v->s.pict_type)
{ {
case I_TYPE: if (decode_i_picture_header(v) < 0) return -1; case I_TYPE: if (decode_i_picture_header(v) < 0) return -1;
case P_TYPE: if (decode_p_picture_header(v) < 0) return -1; case P_TYPE: if (decode_p_picture_primary_header(v) < 0) return -1;
case BI_TYPE: case BI_TYPE:
case B_TYPE: if (decode_b_picture_header(v) < 0) return FRAME_SKIPED; case B_TYPE: if (decode_b_picture_primary_header(v) < 0) return FRAME_SKIPED;
default: break;
}
return 0;
}
static int advanced_decode_picture_secondary_header(VC9Context *v)
{
GetBitContext *gb = &v->s.gb;
int index;
switch(v->s.pict_type)
{
case P_TYPE: if (decode_p_picture_secondary_header(v) < 0) return -1;
case B_TYPE: if (decode_b_picture_secondary_header(v) < 0) return FRAME_SKIPED;
default: break; default: break;
} }
/* AC Syntax */ /* AC Syntax */
index = decode012(&v->gb); index = decode012(gb);
v->luma_ac_vlc = NULL + index; //FIXME v->luma_ac_vlc = NULL + index; //FIXME
v->chroma_ac_vlc = NULL + index; //FIXME v->chroma_ac_vlc = NULL + index; //FIXME
if (v->pict_type == I_TYPE || v->pict_type == BI_TYPE) if (v->s.pict_type == I_TYPE || v->s.pict_type == BI_TYPE)
{ {
index = decode012(&v->gb); //FIXME index = decode012(gb); //FIXME
v->luma_ac2_vlc = NULL + index; v->luma_ac2_vlc = NULL + index;
v->chroma_ac2_vlc = NULL + index; v->chroma_ac2_vlc = NULL + index;
} }
/* DC Syntax */ /* DC Syntax */
index = decode012(&v->gb); index = decode012(gb);
v->luma_dc_vlc = vc9_luma_dc_vlc + index; v->luma_dc_vlc = &ff_msmp4_dc_luma_vlc[index];
v->chroma_dc_vlc = vc9_chroma_dc_vlc + index; v->chroma_dc_vlc = &ff_msmp4_dc_chroma_vlc[index];
return 0; return 0;
} }
...@@ -1373,27 +1413,28 @@ static int advanced_decode_picture_header(VC9Context *v) ...@@ -1373,27 +1413,28 @@ static int advanced_decode_picture_header(VC9Context *v)
/* FIXME proper integration (unusable and lots of parameters to send */ /* FIXME proper integration (unusable and lots of parameters to send */
int decode_luma_intra_block(VC9Context *v, int mquant) int decode_luma_intra_block(VC9Context *v, int mquant)
{ {
GetBitContext *gb = &v->s.gb;
int dcdiff; int dcdiff;
dcdiff = get_vlc2(&v->gb, v->luma_dc_vlc->table, dcdiff = get_vlc2(gb, v->luma_dc_vlc->table,
VC9_DC_VLC_BITS, 2); DC_VLC_BITS, 2);
if (dcdiff) if (dcdiff)
{ {
if (dcdiff == 119 /* ESC index value */) if (dcdiff == 119 /* ESC index value */)
{ {
/* TODO: Optimize */ /* TODO: Optimize */
if (mquant == 1) dcdiff = get_bits(&v->gb, 10); if (mquant == 1) dcdiff = get_bits(gb, 10);
else if (mquant == 2) dcdiff = get_bits(&v->gb, 9); else if (mquant == 2) dcdiff = get_bits(gb, 9);
else dcdiff = get_bits(&v->gb, 8); else dcdiff = get_bits(gb, 8);
} }
else else
{ {
if (mquant == 1) if (mquant == 1)
dcdiff = (dcdiff<<2) + get_bits(&v->gb, 2) - 3; dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
else if (mquant == 2) else if (mquant == 2)
dcdiff = (dcdiff<<1) + get_bits(&v->gb, 1) - 1; dcdiff = (dcdiff<<1) + get_bits(gb, 1) - 1;
} }
if (get_bits(&v->gb, 1)) if (get_bits(gb, 1))
dcdiff = -dcdiff; dcdiff = -dcdiff;
} }
/* FIXME: 8.1.1.15, p(1)13, coeff scaling for Adv Profile */ /* FIXME: 8.1.1.15, p(1)13, coeff scaling for Adv Profile */
...@@ -1407,7 +1448,7 @@ int decode_luma_intra_block(VC9Context *v, int mquant) ...@@ -1407,7 +1448,7 @@ int decode_luma_intra_block(VC9Context *v, int mquant)
/* 8.1.1.5, p(1)02-(1)03 */ /* 8.1.1.5, p(1)02-(1)03 */
/* We only need to store 3 flags, but math with 4 is easier */ /* We only need to store 3 flags, but math with 4 is easier */
#define GET_CBPCY(table, bits) \ #define GET_CBPCY(table, bits) \
predicted_cbpcy = get_vlc2(&v->gb, table, bits, 2); \ predicted_cbpcy = get_vlc2(gb, table, bits, 2); \
cbpcy[0] = (p_cbpcy[-1] == p_cbpcy[2]) \ cbpcy[0] = (p_cbpcy[-1] == p_cbpcy[2]) \
? previous_cbpcy[1] : p_cbpcy[+2]; \ ? previous_cbpcy[1] : p_cbpcy[+2]; \
cbpcy[0] ^= ((predicted_cbpcy>>5)&0x01); \ cbpcy[0] ^= ((predicted_cbpcy>>5)&0x01); \
...@@ -1422,32 +1463,33 @@ int decode_luma_intra_block(VC9Context *v, int mquant) ...@@ -1422,32 +1463,33 @@ int decode_luma_intra_block(VC9Context *v, int mquant)
/* 8.1, p100 */ /* 8.1, p100 */
static int standard_decode_i_mbs(VC9Context *v) static int standard_decode_i_mbs(VC9Context *v)
{ {
int x, y, current_mb = 0; /* MB/Block Position info */ GetBitContext *gb = &v->s.gb;
int ac_pred; MpegEncContext *s = &v->s;
int current_mb = 0; /* MB/Block Position info */
/* FIXME: better to use a pointer than using (x<<4) */ /* FIXME: better to use a pointer than using (x<<4) */
uint8_t cbpcy[4], previous_cbpcy[4], predicted_cbpcy, uint8_t cbpcy[4], previous_cbpcy[4], predicted_cbpcy,
*p_cbpcy /* Pointer to skip some math */; *p_cbpcy /* Pointer to skip some math */;
/* Reset CBPCY predictors */ /* Reset CBPCY predictors */
memset(v->previous_line_cbpcy, 0, (v->width_mb+1)<<2); memset(v->previous_line_cbpcy, 0, s->mb_stride<<2);
/* Select ttmb table depending on pq */ /* Select ttmb table depending on pq */
if (v->pq < 5) v->ttmb_vlc = &vc9_ttmb_vlc[0]; if (v->pq < 5) v->ttmb_vlc = &vc9_ttmb_vlc[0];
else if (v->pq < 13) v->ttmb_vlc = &vc9_ttmb_vlc[1]; else if (v->pq < 13) v->ttmb_vlc = &vc9_ttmb_vlc[1];
else v->ttmb_vlc = &vc9_ttmb_vlc[2]; else v->ttmb_vlc = &vc9_ttmb_vlc[2];
for (y=0; y<v->height_mb; y++) for (s->mb_y=0; s->mb_y<s->mb_height; s->mb_y++)
{ {
/* Init CBPCY for line */ /* Init CBPCY for line */
*((uint32_t*)previous_cbpcy) = 0x00000000; *((uint32_t*)previous_cbpcy) = 0x00000000;
p_cbpcy = v->previous_line_cbpcy+4; p_cbpcy = v->previous_line_cbpcy+4;
for (x=0; x<v->width_mb; x++, p_cbpcy += 4) for (s->mb_x=0; s->mb_x<s->mb_width; s->mb_x++, p_cbpcy += 4)
{ {
/* Get CBPCY */ /* Get CBPCY */
GET_CBPCY(vc9_cbpcy_i_vlc.table, VC9_CBPCY_I_VLC_BITS); GET_CBPCY(ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS);
ac_pred = get_bits(&v->gb, 1); s->ac_pred = get_bits(gb, 1);
/* TODO: Decode blocks from that mb wrt cbpcy */ /* TODO: Decode blocks from that mb wrt cbpcy */
...@@ -1467,20 +1509,20 @@ static int standard_decode_i_mbs(VC9Context *v) ...@@ -1467,20 +1509,20 @@ static int standard_decode_i_mbs(VC9Context *v)
{ \ { \
if (v->dqbilevel) \ if (v->dqbilevel) \
{ \ { \
mquant = (get_bits(&v->gb, 1)) ? v->pq : v->altpq; \ mquant = (get_bits(gb, 1)) ? v->pq : v->altpq; \
} \ } \
else \ else \
{ \ { \
mqdiff = get_bits(&v->gb, 3); \ mqdiff = get_bits(gb, 3); \
if (mqdiff != 7) mquant = v->pq + mqdiff; \ if (mqdiff != 7) mquant = v->pq + mqdiff; \
else mquant = get_bits(&v->gb, 5); \ else mquant = get_bits(gb, 5); \
} \ } \
} \ } \
} }
/* MVDATA decoding from 8.3.5.2, p(1)20 */ /* MVDATA decoding from 8.3.5.2, p(1)20 */
#define GET_MVDATA(_dmv_x, _dmv_y) \ #define GET_MVDATA(_dmv_x, _dmv_y) \
index = 1 + get_vlc2(&v->gb, v->mv_diff_vlc->table, \ index = 1 + get_vlc2(gb, v->mv_diff_vlc->table, \
VC9_MV_DIFF_VLC_BITS, 2); \ VC9_MV_DIFF_VLC_BITS, 2); \
if (index > 36) \ if (index > 36) \
{ \ { \
...@@ -1492,8 +1534,8 @@ static int standard_decode_i_mbs(VC9Context *v) ...@@ -1492,8 +1534,8 @@ static int standard_decode_i_mbs(VC9Context *v)
if (!index) { _dmv_x = _dmv_y = 0; } \ if (!index) { _dmv_x = _dmv_y = 0; } \
else if (index == 35) \ else if (index == 35) \
{ \ { \
_dmv_x = get_bits(&v->gb, k_x); \ _dmv_x = get_bits(gb, k_x); \
_dmv_y = get_bits(&v->gb, k_y); \ _dmv_y = get_bits(gb, k_y); \
mb_is_intra = 1; \ mb_is_intra = 1; \
} \ } \
else \ else \
...@@ -1501,14 +1543,14 @@ static int standard_decode_i_mbs(VC9Context *v) ...@@ -1501,14 +1543,14 @@ static int standard_decode_i_mbs(VC9Context *v)
index1 = index%6; \ index1 = index%6; \
if (hpel_flag && index1 == 5) val = 1; \ if (hpel_flag && index1 == 5) val = 1; \
else val = 0; \ else val = 0; \
val = get_bits(&v->gb, size_table[index1] - val); \ val = get_bits(gb, size_table[index1] - val); \
sign = 0 - (val&1); \ sign = 0 - (val&1); \
_dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \ _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
\ \
index1 = index/6; \ index1 = index/6; \
if (hpel_flag && index1 == 5) val = 1; \ if (hpel_flag && index1 == 5) val = 1; \
else val = 0; \ else val = 0; \
val = get_bits(&v->gb, size_table[index1] - val); \ val = get_bits(gb, size_table[index1] - val); \
sign = 0 - (val&1); \ sign = 0 - (val&1); \
_dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \ _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign; \
} }
...@@ -1516,10 +1558,12 @@ static int standard_decode_i_mbs(VC9Context *v) ...@@ -1516,10 +1558,12 @@ static int standard_decode_i_mbs(VC9Context *v)
/* 8.1, p(1)15 */ /* 8.1, p(1)15 */
static int decode_p_mbs(VC9Context *v) static int decode_p_mbs(VC9Context *v)
{ {
int x, y, current_mb = 0, i; /* MB/Block Position info */ MpegEncContext *s = &v->s;
GetBitContext *gb = &v->s.gb;
int current_mb = 0, i; /* MB/Block Position info */
uint8_t cbpcy[4], previous_cbpcy[4], predicted_cbpcy, uint8_t cbpcy[4], previous_cbpcy[4], predicted_cbpcy,
*p_cbpcy /* Pointer to skip some math */; *p_cbpcy /* Pointer to skip some math */;
int hybrid_pred, ac_pred; /* Prediction types */ int hybrid_pred; /* Prediction types */
int mv_mode_bit = 0; int mv_mode_bit = 0;
int mqdiff, mquant; /* MB quantization */ int mqdiff, mquant; /* MB quantization */
int ttmb; /* MB Transform type */ int ttmb; /* MB Transform type */
...@@ -1552,20 +1596,20 @@ static int decode_p_mbs(VC9Context *v) ...@@ -1552,20 +1596,20 @@ static int decode_p_mbs(VC9Context *v)
k_y -= hpel_flag; k_y -= hpel_flag;
/* Reset CBPCY predictors */ /* Reset CBPCY predictors */
memset(v->previous_line_cbpcy, 0, (v->width_mb+1)<<2); memset(v->previous_line_cbpcy, 0, s->mb_stride<<2);
for (y=0; y<v->height_mb; y++) for (s->mb_y=0; s->mb_y<s->mb_height; s->mb_y++)
{ {
/* Init CBPCY for line */ /* Init CBPCY for line */
*((uint32_t*)previous_cbpcy) = 0x00000000; *((uint32_t*)previous_cbpcy) = 0x00000000;
p_cbpcy = v->previous_line_cbpcy+4; p_cbpcy = v->previous_line_cbpcy+4;
for (x=0; x<v->width_mb; x++) for (s->mb_x=0; s->mb_x<s->mb_width; s->mb_x++)
{ {
if (v->mv_type_mb_plane.is_raw) if (v->mv_type_mb_plane.is_raw)
v->mv_type_mb_plane.data[current_mb] = get_bits(&v->gb, 1); v->mv_type_mb_plane.data[current_mb] = get_bits(gb, 1);
if (v->skip_mb_plane.is_raw) if (v->skip_mb_plane.is_raw)
v->skip_mb_plane.data[current_mb] = get_bits(&v->gb, 1); v->skip_mb_plane.data[current_mb] = get_bits(gb, 1);
if (!mv_mode_bit) /* 1MV mode */ if (!mv_mode_bit) /* 1MV mode */
{ {
if (!v->skip_mb_plane.data[current_mb]) if (!v->skip_mb_plane.data[current_mb])
...@@ -1575,20 +1619,20 @@ static int decode_p_mbs(VC9Context *v) ...@@ -1575,20 +1619,20 @@ static int decode_p_mbs(VC9Context *v)
/* hybrid mv pred, 8.3.5.3.4 */ /* hybrid mv pred, 8.3.5.3.4 */
if (v->mv_mode == MV_PMODE_1MV || if (v->mv_mode == MV_PMODE_1MV ||
v->mv_mode == MV_PMODE_MIXED_MV) v->mv_mode == MV_PMODE_MIXED_MV)
hybrid_pred = get_bits(&v->gb, 1); hybrid_pred = get_bits(gb, 1);
if (mb_is_intra && !mb_has_coeffs) if (mb_is_intra && !mb_has_coeffs)
{ {
GET_MQUANT(); GET_MQUANT();
ac_pred = get_bits(&v->gb, 1); s->ac_pred = get_bits(gb, 1);
} }
else if (mb_has_coeffs) else if (mb_has_coeffs)
{ {
if (mb_is_intra) ac_pred = get_bits(&v->gb, 1); if (mb_is_intra) s->ac_pred = get_bits(gb, 1);
GET_CBPCY(v->cbpcy_vlc->table, VC9_CBPCY_P_VLC_BITS); GET_CBPCY(v->cbpcy_vlc->table, VC9_CBPCY_P_VLC_BITS);
GET_MQUANT(); GET_MQUANT();
} }
if (!v->ttmbf) if (!v->ttmbf)
ttmb = get_vlc2(&v->gb, v->ttmb_vlc->table, ttmb = get_vlc2(gb, v->ttmb_vlc->table,
VC9_TTMB_VLC_BITS, 12); VC9_TTMB_VLC_BITS, 12);
/* TODO: decode blocks from that mb wrt cbpcy */ /* TODO: decode blocks from that mb wrt cbpcy */
} }
...@@ -1597,7 +1641,7 @@ static int decode_p_mbs(VC9Context *v) ...@@ -1597,7 +1641,7 @@ static int decode_p_mbs(VC9Context *v)
/* hybrid mv pred, 8.3.5.3.4 */ /* hybrid mv pred, 8.3.5.3.4 */
if (v->mv_mode == MV_PMODE_1MV || if (v->mv_mode == MV_PMODE_1MV ||
v->mv_mode == MV_PMODE_MIXED_MV) v->mv_mode == MV_PMODE_MIXED_MV)
hybrid_pred = get_bits(&v->gb, 1); hybrid_pred = get_bits(gb, 1);
} }
} //1MV mode } //1MV mode
else //4MV mode else //4MV mode
...@@ -1613,13 +1657,13 @@ static int decode_p_mbs(VC9Context *v) ...@@ -1613,13 +1657,13 @@ static int decode_p_mbs(VC9Context *v)
GET_MVDATA(dmv_x, dmv_y); GET_MVDATA(dmv_x, dmv_y);
} }
if (v->mv_mode == MV_PMODE_MIXED_MV /* Hybrid pred */) if (v->mv_mode == MV_PMODE_MIXED_MV /* Hybrid pred */)
hybrid_pred = get_bits(&v->gb, 1); hybrid_pred = get_bits(gb, 1);
GET_MQUANT(); GET_MQUANT();
if (mb_is_intra /* One of the 4 blocks is intra */ && if (mb_is_intra /* One of the 4 blocks is intra */ &&
index /* non-zero pred for that block */) index /* non-zero pred for that block */)
ac_pred = get_bits(&v->gb, 1); s->ac_pred = get_bits(gb, 1);
if (!v->ttmbf) if (!v->ttmbf)
ttmb = get_vlc2(&v->gb, v->ttmb_vlc->table, ttmb = get_vlc2(gb, v->ttmb_vlc->table,
VC9_TTMB_VLC_BITS, 12); VC9_TTMB_VLC_BITS, 12);
/* TODO: Process blocks wrt cbpcy */ /* TODO: Process blocks wrt cbpcy */
...@@ -1631,7 +1675,7 @@ static int decode_p_mbs(VC9Context *v) ...@@ -1631,7 +1675,7 @@ static int decode_p_mbs(VC9Context *v)
for (i=0; i<4; i++) //All 4 Y blocks for (i=0; i<4; i++) //All 4 Y blocks
{ {
if (v->mv_mode == MV_PMODE_MIXED_MV /* Hybrid pred */) if (v->mv_mode == MV_PMODE_MIXED_MV /* Hybrid pred */)
hybrid_pred = get_bits(&v->gb, 1); hybrid_pred = get_bits(gb, 1);
/* TODO: do something */ /* TODO: do something */
} }
...@@ -1640,7 +1684,7 @@ static int decode_p_mbs(VC9Context *v) ...@@ -1640,7 +1684,7 @@ static int decode_p_mbs(VC9Context *v)
/* Update for next block */ /* Update for next block */
#if TRACE > 2 #if TRACE > 2
av_log(v->avctx, AV_LOG_DEBUG, "Block %4i: p_cbpcy=%i%i%i%i, previous_cbpcy=%i%i%i%i," av_log(s->avctx, AV_LOG_DEBUG, "Block %4i: p_cbpcy=%i%i%i%i, previous_cbpcy=%i%i%i%i,"
" cbpcy=%i%i%i%i\n", current_mb, " cbpcy=%i%i%i%i\n", current_mb,
p_cbpcy[0], p_cbpcy[1], p_cbpcy[2], p_cbpcy[3], p_cbpcy[0], p_cbpcy[1], p_cbpcy[2], p_cbpcy[3],
previous_cbpcy[0], previous_cbpcy[1], previous_cbpcy[2], previous_cbpcy[3], previous_cbpcy[0], previous_cbpcy[1], previous_cbpcy[2], previous_cbpcy[3],
...@@ -1656,8 +1700,9 @@ static int decode_p_mbs(VC9Context *v) ...@@ -1656,8 +1700,9 @@ static int decode_p_mbs(VC9Context *v)
static int decode_b_mbs(VC9Context *v) static int decode_b_mbs(VC9Context *v)
{ {
int x, y, current_mb = 0, i /* MB / B postion information */; MpegEncContext *s = &v->s;
int ac_pred; GetBitContext *gb = &v->s.gb;
int current_mb = 0, i /* MB / B postion information */;
int b_mv_type = BMV_TYPE_BACKWARD; int b_mv_type = BMV_TYPE_BACKWARD;
int mquant, mqdiff; /* MB quant stuff */ int mquant, mqdiff; /* MB quant stuff */
int ttmb; /* MacroBlock transform type */ int ttmb; /* MacroBlock transform type */
...@@ -1688,20 +1733,20 @@ static int decode_b_mbs(VC9Context *v) ...@@ -1688,20 +1733,20 @@ static int decode_b_mbs(VC9Context *v)
else if (v->pq < 13) v->ttmb_vlc = &vc9_ttmb_vlc[1]; else if (v->pq < 13) v->ttmb_vlc = &vc9_ttmb_vlc[1];
else v->ttmb_vlc = &vc9_ttmb_vlc[2]; else v->ttmb_vlc = &vc9_ttmb_vlc[2];
for (y=0; y<v->height_mb; y++) for (s->mb_y=0; s->mb_y<s->mb_height; s->mb_y++)
{ {
for (x=0; x<v->width_mb; x++) for (s->mb_x=0; s->mb_x<s->mb_width; s->mb_x++)
{ {
if (v->direct_mb_plane.is_raw) if (v->direct_mb_plane.is_raw)
v->direct_mb_plane.data[current_mb] = get_bits(&v->gb, 1); v->direct_mb_plane.data[current_mb] = get_bits(gb, 1);
if (v->skip_mb_plane.is_raw) if (v->skip_mb_plane.is_raw)
v->skip_mb_plane.data[current_mb] = get_bits(&v->gb, 1); v->skip_mb_plane.data[current_mb] = get_bits(gb, 1);
if (!v->direct_mb_plane.data[current_mb]) if (!v->direct_mb_plane.data[current_mb])
{ {
if (v->skip_mb_plane.data[current_mb]) if (v->skip_mb_plane.data[current_mb])
{ {
b_mv_type = decode012(&v->gb); b_mv_type = decode012(gb);
if (v->bfraction > 420 /*1/2*/ && if (v->bfraction > 420 /*1/2*/ &&
b_mv_type < 3) b_mv_type = 1-b_mv_type; b_mv_type < 3) b_mv_type = 1-b_mv_type;
} }
...@@ -1712,7 +1757,7 @@ static int decode_b_mbs(VC9Context *v) ...@@ -1712,7 +1757,7 @@ static int decode_b_mbs(VC9Context *v)
if (!mb_is_intra /* b_mv1 tells not intra */) if (!mb_is_intra /* b_mv1 tells not intra */)
{ {
/* FIXME: actually read it */ /* FIXME: actually read it */
b_mv_type = decode012(&v->gb); b_mv_type = decode012(gb);
if (v->bfraction > 420 /*1/2*/ && if (v->bfraction > 420 /*1/2*/ &&
b_mv_type < 3) b_mv_type = 1-b_mv_type; b_mv_type < 3) b_mv_type = 1-b_mv_type;
} }
...@@ -1724,7 +1769,7 @@ static int decode_b_mbs(VC9Context *v) ...@@ -1724,7 +1769,7 @@ static int decode_b_mbs(VC9Context *v)
{ {
GET_MQUANT(); GET_MQUANT();
if (mb_is_intra /* intra mb */) if (mb_is_intra /* intra mb */)
ac_pred = get_bits(&v->gb, 1); s->ac_pred = get_bits(gb, 1);
} }
else else
{ {
...@@ -1737,14 +1782,14 @@ static int decode_b_mbs(VC9Context *v) ...@@ -1737,14 +1782,14 @@ static int decode_b_mbs(VC9Context *v)
if (mb_has_coeffs /* b_mv2 == "last" */) if (mb_has_coeffs /* b_mv2 == "last" */)
{ {
if (mb_is_intra /* intra_mb */) if (mb_is_intra /* intra_mb */)
ac_pred = get_bits(&v->gb, 1); s->ac_pred = get_bits(gb, 1);
GET_MQUANT(); GET_MQUANT();
} }
} }
} }
//End1 //End1
if (v->ttmbf) if (v->ttmbf)
ttmb = get_vlc2(&v->gb, v->ttmb_vlc->table, ttmb = get_vlc2(gb, v->ttmb_vlc->table,
VC9_TTMB_VLC_BITS, 12); VC9_TTMB_VLC_BITS, 12);
//End2 //End2
...@@ -1762,16 +1807,20 @@ static int decode_b_mbs(VC9Context *v) ...@@ -1762,16 +1807,20 @@ static int decode_b_mbs(VC9Context *v)
#if HAS_ADVANCED_PROFILE #if HAS_ADVANCED_PROFILE
static int advanced_decode_i_mbs(VC9Context *v) static int advanced_decode_i_mbs(VC9Context *v)
{ {
int x, y, mqdiff, mquant, ac_pred, current_mb = 0, over_flags_mb = 0; MpegEncContext *s = &v->s;
GetBitContext *gb = &v->s.gb;
int mqdiff, mquant, current_mb = 0, over_flags_mb = 0;
for (y=0; y<v->height_mb; y++) for (s->mb_y=0; s->mb_y<s->mb_height; s->mb_y++)
{ {
for (x=0; x<v->width_mb; x++) for (s->mb_x=0; s->mb_x<s->mb_width; s->mb_x++)
{ {
if (v->ac_pred_plane.data[current_mb]) if (v->ac_pred_plane.is_raw)
ac_pred = get_bits(&v->gb, 1); s->ac_pred = get_bits(gb, 1);
else
s->ac_pred = v->ac_pred_plane.data[current_mb];
if (v->condover == 3 && v->over_flags_plane.is_raw) if (v->condover == 3 && v->over_flags_plane.is_raw)
over_flags_mb = get_bits(&v->gb, 1); over_flags_mb = get_bits(gb, 1);
GET_MQUANT(); GET_MQUANT();
/* TODO: lots */ /* TODO: lots */
...@@ -1785,13 +1834,16 @@ static int advanced_decode_i_mbs(VC9Context *v) ...@@ -1785,13 +1834,16 @@ static int advanced_decode_i_mbs(VC9Context *v)
static int vc9_decode_init(AVCodecContext *avctx) static int vc9_decode_init(AVCodecContext *avctx)
{ {
VC9Context *v = avctx->priv_data; VC9Context *v = avctx->priv_data;
MpegEncContext *s = &v->s;
GetBitContext gb; GetBitContext gb;
if (!avctx->extradata_size || !avctx->extradata) return -1; if (!avctx->extradata_size || !avctx->extradata) return -1;
avctx->pix_fmt = PIX_FMT_YUV420P; avctx->pix_fmt = PIX_FMT_YUV420P;
v->avctx = avctx; v->s.avctx = avctx;
if (init_common(v) < 0) return -1; if(ff_h263_decode_init(avctx) < 0)
return -1;
if (vc9_init_common(v) < 0) return -1;
avctx->coded_width = avctx->width; avctx->coded_width = avctx->width;
avctx->coded_height = avctx->height; avctx->coded_height = avctx->height;
...@@ -1799,68 +1851,68 @@ static int vc9_decode_init(AVCodecContext *avctx) ...@@ -1799,68 +1851,68 @@ static int vc9_decode_init(AVCodecContext *avctx)
{ {
int count = 0; int count = 0;
// looks like WMV3 has a sequence header stored in the extradata // looks like WMV3 has a sequence header stored in the extradata
// advanced sequence header may be before the first frame // advanced sequence header may be before the first frame
// the last byte of the extradata is a version number, 1 for the // the last byte of the extradata is a version number, 1 for the
// samples we can decode // samples we can decode
init_get_bits(&gb, avctx->extradata, avctx->extradata_size); init_get_bits(&gb, avctx->extradata, avctx->extradata_size);
decode_sequence_header(avctx, &gb); decode_sequence_header(avctx, &gb);
count = avctx->extradata_size*8 - get_bits_count(&gb); count = avctx->extradata_size*8 - get_bits_count(&gb);
if (count>0) if (count>0)
{ {
av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n", av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
count, get_bits(&gb, count)); count, get_bits(&gb, count));
} }
else else
{ {
av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count); av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
} }
} }
avctx->has_b_frames= !!(avctx->max_b_frames);
/* Done with header parsing */ s->mb_width = (avctx->coded_width+15)>>4;
//FIXME I feel like this is wrong s->mb_height = (avctx->coded_height+15)>>4;
v->width_mb = (avctx->coded_width+15)>>4;
v->height_mb = (avctx->coded_height+15)>>4;
/* Allocate mb bitplanes */ /* Allocate mb bitplanes */
if (alloc_bitplane(&v->mv_type_mb_plane, v->width_mb, v->height_mb) < 0) if (alloc_bitplane(&v->mv_type_mb_plane, s->mb_width, s->mb_height) < 0)
return -1; return -1;
if (alloc_bitplane(&v->mv_type_mb_plane, v->width_mb, v->height_mb) < 0) if (alloc_bitplane(&v->mv_type_mb_plane, s->mb_width, s->mb_height) < 0)
return -1; return -1;
if (alloc_bitplane(&v->skip_mb_plane, v->width_mb, v->height_mb) < 0) if (alloc_bitplane(&v->skip_mb_plane, s->mb_width, s->mb_height) < 0)
return -1; return -1;
if (alloc_bitplane(&v->direct_mb_plane, v->width_mb, v->height_mb) < 0) if (alloc_bitplane(&v->direct_mb_plane, s->mb_width, s->mb_height) < 0)
return -1; return -1;
/* For predictors */ /* For predictors */
v->previous_line_cbpcy = (uint8_t *)av_malloc((v->width_mb+1)*4); v->previous_line_cbpcy = (uint8_t *)av_malloc(s->mb_stride*4);
if (!v->previous_line_cbpcy) return -1; if (!v->previous_line_cbpcy) return -1;
#if HAS_ADVANCED_PROFILE #if HAS_ADVANCED_PROFILE
if (v->profile > PROFILE_MAIN) if (v->profile > PROFILE_MAIN)
{ {
if (alloc_bitplane(&v->over_flags_plane, v->width_mb, v->height_mb) < 0) if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
return -1; return -1;
if (alloc_bitplane(&v->ac_pred_plane, v->width_mb, v->height_mb) < 0) if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
return -1; return -1;
} }
#endif #endif
return 0; return 0;
} }
static int vc9_decode_frame(AVCodecContext *avctx, static int vc9_decode_frame(AVCodecContext *avctx,
void *data, int *data_size, void *data, int *data_size,
uint8_t *buf, int buf_size) uint8_t *buf, int buf_size)
{ {
VC9Context *v = avctx->priv_data; VC9Context *v = avctx->priv_data;
MpegEncContext *s = &v->s;
int ret = FRAME_SKIPED, len, start_code; int ret = FRAME_SKIPED, len, start_code;
AVFrame *pict = data; AVFrame *pict = data;
uint8_t *tmp_buf; uint8_t *tmp_buf;
v->avctx = avctx; v->s.avctx = avctx;
//buf_size = 0 -> last frame //buf_size = 0 -> last frame
if (!buf_size) return 0; if (!buf_size) return 0;
...@@ -1871,41 +1923,7 @@ static int vc9_decode_frame(AVCodecContext *avctx, ...@@ -1871,41 +1923,7 @@ static int vc9_decode_frame(AVCodecContext *avctx,
avpicture_fill((AVPicture *)pict, tmp_buf, avctx->pix_fmt, avpicture_fill((AVPicture *)pict, tmp_buf, avctx->pix_fmt,
avctx->width, avctx->height); avctx->width, avctx->height);
if (avctx->codec_id == CODEC_ID_WMV3) if (avctx->codec_id == CODEC_ID_VC9)
{
//No IDU
init_get_bits(&v->gb, buf, buf_size*8);
#if HAS_ADVANCED_PROFILE
if (v->profile > PROFILE_MAIN)
{
if (advanced_decode_picture_header(v) == FRAME_SKIPED) return buf_size;
switch(v->pict_type)
{
case I_TYPE: ret = advanced_decode_i_mbs(v); break;
case P_TYPE: ret = decode_p_mbs(v); break;
case B_TYPE:
case BI_TYPE: ret = decode_b_mbs(v); break;
default: ret = FRAME_SKIPED;
}
if (ret == FRAME_SKIPED) return buf_size; //We ignore for now failures
}
else
#endif
{
if (standard_decode_picture_header(v) == FRAME_SKIPED) return buf_size;
switch(v->pict_type)
{
case I_TYPE: ret = standard_decode_i_mbs(v); break;
case P_TYPE: ret = decode_p_mbs(v); break;
case B_TYPE:
case BI_TYPE: ret = decode_b_mbs(v); break;
default: ret = FRAME_SKIPED;
}
if (ret == FRAME_SKIPED) return buf_size;
}
}
else
{ {
#if 0 #if 0
// search for IDU's // search for IDU's
...@@ -1923,7 +1941,7 @@ static int vc9_decode_frame(AVCodecContext *avctx, ...@@ -1923,7 +1941,7 @@ static int vc9_decode_frame(AVCodecContext *avctx,
scs = buf[i++]; scs = buf[i++];
init_get_bits(&v->gb, buf+i, (buf_size-i)*8); init_get_bits(gb, buf+i, (buf_size-i)*8);
switch(scs) switch(scs)
{ {
...@@ -1941,24 +1959,162 @@ static int vc9_decode_frame(AVCodecContext *avctx, ...@@ -1941,24 +1959,162 @@ static int vc9_decode_frame(AVCodecContext *avctx,
if (v->profile <= MAIN_PROFILE) if (v->profile <= MAIN_PROFILE)
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
"Found an entry point in profile %i\n", v->profile); "Found an entry point in profile %i\n", v->profile);
advanced_entry_point_process(avctx, &v->gb); advanced_entry_point_process(avctx, gb);
break; break;
case 0x0F: //Sequence header Start Code case 0x0F: //Sequence header Start Code
decode_sequence_header(avctx, &v->gb); decode_sequence_header(avctx, gb);
break; break;
default: default:
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
"Unsupported IDU suffix %lX\n", scs); "Unsupported IDU suffix %lX\n", scs);
} }
i += get_bits_count(&v->gb)*8; i += get_bits_count(gb)*8;
} }
#else #else
av_abort(); av_abort();
#endif #endif
} }
else
init_get_bits(&v->s.gb, buf, buf_size*8);
s->flags= avctx->flags;
s->flags2= avctx->flags2;
/* no supplementary picture */
if (buf_size == 0) {
/* special case for last picture */
if (s->low_delay==0 && s->next_picture_ptr) {
*pict= *(AVFrame*)s->next_picture_ptr;
s->next_picture_ptr= NULL;
*data_size = sizeof(AVFrame);
}
return 0;
}
//No IDU - we mimic ff_h263_decode_frame
s->bitstream_buffer_size=0;
if (!s->context_initialized) {
if (MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix
return -1;
}
//we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there
if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){
s->current_picture_ptr= &s->picture[ff_find_unused_picture(s, 0)];
}
#if HAS_ADVANCED_PROFILE
if (v->profile > PROFILE_MAIN)
ret= advanced_decode_picture_primary_header(v);
else
#endif
ret= standard_decode_picture_primary_header(v);
if (ret == FRAME_SKIPED) return buf_size;
/* skip if the header was thrashed */
if (ret < 0){
av_log(s->avctx, AV_LOG_ERROR, "header damaged\n");
return -1;
}
//No bug workaround yet, no DCT conformance
//WMV9 does have resized images
if (v->profile <= PROFILE_MAIN && v->multires){
//Parse context stuff in here, don't know how appliable it is
}
//Not sure about context initialization
// for hurry_up==5
s->current_picture.pict_type= s->pict_type;
s->current_picture.key_frame= s->pict_type == I_TYPE;
/* skip b frames if we dont have reference frames */
if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable))
return buf_size; //FIXME simulating all buffer consumed
/* skip b frames if we are in a hurry */
if(avctx->hurry_up && s->pict_type==B_TYPE)
return buf_size; //FIXME simulating all buffer consumed
/* skip everything if we are in a hurry>=5 */
if(avctx->hurry_up>=5)
return buf_size; //FIXME simulating all buffer consumed
if(s->next_p_frame_damaged){
if(s->pict_type==B_TYPE)
return buf_size; //FIXME simulating all buffer consumed
else
s->next_p_frame_damaged=0;
}
if(MPV_frame_start(s, avctx) < 0)
return -1;
ff_er_frame_start(s);
//wmv9 may or may not have skip bits
#if HAS_ADVANCED_PROFILE
if (v->profile > PROFILE_MAIN)
ret= advanced_decode_picture_secondary_header(v);
else
#endif
ret = standard_decode_picture_secondary_header(v);
if (ret<0) return FRAME_SKIPED; //FIXME Non fatal for now
//We consider the image coded in only one slice
#if HAS_ADVANCED_PROFILE
if (v->profile > PROFILE_MAIN)
{
switch(s->pict_type)
{
case I_TYPE: ret = advanced_decode_i_mbs(v); break;
case P_TYPE: ret = decode_p_mbs(v); break;
case B_TYPE:
case BI_TYPE: ret = decode_b_mbs(v); break;
default: ret = FRAME_SKIPED;
}
if (ret == FRAME_SKIPED) return buf_size; //We ignore for now failures
}
else
#endif
{
switch(s->pict_type)
{
case I_TYPE: ret = standard_decode_i_mbs(v); break;
case P_TYPE: ret = decode_p_mbs(v); break;
case B_TYPE:
case BI_TYPE: ret = decode_b_mbs(v); break;
default: ret = FRAME_SKIPED;
}
if (ret == FRAME_SKIPED) return buf_size;
}
ff_er_frame_end(s);
MPV_frame_end(s);
assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
assert(s->current_picture.pict_type == s->pict_type);
if(s->pict_type==B_TYPE || s->low_delay){
*pict= *(AVFrame*)&s->current_picture;
ff_print_debug_info(s, pict);
} else {
*pict= *(AVFrame*)&s->last_picture;
if(pict)
ff_print_debug_info(s, pict);
}
/* Return the Picture timestamp as the frame number */
/* we substract 1 because it is added on utils.c */
avctx->frame_number = s->picture_number - 1;
/* dont output the last pic after seeking */
if(s->last_picture_ptr || s->low_delay)
*data_size = sizeof(AVFrame);
av_log(avctx, AV_LOG_DEBUG, "Consumed %i/%i bits\n", av_log(avctx, AV_LOG_DEBUG, "Consumed %i/%i bits\n",
get_bits_count(&v->gb), buf_size*8); get_bits_count(&s->gb), buf_size*8);
/* Fake consumption of all data */ /* Fake consumption of all data */
*data_size = len; *data_size = len;
...@@ -1973,9 +2129,10 @@ static int vc9_decode_end(AVCodecContext *avctx) ...@@ -1973,9 +2129,10 @@ static int vc9_decode_end(AVCodecContext *avctx)
av_freep(&v->hrd_rate); av_freep(&v->hrd_rate);
av_freep(&v->hrd_buffer); av_freep(&v->hrd_buffer);
#endif #endif
av_freep(&v->mv_type_mb_plane); MPV_common_end(&v->s);
av_freep(&v->skip_mb_plane); free_bitplane(&v->mv_type_mb_plane);
av_freep(&v->direct_mb_plane); free_bitplane(&v->skip_mb_plane);
free_bitplane(&v->direct_mb_plane);
return 0; return 0;
} }
......
...@@ -167,23 +167,8 @@ static const uint8_t vc9_4mv_block_pattern_bits[4][16] = { ...@@ -167,23 +167,8 @@ static const uint8_t vc9_4mv_block_pattern_bits[4][16] = {
{ 2, 4, 4, 4, 4, 4, 5, 5, 4, 5, 4, 5, 4, 5, 5, 4} { 2, 4, 4, 4, 4, 4, 5, 5, 4, 5, 4, 5, 4, 5, 5, 4}
}; };
/* I-Picture CBPCY VLC tables */ const uint8_t wmv3_dc_scale_table[32]={
//same as msmpeg4 table_mb_intra 0, 4, 6, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21
static const uint16_t vc9_cbpcy_i_codes[64] = {
1, 23, 9, 5, 6, 71, 32, 16,
2, 124, 58, 29, 2, 236, 119, 0,
3, 183, 44, 19, 1, 360, 70, 63,
30, 1810, 181, 66, 34, 453, 286, 135,
6, 3, 30, 28, 18, 904, 68, 112,
31, 574, 57, 142, 1, 454, 182, 69,
20, 575, 125, 24, 7, 455, 134, 25,
21, 475, 2, 70, 13, 1811, 474, 361
};
static const uint8_t vc9_cbpcy_i_bits[64] = {
1, 6, 5, 5, 5, 9, 7, 7, 5, 9, 7, 7, 6, 9, 8, 8,
5, 9, 7, 7, 6, 10, 8, 8, 6, 13, 9, 8, 7, 11, 10, 9,
4, 9, 7, 6, 7, 12, 9, 9, 6, 11, 8, 9, 7, 11, 9, 9,
6, 11, 9, 9, 7, 11, 9, 9, 6, 10, 9, 9, 8, 13, 10, 10
}; };
/* P-Picture CBPCY VLC tables */ /* P-Picture CBPCY VLC tables */
......
...@@ -244,7 +244,7 @@ void ff_wmv2_encode_mb(MpegEncContext * s, ...@@ -244,7 +244,7 @@ void ff_wmv2_encode_mb(MpegEncContext * s,
if (s->pict_type == I_TYPE) { if (s->pict_type == I_TYPE) {
set_stat(ST_INTRA_MB); set_stat(ST_INTRA_MB);
put_bits(&s->pb, put_bits(&s->pb,
table_mb_intra[coded_cbp][1], table_mb_intra[coded_cbp][0]); ff_msmp4_mb_i_table[coded_cbp][1], ff_msmp4_mb_i_table[coded_cbp][0]);
} else { } else {
put_bits(&s->pb, put_bits(&s->pb,
wmv2_inter_table[w->cbp_table_index][cbp][1], wmv2_inter_table[w->cbp_table_index][cbp][1],
...@@ -734,7 +734,7 @@ static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) ...@@ -734,7 +734,7 @@ static int wmv2_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
cbp = code & 0x3f; cbp = code & 0x3f;
} else { } else {
s->mb_intra = 1; s->mb_intra = 1;
code = get_vlc2(&s->gb, mb_intra_vlc.table, MB_INTRA_VLC_BITS, 2); code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
if (code < 0){ if (code < 0){
av_log(s->avctx, AV_LOG_ERROR, "II-cbp illegal at %d %d\n", s->mb_x, s->mb_y); av_log(s->avctx, AV_LOG_ERROR, "II-cbp illegal at %d %d\n", s->mb_x, s->mb_y);
return -1; return -1;
......
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