]> granicus.if.org Git - libvpx/commitdiff
Add find_best_ref_mv_mode()
authorAngie Chiang <angiebird@google.com>
Thu, 24 Jan 2019 23:44:41 +0000 (15:44 -0800)
committerAngie Chiang <angiebird@google.com>
Fri, 25 Jan 2019 01:55:28 +0000 (17:55 -0800)
This function compute the rd cost for each  mv_mode and return the
one with minimum rd cost.

eval_mv_mode()
Evaluate the rd cost for a given mv_mode.

Change-Id: Ia1b3ec7e1dd538e443e1bc79f2cab352408cd0a0

vp9/encoder/vp9_encoder.c
vp9/encoder/vp9_encoder.h

index e4f394487bd4941774008f1b4fe8dff442c72c08..4a69e69f092c6c2d5b97dbd88f814cd3d7280342 100644 (file)
@@ -6097,9 +6097,9 @@ static int_mv find_ref_mv(int mv_mode, VP9_COMP *cpi, TplDepFrame *tpl_frame,
   return invalid_mv;
 }
 
-int_mv get_mv_from_mv_mode(int mv_mode, VP9_COMP *cpi, TplDepFrame *tpl_frame,
-                           int rf_idx, BLOCK_SIZE bsize, int mi_row,
-                           int mi_col) {
+static int_mv get_mv_from_mv_mode(int mv_mode, VP9_COMP *cpi,
+                                  TplDepFrame *tpl_frame, int rf_idx,
+                                  BLOCK_SIZE bsize, int mi_row, int mi_col) {
   int_mv mv;
   switch (mv_mode) {
     case ZERO_MV_MODE:
@@ -6123,17 +6123,17 @@ int_mv get_mv_from_mv_mode(int mv_mode, VP9_COMP *cpi, TplDepFrame *tpl_frame,
   return mv;
 }
 
-double get_mv_dist(int mv_mode, VP9_COMP *cpi, MACROBLOCKD *xd,
-                   GF_PICTURE *gf_picture, int frame_idx,
-                   TplDepFrame *tpl_frame, int rf_idx, BLOCK_SIZE bsize,
-                   int mi_row, int mi_col) {
-  MV mv = get_mv_from_mv_mode(mv_mode, cpi, tpl_frame, rf_idx, bsize, mi_row,
-                              mi_col)
-              .as_mv;
-  MV full_mv = get_full_mv(&mv);
+static double get_mv_dist(int mv_mode, VP9_COMP *cpi, MACROBLOCKD *xd,
+                          GF_PICTURE *gf_picture, int frame_idx,
+                          TplDepFrame *tpl_frame, int rf_idx, BLOCK_SIZE bsize,
+                          int mi_row, int mi_col, int_mv *mv) {
   uint32_t sse;
   struct buf_2d src;
   struct buf_2d pre;
+  MV full_mv;
+  *mv = get_mv_from_mv_mode(mv_mode, cpi, tpl_frame, rf_idx, bsize, mi_row,
+                            mi_col);
+  full_mv = get_full_mv(&mv->as_mv);
   get_block_src_pred_buf(xd, gf_picture, frame_idx, rf_idx, mi_row, mi_col,
                          &src, &pre);
   // TODO(angiebird): Consider subpixel when computing the sse.
@@ -6142,6 +6142,58 @@ double get_mv_dist(int mv_mode, VP9_COMP *cpi, MACROBLOCKD *xd,
   return (double)sse;
 }
 
+static double get_mv_cost(int mv_mode) {
+  // TODO(angiebird): Implement this function.
+  (void)mv_mode;
+  return 0;
+}
+
+static double rd_cost(int rdmult, int rddiv, double rate, double dist) {
+  return (rate * rdmult) / (1 << 9) + dist * (1 << rddiv);
+}
+
+static double eval_mv_mode(int mv_mode, VP9_COMP *cpi, MACROBLOCK *x,
+                           GF_PICTURE *gf_picture, int frame_idx,
+                           TplDepFrame *tpl_frame, int rf_idx, BLOCK_SIZE bsize,
+                           int mi_row, int mi_col, int_mv *mv) {
+  MACROBLOCKD *xd = &x->e_mbd;
+  double mv_dist = get_mv_dist(mv_mode, cpi, xd, gf_picture, frame_idx,
+                               tpl_frame, rf_idx, bsize, mi_row, mi_col, mv);
+  double mv_cost = get_mv_cost(mv_mode);
+  return rd_cost(x->rdmult, x->rddiv, mv_cost, mv_dist);
+}
+
+int find_best_ref_mv_mode(VP9_COMP *cpi, MACROBLOCK *x, GF_PICTURE *gf_picture,
+                          int frame_idx, TplDepFrame *tpl_frame, int rf_idx,
+                          BLOCK_SIZE bsize, int mi_row, int mi_col, double *rd,
+                          int_mv *mv) {
+  int best_mv_mode = ZERO_MV_MODE;
+  int update = 0;
+  int mv_mode;
+  for (mv_mode = 0; mv_mode < MAX_MV_MODE; ++mv_mode) {
+    double this_rd;
+    int_mv this_mv;
+    if (mv_mode == NEW_MV_MODE) {
+      continue;
+    }
+    this_rd = eval_mv_mode(mv_mode, cpi, x, gf_picture, frame_idx, tpl_frame,
+                           rf_idx, bsize, mi_row, mi_col, &this_mv);
+    if (update == 0) {
+      *rd = this_rd;
+      *mv = this_mv;
+      best_mv_mode = mv_mode;
+      update = 1;
+    } else {
+      if (this_rd < *rd) {
+        *rd = this_rd;
+        *mv = this_mv;
+        best_mv_mode = mv_mode;
+      }
+    }
+  }
+  return best_mv_mode;
+}
+
 static double get_feature_score(uint8_t *buf, ptrdiff_t stride, int rows,
                                 int cols) {
   double IxIx = 0;
index 2dce39d16aabd22a847a9941f3733a64fb7af175..a690ebc73ec4fd332e0c3b6c057627b8052aab50 100644 (file)
@@ -320,6 +320,7 @@ typedef struct TplDepFrame {
   double mv_dist_sum[3];
   double mv_cost_sum[3];
   int_mv *pyramid_mv_arr[3][SQUARE_BLOCK_SIZES];
+  int *mv_mode_arr[3];
 #endif
 } TplDepFrame;