1/*
2 *  Copyright (c) 2010 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
12#ifndef ONYXD_INT_H_
13#define ONYXD_INT_H_
14
15#include "vpx_config.h"
16#include "vp8/common/onyxd.h"
17#include "treereader.h"
18#include "vp8/common/onyxc_int.h"
19#include "vp8/common/threading.h"
20
21#if CONFIG_ERROR_CONCEALMENT
22#include "ec_types.h"
23#endif
24
25typedef struct
26{
27    int ithread;
28    void *ptr1;
29    void *ptr2;
30} DECODETHREAD_DATA;
31
32typedef struct
33{
34    MACROBLOCKD  mbd;
35} MB_ROW_DEC;
36
37
38typedef struct
39{
40    int enabled;
41    unsigned int count;
42    const unsigned char *ptrs[MAX_PARTITIONS];
43    unsigned int sizes[MAX_PARTITIONS];
44} FRAGMENT_DATA;
45
46#define MAX_FB_MT_DEC 32
47
48struct frame_buffers
49{
50    /*
51     * this struct will be populated with frame buffer management
52     * info in future commits. */
53
54    /* enable/disable frame-based threading */
55    int     use_frame_threads;
56
57    /* decoder instances */
58    struct VP8D_COMP *pbi[MAX_FB_MT_DEC];
59
60};
61
62typedef struct VP8D_COMP
63{
64    DECLARE_ALIGNED(16, MACROBLOCKD, mb);
65
66    YV12_BUFFER_CONFIG *dec_fb_ref[NUM_YV12_BUFFERS];
67
68    DECLARE_ALIGNED(16, VP8_COMMON, common);
69
70    /* the last partition will be used for the modes/mvs */
71    vp8_reader mbc[MAX_PARTITIONS];
72
73    VP8D_CONFIG oxcf;
74
75    FRAGMENT_DATA fragments;
76
77#if CONFIG_MULTITHREAD
78    /* variable for threading */
79
80    volatile int b_multithreaded_rd;
81    int max_threads;
82    int current_mb_col_main;
83    unsigned int decoding_thread_count;
84    int allocated_decoding_thread_count;
85
86    int mt_baseline_filter_level[MAX_MB_SEGMENTS];
87    int sync_range;
88    int *mt_current_mb_col;                  /* Each row remembers its already decoded column. */
89
90    unsigned char **mt_yabove_row;           /* mb_rows x width */
91    unsigned char **mt_uabove_row;
92    unsigned char **mt_vabove_row;
93    unsigned char **mt_yleft_col;            /* mb_rows x 16 */
94    unsigned char **mt_uleft_col;            /* mb_rows x 8 */
95    unsigned char **mt_vleft_col;            /* mb_rows x 8 */
96
97    MB_ROW_DEC           *mb_row_di;
98    DECODETHREAD_DATA    *de_thread_data;
99
100    pthread_t           *h_decoding_thread;
101    sem_t               *h_event_start_decoding;
102    sem_t                h_event_end_decoding;
103    /* end of threading data */
104#endif
105
106    int64_t last_time_stamp;
107    int   ready_for_new_data;
108
109    vp8_prob prob_intra;
110    vp8_prob prob_last;
111    vp8_prob prob_gf;
112    vp8_prob prob_skip_false;
113
114#if CONFIG_ERROR_CONCEALMENT
115    MB_OVERLAP *overlaps;
116    /* the mb num from which modes and mvs (first partition) are corrupt */
117    unsigned int mvs_corrupt_from_mb;
118#endif
119    int ec_enabled;
120    int ec_active;
121    int decoded_key_frame;
122    int independent_partitions;
123    int frame_corrupt_residual;
124
125    vp8_decrypt_cb *decrypt_cb;
126    void *decrypt_state;
127} VP8D_COMP;
128
129int vp8_decode_frame(VP8D_COMP *cpi);
130
131int vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf);
132int vp8_remove_decoder_instances(struct frame_buffers *fb);
133
134#if CONFIG_DEBUG
135#define CHECK_MEM_ERROR(lval,expr) do {\
136        lval = (expr); \
137        if(!lval) \
138            vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\
139                               "Failed to allocate "#lval" at %s:%d", \
140                               __FILE__,__LINE__);\
141    } while(0)
142#else
143#define CHECK_MEM_ERROR(lval,expr) do {\
144        lval = (expr); \
145        if(!lval) \
146            vpx_internal_error(&pbi->common.error, VPX_CODEC_MEM_ERROR,\
147                               "Failed to allocate "#lval);\
148    } while(0)
149#endif
150
151#endif  // ONYXD_INT_H_
152