Fix the initial references to frame buffers.

The old code would start in a mixed state, where all the reference
frames were pointing to frame buffer 0, but the reference counts
were 0. This is why we needed special code for the first frame.

Change-Id: I734961012917654ff8c0c8b317aac00ab75ded1a
This commit is contained in:
Frank Galligan 2013-12-04 15:11:00 -08:00
Родитель da2da79012
Коммит 9ed616a56c
3 изменённых файлов: 7 добавлений и 8 удалений

Просмотреть файл

@ -238,8 +238,10 @@ static int get_free_fb(VP9_COMMON *cm) {
}
static void ref_cnt_fb(int *buf, int *idx, int new_idx) {
if (buf[*idx] > 0)
buf[*idx]--;
const int ref_index = *idx;
if (ref_index > 0 && buf[ref_index] > 0)
buf[ref_index]--;
*idx = new_idx;

Просмотреть файл

@ -687,12 +687,6 @@ static void apply_frame_size(VP9D_COMP *pbi, int width, int height) {
if (cm->width != width || cm->height != height) {
// Change in frame size.
if (cm->width == 0 || cm->height == 0) {
// Assign new frame buffer on first call.
cm->new_fb_idx = NUM_YV12_BUFFERS - 1;
cm->fb_idx_ref_cnt[cm->new_fb_idx] = 1;
}
// TODO(agrange) Don't test width/height, check overall size.
if (width > cm->width || height > cm->height) {
// Rescale frame buffers only if they're not big enough already.

Просмотреть файл

@ -125,6 +125,9 @@ VP9D_PTR vp9_create_decompressor(VP9D_CONFIG *oxcf) {
vp9_zero(*pbi);
// Initialize the references to not point to any frame buffers.
memset(&cm->ref_frame_map, -1, sizeof(cm->ref_frame_map));
if (setjmp(cm->error.jmp)) {
cm->error.setjmp = 0;
vp9_remove_decompressor(pbi);