Fixing bug in VP8_SET_REFERENCE decoder control command
authorHenrik Lundin <hlundin@google.com>
Mon, 23 May 2011 11:47:33 +0000 (13:47 +0200)
committerHenrik Lundin <hlundin@google.com>
Tue, 24 May 2011 07:03:43 +0000 (09:03 +0200)
In vp8dx_set_reference, the new reference image is written to an
unused reference frame buffer.

Change-Id: I9e4f2cef5a011094bb7ce7b2719cbfe096a773e8

vp8/decoder/onyxd_if.c

index 705fb33..d10b2cb 100644 (file)
@@ -39,6 +39,8 @@
 
 extern void vp8_init_loop_filter(VP8_COMMON *cm);
 extern void vp8cx_init_de_quantizer(VP8D_COMP *pbi);
+static int get_free_fb (VP8_COMMON *cm);
+static void ref_cnt_fb (int *buf, int *idx, int new_idx);
 
 
 void vp8dx_initialize()
@@ -155,18 +157,24 @@ int vp8dx_set_reference(VP8D_PTR ptr, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_C
 {
     VP8D_COMP *pbi = (VP8D_COMP *) ptr;
     VP8_COMMON *cm = &pbi->common;
-    int ref_fb_idx;
+    int *ref_fb_ptr = NULL;
+    int free_fb;
 
     if (ref_frame_flag == VP8_LAST_FLAG)
-        ref_fb_idx = cm->lst_fb_idx;
+        *ref_fb_ptr = cm->lst_fb_idx;
     else if (ref_frame_flag == VP8_GOLD_FLAG)
-        ref_fb_idx = cm->gld_fb_idx;
+        *ref_fb_ptr = cm->gld_fb_idx;
     else if (ref_frame_flag == VP8_ALT_FLAG)
-        ref_fb_idx = cm->alt_fb_idx;
+        *ref_fb_ptr = cm->alt_fb_idx;
     else
         return -1;
 
-    vp8_yv12_copy_frame_ptr(sd, &cm->yv12_fb[ref_fb_idx]);
+    /* Find an empty frame buffer. */
+    free_fb = get_free_fb(cm);
+
+    /* Manage the reference counters and copy image. */
+    ref_cnt_fb (cm->fb_idx_ref_cnt, ref_fb_ptr, free_fb);
+    vp8_yv12_copy_frame_ptr(sd, &cm->yv12_fb[*ref_fb_ptr]);
 
     return 0;
 }