vp9_onyxd_if.c revision 5ae7ac49f08a179e4f054d99fcfc9dce78d26e58
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 110ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangVP9D_PTR vp9_create_decompressor(VP9D_CONFIG *oxcf) { 111ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *const pbi = vpx_memalign(32, sizeof(VP9D_COMP)); 1121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang VP9_COMMON *const cm = pbi ? &pbi->common : NULL; 113ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1141184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (!cm) 115ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return NULL; 116ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 117f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_zero(*pbi); 118ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1191184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (setjmp(cm->error.jmp)) { 1201184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 0; 121ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_remove_decompressor(pbi); 122ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return NULL; 123ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 124ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1251184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 1; 126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_initialize_dec(); 127ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_create_common(cm); 129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->oxcf = *oxcf; 131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->ready_for_new_data = 1; 1321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->current_video_frame = 0; 133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 134ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // vp9_init_dequantizer() is first called here. Add check in 135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // frame_init_dequantizer() to avoid unnecessary calling of 136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // vp9_init_dequantizer() for every frame. 1371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_init_dequantizer(cm); 138ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1391184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vp9_loop_filter_init(cm); 140ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1411184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 0; 142ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->decoded_key_frame = 0; 143ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 1445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_worker_init(&pbi->lf_worker); 145f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang 146ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return pbi; 147ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 148ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 149ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid vp9_remove_decompressor(VP9D_PTR ptr) { 1505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int i; 151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *const pbi = (VP9D_COMP *)ptr; 152ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 153ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!pbi) 154ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return; 155ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 156ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_remove_common(&pbi->common); 157f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vp9_worker_end(&pbi->lf_worker); 158f3bed9137f66ef693bd406e43b17e9a1114f1e14hkuang vpx_free(pbi->lf_worker.data1); 1595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang for (i = 0; i < pbi->num_tile_workers; ++i) { 1605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang VP9Worker *const worker = &pbi->tile_workers[i]; 1615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_worker_end(worker); 1625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(worker->data1); 1635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(worker->data2); 1645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 1655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(pbi->tile_workers); 1665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(pbi->mi_streams); 1675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(pbi->above_context[0]); 1685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_free(pbi->above_seg_context); 169ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_free(pbi); 170ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 171ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 172ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic int equal_dimensions(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) { 173ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return a->y_height == b->y_height && a->y_width == b->y_width && 174ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang a->uv_height == b->uv_height && a->uv_width == b->uv_width; 175ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 176ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 177ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvpx_codec_err_t vp9_copy_reference_dec(VP9D_PTR ptr, 178ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_REFFRAME ref_frame_flag, 179ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang YV12_BUFFER_CONFIG *sd) { 180ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *pbi = (VP9D_COMP *) ptr; 181ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &pbi->common; 182ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 183ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* TODO(jkoleszar): The decoder doesn't have any real knowledge of what the 184ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * encoder is using the frame buffers for. This is just a stub to keep the 185ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * vpxenc --test-decode functionality working, and will be replaced in a 186ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * later commit that adds VP9-specific controls for this functionality. 187ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 188ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (ref_frame_flag == VP9_LAST_FLAG) { 1895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang YV12_BUFFER_CONFIG *cfg = &cm->yv12_fb[cm->ref_frame_map[0]]; 1905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!equal_dimensions(cfg, sd)) 1915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_internal_error(&cm->error, VPX_CODEC_ERROR, 1925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang "Incorrect buffer dimensions"); 1935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang else 1945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp8_yv12_copy_frame(cfg, sd); 195ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 1961184aebb761cbeac9124c37189a80a1a58f04b6bhkuang vpx_internal_error(&cm->error, VPX_CODEC_ERROR, 197ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Invalid reference frame"); 198ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 199ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2001184aebb761cbeac9124c37189a80a1a58f04b6bhkuang return cm->error.error_code; 201ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 202ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 203ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 204ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvpx_codec_err_t vp9_set_reference_dec(VP9D_PTR ptr, VP9_REFFRAME ref_frame_flag, 205ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang YV12_BUFFER_CONFIG *sd) { 206ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *pbi = (VP9D_COMP *) ptr; 207ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &pbi->common; 208ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int *ref_fb_ptr = NULL; 209ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 210ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* TODO(jkoleszar): The decoder doesn't have any real knowledge of what the 211ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * encoder is using the frame buffers for. This is just a stub to keep the 212ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * vpxenc --test-decode functionality working, and will be replaced in a 213ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * later commit that adds VP9-specific controls for this functionality. 214ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 2155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (ref_frame_flag == VP9_LAST_FLAG) { 216ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref_fb_ptr = &pbi->common.active_ref_idx[0]; 2175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else if (ref_frame_flag == VP9_GOLD_FLAG) { 218ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref_fb_ptr = &pbi->common.active_ref_idx[1]; 2195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else if (ref_frame_flag == VP9_ALT_FLAG) { 220ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref_fb_ptr = &pbi->common.active_ref_idx[2]; 2215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } else { 222ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_internal_error(&pbi->common.error, VPX_CODEC_ERROR, 223ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Invalid reference frame"); 224ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return pbi->common.error.error_code; 225ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 226ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 227ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (!equal_dimensions(&cm->yv12_fb[*ref_fb_ptr], sd)) { 228ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vpx_internal_error(&pbi->common.error, VPX_CODEC_ERROR, 229ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang "Incorrect buffer dimensions"); 230ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 231ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Find an empty frame buffer. 232ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const int free_fb = get_free_fb(cm); 233ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Decrease fb_idx_ref_cnt since it will be increased again in 234ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // ref_cnt_fb() below. 235ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->fb_idx_ref_cnt[free_fb]--; 236ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 237ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // Manage the reference counters and copy image. 238ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ref_cnt_fb(cm->fb_idx_ref_cnt, ref_fb_ptr, free_fb); 239ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp8_yv12_copy_frame(sd, &cm->yv12_fb[*ref_fb_ptr]); 240ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 241ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 242ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return pbi->common.error.error_code; 243ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 244ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 245ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 246ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_get_reference_dec(VP9D_PTR ptr, int index, YV12_BUFFER_CONFIG **fb) { 247ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *pbi = (VP9D_COMP *) ptr; 248ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &pbi->common; 249ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 250ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (index < 0 || index >= NUM_REF_FRAMES) 251ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 252ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 253ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *fb = &cm->yv12_fb[cm->ref_frame_map[index]]; 254ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return 0; 255ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 256ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 257ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang/* If any buffer updating is signaled it should be done here. */ 258ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstatic void swap_frame_buffers(VP9D_COMP *pbi) { 259ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int ref_index = 0, mask; 2601184aebb761cbeac9124c37189a80a1a58f04b6bhkuang VP9_COMMON *const cm = &pbi->common; 261ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 262ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (mask = pbi->refresh_frame_flags; mask; mask >>= 1) { 2631184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (mask & 1) 2641184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ref_cnt_fb(cm->fb_idx_ref_cnt, &cm->ref_frame_map[ref_index], 2651184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->new_fb_idx); 266ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ++ref_index; 267ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 268ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->frame_to_show = get_frame_new_buffer(cm); 2701184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->fb_idx_ref_cnt[cm->new_fb_idx]--; 271ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2721184aebb761cbeac9124c37189a80a1a58f04b6bhkuang // Invalidate these references until the next frame starts. 273ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang for (ref_index = 0; ref_index < 3; ref_index++) 2741184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->active_ref_idx[ref_index] = INT_MAX; 275ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 276ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 277ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_receive_compressed_data(VP9D_PTR ptr, 2785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang size_t size, const uint8_t **psource, 279ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t time_stamp) { 280ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *pbi = (VP9D_COMP *) ptr; 281ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9_COMMON *cm = &pbi->common; 282ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang const uint8_t *source = *psource; 283ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int retcode = 0; 284ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 285ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /*if(pbi->ready_for_new_data == 0) 286ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1;*/ 287ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 288ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (ptr == 0) 289ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 290ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 2911184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.error_code = VPX_CODEC_OK; 292ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 293ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->source = source; 294ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->source_sz = size; 295ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 296ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pbi->source_sz == 0) { 297ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* This is used to signal that we are missing frames. 298ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * We do not know if the missing frame(s) was supposed to update 299ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * any of the reference buffers, but we act conservative and 300ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * mark only the last buffer as corrupted. 301ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 302ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * TODO(jkoleszar): Error concealment is undefined and non-normative 303ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * at this point, but if it becomes so, [0] may not always be the correct 304ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * thing to do here. 305ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 306ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->active_ref_idx[0] != INT_MAX) 3075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang get_frame_ref_buffer(cm, 0)->corrupted = 1; 308ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 309ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 310ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->new_fb_idx = get_free_fb(cm); 311ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3121184aebb761cbeac9124c37189a80a1a58f04b6bhkuang if (setjmp(cm->error.jmp)) { 3131184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 0; 314ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 315ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* We do not know if the missing frame(s) was supposed to update 316ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * any of the reference buffers, but we act conservative and 317ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * mark only the last buffer as corrupted. 318ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * 319ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * TODO(jkoleszar): Error concealment is undefined and non-normative 320ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * at this point, but if it becomes so, [0] may not always be the correct 321ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang * thing to do here. 322ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 323ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->active_ref_idx[0] != INT_MAX) 3245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang get_frame_ref_buffer(cm, 0)->corrupted = 1; 325ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 326ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) 327ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->fb_idx_ref_cnt[cm->new_fb_idx]--; 328ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 329ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return -1; 330ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 331ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3321184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 1; 333ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 334ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang retcode = vp9_decode_frame(pbi, psource); 335ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 336ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (retcode < 0) { 3371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.error_code = VPX_CODEC_ERROR; 3381184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 0; 339ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) 340ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->fb_idx_ref_cnt[cm->new_fb_idx]--; 341ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return retcode; 342ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 343ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang swap_frame_buffers(pbi); 345ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 346ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER == 2 3475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (cm->show_frame) 3485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang write_dx_frame_to_file(cm->frame_to_show, 3495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->current_video_frame); 3505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang else 3515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang write_dx_frame_to_file(cm->frame_to_show, 3525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->current_video_frame + 1000); 353ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 354ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (!pbi->do_loopfilter_inline) { 3565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_loop_filter_frame(cm, &pbi->mb, pbi->common.lf.filter_level, 0, 0); 3575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang } 358ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 359ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER == 2 3605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang if (cm->show_frame) 3615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang write_dx_frame_to_file(cm->frame_to_show, 3625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->current_video_frame + 2000); 3635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang else 3645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang write_dx_frame_to_file(cm->frame_to_show, 3655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->current_video_frame + 3000); 366ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 367ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vp9_extend_frame_inner_borders(cm->frame_to_show, 3695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->subsampling_x, 3705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang cm->subsampling_y); 371ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 372ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#if WRITE_RECON_BUFFER == 1 373ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->show_frame) 374ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang recon_write_yuv_frame("recon.yuv", cm->frame_to_show, 375ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->width, cm->height); 376ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif 377ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 378ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_clear_system_state(); 379ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 380ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->last_show_frame = cm->show_frame; 381ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (cm->show_frame) { 382ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // current mip will be the prev_mip for the next frame 383ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang MODE_INFO *temp = cm->prev_mip; 3841184aebb761cbeac9124c37189a80a1a58f04b6bhkuang MODE_INFO **temp2 = cm->prev_mi_grid_base; 385ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->prev_mip = cm->mip; 386ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->mip = temp; 3871184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->prev_mi_grid_base = cm->mi_grid_base; 3881184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->mi_grid_base = temp2; 389ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 390ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang // update the upper left visible macroblock ptrs 391ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->mi = cm->mip + cm->mode_info_stride + 1; 392ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->prev_mi = cm->prev_mip + cm->mode_info_stride + 1; 3931184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->mi_grid_visible = cm->mi_grid_base + cm->mode_info_stride + 1; 3941184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mode_info_stride + 1; 395ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 3965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang pbi->mb.mi_8x8 = cm->mi_grid_visible; 3975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang pbi->mb.mi_8x8[0] = cm->mi; 3985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 399ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang cm->current_video_frame++; 400ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 401ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 402ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->ready_for_new_data = 0; 403ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->last_time_stamp = time_stamp; 404ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->source_sz = 0; 405ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 4061184aebb761cbeac9124c37189a80a1a58f04b6bhkuang cm->error.setjmp = 0; 407ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return retcode; 408ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 409ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 410ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp9_get_raw_frame(VP9D_PTR ptr, YV12_BUFFER_CONFIG *sd, 411ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int64_t *time_stamp, int64_t *time_end_stamp, 412ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_ppflags_t *flags) { 413ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang int ret = -1; 414ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang VP9D_COMP *pbi = (VP9D_COMP *) ptr; 415ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 416ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pbi->ready_for_new_data == 1) 417ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return ret; 418ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 419ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* ie no raw frame to show!!! */ 420ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pbi->common.show_frame == 0) 421ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return ret; 422ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 423ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang pbi->ready_for_new_data = 1; 424ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *time_stamp = pbi->last_time_stamp; 425ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *time_end_stamp = 0; 426ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 4271184aebb761cbeac9124c37189a80a1a58f04b6bhkuang#if CONFIG_VP9_POSTPROC 4281184aebb761cbeac9124c37189a80a1a58f04b6bhkuang ret = vp9_post_proc_frame(&pbi->common, sd, flags); 429ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#else 430ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 431ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (pbi->common.frame_to_show) { 432ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang *sd = *pbi->common.frame_to_show; 433ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sd->y_width = pbi->common.width; 434ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang sd->y_height = pbi->common.height; 4351184aebb761cbeac9124c37189a80a1a58f04b6bhkuang sd->uv_width = sd->y_width >> pbi->common.subsampling_x; 4361184aebb761cbeac9124c37189a80a1a58f04b6bhkuang sd->uv_height = sd->y_height >> pbi->common.subsampling_y; 4371184aebb761cbeac9124c37189a80a1a58f04b6bhkuang 438ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ret = 0; 439ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } else { 440ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ret = -1; 441ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 442ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 443ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif /*!CONFIG_POSTPROC*/ 444ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang vp9_clear_system_state(); 445ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang return ret; 446ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} 447