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