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