summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2008-09-11 06:35:37 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2008-09-11 06:35:37 +0000
commit77298e99b78e268f8e0b7ba8aa5203eeb0e84729 (patch)
tree4258a73c4cbe4d854d4857f45f61ed20feb2d936
parentbdf397ba4baa1fe4605527d26d3d2e4b66eb0fbc (diff)
Make it possible to disable loop filter in VC-1.
Unlike H.264 it does not affect picture quality on any files I've watched. Originally committed as revision 15295 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/vc1.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c
index 9dd6ba801d..375c20ac2c 100644
--- a/libavcodec/vc1.c
+++ b/libavcodec/vc1.c
@@ -877,6 +877,8 @@ static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
av_log(avctx, AV_LOG_ERROR,
"LOOPFILTER shell not be enabled in simple profile\n");
}
+ if(v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
+ v->s.loop_filter = 0;
v->res_x8 = get_bits1(gb); //reserved
v->multires = get_bits1(gb);
@@ -3119,6 +3121,7 @@ static int vc1_decode_p_mb(VC1Context *v)
int dst_idx, off;
int skipped, fourmv;
int block_cbp = 0, pat;
+ int apply_loop_filter;
mquant = v->pq; /* Loosy initialization */
@@ -3133,6 +3136,7 @@ static int vc1_decode_p_mb(VC1Context *v)
s->dsp.clear_blocks(s->block[0]);
+ apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY);
if (!fourmv) /* 1MV mode */
{
if (!skipped)
@@ -3197,7 +3201,7 @@ static int vc1_decode_p_mb(VC1Context *v)
if(v->a_avail)
s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
}
- if(v->s.loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
+ if(apply_loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
int left_cbp, top_cbp;
if(i & 4){
left_cbp = v->cbp[s->mb_x - 1] >> (i * 4);
@@ -3214,7 +3218,7 @@ static int vc1_decode_p_mb(VC1Context *v)
block_cbp |= 0xF << (i << 2);
} else if(val) {
int left_cbp = 0, top_cbp = 0, filter = 0;
- if(v->s.loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
+ if(apply_loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
filter = 1;
if(i & 4){
left_cbp = v->cbp[s->mb_x - 1] >> (i * 4);