190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifndef VP8_DECODER_ONYXD_INT_H_
13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VP8_DECODER_ONYXD_INT_H_
14ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
151b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h"
1679f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/onyxd.h"
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "treereader.h"
1879f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/onyxc_int.h"
1979f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/threading.h"
201b362b15af34006e6a11974088a46d42b903418eJohann
211b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT
221b362b15af34006e6a11974088a46d42b903418eJohann#include "ec_types.h"
231b362b15af34006e6a11974088a46d42b903418eJohann#endif
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" {
27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int ithread;
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *ptr1;
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *ptr2;
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} DECODETHREAD_DATA;
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    MACROBLOCKD  mbd;
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} MB_ROW_DEC;
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct
43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang{
44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int enabled;
45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    unsigned int count;
46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    const unsigned char *ptrs[MAX_PARTITIONS];
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    unsigned int sizes[MAX_PARTITIONS];
48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} FRAGMENT_DATA;
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MAX_FB_MT_DEC 32
51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct frame_buffers
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang{
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    /*
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * this struct will be populated with frame buffer management
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * info in future commits. */
57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    /* enable/disable frame-based threading */
59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int     use_frame_threads;
60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    /* decoder instances */
62ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    struct VP8D_COMP *pbi[MAX_FB_MT_DEC];
63ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
64ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
65ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
661b362b15af34006e6a11974088a46d42b903418eJohanntypedef struct VP8D_COMP
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    DECLARE_ALIGNED(16, MACROBLOCKD, mb);
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
701b362b15af34006e6a11974088a46d42b903418eJohann    YV12_BUFFER_CONFIG *dec_fb_ref[NUM_YV12_BUFFERS];
711b362b15af34006e6a11974088a46d42b903418eJohann
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    DECLARE_ALIGNED(16, VP8_COMMON, common);
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
741b362b15af34006e6a11974088a46d42b903418eJohann    /* the last partition will be used for the modes/mvs */
751b362b15af34006e6a11974088a46d42b903418eJohann    vp8_reader mbc[MAX_PARTITIONS];
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8D_CONFIG oxcf;
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
79ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    FRAGMENT_DATA fragments;
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8179f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_MULTITHREAD
8279f15823c34ae1e423108295e416213200bb280fAndreas Huber    /* variable for threading */
8379f15823c34ae1e423108295e416213200bb280fAndreas Huber
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    volatile int b_multithreaded_rd;
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int max_threads;
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int current_mb_col_main;
871b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int decoding_thread_count;
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int allocated_decoding_thread_count;
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
90538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int mt_baseline_filter_level[MAX_MB_SEGMENTS];
91538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int sync_range;
92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int *mt_current_mb_col;                  /* Each row remembers its already decoded column. */
93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_yabove_row;           /* mb_rows x width */
95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_uabove_row;
96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_vabove_row;
97538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_yleft_col;            /* mb_rows x 16 */
98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_uleft_col;            /* mb_rows x 8 */
99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_vleft_col;            /* mb_rows x 8 */
100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    MB_ROW_DEC           *mb_row_di;
102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    DECODETHREAD_DATA    *de_thread_data;
103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    pthread_t           *h_decoding_thread;
105f71323e297a928af368937089d3ed71239786f86Andreas Huber    sem_t               *h_event_start_decoding;
106538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    sem_t                h_event_end_decoding;
107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* end of threading data */
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1101b362b15af34006e6a11974088a46d42b903418eJohann    int64_t last_time_stamp;
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int   ready_for_new_data;
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
113f71323e297a928af368937089d3ed71239786f86Andreas Huber    vp8_prob prob_intra;
114f71323e297a928af368937089d3ed71239786f86Andreas Huber    vp8_prob prob_last;
115f71323e297a928af368937089d3ed71239786f86Andreas Huber    vp8_prob prob_gf;
116f71323e297a928af368937089d3ed71239786f86Andreas Huber    vp8_prob prob_skip_false;
117f71323e297a928af368937089d3ed71239786f86Andreas Huber
1181b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT
1191b362b15af34006e6a11974088a46d42b903418eJohann    MB_OVERLAP *overlaps;
1201b362b15af34006e6a11974088a46d42b903418eJohann    /* the mb num from which modes and mvs (first partition) are corrupt */
1211b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int mvs_corrupt_from_mb;
1221b362b15af34006e6a11974088a46d42b903418eJohann#endif
1231b362b15af34006e6a11974088a46d42b903418eJohann    int ec_enabled;
1241b362b15af34006e6a11974088a46d42b903418eJohann    int ec_active;
1251b362b15af34006e6a11974088a46d42b903418eJohann    int decoded_key_frame;
1261b362b15af34006e6a11974088a46d42b903418eJohann    int independent_partitions;
1271b362b15af34006e6a11974088a46d42b903418eJohann    int frame_corrupt_residual;
1281b362b15af34006e6a11974088a46d42b903418eJohann
129ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp8_decrypt_cb *decrypt_cb;
130ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    void *decrypt_state;
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} VP8D_COMP;
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_decode_frame(VP8D_COMP *cpi);
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
135ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf);
136ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp8_remove_decoder_instances(struct frame_buffers *fb);
137ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_DEBUG
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define CHECK_MEM_ERROR(lval,expr) do {\
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        lval = (expr); \
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if(!lval) \
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               "Failed to allocate "#lval" at %s:%d", \
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               __FILE__,__LINE__);\
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } while(0)
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define CHECK_MEM_ERROR(lval,expr) do {\
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        lval = (expr); \
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if(!lval) \
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               "Failed to allocate "#lval);\
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } while(0)
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
155b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
156b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}  // extern "C"
157b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
158b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
159b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif  // VP8_DECODER_ONYXD_INT_H_
160