176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org/*
276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org *
476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org *  Use of this source code is governed by a BSD-style license
576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org *  that can be found in the LICENSE file in the root of the source
676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org *  tree. An additional intellectual property rights grant can be found
776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org *  in the file PATENTS.  All contributing project authors may
876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org *  be found in the AUTHORS file in the root of the source tree.
976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org */
1076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
1176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#ifndef VP9_DECODER_VP9_DTHREAD_H_
1276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#define VP9_DECODER_VP9_DTHREAD_H_
1376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
1476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#include "./vpx_config.h"
1595aa45d73048f952dcaad0037429cc6751b34f2fjohannkoenig@google.com#include "vp9/common/vp9_thread.h"
1676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#include "vp9/decoder/vp9_reader.h"
1776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
1876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgstruct VP9Common;
1993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgstruct VP9Decoder;
2076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
2176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgtypedef struct TileWorkerData {
2276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  struct VP9Common *cm;
2376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  vp9_reader bit_reader;
2476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  DECLARE_ALIGNED(16, struct macroblockd, xd);
2576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
2676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  // Row-based parallel loopfilter data
2776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  LFWorkerData lfdata;
2876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org} TileWorkerData;
2976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
3076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// Loopfilter row synchronization
3176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgtypedef struct VP9LfSyncData {
3276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#if CONFIG_MULTITHREAD
3376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  pthread_mutex_t *mutex_;
3476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  pthread_cond_t *cond_;
3576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#endif
3676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  // Allocate memory to store the loop-filtered superblock index in each row.
3776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  int *cur_sb_col;
3876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  // The optimal sync_range for different resolution and platform should be
3976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  // determined by testing. Currently, it is chosen to be a power-of-2 number.
4076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org  int sync_range;
41d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org  int rows;
4276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org} VP9LfSync;
4376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
4476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// Allocate memory for loopfilter row synchronization.
4587997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.orgvoid vp9_loop_filter_alloc(VP9LfSync *lf_sync, VP9_COMMON *cm, int rows,
4687997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org                           int width);
4776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
4876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// Deallocate loopfilter synchronization related mutex and data.
49d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgvoid vp9_loop_filter_dealloc(VP9LfSync *lf_sync);
5076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
5176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org// Multi-threaded loopfilter that uses the tile threads.
527765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.orgvoid vp9_loop_filter_frame_mt(YV12_BUFFER_CONFIG *frame,
537765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org                              struct VP9Decoder *pbi,
5476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org                              struct VP9Common *cm,
5576e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org                              int frame_filter_level,
567765c078fa920ba6c949c15f16b6cc979d8bb95bjohannkoenig@chromium.org                              int y_only);
5776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org
5876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#endif  // VP9_DECODER_VP9_DTHREAD_H_
59