[FFmpeg-devel] [PATCH 7/9] hevc: use intreadwrite

Christophe Gisquet christophe.gisquet at gmail.com
Thu Jul 10 08:47:54 CEST 2014


When dealing with MVs, both components may be processed at a time.
---
 libavcodec/hevc.c     |  3 +--
 libavcodec/hevc_mvs.c | 23 +++++++++--------------
 2 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
index 4d3513a..f2bbe91 100644
--- a/libavcodec/hevc.c
+++ b/libavcodec/hevc.c
@@ -1500,8 +1500,7 @@ static void hls_prediction_unit(HEVCContext *s, int x0, int y0,
                 }
 
                 if (s->sh.mvd_l1_zero_flag == 1 && inter_pred_idc == PRED_BI) {
-                    lc->pu.mvd.x = 0;
-                    lc->pu.mvd.y = 0;
+                    AV_ZERO32(&lc->pu.mvd);
                 } else {
                     ff_hevc_hls_mvd_coding(s, x0, y0, 1);
                 }
diff --git a/libavcodec/hevc_mvs.c b/libavcodec/hevc_mvs.c
index 952a431..e900bd0 100644
--- a/libavcodec/hevc_mvs.c
+++ b/libavcodec/hevc_mvs.c
@@ -125,6 +125,7 @@ static int isDiffMER(HEVCContext *s, int xN, int yN, int xP, int yP)
            yN >> plevel == yP >> plevel;
 }
 
+#define MATCH_MV(x) (AV_RN32(&A.x) == AV_RN32(&B.x))
 #define MATCH(x) (A.x == B.x)
 
 // check if the mv's and refidx are the same between A and B
@@ -134,12 +135,12 @@ static int compareMVrefidx(struct MvField A, struct MvField B)
     int b_pf = B.pred_flag;
     if (a_pf == b_pf) {
         if (a_pf == PF_BI) {
-            return MATCH(ref_idx[0]) && MATCH(mv[0].x) && MATCH(mv[0].y) &&
-                   MATCH(ref_idx[1]) && MATCH(mv[1].x) && MATCH(mv[1].y);
+            return MATCH(ref_idx[0]) && MATCH_MV(mv[0]) &&
+                   MATCH(ref_idx[1]) && MATCH_MV(mv[1]);
         } else if (a_pf == PF_L0) {
-            return MATCH(ref_idx[0]) && MATCH(mv[0].x) && MATCH(mv[0].y);
+            return MATCH(ref_idx[0]) && MATCH_MV(mv[0]);
         } else if (a_pf == PF_L1) {
-            return MATCH(ref_idx[1]) && MATCH(mv[1].x) && MATCH(mv[1].y);
+            return MATCH(ref_idx[1]) && MATCH_MV(mv[1]);
         }
     }
     return 0;
@@ -505,15 +506,12 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
             if ((l0_cand.pred_flag & PF_L0) && (l1_cand.pred_flag & PF_L1) &&
                 (refPicList[0].list[l0_cand.ref_idx[0]] !=
                  refPicList[1].list[l1_cand.ref_idx[1]] ||
-                 l0_cand.mv[0].x != l1_cand.mv[1].x ||
-                 l0_cand.mv[0].y != l1_cand.mv[1].y)) {
+                 AV_RN32(&l0_cand.mv[0]) != AV_RN32(&l1_cand.mv[1]))) {
                 mergecandlist[nb_merge_cand].ref_idx[0]   = l0_cand.ref_idx[0];
                 mergecandlist[nb_merge_cand].ref_idx[1]   = l1_cand.ref_idx[1];
                 mergecandlist[nb_merge_cand].pred_flag    = PF_BI;
-                mergecandlist[nb_merge_cand].mv[0].x      = l0_cand.mv[0].x;
-                mergecandlist[nb_merge_cand].mv[0].y      = l0_cand.mv[0].y;
-                mergecandlist[nb_merge_cand].mv[1].x      = l1_cand.mv[1].x;
-                mergecandlist[nb_merge_cand].mv[1].y      = l1_cand.mv[1].y;
+                AV_WN32(&mergecandlist[nb_merge_cand].mv[0], AV_RN32(&l0_cand.mv[0]));
+                AV_WN32(&mergecandlist[nb_merge_cand].mv[1], AV_RN32(&l1_cand.mv[1]));
                 if (merge_idx == nb_merge_cand) return;
                 nb_merge_cand++;
             }
@@ -523,10 +521,7 @@ static void derive_spatial_merge_candidates(HEVCContext *s, int x0, int y0,
     // append Zero motion vector candidates
     while (nb_merge_cand < s->sh.max_num_merge_cand) {
         mergecandlist[nb_merge_cand].pred_flag    = PF_L0 + ((s->sh.slice_type == B_SLICE) << 1);
-        mergecandlist[nb_merge_cand].mv[0].x      = 0;
-        mergecandlist[nb_merge_cand].mv[0].y      = 0;
-        mergecandlist[nb_merge_cand].mv[1].x      = 0;
-        mergecandlist[nb_merge_cand].mv[1].y      = 0;
+        AV_ZERO64(mergecandlist[nb_merge_cand].mv);
         mergecandlist[nb_merge_cand].ref_idx[0]   = zero_idx < nb_refs ? zero_idx : 0;
         mergecandlist[nb_merge_cand].ref_idx[1]   = zero_idx < nb_refs ? zero_idx : 0;
 
-- 
1.9.2.msysgit.0



More information about the ffmpeg-devel mailing list