1ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* 2ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 4ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * Use of this source code is governed by a BSD-style license 5ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * that can be found in the LICENSE file in the root of the source 6ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * tree. An additional intellectual property rights grant can be found 7ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * in the file PATENTS. All contributing project authors may 8ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * be found in the AUTHORS file in the root of the source tree. 9ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 10ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 11ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include <assert.h> 12f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang#include <limits.h> 13f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang#include <stdio.h> 14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 15ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_onyxc_int.h" 161184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#if CONFIG_VP9_POSTPROC 17ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_postproc.h" 18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 19ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/decoder/vp9_onyxd.h" 20ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/decoder/vp9_onyxd_int.h" 21ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_mem/vpx_mem.h" 22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_alloccommon.h" 23ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_loopfilter.h" 24ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_quant_common.h" 25ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_scale/vpx_scale.h" 26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/common/vp9_systemdependent.h" 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vpx_ports/vpx_timer.h" 28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/decoder/vp9_decodframe.h" 29ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp9/decoder/vp9_detokenize.h" 30ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "./vpx_scale_rtcd.h" 31ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define WRITE_RECON_BUFFER 0 33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER == 1 34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void recon_write_yuv_frame(const char *name, 35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const YV12_BUFFER_CONFIG *s, 36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int w, int _h) { 37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FILE *yuv_file = fopen(name, "ab"); 38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const uint8_t *src = s->y_buffer; 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int h = _h; 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(src, w, 1, yuv_file); 43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += s->y_stride; 44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (--h); 45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src = s->u_buffer; 47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang h = (_h + 1) >> 1; 48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang w = (w + 1) >> 1; 49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(src, w, 1, yuv_file); 52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += s->uv_stride; 53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (--h); 54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src = s->v_buffer; 56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang h = (_h + 1) >> 1; 57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang do { 59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(src, w, 1, yuv_file); 60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang src += s->uv_stride; 61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } while (--h); 62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(yuv_file); 64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 66ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER == 2 67ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid write_dx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame) { 68ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // write the frame 69ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang FILE *yframe; 70ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int i; 71ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang char filename[255]; 72ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang snprintf(filename, sizeof(filename)-1, "dx\\y%04d.raw", this_frame); 74ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yframe = fopen(filename, "wb"); 75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 76ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < frame->y_height; i++) 77ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(frame->y_buffer + i * frame->y_stride, 78ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frame->y_width, 1, yframe); 79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 80ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(yframe); 815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang snprintf(filename, sizeof(filename)-1, "dx\\u%04d.raw", this_frame); 82ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yframe = fopen(filename, "wb"); 83ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 84ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < frame->uv_height; i++) 85ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(frame->u_buffer + i * frame->uv_stride, 86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frame->uv_width, 1, yframe); 87ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 88ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(yframe); 895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang snprintf(filename, sizeof(filename)-1, "dx\\v%04d.raw", this_frame); 90ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang yframe = fopen(filename, "wb"); 91ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 92ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (i = 0; i < frame->uv_height; i++) 93ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fwrite(frame->v_buffer + i * frame->uv_stride, 94ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang frame->uv_width, 1, yframe); 95ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 96ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang fclose(yframe); 97ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 98ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 99ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 100ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_initialize_dec() { 101ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang static int init_done = 0; 102ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 103ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!init_done) { 104ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_initialize_common(); 105ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_init_quant_tables(); 106ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang init_done = 1; 107ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 108ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 109ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1109b35249446b07f40ac5fcc3205f2c048616efacchkuangstatic void init_macroblockd(VP9D_COMP *const pbi) { 1119b35249446b07f40ac5fcc3205f2c048616efacchkuang MACROBLOCKD *xd = &pbi->mb; 1129b35249446b07f40ac5fcc3205f2c048616efacchkuang struct macroblockd_plane *const pd = xd->plane; 1139b35249446b07f40ac5fcc3205f2c048616efacchkuang int i; 1149b35249446b07f40ac5fcc3205f2c048616efacchkuang 1159b35249446b07f40ac5fcc3205f2c048616efacchkuang for (i = 0; i < MAX_MB_PLANE; ++i) { 1169b35249446b07f40ac5fcc3205f2c048616efacchkuang pd[i].qcoeff = pbi->qcoeff[i]; 1179b35249446b07f40ac5fcc3205f2c048616efacchkuang pd[i].dqcoeff = pbi->dqcoeff[i]; 1189b35249446b07f40ac5fcc3205f2c048616efacchkuang pd[i].eobs = pbi->eobs[i]; 1199b35249446b07f40ac5fcc3205f2c048616efacchkuang } 1209b35249446b07f40ac5fcc3205f2c048616efacchkuang} 1219b35249446b07f40ac5fcc3205f2c048616efacchkuang 122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangVP9D_PTR vp9_create_decompressor(VP9D_CONFIG *oxcf) { 123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *const pbi = vpx_memalign(32, sizeof(VP9D_COMP)); 1241184aebb761cbeac9124c37189a80a1a58f04b6bhkuang VP9_COMMON *const cm = pbi ? &pbi->common : NULL; 125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (!cm) 127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return NULL; 128ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 129f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_zero(*pbi); 130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1311184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (setjmp(cm->error.jmp)) { 1321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 0; 133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_remove_decompressor(pbi); 134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return NULL; 135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 1; 138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_initialize_dec(); 139ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1401184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_create_common(cm); 141ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->oxcf = *oxcf; 143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->ready_for_new_data = 1; 1441184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->current_video_frame = 0; 145ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // vp9_init_dequantizer() is first called here. Add check in 147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // frame_init_dequantizer() to avoid unnecessary calling of 148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // vp9_init_dequantizer() for every frame. 1491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_init_dequantizer(cm); 150ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_loop_filter_init(cm); 152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1531184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 0; 154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->decoded_key_frame = 0; 155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1569b35249446b07f40ac5fcc3205f2c048616efacchkuang init_macroblockd(pbi); 1579b35249446b07f40ac5fcc3205f2c048616efacchkuang 1585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_worker_init(&pbi->lf_worker); 159f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang 160ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return pbi; 161ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 162ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 163ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_remove_decompressor(VP9D_PTR ptr) { 1645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int i; 165ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *const pbi = (VP9D_COMP *)ptr; 166ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 167ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!pbi) 168ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return; 169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_remove_common(&pbi->common); 171f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_worker_end(&pbi->lf_worker); 172f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vpx_free(pbi->lf_worker.data1); 1735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (i = 0; i < pbi->num_tile_workers; ++i) { 1745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang VP9Worker *const worker = &pbi->tile_workers[i]; 1755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_worker_end(worker); 1765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(worker->data1); 1775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(worker->data2); 1785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 1795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(pbi->tile_workers); 1805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(pbi->mi_streams); 1815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(pbi->above_context[0]); 1825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(pbi->above_seg_context); 183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(pbi); 184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic int equal_dimensions(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) { 187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return a->y_height == b->y_height && a->y_width == b->y_width && 188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang a->uv_height == b->uv_height && a->uv_width == b->uv_width; 189ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 190ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 191ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvpx_codec_err_t vp9_copy_reference_dec(VP9D_PTR ptr, 192ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_REFFRAME ref_frame_flag, 193ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang YV12_BUFFER_CONFIG *sd) { 194ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *pbi = (VP9D_COMP *) ptr; 195ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &pbi->common; 196ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 197ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* TODO(jkoleszar): The decoder doesn't have any real knowledge of what the 198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * encoder is using the frame buffers for. This is just a stub to keep the 199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * vpxenc --test-decode functionality working, and will be replaced in a 200ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * later commit that adds VP9-specific controls for this functionality. 201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (ref_frame_flag == VP9_LAST_FLAG) { 2035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang YV12_BUFFER_CONFIG *cfg = &cm->yv12_fb[cm->ref_frame_map[0]]; 2045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!equal_dimensions(cfg, sd)) 2055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_internal_error(&cm->error, VPX_CODEC_ERROR, 2065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang "Incorrect buffer dimensions"); 2075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang else 2085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp8_yv12_copy_frame(cfg, sd); 209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 2101184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vpx_internal_error(&cm->error, VPX_CODEC_ERROR, 211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Invalid reference frame"); 212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return cm->error.error_code; 215ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 217ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvpx_codec_err_t vp9_set_reference_dec(VP9D_PTR ptr, VP9_REFFRAME ref_frame_flag, 219ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang YV12_BUFFER_CONFIG *sd) { 220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *pbi = (VP9D_COMP *) ptr; 221ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &pbi->common; 222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int *ref_fb_ptr = NULL; 223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* TODO(jkoleszar): The decoder doesn't have any real knowledge of what the 225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * encoder is using the frame buffers for. This is just a stub to keep the 226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * vpxenc --test-decode functionality working, and will be replaced in a 227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * later commit that adds VP9-specific controls for this functionality. 228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 2295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (ref_frame_flag == VP9_LAST_FLAG) { 230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref_fb_ptr = &pbi->common.active_ref_idx[0]; 2315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else if (ref_frame_flag == VP9_GOLD_FLAG) { 232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref_fb_ptr = &pbi->common.active_ref_idx[1]; 2335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else if (ref_frame_flag == VP9_ALT_FLAG) { 234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref_fb_ptr = &pbi->common.active_ref_idx[2]; 2355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else { 236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_internal_error(&pbi->common.error, VPX_CODEC_ERROR, 237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Invalid reference frame"); 238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return pbi->common.error.error_code; 239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!equal_dimensions(&cm->yv12_fb[*ref_fb_ptr], sd)) { 242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_internal_error(&pbi->common.error, VPX_CODEC_ERROR, 243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Incorrect buffer dimensions"); 244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Find an empty frame buffer. 246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int free_fb = get_free_fb(cm); 247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Decrease fb_idx_ref_cnt since it will be increased again in 248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // ref_cnt_fb() below. 249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->fb_idx_ref_cnt[free_fb]--; 250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Manage the reference counters and copy image. 252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref_cnt_fb(cm->fb_idx_ref_cnt, ref_fb_ptr, free_fb); 253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp8_yv12_copy_frame(sd, &cm->yv12_fb[*ref_fb_ptr]); 254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return pbi->common.error.error_code; 257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 260ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_get_reference_dec(VP9D_PTR ptr, int index, YV12_BUFFER_CONFIG **fb) { 261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *pbi = (VP9D_COMP *) ptr; 262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &pbi->common; 263ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 264ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (index < 0 || index >= NUM_REF_FRAMES) 265ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 266ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *fb = &cm->yv12_fb[cm->ref_frame_map[index]]; 268ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 269ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 270ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 271ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* If any buffer updating is signaled it should be done here. */ 272ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void swap_frame_buffers(VP9D_COMP *pbi) { 273ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int ref_index = 0, mask; 2741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang VP9_COMMON *const cm = &pbi->common; 275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 276ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (mask = pbi->refresh_frame_flags; mask; mask >>= 1) { 2771184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mask & 1) 2781184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ref_cnt_fb(cm->fb_idx_ref_cnt, &cm->ref_frame_map[ref_index], 2791184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->new_fb_idx); 280ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ++ref_index; 281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->frame_to_show = get_frame_new_buffer(cm); 2841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->fb_idx_ref_cnt[cm->new_fb_idx]--; 285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2861184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Invalidate these references until the next frame starts. 287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (ref_index = 0; ref_index < 3; ref_index++) 2881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->active_ref_idx[ref_index] = INT_MAX; 289ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 291ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_receive_compressed_data(VP9D_PTR ptr, 2925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang size_t size, const uint8_t **psource, 293ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t time_stamp) { 294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *pbi = (VP9D_COMP *) ptr; 295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &pbi->common; 296ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const uint8_t *source = *psource; 297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int retcode = 0; 298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 299ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /*if(pbi->ready_for_new_data == 0) 300ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1;*/ 301ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 302ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (ptr == 0) 303ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3051184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.error_code = VPX_CODEC_OK; 306ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 307ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->source = source; 308ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->source_sz = size; 309ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 310ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pbi->source_sz == 0) { 311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* This is used to signal that we are missing frames. 312ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * We do not know if the missing frame(s) was supposed to update 313ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * any of the reference buffers, but we act conservative and 314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * mark only the last buffer as corrupted. 315ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * TODO(jkoleszar): Error concealment is undefined and non-normative 317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * at this point, but if it becomes so, [0] may not always be the correct 318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * thing to do here. 319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->active_ref_idx[0] != INT_MAX) 3215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang get_frame_ref_buffer(cm, 0)->corrupted = 1; 322ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 323ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 324ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->new_fb_idx = get_free_fb(cm); 325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3261184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (setjmp(cm->error.jmp)) { 3271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 0; 328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* We do not know if the missing frame(s) was supposed to update 330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * any of the reference buffers, but we act conservative and 331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * mark only the last buffer as corrupted. 332ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * TODO(jkoleszar): Error concealment is undefined and non-normative 334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * at this point, but if it becomes so, [0] may not always be the correct 335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * thing to do here. 336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 337ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->active_ref_idx[0] != INT_MAX) 3385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang get_frame_ref_buffer(cm, 0)->corrupted = 1; 339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) 341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->fb_idx_ref_cnt[cm->new_fb_idx]--; 342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 344ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3461184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 1; 347ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 348ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang retcode = vp9_decode_frame(pbi, psource); 349ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 350ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (retcode < 0) { 3511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.error_code = VPX_CODEC_ERROR; 3521184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 0; 353ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) 354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->fb_idx_ref_cnt[cm->new_fb_idx]--; 355ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return retcode; 356ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 357ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang swap_frame_buffers(pbi); 359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 360ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER == 2 3615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (cm->show_frame) 3625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang write_dx_frame_to_file(cm->frame_to_show, 3635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->current_video_frame); 3645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang else 3655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang write_dx_frame_to_file(cm->frame_to_show, 3665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->current_video_frame + 1000); 367ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 368ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!pbi->do_loopfilter_inline) { 3705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_loop_filter_frame(cm, &pbi->mb, pbi->common.lf.filter_level, 0, 0); 3715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 373ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER == 2 3745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (cm->show_frame) 3755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang write_dx_frame_to_file(cm->frame_to_show, 3765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->current_video_frame + 2000); 3775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang else 3785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang write_dx_frame_to_file(cm->frame_to_show, 3795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->current_video_frame + 3000); 380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 381ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_extend_frame_inner_borders(cm->frame_to_show, 3835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->subsampling_x, 3845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->subsampling_y); 385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 386ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER == 1 387ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->show_frame) 388ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang recon_write_yuv_frame("recon.yuv", cm->frame_to_show, 389ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->width, cm->height); 390ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_clear_system_state(); 393ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 394ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->last_show_frame = cm->show_frame; 395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->show_frame) { 396ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // current mip will be the prev_mip for the next frame 397ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MODE_INFO *temp = cm->prev_mip; 3981184aebb761cbeac9124c37189a80a1a58f04b6bhkuang MODE_INFO **temp2 = cm->prev_mi_grid_base; 399ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->prev_mip = cm->mip; 400ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->mip = temp; 4011184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->prev_mi_grid_base = cm->mi_grid_base; 4021184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->mi_grid_base = temp2; 403ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 404ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // update the upper left visible macroblock ptrs 405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->mi = cm->mip + cm->mode_info_stride + 1; 406ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1; 4071184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->mi_grid_visible = cm->mi_grid_base + cm->mode_info_stride + 1; 4081184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mode_info_stride + 1; 409ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 4105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang pbi->mb.mi_8x8 = cm->mi_grid_visible; 4115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang pbi->mb.mi_8x8[0] = cm->mi; 4125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 413ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->current_video_frame++; 414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 415ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 416ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->ready_for_new_data = 0; 417ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->last_time_stamp = time_stamp; 418ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->source_sz = 0; 419ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 4201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 0; 421ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return retcode; 422ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 423ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 424ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_get_raw_frame(VP9D_PTR ptr, YV12_BUFFER_CONFIG *sd, 425ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t *time_stamp, int64_t *time_end_stamp, 426ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_ppflags_t *flags) { 427ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int ret = -1; 428ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *pbi = (VP9D_COMP *) ptr; 429ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 430ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pbi->ready_for_new_data == 1) 431ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return ret; 432ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 433ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* ie no raw frame to show!!! */ 434ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pbi->common.show_frame == 0) 435ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return ret; 436ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 437ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->ready_for_new_data = 1; 438ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *time_stamp = pbi->last_time_stamp; 439ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *time_end_stamp = 0; 440ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 4411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#if CONFIG_VP9_POSTPROC 4421184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ret = vp9_post_proc_frame(&pbi->common, sd, flags); 443ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 444ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 445ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pbi->common.frame_to_show) { 446ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *sd = *pbi->common.frame_to_show; 447ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sd->y_width = pbi->common.width; 448ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sd->y_height = pbi->common.height; 4491184aebb761cbeac9124c37189a80a1a58f04b6bhkuang sd->uv_width = sd->y_width >> pbi->common.subsampling_x; 4501184aebb761cbeac9124c37189a80a1a58f04b6bhkuang sd->uv_height = sd->y_height >> pbi->common.subsampling_y; 4511184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 452ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ret = 0; 453ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 454ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ret = -1; 455ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 456ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 457ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif /*!CONFIG_POSTPROC*/ 458ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_clear_system_state(); 459ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return ret; 460ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 461