1b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian/* 2b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 3b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * 4b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * Use of this source code is governed by a BSD-style license 5b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * that can be found in the LICENSE file in the root of the source 6b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * tree. An additional intellectual property rights grant can be found 7b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * in the file PATENTS. All contributing project authors may 8b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * be found in the AUTHORS file in the root of the source tree. 9b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian */ 10b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 11b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifndef VP9_DECODER_VP9_DTHREAD_H_ 12b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VP9_DECODER_VP9_DTHREAD_H_ 13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 14b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "./vpx_config.h" 15b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/common/vp9_loopfilter.h" 16b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/decoder/vp9_reader.h" 17b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vp9/decoder/vp9_thread.h" 18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 19b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct macroblockd; 20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct VP9Common; 216ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstruct VP9Decoder; 22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef struct TileWorkerData { 24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct VP9Common *cm; 25b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian vp9_reader bit_reader; 26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian DECLARE_ALIGNED(16, struct macroblockd, xd); 27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Row-based parallel loopfilter data 29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian LFWorkerData lfdata; 30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} TileWorkerData; 31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 32b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Loopfilter row synchronization 33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramaniantypedef struct VP9LfSyncData { 34b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#if CONFIG_MULTITHREAD 35b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian pthread_mutex_t *mutex_; 36b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian pthread_cond_t *cond_; 37b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif 38b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // Allocate memory to store the loop-filtered superblock index in each row. 39b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int *cur_sb_col; 40b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // The optimal sync_range for different resolution and platform should be 41b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian // determined by testing. Currently, it is chosen to be a power-of-2 number. 42b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int sync_range; 43b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} VP9LfSync; 44b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 45b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Allocate memory for loopfilter row synchronization. 46b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_loop_filter_alloc(struct VP9Common *cm, struct VP9LfSyncData *lf_sync, 47b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int rows, int width); 48b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 49b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Deallocate loopfilter synchronization related mutex and data. 50b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid vp9_loop_filter_dealloc(struct VP9LfSyncData *lf_sync, int rows); 51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 52b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian// Multi-threaded loopfilter that uses the tile threads. 536ac915abcdb404a00d927fe6308a47fcf09d9519hkuangvoid vp9_loop_filter_frame_mt(struct VP9Decoder *pbi, 54b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct VP9Common *cm, 55b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct macroblockd *xd, 56b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int frame_filter_level, 57b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int y_only, int partial_frame); 58b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 59b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif // VP9_DECODER_VP9_DTHREAD_H_ 60