1 /*
2 * jcext.c
3 *
4 * Copyright (C) 2014, D. R. Commander.
5 * Copyright (C) 2014, Mozilla Corporation.
6 * For conditions of distribution and use, see the accompanying README file.
7 *
8 * This file contains accessor functions for extension parameters. These
9 * allow for extending the functionality of the libjpeg API without breaking
10 * backward ABI compatibility.
11 */
12
13 #define JPEG_INTERNALS
14 #include "jinclude.h"
15 #include "jpeglib.h"
16
17
18 GLOBAL(boolean)
jpeg_c_bool_param_supported(const j_compress_ptr cinfo,J_BOOLEAN_PARAM param)19 jpeg_c_bool_param_supported (const j_compress_ptr cinfo, J_BOOLEAN_PARAM param)
20 {
21 switch (param) {
22 case JBOOLEAN_OPTIMIZE_SCANS:
23 case JBOOLEAN_TRELLIS_QUANT:
24 case JBOOLEAN_TRELLIS_QUANT_DC:
25 case JBOOLEAN_TRELLIS_EOB_OPT:
26 case JBOOLEAN_USE_LAMBDA_WEIGHT_TBL:
27 case JBOOLEAN_USE_SCANS_IN_TRELLIS:
28 case JBOOLEAN_TRELLIS_Q_OPT:
29 case JBOOLEAN_OVERSHOOT_DERINGING:
30 return TRUE;
31 }
32
33 return FALSE;
34 }
35
36
37 GLOBAL(void)
jpeg_c_set_bool_param(j_compress_ptr cinfo,J_BOOLEAN_PARAM param,boolean value)38 jpeg_c_set_bool_param (j_compress_ptr cinfo, J_BOOLEAN_PARAM param,
39 boolean value)
40 {
41 switch(param) {
42 case JBOOLEAN_OPTIMIZE_SCANS:
43 cinfo->master->optimize_scans = value;
44 break;
45 case JBOOLEAN_TRELLIS_QUANT:
46 cinfo->master->trellis_quant = value;
47 break;
48 case JBOOLEAN_TRELLIS_QUANT_DC:
49 cinfo->master->trellis_quant_dc = value;
50 break;
51 case JBOOLEAN_TRELLIS_EOB_OPT:
52 cinfo->master->trellis_eob_opt = value;
53 break;
54 case JBOOLEAN_USE_LAMBDA_WEIGHT_TBL:
55 cinfo->master->use_lambda_weight_tbl = value;
56 break;
57 case JBOOLEAN_USE_SCANS_IN_TRELLIS:
58 cinfo->master->use_scans_in_trellis = value;
59 break;
60 case JBOOLEAN_TRELLIS_Q_OPT:
61 cinfo->master->trellis_q_opt = value;
62 break;
63 case JBOOLEAN_OVERSHOOT_DERINGING:
64 cinfo->master->overshoot_deringing = value;
65 break;
66 default:
67 ERREXIT(cinfo, JERR_BAD_PARAM);
68 }
69 }
70
71
72 GLOBAL(boolean)
jpeg_c_get_bool_param(const j_compress_ptr cinfo,J_BOOLEAN_PARAM param)73 jpeg_c_get_bool_param (const j_compress_ptr cinfo, J_BOOLEAN_PARAM param)
74 {
75 switch(param) {
76 case JBOOLEAN_OPTIMIZE_SCANS:
77 return cinfo->master->optimize_scans;
78 case JBOOLEAN_TRELLIS_QUANT:
79 return cinfo->master->trellis_quant;
80 case JBOOLEAN_TRELLIS_QUANT_DC:
81 return cinfo->master->trellis_quant_dc;
82 case JBOOLEAN_TRELLIS_EOB_OPT:
83 return cinfo->master->trellis_eob_opt;
84 case JBOOLEAN_USE_LAMBDA_WEIGHT_TBL:
85 return cinfo->master->use_lambda_weight_tbl;
86 case JBOOLEAN_USE_SCANS_IN_TRELLIS:
87 return cinfo->master->use_scans_in_trellis;
88 case JBOOLEAN_TRELLIS_Q_OPT:
89 return cinfo->master->trellis_q_opt;
90 case JBOOLEAN_OVERSHOOT_DERINGING:
91 return cinfo->master->overshoot_deringing;
92 default:
93 ERREXIT(cinfo, JERR_BAD_PARAM);
94 }
95
96 return FALSE;
97 }
98
99
100 GLOBAL(boolean)
jpeg_c_float_param_supported(const j_compress_ptr cinfo,J_FLOAT_PARAM param)101 jpeg_c_float_param_supported (const j_compress_ptr cinfo, J_FLOAT_PARAM param)
102 {
103 switch (param) {
104 case JFLOAT_LAMBDA_LOG_SCALE1:
105 case JFLOAT_LAMBDA_LOG_SCALE2:
106 case JFLOAT_TRELLIS_DELTA_DC_WEIGHT:
107 return TRUE;
108 }
109
110 return FALSE;
111 }
112
113
114 GLOBAL(void)
jpeg_c_set_float_param(j_compress_ptr cinfo,J_FLOAT_PARAM param,float value)115 jpeg_c_set_float_param (j_compress_ptr cinfo, J_FLOAT_PARAM param, float value)
116 {
117 switch (param) {
118 case JFLOAT_LAMBDA_LOG_SCALE1:
119 cinfo->master->lambda_log_scale1 = value;
120 break;
121 case JFLOAT_LAMBDA_LOG_SCALE2:
122 cinfo->master->lambda_log_scale2 = value;
123 break;
124 case JFLOAT_TRELLIS_DELTA_DC_WEIGHT:
125 cinfo->master->trellis_delta_dc_weight = value;
126 break;
127 default:
128 ERREXIT(cinfo, JERR_BAD_PARAM);
129 }
130 }
131
132
133 GLOBAL(float)
jpeg_c_get_float_param(const j_compress_ptr cinfo,J_FLOAT_PARAM param)134 jpeg_c_get_float_param (const j_compress_ptr cinfo, J_FLOAT_PARAM param)
135 {
136 switch (param) {
137 case JFLOAT_LAMBDA_LOG_SCALE1:
138 return cinfo->master->lambda_log_scale1;
139 case JFLOAT_LAMBDA_LOG_SCALE2:
140 return cinfo->master->lambda_log_scale2;
141 case JFLOAT_TRELLIS_DELTA_DC_WEIGHT:
142 return cinfo->master->trellis_delta_dc_weight;
143 default:
144 ERREXIT(cinfo, JERR_BAD_PARAM);
145 }
146
147 return -1;
148 }
149
150
151 GLOBAL(boolean)
jpeg_c_int_param_supported(const j_compress_ptr cinfo,J_INT_PARAM param)152 jpeg_c_int_param_supported (const j_compress_ptr cinfo, J_INT_PARAM param)
153 {
154 switch (param) {
155 case JINT_COMPRESS_PROFILE:
156 case JINT_TRELLIS_FREQ_SPLIT:
157 case JINT_TRELLIS_NUM_LOOPS:
158 case JINT_BASE_QUANT_TBL_IDX:
159 case JINT_DC_SCAN_OPT_MODE:
160 return TRUE;
161 }
162
163 return FALSE;
164 }
165
166
167 GLOBAL(void)
jpeg_c_set_int_param(j_compress_ptr cinfo,J_INT_PARAM param,int value)168 jpeg_c_set_int_param (j_compress_ptr cinfo, J_INT_PARAM param, int value)
169 {
170 switch (param) {
171 case JINT_COMPRESS_PROFILE:
172 switch (value) {
173 case JCP_MAX_COMPRESSION:
174 case JCP_FASTEST:
175 cinfo->master->compress_profile = value;
176 break;
177 default:
178 ERREXIT(cinfo, JERR_BAD_PARAM_VALUE);
179 }
180 break;
181 case JINT_TRELLIS_FREQ_SPLIT:
182 cinfo->master->trellis_freq_split = value;
183 break;
184 case JINT_TRELLIS_NUM_LOOPS:
185 cinfo->master->trellis_num_loops = value;
186 break;
187 case JINT_BASE_QUANT_TBL_IDX:
188 if (value >= 0 && value <= 8)
189 cinfo->master->quant_tbl_master_idx = value;
190 break;
191 case JINT_DC_SCAN_OPT_MODE:
192 cinfo->master->dc_scan_opt_mode = value;
193 break;
194 default:
195 ERREXIT(cinfo, JERR_BAD_PARAM);
196 }
197 }
198
199
200 GLOBAL(int)
jpeg_c_get_int_param(const j_compress_ptr cinfo,J_INT_PARAM param)201 jpeg_c_get_int_param (const j_compress_ptr cinfo, J_INT_PARAM param)
202 {
203 switch (param) {
204 case JINT_COMPRESS_PROFILE:
205 return cinfo->master->compress_profile;
206 case JINT_TRELLIS_FREQ_SPLIT:
207 return cinfo->master->trellis_freq_split;
208 case JINT_TRELLIS_NUM_LOOPS:
209 return cinfo->master->trellis_num_loops;
210 case JINT_BASE_QUANT_TBL_IDX:
211 return cinfo->master->quant_tbl_master_idx;
212 case JINT_DC_SCAN_OPT_MODE:
213 return cinfo->master->dc_scan_opt_mode;
214 default:
215 ERREXIT(cinfo, JERR_BAD_PARAM);
216 }
217
218 return -1;
219 }
220