diff options
author | Frank Galligan <fgalligan@google.com> | 2013-12-10 17:22:41 -0800 |
---|---|---|
committer | James Zern <jzern@google.com> | 2013-12-15 19:57:42 -0800 |
commit | fbada948fa345e67acf9aa41a8f9a78f5dfe8648 (patch) | |
tree | c975a7d9a4db74fc190d2476647682752b883d70 /vp9/common/vp9_onyxc_int.h | |
parent | d0ee1fd797598fd692cbfe410bc37308a9e8924e (diff) | |
download | libvpx-fbada948fa345e67acf9aa41a8f9a78f5dfe8648.tar libvpx-fbada948fa345e67acf9aa41a8f9a78f5dfe8648.tar.gz libvpx-fbada948fa345e67acf9aa41a8f9a78f5dfe8648.tar.bz2 libvpx-fbada948fa345e67acf9aa41a8f9a78f5dfe8648.zip |
Add frame buffer lru cache.
Add an option for libvpx to return the least recently used
frame buffer.
Change-Id: I886a96ffb94984f1c42de53086e0131922df3260
Diffstat (limited to 'vp9/common/vp9_onyxc_int.h')
-rw-r--r-- | vp9/common/vp9_onyxc_int.h | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/vp9/common/vp9_onyxc_int.h b/vp9/common/vp9_onyxc_int.h index aa7086882..bfb94e44c 100644 --- a/vp9/common/vp9_onyxc_int.h +++ b/vp9/common/vp9_onyxc_int.h @@ -218,6 +218,10 @@ typedef struct VP9Common { int fb_count; // Total number of frame buffers vpx_realloc_frame_buffer_cb_fn_t realloc_fb_cb; void *user_priv; // Private data associated with the external frame buffers. + + int fb_lru; // Flag telling if lru is on/off + uint32_t *fb_idx_ref_lru; // Frame buffer lru cache + uint32_t fb_idx_ref_lru_count; } VP9_COMMON; // ref == 0 => LAST_FRAME @@ -233,13 +237,27 @@ static YV12_BUFFER_CONFIG *get_frame_new_buffer(VP9_COMMON *cm) { static int get_free_fb(VP9_COMMON *cm) { int i; - for (i = 0; i < cm->fb_count; i++) - if (cm->fb_idx_ref_cnt[i] == 0) - break; + uint32_t lru_count = cm->fb_idx_ref_lru_count + 1; + int free_buffer_idx = cm->fb_count; + for (i = 0; i < cm->fb_count; i++) { + if (!cm->fb_lru) { + if (cm->fb_idx_ref_cnt[i] == 0) { + free_buffer_idx = i; + break; + } + } else { + if (cm->fb_idx_ref_cnt[i] == 0 && cm->fb_idx_ref_lru[i] < lru_count) { + free_buffer_idx = i; + lru_count = cm->fb_idx_ref_lru[i]; + } + } + } - assert(i < cm->fb_count); - cm->fb_idx_ref_cnt[i] = 1; - return i; + assert(free_buffer_idx < cm->fb_count); + cm->fb_idx_ref_cnt[free_buffer_idx] = 1; + if (cm->fb_lru) + cm->fb_idx_ref_lru[free_buffer_idx] = ++cm->fb_idx_ref_lru_count; + return free_buffer_idx; } static void ref_cnt_fb(int *buf, int *idx, int new_idx) { |