Add previously omitted overlap smooting and loop filtering for frame/field-interlace pictures. For progressive pictures switch to the re-implemented versions of overlap smooting and loop filtering. Signed-off-by: Jerome Borsboom <jerome.borsboom@carpalis.nl>tags/n4.1
| @@ -1328,16 +1328,6 @@ static int vc1_decode_p_mb(VC1Context *v) | |||
| if (v->rangeredfrm) | |||
| for (j = 0; j < 64; j++) | |||
| v->block[v->cur_blk_idx][i][j] <<= 1; | |||
| s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i], | |||
| s->dest[dst_idx] + off, | |||
| i & 4 ? s->uvlinesize | |||
| : s->linesize); | |||
| if (v->pq >= 9 && v->overlap) { | |||
| if (v->c_avail) | |||
| v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize); | |||
| if (v->a_avail) | |||
| v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize); | |||
| } | |||
| block_cbp |= 0xF << (i << 2); | |||
| block_intra |= 1 << i; | |||
| } else if (val) { | |||
| @@ -1439,16 +1429,6 @@ static int vc1_decode_p_mb(VC1Context *v) | |||
| if (v->rangeredfrm) | |||
| for (j = 0; j < 64; j++) | |||
| v->block[v->cur_blk_idx][i][j] <<= 1; | |||
| s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i], | |||
| s->dest[dst_idx] + off, | |||
| (i & 4) ? s->uvlinesize | |||
| : s->linesize); | |||
| if (v->pq >= 9 && v->overlap) { | |||
| if (v->c_avail) | |||
| v->vc1dsp.vc1_h_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize); | |||
| if (v->a_avail) | |||
| v->vc1dsp.vc1_v_overlap(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize); | |||
| } | |||
| block_cbp |= 0xF << (i << 2); | |||
| block_intra |= 1 << i; | |||
| } else if (is_coded[i]) { | |||
| @@ -1479,6 +1459,10 @@ static int vc1_decode_p_mb(VC1Context *v) | |||
| } | |||
| } | |||
| end: | |||
| if (v->overlap && v->pq >= 9) | |||
| ff_vc1_p_overlap_filter(v); | |||
| vc1_put_signed_blocks_clamped(v); | |||
| v->cbp[s->mb_x] = block_cbp; | |||
| v->ttblk[s->mb_x] = block_tt; | |||
| v->is_intra[s->mb_x] = block_intra; | |||
| @@ -1506,7 +1490,7 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) | |||
| int skipped, fourmv = 0, twomv = 0; | |||
| int block_cbp = 0, pat, block_tt = 0; | |||
| int idx_mbmode = 0, mvbp; | |||
| int stride_y, fieldtx; | |||
| int fieldtx; | |||
| mquant = v->pq; /* Lossy initialization */ | |||
| @@ -1584,17 +1568,10 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) | |||
| if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY)) | |||
| continue; | |||
| v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]); | |||
| if (i < 4) { | |||
| stride_y = s->linesize << fieldtx; | |||
| if (i < 4) | |||
| off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize; | |||
| } else { | |||
| stride_y = s->uvlinesize; | |||
| else | |||
| off = 0; | |||
| } | |||
| s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i], | |||
| s->dest[dst_idx] + off, | |||
| stride_y); | |||
| //TODO: loop filter | |||
| block_cbp |= 0xf << (i << 2); | |||
| } | |||
| @@ -1693,6 +1670,10 @@ static int vc1_decode_p_mb_intfr(VC1Context *v) | |||
| ff_vc1_mc_1mv(v, 0); | |||
| v->fieldtx_plane[mb_pos] = 0; | |||
| } | |||
| if (v->overlap && v->pq >= 9) | |||
| ff_vc1_p_overlap_filter(v); | |||
| vc1_put_signed_blocks_clamped(v); | |||
| v->cbp[s->mb_x] = block_cbp; | |||
| v->ttblk[s->mb_x] = block_tt; | |||
| @@ -1754,11 +1735,6 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) | |||
| continue; | |||
| v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][i]); | |||
| off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize); | |||
| s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][i], | |||
| s->dest[dst_idx] + off, | |||
| (i & 4) ? s->uvlinesize | |||
| : s->linesize); | |||
| // TODO: loop filter | |||
| block_cbp |= 0xf << (i << 2); | |||
| } | |||
| } else { | |||
| @@ -1814,6 +1790,10 @@ static int vc1_decode_p_mb_intfi(VC1Context *v) | |||
| } | |||
| } | |||
| } | |||
| if (v->overlap && v->pq >= 9) | |||
| ff_vc1_p_overlap_filter(v); | |||
| vc1_put_signed_blocks_clamped(v); | |||
| v->cbp[s->mb_x] = block_cbp; | |||
| v->ttblk[s->mb_x] = block_tt; | |||
| @@ -2040,7 +2020,6 @@ static void vc1_decode_b_mb_intfi(VC1Context *v) | |||
| s->dest[dst_idx] + off, | |||
| (i & 4) ? s->uvlinesize | |||
| : s->linesize); | |||
| // TODO: yet to perform loop filter | |||
| } | |||
| } else { | |||
| s->mb_intra = v->is_intra[s->mb_x] = 0; | |||
| @@ -2734,10 +2713,11 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) | |||
| v->vc1dsp.vc1_inv_trans_8x8(block[k]); | |||
| } | |||
| ff_vc1_smooth_overlap_filter_iblk(v); | |||
| if (v->overlap && v->condover != CONDOVER_NONE) | |||
| ff_vc1_i_overlap_filter(v); | |||
| vc1_put_signed_blocks_clamped(v); | |||
| if (v->s.loop_filter) | |||
| ff_vc1_loop_filter_iblk_delayed(v, v->pq); | |||
| ff_vc1_i_loop_filter(v); | |||
| if (get_bits_count(&s->gb) > v->bits) { | |||
| // TODO: may need modification to handle slice coding | |||
| @@ -2758,19 +2738,6 @@ static void vc1_decode_i_blocks_adv(VC1Context *v) | |||
| s->first_slice_line = 0; | |||
| } | |||
| /* raw bottom MB row */ | |||
| s->mb_x = 0; | |||
| init_block_index(v); | |||
| for (; s->mb_x < s->mb_width; s->mb_x++) { | |||
| ff_update_block_index(s); | |||
| vc1_put_signed_blocks_clamped(v); | |||
| if (v->s.loop_filter) | |||
| ff_vc1_loop_filter_iblk_delayed(v, v->pq); | |||
| inc_blk_idx(v->topleft_blk_idx); | |||
| inc_blk_idx(v->top_blk_idx); | |||
| inc_blk_idx(v->left_blk_idx); | |||
| inc_blk_idx(v->cur_blk_idx); | |||
| } | |||
| if (v->s.loop_filter) | |||
| ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16); | |||
| ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, | |||
| @@ -2807,8 +2774,7 @@ static void vc1_decode_p_blocks(VC1Context *v) | |||
| break; | |||
| } | |||
| apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY) && | |||
| v->fcm == PROGRESSIVE; | |||
| apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY); | |||
| s->first_slice_line = 1; | |||
| memset(v->cbp_base, 0, sizeof(v->cbp_base[0]) * 3 * s->mb_stride); | |||
| for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) { | |||
| @@ -2817,13 +2783,19 @@ static void vc1_decode_p_blocks(VC1Context *v) | |||
| for (; s->mb_x < s->mb_width; s->mb_x++) { | |||
| ff_update_block_index(s); | |||
| if (v->fcm == ILACE_FIELD) | |||
| if (v->fcm == ILACE_FIELD) { | |||
| vc1_decode_p_mb_intfi(v); | |||
| else if (v->fcm == ILACE_FRAME) | |||
| if (apply_loop_filter) | |||
| ff_vc1_p_loop_filter(v); | |||
| } else if (v->fcm == ILACE_FRAME) { | |||
| vc1_decode_p_mb_intfr(v); | |||
| else vc1_decode_p_mb(v); | |||
| if (s->mb_y != s->start_mb_y && apply_loop_filter) | |||
| ff_vc1_apply_p_loop_filter(v); | |||
| if (apply_loop_filter) | |||
| ff_vc1_p_intfr_loop_filter(v); | |||
| } else { | |||
| vc1_decode_p_mb(v); | |||
| if (apply_loop_filter) | |||
| ff_vc1_p_loop_filter(v); | |||
| } | |||
| if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { | |||
| // TODO: may need modification to handle slice coding | |||
| ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR); | |||
| @@ -2852,14 +2824,6 @@ static void vc1_decode_p_blocks(VC1Context *v) | |||
| ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16); | |||
| s->first_slice_line = 0; | |||
| } | |||
| if (apply_loop_filter) { | |||
| s->mb_x = 0; | |||
| init_block_index(v); | |||
| for (; s->mb_x < s->mb_width; s->mb_x++) { | |||
| ff_update_block_index(s); | |||
| ff_vc1_apply_p_loop_filter(v); | |||
| } | |||
| } | |||
| if (s->end_mb_y >= s->start_mb_y) | |||
| ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16); | |||
| ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1, | |||
| @@ -2902,12 +2866,19 @@ static void vc1_decode_b_blocks(VC1Context *v) | |||
| for (; s->mb_x < s->mb_width; s->mb_x++) { | |||
| ff_update_block_index(s); | |||
| if (v->fcm == ILACE_FIELD) | |||
| if (v->fcm == ILACE_FIELD) { | |||
| vc1_decode_b_mb_intfi(v); | |||
| else if (v->fcm == ILACE_FRAME) | |||
| if (v->s.loop_filter) | |||
| ff_vc1_b_intfi_loop_filter(v); | |||
| } else if (v->fcm == ILACE_FRAME) { | |||
| vc1_decode_b_mb_intfr(v); | |||
| else | |||
| if (v->s.loop_filter) | |||
| ff_vc1_p_intfr_loop_filter(v); | |||
| } else { | |||
| vc1_decode_b_mb(v); | |||
| if (v->s.loop_filter) | |||
| ff_vc1_i_loop_filter(v); | |||
| } | |||
| if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) { | |||
| // TODO: may need modification to handle slice coding | |||
| ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR); | |||
| @@ -2915,8 +2886,6 @@ static void vc1_decode_b_blocks(VC1Context *v) | |||
| get_bits_count(&s->gb), v->bits, s->mb_x, s->mb_y); | |||
| return; | |||
| } | |||
| if (v->s.loop_filter) | |||
| ff_vc1_loop_filter_iblk(v, v->pq); | |||
| } | |||
| memmove(v->cbp_base, | |||
| v->cbp - s->mb_stride, | |||
| @@ -3,16 +3,16 @@ | |||
| #codec_id 0: rawvideo | |||
| #dimensions 0: 1920x1080 | |||
| #sar 0: 1/1 | |||
| 0, 0, 0, 1, 3110400, 0x764f8856 | |||
| 0, 2, 2, 1, 3110400, 0x3b615b79 | |||
| 0, 3, 3, 1, 3110400, 0x4fbb6f84 | |||
| 0, 4, 4, 1, 3110400, 0xc1ca8532 | |||
| 0, 5, 5, 1, 3110400, 0xbdabd2a8 | |||
| 0, 6, 6, 1, 3110400, 0x66e60c5a | |||
| 0, 7, 7, 1, 3110400, 0x8044891c | |||
| 0, 8, 8, 1, 3110400, 0x3a4e8992 | |||
| 0, 9, 9, 1, 3110400, 0xe49fcb23 | |||
| 0, 10, 10, 1, 3110400, 0xe8e165b6 | |||
| 0, 11, 11, 1, 3110400, 0x046321b5 | |||
| 0, 12, 12, 1, 3110400, 0x3cbe5125 | |||
| 0, 13, 13, 1, 3110400, 0xcb4328e7 | |||
| 0, 0, 0, 1, 3110400, 0xc95e8861 | |||
| 0, 2, 2, 1, 3110400, 0xf58b5cbf | |||
| 0, 3, 3, 1, 3110400, 0x2f866f33 | |||
| 0, 4, 4, 1, 3110400, 0x05c18415 | |||
| 0, 5, 5, 1, 3110400, 0x4077ca93 | |||
| 0, 6, 6, 1, 3110400, 0x44d105fc | |||
| 0, 7, 7, 1, 3110400, 0xa0608374 | |||
| 0, 8, 8, 1, 3110400, 0x407689dc | |||
| 0, 9, 9, 1, 3110400, 0x4707d00a | |||
| 0, 10, 10, 1, 3110400, 0x74986831 | |||
| 0, 11, 11, 1, 3110400, 0xa5912619 | |||
| 0, 12, 12, 1, 3110400, 0x44aa5565 | |||
| 0, 13, 13, 1, 3110400, 0xb9752774 | |||
| @@ -3,33 +3,33 @@ | |||
| #codec_id 0: rawvideo | |||
| #dimensions 0: 720x480 | |||
| #sar 0: 1/1 | |||
| 0, 0, 0, 1, 518400, 0x89407f55 | |||
| 0, 2, 2, 1, 518400, 0xaa896afd | |||
| 0, 3, 3, 1, 518400, 0x0e69ff59 | |||
| 0, 4, 4, 1, 518400, 0x0c30bfa0 | |||
| 0, 5, 5, 1, 518400, 0x1a5b6a69 | |||
| 0, 6, 6, 1, 518400, 0x23470858 | |||
| 0, 7, 7, 1, 518400, 0x9a4e3c54 | |||
| 0, 8, 8, 1, 518400, 0xad63160b | |||
| 0, 9, 9, 1, 518400, 0x0fcfeebc | |||
| 0, 10, 10, 1, 518400, 0x20b31777 | |||
| 0, 11, 11, 1, 518400, 0x9d79df09 | |||
| 0, 12, 12, 1, 518400, 0x3e86766f | |||
| 0, 13, 13, 1, 518400, 0x638a8746 | |||
| 0, 14, 14, 1, 518400, 0x7a6c1a0e | |||
| 0, 15, 15, 1, 518400, 0x306f6cef | |||
| 0, 16, 16, 1, 518400, 0x81f81281 | |||
| 0, 17, 17, 1, 518400, 0x49ab5bf5 | |||
| 0, 18, 18, 1, 518400, 0x8f316e44 | |||
| 0, 19, 19, 1, 518400, 0x95ae00c9 | |||
| 0, 20, 20, 1, 518400, 0xf71bb7f5 | |||
| 0, 21, 21, 1, 518400, 0x5205ea68 | |||
| 0, 22, 22, 1, 518400, 0x74a1d8b9 | |||
| 0, 23, 23, 1, 518400, 0xa3217616 | |||
| 0, 24, 24, 1, 518400, 0x2b28bbf8 | |||
| 0, 25, 25, 1, 518400, 0xf024872a | |||
| 0, 26, 26, 1, 518400, 0x2fdbaaf3 | |||
| 0, 27, 27, 1, 518400, 0xa3a2418e | |||
| 0, 28, 28, 1, 518400, 0x55bfe435 | |||
| 0, 29, 29, 1, 518400, 0x50fb6c94 | |||
| 0, 30, 30, 1, 518400, 0x5584bb40 | |||
| 0, 0, 0, 1, 518400, 0x34fa7f55 | |||
| 0, 2, 2, 1, 518400, 0x60466bc1 | |||
| 0, 3, 3, 1, 518400, 0xe68dff1e | |||
| 0, 4, 4, 1, 518400, 0x790ac06a | |||
| 0, 5, 5, 1, 518400, 0xb3b26b27 | |||
| 0, 6, 6, 1, 518400, 0x8840096c | |||
| 0, 7, 7, 1, 518400, 0xf75c3d61 | |||
| 0, 8, 8, 1, 518400, 0xca071781 | |||
| 0, 9, 9, 1, 518400, 0xa8e6edf9 | |||
| 0, 10, 10, 1, 518400, 0xabb61984 | |||
| 0, 11, 11, 1, 518400, 0x0b31dedd | |||
| 0, 12, 12, 1, 518400, 0xf44378ef | |||
| 0, 13, 13, 1, 518400, 0xf7268996 | |||
| 0, 14, 14, 1, 518400, 0x8c5b1ff4 | |||
| 0, 15, 15, 1, 518400, 0xda356fd2 | |||
| 0, 16, 16, 1, 518400, 0x0e091c57 | |||
| 0, 17, 17, 1, 518400, 0x17645e68 | |||
| 0, 18, 18, 1, 518400, 0xf47a71ef | |||
| 0, 19, 19, 1, 518400, 0x6c440498 | |||
| 0, 20, 20, 1, 518400, 0xd705bd32 | |||
| 0, 21, 21, 1, 518400, 0x0800edd0 | |||
| 0, 22, 22, 1, 518400, 0x902be119 | |||
| 0, 23, 23, 1, 518400, 0x0f7d7bc4 | |||
| 0, 24, 24, 1, 518400, 0x9f4dc421 | |||
| 0, 25, 25, 1, 518400, 0x3b8c8d5a | |||
| 0, 26, 26, 1, 518400, 0xbcdfb2b9 | |||
| 0, 27, 27, 1, 518400, 0xa02a46c3 | |||
| 0, 28, 28, 1, 518400, 0x8ecde915 | |||
| 0, 29, 29, 1, 518400, 0x20576bfd | |||
| 0, 30, 30, 1, 518400, 0xac40bc36 | |||