16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/*
26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *
46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  Use of this source code is governed by a BSD-style license
56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  that can be found in the LICENSE file in the root of the source
66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  tree. An additional intellectual property rights grant can be found
76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  in the file PATENTS.  All contributing project authors may
86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *  be found in the AUTHORS file in the root of the source tree.
96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */
106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#ifndef VP9_DECODER_VP9_DECODER_H_
1293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#define VP9_DECODER_VP9_DECODER_H_
136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
1493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "./vpx_config.h"
1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "vpx/vpx_codec.h"
176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vpx_scale/yv12config.h"
1893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
1993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "vp9/common/vp9_onyxc_int.h"
206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp9/common/vp9_ppflags.h"
2195aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com#include "vp9/common/vp9_thread.h"
2293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
2393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "vp9/decoder/vp9_dthread.h"
246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
25dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus
26dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgextern "C" {
27dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
28dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
2988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(hkuang): combine this with TileWorkerData.
3088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgtypedef struct TileData {
3188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  VP9_COMMON *cm;
3288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  vp9_reader bit_reader;
3388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  DECLARE_ALIGNED(16, MACROBLOCKD, xd);
3488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org} TileData;
3588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
3693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgtypedef struct VP9Decoder {
3793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  DECLARE_ALIGNED(16, MACROBLOCKD, mb);
3893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
3993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  DECLARE_ALIGNED(16, VP9_COMMON, common);
4093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
4193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int ready_for_new_data;
4293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
4393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int refresh_frame_flags;
4493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
4588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  int frame_parallel_decode;  // frame-based threading.
4693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
4793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  VP9Worker lf_worker;
4893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  VP9Worker *tile_workers;
4993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  int num_tile_workers;
5093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org
5188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  TileData *tile_data;
5288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  int total_tiles;
5388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
5493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org  VP9LfSync lf_row_sync;
55693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com
56693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  vpx_decrypt_cb decrypt_cb;
57693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com  void *decrypt_state;
587765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org
597765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org  int max_threads;
607765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org  int inv_tile_order;
6187997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org  int need_resync;  // wait for key/intra-only frame
6293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org} VP9Decoder;
6310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
6493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgint vp9_receive_compressed_data(struct VP9Decoder *pbi,
6588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                                size_t size, const uint8_t **dest);
6610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
6788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgint vp9_get_raw_frame(struct VP9Decoder *pbi, YV12_BUFFER_CONFIG *sd,
6810a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                      vp9_ppflags_t *flags);
6910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
7093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvpx_codec_err_t vp9_copy_reference_dec(struct VP9Decoder *pbi,
7110a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                                       VP9_REFFRAME ref_frame_flag,
7210a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                                       YV12_BUFFER_CONFIG *sd);
7310a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
7493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvpx_codec_err_t vp9_set_reference_dec(VP9_COMMON *cm,
7510a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                                      VP9_REFFRAME ref_frame_flag,
7610a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org                                      YV12_BUFFER_CONFIG *sd);
7710a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
787765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.orgstruct VP9Decoder *vp9_decoder_create();
7910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org
8093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgvoid vp9_decoder_remove(struct VP9Decoder *pbi);
816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
82ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.orgstatic INLINE uint8_t read_marker(vpx_decrypt_cb decrypt_cb,
83ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org                                  void *decrypt_state,
84ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org                                  const uint8_t *data) {
85ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org  if (decrypt_cb) {
86ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org    uint8_t marker;
87ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org    decrypt_cb(decrypt_state, data, &marker, 1);
88ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org    return marker;
89ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org  }
90ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org  return *data;
91ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org}
92ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org
93ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org// This function is exposed for use in tests, as well as the inlined function
94ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org// "read_marker".
95ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.orgvpx_codec_err_t vp9_parse_superframe_index(const uint8_t *data,
96ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org                                           size_t data_sz,
97ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org                                           uint32_t sizes[8], int *count,
98ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org                                           vpx_decrypt_cb decrypt_cb,
99ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org                                           void *decrypt_state);
100ace65784417788374f0b19ce5a8abd06c9ccd007johannkoenig@chromium.org
1016fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#ifdef __cplusplus
102dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org}  // extern "C"
1036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#endif
1046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
10593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#endif  // VP9_DECODER_VP9_DECODER_H_
106