1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
128b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#ifndef VP8_DECODER_ONYXD_INT_H_
138b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#define VP8_DECODER_ONYXD_INT_H_
144b95526e5c4eb4fecde1cd642cf991a82c51b9f2johannkoenig@chromium.org
15167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "vpx_config.h"
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/onyxd.h"
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "treereader.h"
18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/onyxc_int.h"
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/threading.h"
20167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org
21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT
22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "ec_types.h"
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
25dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus
26dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgextern "C" {
27dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
28dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct
30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ithread;
32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    void *ptr1;
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    void *ptr2;
34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} DECODETHREAD_DATA;
35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgtypedef struct
37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MACROBLOCKD  mbd;
39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} MB_ROW_DEC;
40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
41fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org
42da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.orgtypedef struct
43da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org{
44da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org    int enabled;
45da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org    unsigned int count;
46da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org    const unsigned char *ptrs[MAX_PARTITIONS];
47da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org    unsigned int sizes[MAX_PARTITIONS];
48da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org} FRAGMENT_DATA;
49da24c9017693dec11c2925131958a7e0e0b9f1cffgalligan@chromium.org
50fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org#define MAX_FB_MT_DEC 32
51fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org
52fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.orgstruct frame_buffers
53fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org{
54fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org    /*
55fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org     * this struct will be populated with frame buffer management
56fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org     * info in future commits. */
57fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org
58fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org    /* enable/disable frame-based threading */
59fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org    int     use_frame_threads;
60fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org
61fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org    /* decoder instances */
62fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org    struct VP8D_COMP *pbi[MAX_FB_MT_DEC];
63fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org
64fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org};
65fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org
66167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgtypedef struct VP8D_COMP
67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{
68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, MACROBLOCKD, mb);
69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
70ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    YV12_BUFFER_CONFIG *dec_fb_ref[NUM_YV12_BUFFERS];
71ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECLARE_ALIGNED(16, VP8_COMMON, common);
73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
74ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    /* the last partition will be used for the modes/mvs */
75ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    vp8_reader mbc[MAX_PARTITIONS];
76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    VP8D_CONFIG oxcf;
78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
79c5ff9561dffb0f6b6a64796713281339282aea41fgalligan@chromium.org    FRAGMENT_DATA fragments;
80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_MULTITHREAD
82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* variable for threading */
83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    volatile int b_multithreaded_rd;
85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int max_threads;
86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int current_mb_col_main;
870f63c1066cd1edc83ea58380069ce0fe25050d26scottmg@google.com    unsigned int decoding_thread_count;
88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int allocated_decoding_thread_count;
89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int mt_baseline_filter_level[MAX_MB_SEGMENTS];
91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int sync_range;
92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int *mt_current_mb_col;                  /* Each row remembers its already decoded column. */
93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char **mt_yabove_row;           /* mb_rows x width */
95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char **mt_uabove_row;
96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char **mt_vabove_row;
97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char **mt_yleft_col;            /* mb_rows x 16 */
98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char **mt_uleft_col;            /* mb_rows x 8 */
99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned char **mt_vleft_col;            /* mb_rows x 8 */
100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MB_ROW_DEC           *mb_row_di;
102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    DECODETHREAD_DATA    *de_thread_data;
103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    pthread_t           *h_decoding_thread;
105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sem_t               *h_event_start_decoding;
106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    sem_t                h_event_end_decoding;
107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* end of threading data */
108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int64_t last_time_stamp;
111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int   ready_for_new_data;
112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_prob prob_intra;
114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_prob prob_last;
115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_prob prob_gf;
116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    vp8_prob prob_skip_false;
117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_ERROR_CONCEALMENT
119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    MB_OVERLAP *overlaps;
120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    /* the mb num from which modes and mvs (first partition) are corrupt */
121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    unsigned int mvs_corrupt_from_mb;
122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ec_enabled;
124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int ec_active;
125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int decoded_key_frame;
126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int independent_partitions;
127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    int frame_corrupt_residual;
128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
129693441efe611de7ca09c00f4e79776f604b689f4joeyparrish@google.com    vpx_decrypt_cb decrypt_cb;
1306ffb5d8eaaa9cb68c354c46f375ccc5b9bc8b107jpet@google.com    void *decrypt_state;
131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} VP8D_COMP;
132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8_decode_frame(VP8D_COMP *cpi);
134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
135fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.orgint vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf);
136fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.orgint vp8_remove_decoder_instances(struct frame_buffers *fb);
137fa43a22c16ae2b81f2532c907fb9eb2c1cd2a373fgalligan@chromium.org
138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if CONFIG_DEBUG
139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define CHECK_MEM_ERROR(lval,expr) do {\
140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lval = (expr); \
141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if(!lval) \
142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\
143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               "Failed to allocate "#lval" at %s:%d", \
144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               __FILE__,__LINE__);\
145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    } while(0)
146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else
147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define CHECK_MEM_ERROR(lval,expr) do {\
148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        lval = (expr); \
149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org        if(!lval) \
150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org            vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\
151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org                               "Failed to allocate "#lval);\
152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    } while(0)
153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
155dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#ifdef __cplusplus
156dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org}  // extern "C"
157dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org#endif
158dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org
1598b26fe55f3e4daa2311dbd2d95e8ac2b4e080685johannkoenig@chromium.org#endif  // VP8_DECODER_ONYXD_INT_H_
160