hevc_mvs: make sure to always initialize the temporal MV fully
authorAnton Khirnov <anton@khirnov.net>
Mon, 29 Sep 2014 16:25:14 +0000 (16:25 +0000)
committerAnton Khirnov <anton@khirnov.net>
Tue, 7 Oct 2014 07:13:01 +0000 (07:13 +0000)
The spec requires this.

Fixes uninitialized reads on some samples.

Remove now unnecessary initialization of the whole merge candidate list.

libavcodec/hevc_mvs.c

index 8b172a2..721eb3a 100644 (file)
@@ -481,14 +481,10 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
             mergecandlist[nb_merge_cand].is_intra     = 0;
             mergecandlist[nb_merge_cand].pred_flag[0] = available_l0;
             mergecandlist[nb_merge_cand].pred_flag[1] = available_l1;
-            if (available_l0) {
-                mergecandlist[nb_merge_cand].mv[0]      = mv_l0_col;
-                mergecandlist[nb_merge_cand].ref_idx[0] = 0;
-            }
-            if (available_l1) {
-                mergecandlist[nb_merge_cand].mv[1]      = mv_l1_col;
-                mergecandlist[nb_merge_cand].ref_idx[1] = 0;
-            }
+            AV_ZERO16(mergecandlist[nb_merge_cand].ref_idx);
+            mergecandlist[nb_merge_cand].mv[0]      = mv_l0_col;
+            mergecandlist[nb_merge_cand].mv[1]      = mv_l1_col;
+
             if (merge_idx == nb_merge_cand)
                 return;
             nb_merge_cand++;
@@ -558,8 +554,6 @@ void ff_hevc_luma_mv_merge_mode(HEVCContext *s, int x0, int y0, int nPbW,
     int nPbH2 = nPbH;
     HEVCLocalContext *lc = &s->HEVClc;
 
-    memset(mergecand_list, 0, MRG_MAX_NUM_CANDS * sizeof(*mergecand_list));
-
     if (s->pps->log2_parallel_merge_level > 2 && nCS == 8) {
         singleMCLFlag = 1;
         x0            = lc->cu.x;