mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
vc1: use an enum for Frame Coding Mode
Document it a little and possibly fix a bug in dxva2_vc1.
This commit is contained in:
parent
9270b8a3d1
commit
1f948745c3
@ -68,7 +68,7 @@ static void fill_picture_parameters(AVCodecContext *avctx,
|
|||||||
pp->bPicStructure |= 0x01;
|
pp->bPicStructure |= 0x01;
|
||||||
if (s->picture_structure & PICT_BOTTOM_FIELD)
|
if (s->picture_structure & PICT_BOTTOM_FIELD)
|
||||||
pp->bPicStructure |= 0x02;
|
pp->bPicStructure |= 0x02;
|
||||||
pp->bSecondField = v->interlace && v->fcm != 0x03 && !s->first_field;
|
pp->bSecondField = v->interlace && v->fcm != ILACE_FIELD && !s->first_field;
|
||||||
pp->bPicIntra = s->pict_type == AV_PICTURE_TYPE_I;
|
pp->bPicIntra = s->pict_type == AV_PICTURE_TYPE_I;
|
||||||
pp->bPicBackwardPrediction = s->pict_type == AV_PICTURE_TYPE_B;
|
pp->bPicBackwardPrediction = s->pict_type == AV_PICTURE_TYPE_B;
|
||||||
pp->bBidirectionalAveragingMode = (1 << 7) |
|
pp->bBidirectionalAveragingMode = (1 << 7) |
|
||||||
@ -100,7 +100,7 @@ static void fill_picture_parameters(AVCodecContext *avctx,
|
|||||||
(s->resync_marker << 4) |
|
(s->resync_marker << 4) |
|
||||||
(v->rangered << 3) |
|
(v->rangered << 3) |
|
||||||
(s->max_b_frames );
|
(s->max_b_frames );
|
||||||
pp->bPicExtrapolation = (!v->interlace || v->fcm == 0x00) ? 1 : 2;
|
pp->bPicExtrapolation = (!v->interlace || v->fcm == PROGRESSIVE) ? 1 : 2;
|
||||||
pp->bPicDeblocked = ((v->profile != PROFILE_ADVANCED && v->rangeredfrm) << 5) |
|
pp->bPicDeblocked = ((v->profile != PROFILE_ADVANCED && v->rangeredfrm) << 5) |
|
||||||
(s->loop_filter << 1);
|
(s->loop_filter << 1);
|
||||||
pp->bPicDeblockConfined = (v->postprocflag << 7) |
|
pp->bPicDeblockConfined = (v->postprocflag << 7) |
|
||||||
|
@ -836,14 +836,14 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
if (v->interlace) {
|
if (v->interlace) {
|
||||||
v->fcm = decode012(gb);
|
v->fcm = decode012(gb);
|
||||||
if (v->fcm) {
|
if (v->fcm) {
|
||||||
if (v->fcm == 2)
|
if (v->fcm == ILACE_FIELD)
|
||||||
v->field_mode = 1;
|
v->field_mode = 1;
|
||||||
if (!v->warn_interlaced++)
|
if (!v->warn_interlaced++)
|
||||||
av_log(v->s.avctx, AV_LOG_ERROR,
|
av_log(v->s.avctx, AV_LOG_ERROR,
|
||||||
"Interlaced frames/fields support is incomplete\n");
|
"Interlaced frames/fields support is incomplete\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
v->fcm = 0;
|
v->fcm = PROGRESSIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v->field_mode) {
|
if (v->field_mode) {
|
||||||
@ -957,7 +957,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
switch (v->s.pict_type) {
|
switch (v->s.pict_type) {
|
||||||
case AV_PICTURE_TYPE_I:
|
case AV_PICTURE_TYPE_I:
|
||||||
case AV_PICTURE_TYPE_BI:
|
case AV_PICTURE_TYPE_BI:
|
||||||
if (v->fcm == 1) { //interlace frame picture
|
if (v->fcm == ILACE_FRAME) { //interlace frame picture
|
||||||
status = bitplane_decoding(v->fieldtx_plane, &v->fieldtx_is_raw, v);
|
status = bitplane_decoding(v->fieldtx_plane, &v->fieldtx_is_raw, v);
|
||||||
if (status < 0)
|
if (status < 0)
|
||||||
return -1;
|
return -1;
|
||||||
@ -998,7 +998,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
v->dmvrange = get_unary(gb, 0, 3);
|
v->dmvrange = get_unary(gb, 0, 3);
|
||||||
else
|
else
|
||||||
v->dmvrange = 0;
|
v->dmvrange = 0;
|
||||||
if (v->fcm == 1) { // interlaced frame picture
|
if (v->fcm == ILACE_FRAME) { // interlaced frame picture
|
||||||
v->fourmvswitch = get_bits1(gb);
|
v->fourmvswitch = get_bits1(gb);
|
||||||
v->intcomp = get_bits1(gb);
|
v->intcomp = get_bits1(gb);
|
||||||
if (v->intcomp) {
|
if (v->intcomp) {
|
||||||
@ -1038,7 +1038,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
v->tt_index = 1;
|
v->tt_index = 1;
|
||||||
else
|
else
|
||||||
v->tt_index = 2;
|
v->tt_index = 2;
|
||||||
if (v->fcm != 1) {
|
if (v->fcm != ILACE_FRAME) {
|
||||||
int mvmode;
|
int mvmode;
|
||||||
mvmode = get_unary(gb, 1, 4);
|
mvmode = get_unary(gb, 1, 4);
|
||||||
lowquant = (v->pq > 12) ? 0 : 1;
|
lowquant = (v->pq > 12) ? 0 : 1;
|
||||||
@ -1073,7 +1073,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
|| (v->mv_mode == MV_PMODE_INTENSITY_COMP
|
|| (v->mv_mode == MV_PMODE_INTENSITY_COMP
|
||||||
&& v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
|
&& v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
|
||||||
}
|
}
|
||||||
if (v->fcm == 0) { // progressive
|
if (v->fcm == PROGRESSIVE) { // progressive
|
||||||
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) {
|
||||||
@ -1095,7 +1095,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
/* Hopefully this is correct for P frames */
|
/* Hopefully this is correct for P frames */
|
||||||
v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
|
v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
|
||||||
v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
|
v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
|
||||||
} else if (v->fcm == 1) { // frame interlaced
|
} else if (v->fcm == ILACE_FRAME) { // frame interlaced
|
||||||
v->qs_last = v->s.quarter_sample;
|
v->qs_last = v->s.quarter_sample;
|
||||||
v->s.quarter_sample = 1;
|
v->s.quarter_sample = 1;
|
||||||
v->s.mspel = 1;
|
v->s.mspel = 1;
|
||||||
@ -1135,7 +1135,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
break;
|
break;
|
||||||
case AV_PICTURE_TYPE_B:
|
case AV_PICTURE_TYPE_B:
|
||||||
// TODO: implement interlaced frame B picture decoding
|
// TODO: implement interlaced frame B picture decoding
|
||||||
if (v->fcm == 1)
|
if (v->fcm == ILACE_FRAME)
|
||||||
return -1;
|
return -1;
|
||||||
if (v->extended_mv)
|
if (v->extended_mv)
|
||||||
v->mvrange = get_unary(gb, 0, 3);
|
v->mvrange = get_unary(gb, 0, 3);
|
||||||
|
@ -161,6 +161,16 @@ enum COTypes {
|
|||||||
};
|
};
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FCM Frame Coding Mode
|
||||||
|
* @note some content might be marked interlaced
|
||||||
|
* but have fcm set to 0 as well (e.g. HD-DVD)
|
||||||
|
*/
|
||||||
|
enum FrameCodingMode {
|
||||||
|
PROGRESSIVE = 0, ///< in the bitstream is reported as 00b
|
||||||
|
ILACE_FRAME, ///< in the bitstream is reported as 10b
|
||||||
|
ILACE_FIELD ///< in the bitstream is reported as 11b
|
||||||
|
};
|
||||||
|
|
||||||
/** The VC1 Context
|
/** The VC1 Context
|
||||||
* @todo Change size wherever another size is more efficient
|
* @todo Change size wherever another size is more efficient
|
||||||
@ -296,7 +306,7 @@ typedef struct VC1Context{
|
|||||||
|
|
||||||
/** Frame decoding info for Advanced profile */
|
/** Frame decoding info for Advanced profile */
|
||||||
//@{
|
//@{
|
||||||
uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
|
enum FrameCodingMode fcm;
|
||||||
uint8_t numpanscanwin;
|
uint8_t numpanscanwin;
|
||||||
uint8_t tfcntr;
|
uint8_t tfcntr;
|
||||||
uint8_t rptfrm, tff, rff;
|
uint8_t rptfrm, tff, rff;
|
||||||
|
@ -501,7 +501,8 @@ static void vc1_mc_1mv(VC1Context *v, int dir)
|
|||||||
uvmy = uvmy - 2 + 4 * v->cur_field_type;
|
uvmy = uvmy - 2 + 4 * v->cur_field_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v->fastuvmc && (v->fcm != 1)) { // fastuvmc shall be ignored for interlaced frame picture
|
// fastuvmc shall be ignored for interlaced frame picture
|
||||||
|
if (v->fastuvmc && (v->fcm != ILACE_FRAME)) {
|
||||||
uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
|
uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
|
||||||
uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
|
uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
|
||||||
}
|
}
|
||||||
@ -685,7 +686,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
|
|||||||
uint8_t *srcY;
|
uint8_t *srcY;
|
||||||
int dxy, mx, my, src_x, src_y;
|
int dxy, mx, my, src_x, src_y;
|
||||||
int off;
|
int off;
|
||||||
int fieldmv = (v->fcm == 1) ? v->blk_mv_type[s->block_index[n]] : 0;
|
int fieldmv = (v->fcm == ILACE_FRAME) ? v->blk_mv_type[s->block_index[n]] : 0;
|
||||||
int v_edge_pos = s->v_edge_pos >> v->field_mode;
|
int v_edge_pos = s->v_edge_pos >> v->field_mode;
|
||||||
|
|
||||||
if (!v->field_mode && !v->s.last_picture.f.data[0])
|
if (!v->field_mode && !v->s.last_picture.f.data[0])
|
||||||
@ -744,7 +745,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
|
|||||||
v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
|
v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v->fcm == 1) { // not sure if needed for other types of picture
|
if (v->fcm == ILACE_FRAME) { // not sure if needed for other types of picture
|
||||||
int qx, qy;
|
int qx, qy;
|
||||||
int width = s->avctx->coded_width;
|
int width = s->avctx->coded_width;
|
||||||
int height = s->avctx->coded_height >> 1;
|
int height = s->avctx->coded_height >> 1;
|
||||||
@ -761,7 +762,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
|
|||||||
my -= 8 * (qy - height - 1);
|
my -= 8 * (qy - height - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((v->fcm == 1) && fieldmv)
|
if ((v->fcm == ILACE_FRAME) && fieldmv)
|
||||||
off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
|
off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
|
||||||
else
|
else
|
||||||
off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
|
off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
|
||||||
@ -779,7 +780,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
|
|||||||
src_y = av_clip(src_y, -16, s->mb_height * 16);
|
src_y = av_clip(src_y, -16, s->mb_height * 16);
|
||||||
} else {
|
} else {
|
||||||
src_x = av_clip(src_x, -17, s->avctx->coded_width);
|
src_x = av_clip(src_x, -17, s->avctx->coded_width);
|
||||||
if (v->fcm == 1) {
|
if (v->fcm == ILACE_FRAME) {
|
||||||
if (src_y & 1)
|
if (src_y & 1)
|
||||||
src_y = av_clip(src_y, -17, s->avctx->coded_height + 1);
|
src_y = av_clip(src_y, -17, s->avctx->coded_height + 1);
|
||||||
else
|
else
|
||||||
@ -2917,7 +2918,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
int k;
|
int k;
|
||||||
|
|
||||||
if (v->s.ac_pred) {
|
if (v->s.ac_pred) {
|
||||||
if (!use_pred && v->fcm == 1) {
|
if (!use_pred && v->fcm == ILACE_FRAME) {
|
||||||
zz_table = v->zzi_8x8;
|
zz_table = v->zzi_8x8;
|
||||||
} else {
|
} else {
|
||||||
if (!dc_pred_dir) // top
|
if (!dc_pred_dir) // top
|
||||||
@ -2926,7 +2927,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
zz_table = v->zz_8x8[3];
|
zz_table = v->zz_8x8[3];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (v->fcm != 1)
|
if (v->fcm != ILACE_FRAME)
|
||||||
zz_table = v->zz_8x8[1];
|
zz_table = v->zz_8x8[1];
|
||||||
else
|
else
|
||||||
zz_table = v->zzi_8x8;
|
zz_table = v->zzi_8x8;
|
||||||
@ -3136,10 +3137,10 @@ static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
i += skip;
|
i += skip;
|
||||||
if (i > 63)
|
if (i > 63)
|
||||||
break;
|
break;
|
||||||
if (v->fcm == 0)
|
if (v->fcm == PROGRESSIVE)
|
||||||
block[v->zz_8x8[0][i++]] = value;
|
block[v->zz_8x8[0][i++]] = value;
|
||||||
else {
|
else {
|
||||||
if (use_pred && (v->fcm == 1)) {
|
if (use_pred && (v->fcm == ILACE_FRAME)) {
|
||||||
if (!dc_pred_dir) // top
|
if (!dc_pred_dir) // top
|
||||||
block[v->zz_8x8[2][i++]] = value;
|
block[v->zz_8x8[2][i++]] = value;
|
||||||
else // left
|
else // left
|
||||||
@ -4739,12 +4740,12 @@ static void vc1_decode_p_blocks(VC1Context *v)
|
|||||||
for (; s->mb_x < s->mb_width; s->mb_x++) {
|
for (; s->mb_x < s->mb_width; s->mb_x++) {
|
||||||
ff_update_block_index(s);
|
ff_update_block_index(s);
|
||||||
|
|
||||||
if (v->fcm == 2)
|
if (v->fcm == ILACE_FIELD)
|
||||||
vc1_decode_p_mb_intfi(v);
|
vc1_decode_p_mb_intfi(v);
|
||||||
else if (v->fcm == 1)
|
else if (v->fcm == ILACE_FRAME)
|
||||||
vc1_decode_p_mb_intfr(v);
|
vc1_decode_p_mb_intfr(v);
|
||||||
else vc1_decode_p_mb(v);
|
else vc1_decode_p_mb(v);
|
||||||
if (s->mb_y != s->start_mb_y && apply_loop_filter && v->fcm == 0)
|
if (s->mb_y != s->start_mb_y && apply_loop_filter && v->fcm == PROGRESSIVE)
|
||||||
vc1_apply_p_loop_filter(v);
|
vc1_apply_p_loop_filter(v);
|
||||||
if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
|
if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
|
||||||
// TODO: may need modification to handle slice coding
|
// TODO: may need modification to handle slice coding
|
||||||
@ -4811,7 +4812,7 @@ static void vc1_decode_b_blocks(VC1Context *v)
|
|||||||
for (; s->mb_x < s->mb_width; s->mb_x++) {
|
for (; s->mb_x < s->mb_width; s->mb_x++) {
|
||||||
ff_update_block_index(s);
|
ff_update_block_index(s);
|
||||||
|
|
||||||
if (v->fcm == 2)
|
if (v->fcm == ILACE_FIELD)
|
||||||
vc1_decode_b_mb_intfi(v);
|
vc1_decode_b_mb_intfi(v);
|
||||||
else
|
else
|
||||||
vc1_decode_b_mb(v);
|
vc1_decode_b_mb(v);
|
||||||
|
Loading…
Reference in New Issue
Block a user