[FFmpeg-cvslog] vc1dec: Fix mv_f shuffling

Michael Niedermayer git at videolan.org
Wed Apr 24 14:07:55 CEST 2013


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Wed Apr 24 13:51:10 2013 +0200| [3fdd0979acd384f1c006aa5ca097e39a7b735983] | committer: Michael Niedermayer

vc1dec: Fix mv_f shuffling

Avoid a (confusing) memcpy()
Simpler code
Fixes a small number of artifacts in black_screen_VC-1.mkv
and several more artifacts in other videos

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3fdd0979acd384f1c006aa5ca097e39a7b735983
---

 libavcodec/vc1dec.c |   26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
index 50e47e7..fc26146 100644
--- a/libavcodec/vc1dec.c
+++ b/libavcodec/vc1dec.c
@@ -6008,22 +6008,11 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data,
         v->bits = buf_size * 8;
         v->end_mb_x = s->mb_width;
         if (v->field_mode) {
-            uint8_t *tmp[2];
             s->current_picture.f.linesize[0] <<= 1;
             s->current_picture.f.linesize[1] <<= 1;
             s->current_picture.f.linesize[2] <<= 1;
             s->linesize                      <<= 1;
             s->uvlinesize                    <<= 1;
-            if (v->s.pict_type != AV_PICTURE_TYPE_BI && v->s.pict_type != AV_PICTURE_TYPE_B) {
-            tmp[0]          = v->mv_f_last[0];
-            tmp[1]          = v->mv_f_last[1];
-            v->mv_f_last[0] = v->mv_f_next[0];
-            v->mv_f_last[1] = v->mv_f_next[1];
-            v->mv_f_next[0] = v->mv_f[0];
-            v->mv_f_next[1] = v->mv_f[1];
-            v->mv_f[0] = tmp[0];
-            v->mv_f[1] = tmp[1];
-            }
         }
         mb_height = s->mb_height >> v->field_mode;
         for (i = 0; i <= n_slices; i++) {
@@ -6083,15 +6072,22 @@ static int vc1_decode_frame(AVCodecContext *avctx, void *data,
         }
         if (v->field_mode) {
             v->second_field = 0;
-            if (s->pict_type == AV_PICTURE_TYPE_B) {
-                memcpy(v->mv_f_base, v->mv_f_next_base,
-                       2 * (s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2));
-            }
             s->current_picture.f.linesize[0] >>= 1;
             s->current_picture.f.linesize[1] >>= 1;
             s->current_picture.f.linesize[2] >>= 1;
             s->linesize                      >>= 1;
             s->uvlinesize                    >>= 1;
+            if (v->s.pict_type != AV_PICTURE_TYPE_BI && v->s.pict_type != AV_PICTURE_TYPE_B) {
+                uint8_t *tmp[2];
+                tmp[0]          = v->mv_f_last[0];
+                tmp[1]          = v->mv_f_last[1];
+                v->mv_f_last[0] = v->mv_f_next[0];
+                v->mv_f_last[1] = v->mv_f_next[1];
+                v->mv_f_next[0] = v->mv_f[0];
+                v->mv_f_next[1] = v->mv_f[1];
+                v->mv_f[0] = tmp[0];
+                v->mv_f[1] = tmp[1];
+            }
         }
         av_dlog(s->avctx, "Consumed %i/%i bits\n",
                 get_bits_count(&s->gb), s->gb.size_in_bits);



More information about the ffmpeg-cvslog mailing list