/work/libde265/libde265/vui.cc
Line | Count | Source |
1 | | /* |
2 | | * H.265 video codec. |
3 | | * Copyright (c) 2013-2014 struktur AG, Dirk Farin <farin@struktur.de> |
4 | | * |
5 | | * This file is part of libde265. |
6 | | * |
7 | | * libde265 is free software: you can redistribute it and/or modify |
8 | | * it under the terms of the GNU Lesser General Public License as |
9 | | * published by the Free Software Foundation, either version 3 of |
10 | | * the License, or (at your option) any later version. |
11 | | * |
12 | | * libde265 is distributed in the hope that it will be useful, |
13 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | | * GNU Lesser General Public License for more details. |
16 | | * |
17 | | * You should have received a copy of the GNU Lesser General Public License |
18 | | * along with libde265. If not, see <http://www.gnu.org/licenses/>. |
19 | | */ |
20 | | |
21 | | #include "vui.h" |
22 | | #include "decctx.h" |
23 | | |
24 | | #include <assert.h> |
25 | | #include <stdlib.h> |
26 | | #include <string.h> |
27 | | |
28 | | #define READ_VLC(variable, vlctype) \ |
29 | 0 | if ((vlc = br->get_ ## vlctype()) == UVLC_ERROR) { \ |
30 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); \ |
31 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; \ |
32 | 0 | } \ |
33 | 0 | (variable) = vlc; |
34 | | |
35 | | |
36 | 0 | #define NUM_SAR_PRESETS 17 |
37 | | |
38 | | static uint16_t sar_presets[NUM_SAR_PRESETS+1][2] = { |
39 | | { 0,0 }, |
40 | | { 1,1 }, |
41 | | { 12,11 }, |
42 | | { 10,11 }, |
43 | | { 16,11 }, |
44 | | { 40,33 }, |
45 | | { 24,11 }, |
46 | | { 20,11 }, |
47 | | { 32,11 }, |
48 | | { 80,33 }, |
49 | | { 18,11 }, |
50 | | { 15,11 }, |
51 | | { 64,33 }, |
52 | | { 160,99 }, |
53 | | { 4,3 }, |
54 | | { 3,2 }, |
55 | | { 2,1 } |
56 | | }; |
57 | | |
58 | 0 | #define EXTENDED_SAR 255 |
59 | | |
60 | | |
61 | | const char* get_video_format_name(enum VideoFormat format) |
62 | 0 | { |
63 | 0 | switch (format) { |
64 | 0 | case VideoFormat_Component: return "component"; |
65 | 0 | case VideoFormat_PAL: return "PAL"; |
66 | 0 | case VideoFormat_NTSC: return "NTSC"; |
67 | 0 | case VideoFormat_SECAM: return "SECAM"; |
68 | 0 | case VideoFormat_MAC: return "MAC"; |
69 | 0 | default: return "unspecified"; |
70 | 0 | } |
71 | 0 | } |
72 | | |
73 | | |
74 | 0 | video_usability_information::video_usability_information() = default; |
75 | | |
76 | | |
77 | | de265_error video_usability_information::hrd_parameters(error_queue* errqueue, bitreader* br, const seq_parameter_set* sps) |
78 | 0 | { |
79 | 0 | uint32_t vlc; |
80 | |
|
81 | 0 | nal_hrd_parameters_present_flag = br->get_bits(1); |
82 | 0 | vcl_hrd_parameters_present_flag = br->get_bits(1); |
83 | |
|
84 | 0 | if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) |
85 | 0 | { |
86 | 0 | sub_pic_hrd_params_present_flag = br->get_bits(1); |
87 | 0 | if (sub_pic_hrd_params_present_flag) |
88 | 0 | { |
89 | 0 | tick_divisor_minus2 = br->get_bits(8); |
90 | 0 | du_cpb_removal_delay_increment_length_minus1 = br->get_bits(5); |
91 | 0 | sub_pic_cpb_params_in_pic_timing_sei_flag = br->get_bits(1); |
92 | 0 | dpb_output_delay_du_length_minus1 = br->get_bits(5); |
93 | 0 | } |
94 | 0 | bit_rate_scale = br->get_bits(4); |
95 | 0 | cpb_size_scale = br->get_bits(4); |
96 | | |
97 | |
|
98 | 0 | if (sub_pic_hrd_params_present_flag) |
99 | 0 | { |
100 | 0 | cpb_size_du_scale = br->get_bits(4); |
101 | 0 | } |
102 | 0 | initial_cpb_removal_delay_length_minus1 = br->get_bits(5); |
103 | 0 | au_cpb_removal_delay_length_minus1 = br->get_bits(5); |
104 | 0 | dpb_output_delay_length_minus1 = br->get_bits(5); |
105 | 0 | } |
106 | 0 | int i, nalOrVcl; |
107 | |
|
108 | 0 | for (i = 0; i < sps->sps_max_sub_layers; i++) |
109 | 0 | { |
110 | 0 | fixed_pic_rate_general_flag[i] = br->get_bits(1); |
111 | 0 | if (!fixed_pic_rate_general_flag[i]) |
112 | 0 | { |
113 | 0 | fixed_pic_rate_within_cvs_flag[i] = br->get_bits(1); |
114 | 0 | } |
115 | 0 | else |
116 | 0 | { |
117 | 0 | fixed_pic_rate_within_cvs_flag[i] = true; |
118 | 0 | } |
119 | |
|
120 | 0 | low_delay_hrd_flag[i] = 0;// Inferred to be 0 when not present |
121 | 0 | cpb_cnt_minus1[i] = 0; // Inferred to be 0 when not present |
122 | |
|
123 | 0 | if (fixed_pic_rate_within_cvs_flag[i]) |
124 | 0 | { |
125 | 0 | READ_VLC(elemental_duration_in_tc_minus1[i], uvlc); |
126 | 0 | } |
127 | 0 | else |
128 | 0 | { |
129 | 0 | low_delay_hrd_flag[i] = br->get_bits(1); |
130 | 0 | } |
131 | 0 | if (!low_delay_hrd_flag[i]) |
132 | 0 | { |
133 | 0 | READ_VLC(cpb_cnt_minus1[i], uvlc); |
134 | 0 | if (cpb_cnt_minus1[i] > 31) { |
135 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
136 | 0 | } |
137 | 0 | } |
138 | | |
139 | 0 | for (nalOrVcl = 0; nalOrVcl < 2; nalOrVcl++) |
140 | 0 | { |
141 | 0 | if (((nalOrVcl == 0) && nal_hrd_parameters_present_flag) || |
142 | 0 | ((nalOrVcl == 1) && vcl_hrd_parameters_present_flag)) |
143 | 0 | { |
144 | 0 | for (uint32_t j = 0; j <= cpb_cnt_minus1[i]; j++) |
145 | 0 | { |
146 | 0 | READ_VLC(bit_rate_value_minus1[i][j][nalOrVcl], uvlc); |
147 | 0 | READ_VLC(cpb_size_value_minus1[i][j][nalOrVcl], uvlc); |
148 | |
|
149 | 0 | if (sub_pic_hrd_params_present_flag) |
150 | 0 | { |
151 | 0 | READ_VLC(cpb_size_du_value_minus1[i][j][nalOrVcl], uvlc); |
152 | 0 | READ_VLC(bit_rate_du_value_minus1[i][j][nalOrVcl], uvlc); |
153 | 0 | } |
154 | 0 | cbr_flag[i][j][nalOrVcl] = br->get_bits(1); |
155 | 0 | } |
156 | 0 | } |
157 | 0 | } |
158 | 0 | } |
159 | 0 | return DE265_OK; |
160 | 0 | } |
161 | | |
162 | | de265_error video_usability_information::read(error_queue* errqueue, bitreader* br, |
163 | | const seq_parameter_set* sps) |
164 | 0 | { |
165 | 0 | uint32_t vlc; |
166 | | |
167 | | |
168 | | // --- sample aspect ratio (SAR) --- |
169 | |
|
170 | 0 | aspect_ratio_info_present_flag = br->get_bits(1); |
171 | 0 | if (aspect_ratio_info_present_flag) { |
172 | 0 | int aspect_ratio_idc = br->get_bits(8); |
173 | 0 | if (aspect_ratio_idc <= NUM_SAR_PRESETS) { |
174 | 0 | sar_width = sar_presets[aspect_ratio_idc][0]; |
175 | 0 | sar_height = sar_presets[aspect_ratio_idc][1]; |
176 | 0 | } |
177 | 0 | else if (aspect_ratio_idc == EXTENDED_SAR) { |
178 | 0 | sar_width = br->get_bits(16); |
179 | 0 | sar_height = br->get_bits(16); |
180 | 0 | } |
181 | 0 | else { |
182 | 0 | sar_width = 0; |
183 | 0 | sar_height = 0; |
184 | 0 | } |
185 | 0 | } |
186 | 0 | else { |
187 | 0 | sar_width = 0; |
188 | 0 | sar_height = 0; |
189 | 0 | } |
190 | | |
191 | | |
192 | | // --- overscan --- |
193 | |
|
194 | 0 | overscan_info_present_flag = br->get_bits(1); |
195 | 0 | if (overscan_info_present_flag) { |
196 | 0 | overscan_appropriate_flag = br->get_bits(1); |
197 | 0 | } |
198 | | |
199 | | |
200 | | // --- video signal type --- |
201 | |
|
202 | 0 | { // defaults |
203 | 0 | video_format = VideoFormat_Unspecified; |
204 | 0 | video_full_range_flag = false; |
205 | 0 | colour_primaries = 2; |
206 | 0 | transfer_characteristics = 2; |
207 | 0 | matrix_coeffs = 2; |
208 | 0 | } |
209 | |
|
210 | 0 | video_signal_type_present_flag = br->get_bits(1); |
211 | 0 | if (video_signal_type_present_flag) { |
212 | 0 | int video_format_idc = br->get_bits(3); |
213 | 0 | if (video_format_idc > 5) { |
214 | 0 | video_format_idc = VideoFormat_Unspecified; |
215 | 0 | } |
216 | 0 | video_format = (VideoFormat)video_format_idc; |
217 | |
|
218 | 0 | video_full_range_flag = br->get_bits(1); |
219 | |
|
220 | 0 | colour_description_present_flag = br->get_bits(1); |
221 | 0 | if (colour_description_present_flag) { |
222 | 0 | colour_primaries = br->get_bits(8); |
223 | 0 | if (colour_primaries == 0 || |
224 | 0 | colour_primaries == 3 || |
225 | 0 | colour_primaries >= 11) { |
226 | 0 | colour_primaries = 2; |
227 | 0 | } |
228 | |
|
229 | 0 | transfer_characteristics = br->get_bits(8); |
230 | 0 | if (transfer_characteristics == 0 || |
231 | 0 | transfer_characteristics == 3 || |
232 | 0 | transfer_characteristics >= 18) { |
233 | 0 | transfer_characteristics = 2; |
234 | 0 | } |
235 | |
|
236 | 0 | matrix_coeffs = br->get_bits(8); |
237 | | |
238 | 0 | if (matrix_coeffs >= 11) { |
239 | 0 | matrix_coeffs = 2; |
240 | 0 | } |
241 | 0 | } |
242 | 0 | } |
243 | | |
244 | | |
245 | | // --- chroma / interlaced --- |
246 | |
|
247 | 0 | chroma_loc_info_present_flag = br->get_bits(1); |
248 | 0 | if (chroma_loc_info_present_flag) { |
249 | 0 | if ((vlc = br->get_uvlc()) == UVLC_ERROR || vlc > 5) { |
250 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
251 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
252 | 0 | } |
253 | 0 | chroma_sample_loc_type_top_field = vlc; |
254 | |
|
255 | 0 | if ((vlc = br->get_uvlc()) == UVLC_ERROR || vlc > 5) { |
256 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
257 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
258 | 0 | } |
259 | 0 | chroma_sample_loc_type_bottom_field = vlc; |
260 | 0 | } |
261 | 0 | else { |
262 | 0 | chroma_sample_loc_type_top_field = 0; |
263 | 0 | chroma_sample_loc_type_bottom_field = 0; |
264 | 0 | } |
265 | | |
266 | 0 | neutral_chroma_indication_flag = br->get_bits(1); |
267 | 0 | field_seq_flag = br->get_bits(1); |
268 | 0 | frame_field_info_present_flag = br->get_bits(1); |
269 | | |
270 | | |
271 | | // --- default display window --- |
272 | |
|
273 | 0 | default_display_window_flag = br->get_bits(1); |
274 | 0 | if (default_display_window_flag) { |
275 | 0 | READ_VLC(def_disp_win_left_offset, uvlc); |
276 | 0 | READ_VLC(def_disp_win_right_offset, uvlc); |
277 | 0 | READ_VLC(def_disp_win_top_offset, uvlc); |
278 | 0 | READ_VLC(def_disp_win_bottom_offset, uvlc); |
279 | 0 | } |
280 | 0 | else { |
281 | 0 | def_disp_win_left_offset = 0; |
282 | 0 | def_disp_win_right_offset = 0; |
283 | 0 | def_disp_win_top_offset = 0; |
284 | 0 | def_disp_win_bottom_offset = 0; |
285 | 0 | } |
286 | | |
287 | | |
288 | | // --- timing --- |
289 | | |
290 | 0 | vui_timing_info_present_flag = br->get_bits(1); |
291 | 0 | if (vui_timing_info_present_flag) { |
292 | 0 | vui_num_units_in_tick = br->get_bits(32); |
293 | 0 | vui_time_scale = br->get_bits(32); |
294 | |
|
295 | 0 | vui_poc_proportional_to_timing_flag = br->get_bits(1); |
296 | 0 | if (vui_poc_proportional_to_timing_flag) { |
297 | 0 | if ((vlc = br->get_uvlc()) == UVLC_ERROR) { |
298 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
299 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
300 | 0 | } |
301 | | |
302 | 0 | vui_num_ticks_poc_diff_one = vlc + 1; |
303 | 0 | } |
304 | | |
305 | | // --- hrd parameters --- |
306 | | |
307 | 0 | vui_hrd_parameters_present_flag = br->get_bits(1); |
308 | 0 | if (vui_hrd_parameters_present_flag) { |
309 | 0 | de265_error err; |
310 | 0 | err = hrd_parameters(errqueue, br, sps); |
311 | 0 | if (err) { |
312 | 0 | return err; |
313 | 0 | } |
314 | 0 | } |
315 | 0 | } |
316 | | |
317 | | // --- bitstream restriction --- |
318 | | |
319 | 0 | bitstream_restriction_flag = br->get_bits(1); |
320 | 0 | if (bitstream_restriction_flag) { |
321 | 0 | tiles_fixed_structure_flag = br->get_bits(1); |
322 | 0 | motion_vectors_over_pic_boundaries_flag = br->get_bits(1); |
323 | 0 | restricted_ref_pic_lists_flag = br->get_bits(1); |
324 | |
|
325 | 0 | if ((vlc = br->get_uvlc()) == UVLC_ERROR || vlc > 4095) { |
326 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
327 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
328 | 0 | } |
329 | 0 | min_spatial_segmentation_idc = vlc; |
330 | |
|
331 | 0 | if ((vlc = br->get_uvlc()) == UVLC_ERROR || vlc > 16) { |
332 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
333 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
334 | 0 | } |
335 | 0 | max_bytes_per_pic_denom = vlc; |
336 | |
|
337 | 0 | if ((vlc = br->get_uvlc()) == UVLC_ERROR || vlc > 16) { |
338 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
339 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
340 | 0 | } |
341 | 0 | max_bits_per_min_cu_denom = vlc; |
342 | |
|
343 | 0 | if ((vlc = br->get_uvlc()) == UVLC_ERROR || vlc > 15) { |
344 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
345 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
346 | 0 | } |
347 | 0 | log2_max_mv_length_horizontal = vlc; |
348 | |
|
349 | 0 | if ((vlc = br->get_uvlc()) == UVLC_ERROR || vlc > 15) { |
350 | 0 | errqueue->add_warning(DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE, false); |
351 | 0 | return DE265_ERROR_CODED_PARAMETER_OUT_OF_RANGE; |
352 | 0 | } |
353 | 0 | log2_max_mv_length_vertical = vlc; |
354 | 0 | } |
355 | 0 | else { |
356 | 0 | tiles_fixed_structure_flag = false; |
357 | 0 | motion_vectors_over_pic_boundaries_flag = true; |
358 | 0 | restricted_ref_pic_lists_flag = false; // NOTE: default not specified in standard 2014/10 |
359 | |
|
360 | 0 | min_spatial_segmentation_idc = 0; |
361 | 0 | max_bytes_per_pic_denom = 2; |
362 | 0 | max_bits_per_min_cu_denom = 1; |
363 | 0 | log2_max_mv_length_horizontal = 15; |
364 | 0 | log2_max_mv_length_vertical = 15; |
365 | 0 | } |
366 | | |
367 | | //vui_read = true; |
368 | | |
369 | 0 | return DE265_OK; |
370 | 0 | } |
371 | | |
372 | | |
373 | | void video_usability_information::dump(int fd) const |
374 | 0 | { |
375 | | //#if (_MSC_VER >= 1500) |
376 | | //#define LOG0(t) loginfo(LogHeaders, t) |
377 | | //#define LOG1(t,d) loginfo(LogHeaders, t,d) |
378 | | //#define LOG2(t,d1,d2) loginfo(LogHeaders, t,d1,d2) |
379 | | //#define LOG3(t,d1,d2,d3) loginfo(LogHeaders, t,d1,d2,d3) |
380 | |
|
381 | 0 | FILE* fh; |
382 | 0 | if (fd==1) fh=stdout; |
383 | 0 | else if (fd==2) fh=stderr; |
384 | 0 | else { return; } |
385 | | |
386 | 0 | #define LOG0(t) log2fh(fh, t) |
387 | 0 | #define LOG1(t,d) log2fh(fh, t,d) |
388 | 0 | #define LOG2(t,d1,d2) log2fh(fh, t,d1,d2) |
389 | 0 | #define LOG3(t,d1,d2,d3) log2fh(fh, t,d1,d2,d3) |
390 | | |
391 | 0 | LOG0("----------------- VUI -----------------\n"); |
392 | 0 | LOG2("sample aspect ratio : %d:%d\n", sar_width,sar_height); |
393 | 0 | LOG1("overscan_info_present_flag : %d\n", overscan_info_present_flag); |
394 | 0 | LOG1("overscan_appropriate_flag : %d\n", overscan_appropriate_flag); |
395 | |
|
396 | 0 | LOG1("video_signal_type_present_flag: %d\n", video_signal_type_present_flag); |
397 | 0 | if (video_signal_type_present_flag) { |
398 | 0 | LOG1(" video_format : %s\n", get_video_format_name(video_format)); |
399 | 0 | LOG1(" video_full_range_flag : %d\n", video_full_range_flag); |
400 | 0 | LOG1(" colour_description_present_flag : %d\n", colour_description_present_flag); |
401 | 0 | LOG1(" colour_primaries : %d\n", colour_primaries); |
402 | 0 | LOG1(" transfer_characteristics : %d\n", transfer_characteristics); |
403 | 0 | LOG1(" matrix_coeffs : %d\n", matrix_coeffs); |
404 | 0 | } |
405 | |
|
406 | 0 | LOG1("chroma_loc_info_present_flag: %d\n", chroma_loc_info_present_flag); |
407 | 0 | if (chroma_loc_info_present_flag) { |
408 | 0 | LOG1(" chroma_sample_loc_type_top_field : %d\n", chroma_sample_loc_type_top_field); |
409 | 0 | LOG1(" chroma_sample_loc_type_bottom_field: %d\n", chroma_sample_loc_type_bottom_field); |
410 | 0 | } |
411 | |
|
412 | 0 | LOG1("neutral_chroma_indication_flag: %d\n", neutral_chroma_indication_flag); |
413 | 0 | LOG1("field_seq_flag : %d\n", field_seq_flag); |
414 | 0 | LOG1("frame_field_info_present_flag : %d\n", frame_field_info_present_flag); |
415 | |
|
416 | 0 | LOG1("default_display_window_flag : %d\n", default_display_window_flag); |
417 | 0 | LOG1(" def_disp_win_left_offset : %d\n", def_disp_win_left_offset); |
418 | 0 | LOG1(" def_disp_win_right_offset : %d\n", def_disp_win_right_offset); |
419 | 0 | LOG1(" def_disp_win_top_offset : %d\n", def_disp_win_top_offset); |
420 | 0 | LOG1(" def_disp_win_bottom_offset : %d\n", def_disp_win_bottom_offset); |
421 | |
|
422 | 0 | LOG1("vui_timing_info_present_flag : %d\n", vui_timing_info_present_flag); |
423 | 0 | if (vui_timing_info_present_flag) { |
424 | 0 | LOG1(" vui_num_units_in_tick : %d\n", vui_num_units_in_tick); |
425 | 0 | LOG1(" vui_time_scale : %d\n", vui_time_scale); |
426 | 0 | } |
427 | |
|
428 | 0 | LOG1("vui_poc_proportional_to_timing_flag : %d\n", vui_poc_proportional_to_timing_flag); |
429 | 0 | LOG1("vui_num_ticks_poc_diff_one : %d\n", vui_num_ticks_poc_diff_one); |
430 | |
|
431 | 0 | LOG1("vui_hrd_parameters_present_flag : %d\n", vui_hrd_parameters_present_flag); |
432 | 0 | if (vui_hrd_parameters_present_flag) { |
433 | | //hrd_parameters vui_hrd_parameters; |
434 | 0 | } |
435 | | |
436 | | |
437 | | // --- bitstream restriction --- |
438 | |
|
439 | 0 | LOG1("bitstream_restriction_flag : %d\n", bitstream_restriction_flag); |
440 | 0 | if (bitstream_restriction_flag) { |
441 | 0 | LOG1(" tiles_fixed_structure_flag : %d\n", tiles_fixed_structure_flag); |
442 | 0 | LOG1(" motion_vectors_over_pic_boundaries_flag : %d\n", motion_vectors_over_pic_boundaries_flag); |
443 | 0 | LOG1(" restricted_ref_pic_lists_flag : %d\n", restricted_ref_pic_lists_flag); |
444 | 0 | LOG1(" min_spatial_segmentation_idc : %d\n", min_spatial_segmentation_idc); |
445 | 0 | LOG1(" max_bytes_per_pic_denom : %d\n", max_bytes_per_pic_denom); |
446 | 0 | LOG1(" max_bits_per_min_cu_denom : %d\n", max_bits_per_min_cu_denom); |
447 | 0 | LOG1(" log2_max_mv_length_horizontal : %d\n", log2_max_mv_length_horizontal); |
448 | 0 | LOG1(" log2_max_mv_length_vertical : %d\n", log2_max_mv_length_vertical); |
449 | 0 | } |
450 | |
|
451 | 0 | #undef LOG0 |
452 | 0 | #undef LOG1 |
453 | 0 | #undef LOG2 |
454 | 0 | #undef LOG3 |
455 | | //#endif |
456 | 0 | } |