2 * @file encode_accessors.c
4 * @author Mathis Rosenhauer, Deutsches Klimarechenzentrum
5 * @author Moritz Hanke, Deutsches Klimarechenzentrum
6 * @author Joerg Behrens, Deutsches Klimarechenzentrum
7 * @author Luis Kornblueh, Max-Planck-Institut fuer Meteorologie
12 * Mathis Rosenhauer, Luis Kornblueh
16 * Deutsches Klimarechenzentrum GmbH Max-Planck-Institut fuer Meteorologie
17 * Bundesstr. 45a Bundesstr. 53
18 * 20146 Hamburg 20146 Hamburg
21 * All rights reserved.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
27 * 1. Redistributions of source code must retain the above copyright
28 * notice, this list of conditions and the following disclaimer.
29 * 2. Redistributions in binary form must reproduce the above
30 * copyright notice, this list of conditions and the following
31 * disclaimer in the documentation and/or other materials provided
32 * with the distribution.
34 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
35 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
36 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
37 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
38 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
39 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
40 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
41 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
42 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
43 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
44 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
45 * OF THE POSSIBILITY OF SUCH DAMAGE.
47 * @section DESCRIPTION
49 * Read various data types from input stream
62 #include "encode_accessors.h"
64 uint32_t aec_get_8(struct aec_stream *strm)
68 return *strm->next_in++;
71 uint32_t aec_get_lsb_16(struct aec_stream *strm)
75 data = ((uint32_t)strm->next_in[1] << 8)
76 | (uint32_t)strm->next_in[0];
84 uint32_t aec_get_msb_16(struct aec_stream *strm)
88 data = ((uint32_t)strm->next_in[0] << 8)
89 | (uint32_t)strm->next_in[1];
97 uint32_t aec_get_lsb_24(struct aec_stream *strm)
101 data = ((uint32_t)strm->next_in[2] << 16)
102 | ((uint32_t)strm->next_in[1] << 8)
103 | (uint32_t)strm->next_in[0];
111 uint32_t aec_get_msb_24(struct aec_stream *strm)
115 data = ((uint32_t)strm->next_in[0] << 16)
116 | ((uint32_t)strm->next_in[1] << 8)
117 | (uint32_t)strm->next_in[2];
125 uint32_t aec_get_lsb_32(struct aec_stream *strm)
129 data = ((uint32_t)strm->next_in[3] << 24)
130 | ((uint32_t)strm->next_in[2] << 16)
131 | ((uint32_t)strm->next_in[1] << 8)
132 | (uint32_t)strm->next_in[0];
140 uint32_t aec_get_msb_32(struct aec_stream *strm)
144 data = ((uint32_t)strm->next_in[0] << 24)
145 | ((uint32_t)strm->next_in[1] << 16)
146 | ((uint32_t)strm->next_in[2] << 8)
147 | (uint32_t)strm->next_in[3];
155 void aec_get_rsi_8(struct aec_stream *strm)
157 uint32_t *out = strm->state->data_raw;
158 unsigned const char *in = strm->next_in;
159 int rsi = strm->rsi * strm->block_size;
161 strm->next_in += rsi;
162 strm->total_in += rsi;
163 strm->avail_in -= rsi;
166 out[0] = (uint32_t)in[0];
167 out[1] = (uint32_t)in[1];
168 out[2] = (uint32_t)in[2];
169 out[3] = (uint32_t)in[3];
170 out[4] = (uint32_t)in[4];
171 out[5] = (uint32_t)in[5];
172 out[6] = (uint32_t)in[6];
173 out[7] = (uint32_t)in[7];
180 void aec_get_rsi_lsb_16(struct aec_stream *strm)
182 uint32_t *out = strm->state->data_raw;
183 const unsigned char *in = strm->next_in;
184 int rsi = strm->rsi * strm->block_size;
186 strm->next_in += 2 * rsi;
187 strm->total_in += 2 * rsi;
188 strm->avail_in -= 2 * rsi;
191 out[0] = (uint32_t)in[0]
192 | ((uint32_t)in[1] << 8);
193 out[1] = (uint32_t)in[2]
194 | ((uint32_t)in[3] << 8);
195 out[2] = (uint32_t)in[4]
196 | ((uint32_t)in[5] << 8);
197 out[3] = (uint32_t)in[6]
198 | ((uint32_t)in[7] << 8);
199 out[4] = (uint32_t)in[8]
200 | ((uint32_t)in[9] << 8);
201 out[5] = (uint32_t)in[10]
202 | ((uint32_t)in[11] << 8);
203 out[6] = (uint32_t)in[12]
204 | ((uint32_t)in[13] << 8);
205 out[7] = (uint32_t)in[14]
206 | ((uint32_t)in[15] << 8);
213 void aec_get_rsi_msb_16(struct aec_stream *strm)
215 uint32_t *out = strm->state->data_raw;
216 const unsigned char *in = strm->next_in;
217 int rsi = strm->rsi * strm->block_size;
219 strm->next_in += 2 * rsi;
220 strm->total_in += 2 * rsi;
221 strm->avail_in -= 2 * rsi;
224 out[0] = ((uint32_t)in[0] << 8)
226 out[1] = ((uint32_t)in[2] << 8)
228 out[2] = ((uint32_t)in[4] << 8)
230 out[3] = ((uint32_t)in[6] << 8)
232 out[4] = ((uint32_t)in[8] << 8)
234 out[5] = ((uint32_t)in[10] << 8)
236 out[6] = ((uint32_t)in[12] << 8)
238 out[7] = ((uint32_t)in[14] << 8)
246 void aec_get_rsi_lsb_24(struct aec_stream *strm)
248 uint32_t *out = strm->state->data_raw;
249 const unsigned char *in = strm->next_in;
250 int rsi = strm->rsi * strm->block_size;
252 strm->next_in += 3 * rsi;
253 strm->total_in += 3 * rsi;
254 strm->avail_in -= 3 * rsi;
257 out[0] = (uint32_t)in[0]
258 | ((uint32_t)in[1] << 8)
259 | ((uint32_t)in[2] << 16);
260 out[1] = (uint32_t)in[3]
261 | ((uint32_t)in[4] << 8)
262 | ((uint32_t)in[5] << 16);
263 out[2] = (uint32_t)in[6]
264 | ((uint32_t)in[7] << 8)
265 | ((uint32_t)in[8] << 16);
266 out[3] = (uint32_t)in[9]
267 | ((uint32_t)in[10] << 8)
268 | ((uint32_t)in[11] << 16);
269 out[4] = (uint32_t)in[12]
270 | ((uint32_t)in[13] << 8)
271 | ((uint32_t)in[14] << 16);
272 out[5] = (uint32_t)in[15]
273 | ((uint32_t)in[16] << 8)
274 | ((uint32_t)in[17] << 16);
275 out[6] = (uint32_t)in[18]
276 | ((uint32_t)in[19] << 8)
277 | ((uint32_t)in[20] << 16);
278 out[7] = (uint32_t)in[21]
279 | ((uint32_t)in[22] << 8)
280 | ((uint32_t)in[23] << 16);
287 void aec_get_rsi_msb_24(struct aec_stream *strm)
289 uint32_t *out = strm->state->data_raw;
290 const unsigned char *in = strm->next_in;
291 int rsi = strm->rsi * strm->block_size;
293 strm->next_in += 3 * rsi;
294 strm->total_in += 3 * rsi;
295 strm->avail_in -= 3 * rsi;
298 out[0] = ((uint32_t)in[0] << 16)
299 | ((uint32_t)in[1] << 8)
301 out[1] = ((uint32_t)in[3] << 16)
302 | ((uint32_t)in[4] << 8)
304 out[2] = ((uint32_t)in[6] << 16)
305 | ((uint32_t)in[7] << 8)
307 out[3] = ((uint32_t)in[9] << 16)
308 | ((uint32_t)in[10] << 8)
310 out[4] = ((uint32_t)in[12] << 16)
311 | ((uint32_t)in[13] << 8)
313 out[5] = ((uint32_t)in[15] << 16)
314 | ((uint32_t)in[16] << 8)
316 out[6] = ((uint32_t)in[18] << 16)
317 | ((uint32_t)in[19] << 8)
319 out[7] = ((uint32_t)in[21] << 16)
320 | ((uint32_t)in[22] << 8)
328 #define AEC_GET_RSI_NATIVE_32(BO) \
329 void aec_get_rsi_##BO##_32(struct aec_stream *strm) \
331 int rsi = strm->rsi * strm->block_size; \
332 memcpy(strm->state->data_raw, \
333 strm->next_in, 4 * rsi); \
334 strm->next_in += 4 * rsi; \
335 strm->total_in += 4 * rsi; \
336 strm->avail_in -= 4 * rsi; \
339 #ifdef WORDS_BIGENDIAN
340 void aec_get_rsi_lsb_32(struct aec_stream *strm)
342 uint32_t *out = strm->state->data_raw;
343 const unsigned char *in = strm->next_in;
344 int rsi = strm->rsi * strm->block_size;
346 strm->next_in += 4 * rsi;
347 strm->total_in += 4 * rsi;
348 strm->avail_in -= 4 * rsi;
351 out[0] = (uint32_t)in[0]
352 | ((uint32_t)in[1] << 8)
353 | ((uint32_t)in[2] << 16)
354 | ((uint32_t)in[3] << 24);
355 out[1] = (uint32_t)in[4]
356 | ((uint32_t)in[5] << 8)
357 | ((uint32_t)in[6] << 16)
358 | ((uint32_t)in[7] << 24);
359 out[2] = (uint32_t)in[8]
360 | ((uint32_t)in[9] << 8)
361 | ((uint32_t)in[10] << 16)
362 | ((uint32_t)in[11] << 24);
363 out[3] = (uint32_t)in[12]
364 | ((uint32_t)in[13] << 8)
365 | ((uint32_t)in[14] << 16)
366 | ((uint32_t)in[15] << 24);
367 out[4] = (uint32_t)in[16]
368 | ((uint32_t)in[17] << 8)
369 | ((uint32_t)in[18] << 16)
370 | ((uint32_t)in[19] << 24);
371 out[5] = (uint32_t)in[20]
372 | ((uint32_t)in[21] << 8)
373 | ((uint32_t)in[22] << 16)
374 | ((uint32_t)in[23] << 24);
375 out[6] = (uint32_t)in[24]
376 | ((uint32_t)in[25] << 8)
377 | ((uint32_t)in[26] << 16)
378 | ((uint32_t)in[27] << 24);
379 out[7] = (uint32_t)in[28]
380 | ((uint32_t)in[29] << 8)
381 | ((uint32_t)in[30] << 16)
382 | ((uint32_t)in[31] << 24);
389 AEC_GET_RSI_NATIVE_32(msb);
391 #else /* !WORDS_BIGENDIAN */
392 void aec_get_rsi_msb_32(struct aec_stream *strm)
394 uint32_t *out = strm->state->data_raw;
395 const unsigned char *in = strm->next_in;
396 int rsi = strm->rsi * strm->block_size;
398 strm->next_in += 4 * rsi;
399 strm->total_in += 4 * rsi;
400 strm->avail_in -= 4 * rsi;
403 out[0] = ((uint32_t)in[0] << 24)
404 | ((uint32_t)in[1] << 16)
405 | ((uint32_t)in[2] << 8)
407 out[1] = ((uint32_t)in[4] << 24)
408 | ((uint32_t)in[5] << 16)
409 | ((uint32_t)in[6] << 8)
411 out[2] = ((uint32_t)in[8] << 24)
412 | ((uint32_t)in[9] << 16)
413 | ((uint32_t)in[10] << 8)
415 out[3] = ((uint32_t)in[12] << 24)
416 | ((uint32_t)in[13] << 16)
417 | ((uint32_t)in[14] << 8)
419 out[4] = ((uint32_t)in[16] << 24)
420 | ((uint32_t)in[17] << 16)
421 | ((uint32_t)in[18] << 8)
423 out[5] = ((uint32_t)in[20] << 24)
424 | ((uint32_t)in[21] << 16)
425 | ((uint32_t)in[22] << 8)
427 out[6] = ((uint32_t)in[24] << 24)
428 | ((uint32_t)in[25] << 16)
429 | ((uint32_t)in[26] << 8)
431 out[7] = ((uint32_t)in[28] << 24)
432 | ((uint32_t)in[29] << 16)
433 | ((uint32_t)in[30] << 8)
441 AEC_GET_RSI_NATIVE_32(lsb);
443 #endif /* !WORDS_BIGENDIAN */