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
12ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#ifndef ONYXD_INT_H_
13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define 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
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int ithread;
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *ptr1;
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void *ptr2;
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} DECODETHREAD_DATA;
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubertypedef struct
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    MACROBLOCKD  mbd;
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} MB_ROW_DEC;
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangtypedef struct
39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang{
40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int enabled;
41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    unsigned int count;
42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    const unsigned char *ptrs[MAX_PARTITIONS];
43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    unsigned int sizes[MAX_PARTITIONS];
44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang} FRAGMENT_DATA;
45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#define MAX_FB_MT_DEC 32
47ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
48ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangstruct frame_buffers
49ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang{
50ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    /*
51ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * this struct will be populated with frame buffer management
52ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang     * info in future commits. */
53ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
54ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    /* enable/disable frame-based threading */
55ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    int     use_frame_threads;
56ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
57ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    /* decoder instances */
58ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    struct VP8D_COMP *pbi[MAX_FB_MT_DEC];
59ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
60ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang};
61ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
621b362b15af34006e6a11974088a46d42b903418eJohanntypedef struct VP8D_COMP
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    DECLARE_ALIGNED(16, MACROBLOCKD, mb);
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
661b362b15af34006e6a11974088a46d42b903418eJohann    YV12_BUFFER_CONFIG *dec_fb_ref[NUM_YV12_BUFFERS];
671b362b15af34006e6a11974088a46d42b903418eJohann
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    DECLARE_ALIGNED(16, VP8_COMMON, common);
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
701b362b15af34006e6a11974088a46d42b903418eJohann    /* the last partition will be used for the modes/mvs */
711b362b15af34006e6a11974088a46d42b903418eJohann    vp8_reader mbc[MAX_PARTITIONS];
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    VP8D_CONFIG oxcf;
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
75ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    FRAGMENT_DATA fragments;
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7779f15823c34ae1e423108295e416213200bb280fAndreas Huber#if CONFIG_MULTITHREAD
7879f15823c34ae1e423108295e416213200bb280fAndreas Huber    /* variable for threading */
7979f15823c34ae1e423108295e416213200bb280fAndreas Huber
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    volatile int b_multithreaded_rd;
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int max_threads;
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int current_mb_col_main;
831b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int decoding_thread_count;
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int allocated_decoding_thread_count;
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
86538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int mt_baseline_filter_level[MAX_MB_SEGMENTS];
87538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int sync_range;
88538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int *mt_current_mb_col;                  /* Each row remembers its already decoded column. */
89538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
90538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_yabove_row;           /* mb_rows x width */
91538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_uabove_row;
92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_vabove_row;
93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_yleft_col;            /* mb_rows x 16 */
94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_uleft_col;            /* mb_rows x 8 */
95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned char **mt_vleft_col;            /* mb_rows x 8 */
96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    MB_ROW_DEC           *mb_row_di;
98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    DECODETHREAD_DATA    *de_thread_data;
99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    pthread_t           *h_decoding_thread;
101f71323e297a928af368937089d3ed71239786f86Andreas Huber    sem_t               *h_event_start_decoding;
102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    sem_t                h_event_end_decoding;
103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* end of threading data */
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
105538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
1061b362b15af34006e6a11974088a46d42b903418eJohann    int64_t last_time_stamp;
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int   ready_for_new_data;
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
109f71323e297a928af368937089d3ed71239786f86Andreas Huber    vp8_prob prob_intra;
110f71323e297a928af368937089d3ed71239786f86Andreas Huber    vp8_prob prob_last;
111f71323e297a928af368937089d3ed71239786f86Andreas Huber    vp8_prob prob_gf;
112f71323e297a928af368937089d3ed71239786f86Andreas Huber    vp8_prob prob_skip_false;
113f71323e297a928af368937089d3ed71239786f86Andreas Huber
1141b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_ERROR_CONCEALMENT
1151b362b15af34006e6a11974088a46d42b903418eJohann    MB_OVERLAP *overlaps;
1161b362b15af34006e6a11974088a46d42b903418eJohann    /* the mb num from which modes and mvs (first partition) are corrupt */
1171b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int mvs_corrupt_from_mb;
1181b362b15af34006e6a11974088a46d42b903418eJohann#endif
1191b362b15af34006e6a11974088a46d42b903418eJohann    int ec_enabled;
1201b362b15af34006e6a11974088a46d42b903418eJohann    int ec_active;
1211b362b15af34006e6a11974088a46d42b903418eJohann    int decoded_key_frame;
1221b362b15af34006e6a11974088a46d42b903418eJohann    int independent_partitions;
1231b362b15af34006e6a11974088a46d42b903418eJohann    int frame_corrupt_residual;
1241b362b15af34006e6a11974088a46d42b903418eJohann
125ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    vp8_decrypt_cb *decrypt_cb;
126ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang    void *decrypt_state;
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} VP8D_COMP;
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint vp8_decode_frame(VP8D_COMP *cpi);
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
131ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf);
132ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangint vp8_remove_decoder_instances(struct frame_buffers *fb);
133ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_DEBUG
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define CHECK_MEM_ERROR(lval,expr) do {\
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        lval = (expr); \
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if(!lval) \
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               "Failed to allocate "#lval" at %s:%d", \
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               __FILE__,__LINE__);\
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } while(0)
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define CHECK_MEM_ERROR(lval,expr) do {\
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        lval = (expr); \
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        if(!lval) \
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                               "Failed to allocate "#lval);\
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } while(0)
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
151ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#endif  // ONYXD_INT_H_
152