/src/trunk/xvidcore/src/encoder.h
Line | Count | Source (jump to first uncovered line) |
1 | | /***************************************************************************** |
2 | | * |
3 | | * XVID MPEG-4 VIDEO CODEC |
4 | | * - Encoder related header - |
5 | | * |
6 | | * Copyright(C) 2002-2010 Michael Militzer <isibaar@xvid.org> |
7 | | * 2002-2003 Peter Ross <pross@xvid.org> |
8 | | * |
9 | | * This program is free software ; you can redistribute it and/or modify |
10 | | * it under the terms of the GNU General Public License as published by |
11 | | * the Free Software Foundation ; either version 2 of the License, or |
12 | | * (at your option) any later version. |
13 | | * |
14 | | * This program is distributed in the hope that it will be useful, |
15 | | * but WITHOUT ANY WARRANTY ; without even the implied warranty of |
16 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
17 | | * GNU General Public License for more details. |
18 | | * |
19 | | * You should have received a copy of the GNU General Public License |
20 | | * along with this program ; if not, write to the Free Software |
21 | | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 | | * |
23 | | * $Id: encoder.h 1988 2011-05-18 09:10:05Z Isibaar $ |
24 | | * |
25 | | ****************************************************************************/ |
26 | | |
27 | | #ifndef _ENCODER_H_ |
28 | | #define _ENCODER_H_ |
29 | | |
30 | | #include "xvid.h" |
31 | | #include "portab.h" |
32 | | #include "global.h" |
33 | | |
34 | | /***************************************************************************** |
35 | | * Constants |
36 | | ****************************************************************************/ |
37 | | |
38 | | /* lambda base exponential. 1<<LAMBDA_EXP is the neutral lambda */ |
39 | 0 | #define LAMBDA_EXP 6 |
40 | | |
41 | | /***************************************************************************** |
42 | | * Types |
43 | | ****************************************************************************/ |
44 | | |
45 | | typedef int bool; |
46 | | |
47 | | /***************************************************************************** |
48 | | * Structures |
49 | | ****************************************************************************/ |
50 | | |
51 | | typedef struct |
52 | | { |
53 | | /* --- constants --- */ |
54 | | uint32_t width; |
55 | | uint32_t height; |
56 | | |
57 | | uint32_t edged_width; |
58 | | uint32_t edged_height; |
59 | | uint32_t mb_width; |
60 | | uint32_t mb_height; |
61 | | |
62 | | int plugin_flags; |
63 | | |
64 | | /* frame rate increment & base */ |
65 | | int32_t fincr; |
66 | | uint32_t fbase; |
67 | | |
68 | | int profile; |
69 | | |
70 | | int global_flags; |
71 | | int bquant_ratio; |
72 | | int bquant_offset; |
73 | | int frame_drop_ratio; |
74 | | |
75 | | int min_quant[3]; |
76 | | int max_quant[3]; |
77 | | |
78 | | int par; |
79 | | int par_width; |
80 | | int par_height; |
81 | | |
82 | | int iMaxKeyInterval; |
83 | | int max_bframes; |
84 | | |
85 | | /* --- inbetween vop stuff --- */ |
86 | | /* rounding type; alternate 0-1 after each interframe */ |
87 | | /* 1 <= fixed_code <= 4 |
88 | | automatically adjusted using motion vector statistics inside |
89 | | */ |
90 | | |
91 | | /* vars that not "quite" frame independant */ |
92 | | uint32_t m_rounding_type; |
93 | | uint32_t m_fcode; |
94 | | int vol_flags; |
95 | | |
96 | | int64_t m_stamp; |
97 | | |
98 | | uint16_t *mpeg_quant_matrices; |
99 | | uint32_t last_quant_initialized_intra; /* needed for mpeg matrices initialization */ |
100 | | } MBParam; |
101 | | |
102 | | typedef struct |
103 | | { |
104 | | int iTextBits; |
105 | | int iMvSum; |
106 | | int iMvCount; |
107 | | int kblks; |
108 | | int mblks; |
109 | | int ublks; |
110 | | int gblks; |
111 | | int iMVBits; |
112 | | } Statistics; |
113 | | |
114 | | /* encoding queue */ |
115 | | typedef struct |
116 | | { |
117 | | xvid_enc_frame_t frame; |
118 | | unsigned char quant_intra_matrix[64]; |
119 | | unsigned char quant_inter_matrix[64]; |
120 | | IMAGE image; |
121 | | } QUEUEINFO; |
122 | | |
123 | | typedef struct |
124 | | { |
125 | | int frame_num; |
126 | | int fincr; |
127 | | int vol_flags; |
128 | | int vop_flags; |
129 | | int motion_flags; |
130 | | |
131 | | int coding_type; |
132 | | uint32_t quant; |
133 | | uint32_t rounding_type; |
134 | | uint32_t fcode; |
135 | | uint32_t bcode; |
136 | | |
137 | | uint32_t seconds; |
138 | | uint32_t ticks; |
139 | | int64_t stamp; |
140 | | |
141 | | IMAGE image; |
142 | | |
143 | | MACROBLOCK *mbs; |
144 | | |
145 | | WARPPOINTS warp; /* as in bitstream */ |
146 | | GMC_DATA gmc_data; /* common data for all MBs */ |
147 | | NEW_GMC_DATA new_gmc_data; /* common data for all MBs */ |
148 | | |
149 | | int length; /* the encoded size of this frame */ |
150 | | |
151 | | Statistics sStat; |
152 | | int is_edged, is_interpolated; |
153 | | } FRAMEINFO; |
154 | | |
155 | | #include "motion/motion_smp.h" |
156 | | |
157 | | typedef struct |
158 | | { |
159 | | MBParam mbParam; |
160 | | |
161 | | int iFrameNum; |
162 | | int bitrate; |
163 | | |
164 | | /* zones */ |
165 | | unsigned int num_zones; |
166 | | xvid_enc_zone_t * zones; |
167 | | |
168 | | /* plugins */ |
169 | | int num_plugins; /* note: we store plugin flags in MBPARAM */ |
170 | | xvid_enc_plugin_t * plugins; |
171 | | |
172 | | /* dquant */ |
173 | | |
174 | | int * temp_dquants; |
175 | | |
176 | | /* lambda */ |
177 | | |
178 | | float * temp_lambda; |
179 | | |
180 | | /* images */ |
181 | | |
182 | | FRAMEINFO *current; |
183 | | FRAMEINFO *reference; |
184 | | |
185 | | IMAGE sOriginal; /* original image copy for i/p frames */ |
186 | | IMAGE sOriginal2; /* original image copy for b-frames */ |
187 | | IMAGE vInterH; |
188 | | IMAGE vInterV; |
189 | | IMAGE vInterVf; |
190 | | IMAGE vInterHV; |
191 | | IMAGE vInterHVf; |
192 | | |
193 | | IMAGE vGMC; |
194 | | |
195 | | /* image queue */ |
196 | | int queue_head; |
197 | | int queue_tail; |
198 | | int queue_size; |
199 | | QUEUEINFO *queue; |
200 | | |
201 | | /* bframe buffer */ |
202 | | int bframenum_head; |
203 | | int bframenum_tail; |
204 | | int flush_bframes; |
205 | | |
206 | | FRAMEINFO **bframes; |
207 | | IMAGE f_refh; |
208 | | IMAGE f_refv; |
209 | | IMAGE f_refhv; |
210 | | |
211 | | /* closed_gop fixup temporary storage */ |
212 | | int closed_bframenum; /* == -1 if there is no fixup intended */ |
213 | | QUEUEINFO closed_qframe; /* qFrame, only valid when >= 0 */ |
214 | | |
215 | | /* multithreaded stuff */ |
216 | | int num_threads; /* number of encoder threads */ |
217 | | SMPData * smpData; /* data structures used to pass all thread-specific data */ |
218 | | |
219 | | int m_framenum; /* debug frame num counter; unlike iFrameNum, does not reset at ivop */ |
220 | | |
221 | | float fMvPrevSigma; |
222 | | |
223 | | int num_slices; /* number of slices to code */ |
224 | | } Encoder; |
225 | | |
226 | | /***************************************************************************** |
227 | | * Inline functions |
228 | | ****************************************************************************/ |
229 | | |
230 | | static __inline uint8_t |
231 | | get_fcode(uint16_t sr) |
232 | 0 | { |
233 | 0 | if (sr <= 16) |
234 | 0 | return 1; |
235 | 0 |
|
236 | 0 | else if (sr <= 32) |
237 | 0 | return 2; |
238 | 0 |
|
239 | 0 | else if (sr <= 64) |
240 | 0 | return 3; |
241 | 0 |
|
242 | 0 | else if (sr <= 128) |
243 | 0 | return 4; |
244 | 0 |
|
245 | 0 | else if (sr <= 256) |
246 | 0 | return 5; |
247 | 0 |
|
248 | 0 | else if (sr <= 512) |
249 | 0 | return 6; |
250 | 0 |
|
251 | 0 | else if (sr <= 1024) |
252 | 0 | return 7; |
253 | 0 |
|
254 | 0 | else |
255 | 0 | return 0; |
256 | 0 | } Unexecuted instantiation: xvid.c:get_fcode Unexecuted instantiation: mbcoding.c:get_fcode Unexecuted instantiation: gmc.c:get_fcode Unexecuted instantiation: mbtransquant.c:get_fcode Unexecuted instantiation: decoder.c:get_fcode Unexecuted instantiation: encoder.c:get_fcode Unexecuted instantiation: bitstream.c:get_fcode Unexecuted instantiation: estimation_bvop.c:get_fcode Unexecuted instantiation: estimation_common.c:get_fcode Unexecuted instantiation: estimation_gmc.c:get_fcode Unexecuted instantiation: estimation_pvop.c:get_fcode Unexecuted instantiation: estimation_rd_based.c:get_fcode Unexecuted instantiation: estimation_rd_based_bvop.c:get_fcode Unexecuted instantiation: motion_comp.c:get_fcode Unexecuted instantiation: vop_type_decision.c:get_fcode Unexecuted instantiation: mbprediction.c:get_fcode |
257 | | |
258 | | /***************************************************************************** |
259 | | * Prototypes |
260 | | ****************************************************************************/ |
261 | | |
262 | | void init_encoder(uint32_t cpu_flags); |
263 | | |
264 | | int enc_create(xvid_enc_create_t * create); |
265 | | int enc_destroy(Encoder * pEnc); |
266 | | int enc_encode(Encoder * pEnc, |
267 | | xvid_enc_frame_t * pFrame, |
268 | | xvid_enc_stats_t * stats); |
269 | | |
270 | | #endif |