|
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 |
|
25 typedef struct |
|
26 { |
|
27 int ithread; |
|
28 void *ptr1; |
|
29 void *ptr2; |
|
30 } DECODETHREAD_DATA; |
|
31 |
|
32 typedef struct |
|
33 { |
|
34 MACROBLOCKD mbd; |
|
35 } MB_ROW_DEC; |
|
36 |
|
37 |
|
38 typedef 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 |
|
48 struct 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 |
|
62 typedef 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 |
|
129 int vp8_decode_frame(VP8D_COMP *cpi); |
|
130 |
|
131 int vp8_create_decoder_instances(struct frame_buffers *fb, VP8D_CONFIG *oxcf); |
|
132 int 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_ |