]> granicus.if.org Git - libvpx/commitdiff
Fix ref_frame segment feature when it is intra.
authorRonald S. Bultje <rbultje@google.com>
Fri, 7 Jun 2013 18:54:20 +0000 (11:54 -0700)
committerRonald S. Bultje <rbultje@google.com>
Fri, 7 Jun 2013 20:57:55 +0000 (13:57 -0700)
Change-Id: Ifbf790c14cee0c08a27f6728e3c637404e1f8477

vp9/decoder/vp9_decodemv.c
vp9/encoder/vp9_bitstream.c
vp9/encoder/vp9_encodeframe.c

index e0f128f57c52e56dc129f3419a00b11113a1b68d..82ea7dc96fa7a146d8aedb9eda4dcd7f36391f1a 100644 (file)
@@ -525,9 +525,15 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
     mbmi->mb_skip_coeff = vp9_read(r, vp9_get_pred_prob(cm, xd, PRED_MBSKIP));
 
   // Read the reference frame
-  mbmi->ref_frame[0] = vp9_read(r, vp9_get_pred_prob(cm, xd, PRED_INTRA_INTER));
-  cm->fc.intra_inter_count[vp9_get_pred_context(cm, xd, PRED_INTRA_INTER)]
-                          [mbmi->ref_frame[0] != INTRA_FRAME]++;
+  if (!vp9_segfeature_active(xd, mbmi->segment_id, SEG_LVL_REF_FRAME)) {
+    mbmi->ref_frame[0] =
+        vp9_read(r, vp9_get_pred_prob(cm, xd, PRED_INTRA_INTER));
+    cm->fc.intra_inter_count[vp9_get_pred_context(cm, xd, PRED_INTRA_INTER)]
+                            [mbmi->ref_frame[0] != INTRA_FRAME]++;
+  } else {
+    mbmi->ref_frame[0] =
+        vp9_get_segdata(xd, mbmi->segment_id, SEG_LVL_REF_FRAME) != INTRA_FRAME;
+  }
 
   if (cm->txfm_mode == TX_MODE_SELECT &&
       (mbmi->mb_skip_coeff == 0 || mbmi->ref_frame[0] == INTRA_FRAME) &&
index 55ed2a4506ed486e73ffb5e20da2732fc37c4797..d89cebd4c6e888178e8f0e2033ffc7b97d1993fc 100644 (file)
@@ -561,7 +561,9 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m,
               vp9_get_pred_prob(pc, xd, PRED_MBSKIP));
   }
 
-  vp9_write(bc, rf != INTRA_FRAME, vp9_get_pred_prob(pc, xd, PRED_INTRA_INTER));
+  if (!vp9_segfeature_active(xd, segment_id, SEG_LVL_REF_FRAME))
+    vp9_write(bc, rf != INTRA_FRAME,
+              vp9_get_pred_prob(pc, xd, PRED_INTRA_INTER));
 
   if (mi->sb_type >= BLOCK_SIZE_SB8X8 && pc->txfm_mode == TX_MODE_SELECT &&
       !(rf != INTRA_FRAME &&
index 047bbb5e91a3f74a3120213463a0a67d5dc16e07..d7810dd66c24dbdad876a084baf4cde9f4b7afbe 100644 (file)
@@ -631,15 +631,17 @@ static void update_stats(VP9_COMP *cpi, int mi_row, int mi_col) {
   if (cm->frame_type != KEY_FRAME) {
     int segment_id, seg_ref_active;
 
-    cpi->intra_inter_count[vp9_get_pred_context(cm, xd, PRED_INTRA_INTER)]
-                          [mbmi->ref_frame[0] > INTRA_FRAME]++;
+    segment_id = mbmi->segment_id;
+    seg_ref_active = vp9_segfeature_active(xd, segment_id,
+                                           SEG_LVL_REF_FRAME);
+
+    if (!seg_ref_active)
+      cpi->intra_inter_count[vp9_get_pred_context(cm, xd, PRED_INTRA_INTER)]
+                            [mbmi->ref_frame[0] > INTRA_FRAME]++;
 
     // If the segment reference feature is enabled we have only a single
     // reference frame allowed for the segment so exclude it from
     // the reference frame counts used to work out probabilities.
-    segment_id = mbmi->segment_id;
-    seg_ref_active = vp9_segfeature_active(xd, segment_id,
-                                           SEG_LVL_REF_FRAME);
     if ((mbmi->ref_frame[0] > INTRA_FRAME) && !seg_ref_active) {
       if (cm->comp_pred_mode == HYBRID_PREDICTION)
         cpi->comp_inter_count[vp9_get_pred_context(cm, xd,