*/
/**
- * @file libavcodec/vc1.c
+ * @file
* VC-1 and WMV3 decoder common code
*
*/
v->profile = get_bits(gb, 2);
if (v->profile == PROFILE_COMPLEX)
{
- av_log(avctx, AV_LOG_ERROR, "WMV3 Complex Profile is not fully supported\n");
+ av_log(avctx, AV_LOG_WARNING, "WMV3 Complex Profile is not fully supported\n");
}
if (v->profile == PROFILE_ADVANCED)
{
v->zz_8x4 = wmv2_scantableA;
v->zz_4x8 = wmv2_scantableB;
- v->res_sm = get_bits(gb, 2); //reserved
- if (v->res_sm)
+ v->res_y411 = get_bits1(gb);
+ v->res_sprite = get_bits1(gb);
+ if (v->res_y411)
{
av_log(avctx, AV_LOG_ERROR,
- "Reserved RES_SM=%i is forbidden\n", v->res_sm);
+ "Old interlaced mode is not supported\n");
return -1;
}
+ if (v->res_sprite) {
+ av_log(avctx, AV_LOG_ERROR, "WMVP is not fully supported\n");
+ }
}
// (fps-2)/4 (->30)
v->res_fasttx = get_bits1(gb);
if (!v->res_fasttx)
{
- v->s.dsp.vc1_inv_trans_8x8 = ff_simple_idct;
- v->s.dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add;
- v->s.dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add;
- v->s.dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add;
- v->s.dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add;
- v->s.dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
- v->s.dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
- v->s.dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
+ v->vc1dsp.vc1_inv_trans_8x8 = ff_simple_idct;
+ v->vc1dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add;
+ v->vc1dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add;
+ v->vc1dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add;
+ v->vc1dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add;
+ v->vc1dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
+ v->vc1dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
+ v->vc1dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
}
v->fastuvmc = get_bits1(gb); //common
v->quantizer_mode = get_bits(gb, 2); //common
v->finterpflag = get_bits1(gb); //common
- v->res_rtm_flag = get_bits1(gb); //reserved
+
+ if (v->res_sprite) {
+ v->s.avctx->width = v->s.avctx->coded_width = get_bits(gb, 11);
+ v->s.avctx->height = v->s.avctx->coded_height = get_bits(gb, 11);
+ skip_bits(gb, 5); //frame rate
+ v->res_x8 = get_bits1(gb);
+ if (get_bits1(gb)) { // something to do with DC VLC selection
+ av_log(avctx, AV_LOG_ERROR, "Unsupported sprite feature\n");
+ return -1;
+ }
+ skip_bits(gb, 3); //slice code
+ v->res_rtm_flag = 0;
+ } else {
+ v->res_rtm_flag = get_bits1(gb); //reserved
+ }
if (!v->res_rtm_flag)
{
// av_log(avctx, AV_LOG_ERROR,
// "0 for reserved RES_RTM_FLAG is forbidden\n");
av_log(avctx, AV_LOG_ERROR,
- "Old WMV3 version detected, only I-frames will be decoded\n");
+ "Old WMV3 version detected, some frames may be decoded incorrectly\n");
//return -1;
}
//TODO: figure out what they mean (always 0x402F)
v->s.pict_type = get_bits1(gb);
if (v->s.avctx->max_b_frames) {
if (!v->s.pict_type) {
- if (get_bits1(gb)) v->s.pict_type = FF_I_TYPE;
- else v->s.pict_type = FF_B_TYPE;
- } else v->s.pict_type = FF_P_TYPE;
- } else v->s.pict_type = v->s.pict_type ? FF_P_TYPE : FF_I_TYPE;
+ if (get_bits1(gb)) v->s.pict_type = AV_PICTURE_TYPE_I;
+ else v->s.pict_type = AV_PICTURE_TYPE_B;
+ } else v->s.pict_type = AV_PICTURE_TYPE_P;
+ } else v->s.pict_type = v->s.pict_type ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
v->bi_type = 0;
- if(v->s.pict_type == FF_B_TYPE) {
+ if(v->s.pict_type == AV_PICTURE_TYPE_B) {
v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
if(v->bfraction == 0) {
- v->s.pict_type = FF_BI_TYPE;
+ v->s.pict_type = AV_PICTURE_TYPE_BI;
}
}
- if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
+ if(v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
skip_bits(gb, 7); // skip buffer fullness
if(v->parse_only)
return 0;
/* calculate RND */
- if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
+ if(v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
v->rnd = 1;
- if(v->s.pict_type == FF_P_TYPE)
+ if(v->s.pict_type == AV_PICTURE_TYPE_P)
v->rnd ^= 1;
/* Quantizer stuff */
v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
v->range_x = 1 << (v->k_x - 1);
v->range_y = 1 << (v->k_y - 1);
- if (v->multires && v->s.pict_type != FF_B_TYPE) v->respic = get_bits(gb, 2);
+ if (v->multires && v->s.pict_type != AV_PICTURE_TYPE_B) v->respic = get_bits(gb, 2);
- if(v->res_x8 && (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)){
+ if(v->res_x8 && (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)){
v->x8_type = get_bits1(gb);
}else v->x8_type = 0;
//av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
-// (v->s.pict_type == FF_P_TYPE) ? 'P' : ((v->s.pict_type == FF_I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm);
+// (v->s.pict_type == AV_PICTURE_TYPE_P) ? 'P' : ((v->s.pict_type == AV_PICTURE_TYPE_I) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm);
- if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_P_TYPE) v->use_ic = 0;
+ if(v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_P) v->use_ic = 0;
switch(v->s.pict_type) {
- case FF_P_TYPE:
+ case AV_PICTURE_TYPE_P:
if (v->pq < 5) v->tt_index = 0;
else if(v->pq < 13) v->tt_index = 1;
else v->tt_index = 2;
v->ttfrm = TT_8X8;
}
break;
- case FF_B_TYPE:
+ case AV_PICTURE_TYPE_B:
if (v->pq < 5) v->tt_index = 0;
else if(v->pq < 13) v->tt_index = 1;
else v->tt_index = 2;
{
/* AC Syntax */
v->c_ac_table_index = decode012(gb);
- if (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
+ if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
{
v->y_ac_table_index = decode012(gb);
}
v->s.dc_table_index = get_bits1(gb);
}
- if(v->s.pict_type == FF_BI_TYPE) {
- v->s.pict_type = FF_B_TYPE;
+ if(v->s.pict_type == AV_PICTURE_TYPE_BI) {
+ v->s.pict_type = AV_PICTURE_TYPE_B;
v->bi_type = 1;
}
return 0;
if(v->interlace){
v->fcm = decode012(gb);
- if(v->fcm) return -1; // interlaced frames/fields are not implemented
+ if(v->fcm){
+ if(!v->warn_interlaced++)
+ av_log(v->s.avctx, AV_LOG_ERROR, "Interlaced frames/fields support is not implemented\n");
+ return -1;
+ }
}
switch(get_unary(gb, 0, 4)) {
case 0:
- v->s.pict_type = FF_P_TYPE;
+ v->s.pict_type = AV_PICTURE_TYPE_P;
break;
case 1:
- v->s.pict_type = FF_B_TYPE;
+ v->s.pict_type = AV_PICTURE_TYPE_B;
break;
case 2:
- v->s.pict_type = FF_I_TYPE;
+ v->s.pict_type = AV_PICTURE_TYPE_I;
break;
case 3:
- v->s.pict_type = FF_BI_TYPE;
+ v->s.pict_type = AV_PICTURE_TYPE_BI;
break;
case 4:
- v->s.pict_type = FF_P_TYPE; // skipped pic
+ v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
v->p_frame_skipped = 1;
return 0;
}
v->rptfrm = get_bits(gb, 2);
} else {
v->tff = get_bits1(gb);
- v->rptfrm = get_bits1(gb);
+ v->rff = get_bits1(gb);
}
}
if(v->panscanflag) {
+ av_log_missing_feature(v->s.avctx, "Pan-scan", 0);
//...
}
v->rnd = get_bits1(gb);
if(v->interlace)
v->uvsamp = get_bits1(gb);
if(v->finterpflag) v->interpfrm = get_bits1(gb);
- if(v->s.pict_type == FF_B_TYPE) {
+ if(v->s.pict_type == AV_PICTURE_TYPE_B) {
v->bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
v->bfraction = ff_vc1_bfraction_lut[v->bfraction_lut_index];
if(v->bfraction == 0) {
- v->s.pict_type = FF_BI_TYPE; /* XXX: should not happen here */
+ v->s.pict_type = AV_PICTURE_TYPE_BI; /* XXX: should not happen here */
}
}
pqindex = get_bits(gb, 5);
if(v->postprocflag)
v->postproc = get_bits(gb, 2);
- if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_P_TYPE) v->use_ic = 0;
+ if(v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_P) v->use_ic = 0;
if(v->parse_only)
return 0;
switch(v->s.pict_type) {
- case FF_I_TYPE:
- case FF_BI_TYPE:
+ case AV_PICTURE_TYPE_I:
+ case AV_PICTURE_TYPE_BI:
status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
if (status < 0) return -1;
av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
}
}
break;
- case FF_P_TYPE:
+ case AV_PICTURE_TYPE_P:
if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3);
else v->mvrange = 0;
v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
v->ttfrm = TT_8X8;
}
break;
- case FF_B_TYPE:
+ case AV_PICTURE_TYPE_B:
if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3);
else v->mvrange = 0;
v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
/* AC Syntax */
v->c_ac_table_index = decode012(gb);
- if (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
+ if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
{
v->y_ac_table_index = decode012(gb);
}
/* DC Syntax */
v->s.dc_table_index = get_bits1(gb);
- if ((v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE) && v->dquant) {
+ if ((v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) && v->dquant) {
av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
vop_dquant_decoding(v);
}
v->bi_type = 0;
- if(v->s.pict_type == FF_BI_TYPE) {
- v->s.pict_type = FF_B_TYPE;
+ if(v->s.pict_type == AV_PICTURE_TYPE_BI) {
+ v->s.pict_type = AV_PICTURE_TYPE_B;
v->bi_type = 1;
}
return 0;