clean up
[platform/upstream/libaec.git] / src / encode_accessors.c
1 /**
2  * @file encode_accessors.c
3  *
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
8  *
9  * @section LICENSE
10  * Copyright 2012
11  *
12  * Mathis Rosenhauer,                 Luis Kornblueh
13  * Moritz Hanke,
14  * Joerg Behrens
15  *
16  * Deutsches Klimarechenzentrum GmbH  Max-Planck-Institut fuer Meteorologie
17  * Bundesstr. 45a                     Bundesstr. 53
18  * 20146 Hamburg                      20146 Hamburg
19  * Germany                            Germany
20  *
21  * All rights reserved.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  *
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.
33  *
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.
46  *
47  * @section DESCRIPTION
48  *
49  * Read various data types from input stream
50  *
51  */
52
53 #include <config.h>
54
55 #if HAVE_STDINT_H
56 # include <stdint.h>
57 #endif
58
59 #include <string.h>
60 #include "libaec.h"
61 #include "encode.h"
62 #include "encode_accessors.h"
63
64 uint32_t aec_get_8(struct aec_stream *strm)
65 {
66     strm->avail_in--;
67     strm->total_in++;
68     return *strm->next_in++;
69 }
70
71 uint32_t aec_get_lsb_16(struct aec_stream *strm)
72 {
73     uint32_t data;
74
75     data = ((uint32_t)strm->next_in[1] << 8)
76         | (uint32_t)strm->next_in[0];
77
78     strm->next_in += 2;
79     strm->total_in += 2;
80     strm->avail_in -= 2;
81     return data;
82 }
83
84 uint32_t aec_get_msb_16(struct aec_stream *strm)
85 {
86     uint32_t data;
87
88     data = ((uint32_t)strm->next_in[0] << 8)
89         | (uint32_t)strm->next_in[1];
90
91     strm->next_in += 2;
92     strm->total_in += 2;
93     strm->avail_in -= 2;
94     return data;
95 }
96
97 uint32_t aec_get_lsb_24(struct aec_stream *strm)
98 {
99     uint32_t data;
100
101     data = ((uint32_t)strm->next_in[2] << 16)
102         | ((uint32_t)strm->next_in[1] << 8)
103         | (uint32_t)strm->next_in[0];
104
105     strm->next_in += 3;
106     strm->total_in += 3;
107     strm->avail_in -= 3;
108     return data;
109 }
110
111 uint32_t aec_get_msb_24(struct aec_stream *strm)
112 {
113     uint32_t data;
114
115     data = ((uint32_t)strm->next_in[0] << 16)
116         | ((uint32_t)strm->next_in[1] << 8)
117         | (uint32_t)strm->next_in[2];
118
119     strm->next_in += 3;
120     strm->total_in += 3;
121     strm->avail_in -= 3;
122     return data;
123 }
124
125 uint32_t aec_get_lsb_32(struct aec_stream *strm)
126 {
127     uint32_t data;
128
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];
133
134     strm->next_in += 4;
135     strm->total_in += 4;
136     strm->avail_in -= 4;
137     return data;
138 }
139
140 uint32_t aec_get_msb_32(struct aec_stream *strm)
141 {
142     uint32_t data;
143
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];
148
149     strm->next_in += 4;
150     strm->total_in += 4;
151     strm->avail_in -= 4;
152     return data;
153 }
154
155 void aec_get_rsi_8(struct aec_stream *strm)
156 {
157     uint32_t *out = strm->state->data_raw;
158     unsigned const char *in = strm->next_in;
159     int rsi = strm->rsi * strm->block_size;
160
161     strm->next_in += rsi;
162     strm->total_in += rsi;
163     strm->avail_in -= rsi;
164
165     while (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];
174         in += 8;
175         out += 8;
176         rsi -= 8;
177     }
178 }
179
180 void aec_get_rsi_lsb_16(struct aec_stream *strm)
181 {
182     uint32_t *out = strm->state->data_raw;
183     const unsigned char *in = strm->next_in;
184     int rsi = strm->rsi * strm->block_size;
185
186     strm->next_in += 2 * rsi;
187     strm->total_in += 2 * rsi;
188     strm->avail_in -= 2 * rsi;
189
190     while (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);
207         in += 16;
208         out += 8;
209         rsi -= 8;
210     }
211 }
212
213 void aec_get_rsi_msb_16(struct aec_stream *strm)
214 {
215     uint32_t *out = strm->state->data_raw;
216     const unsigned char *in = strm->next_in;
217     int rsi = strm->rsi * strm->block_size;
218
219     strm->next_in += 2 * rsi;
220     strm->total_in += 2 * rsi;
221     strm->avail_in -= 2 * rsi;
222
223     while (rsi) {
224         out[0] = ((uint32_t)in[0] << 8)
225             | (uint32_t)in[1];
226         out[1] = ((uint32_t)in[2] << 8)
227             | (uint32_t)in[3];
228         out[2] = ((uint32_t)in[4] << 8)
229             | (uint32_t)in[5];
230         out[3] = ((uint32_t)in[6] << 8)
231             | (uint32_t)in[7];
232         out[4] = ((uint32_t)in[8] << 8)
233             | (uint32_t)in[9];
234         out[5] = ((uint32_t)in[10] << 8)
235             | (uint32_t)in[11];
236         out[6] = ((uint32_t)in[12] << 8)
237             | (uint32_t)in[13];
238         out[7] = ((uint32_t)in[14] << 8)
239             | (uint32_t)in[15];
240         in += 16;
241         out += 8;
242         rsi -= 8;
243     }
244 }
245
246 void aec_get_rsi_lsb_24(struct aec_stream *strm)
247 {
248     uint32_t *out = strm->state->data_raw;
249     const unsigned char *in = strm->next_in;
250     int rsi = strm->rsi * strm->block_size;
251
252     strm->next_in += 3 * rsi;
253     strm->total_in += 3 * rsi;
254     strm->avail_in -= 3 * rsi;
255
256     while (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);
281         in += 24;
282         out += 8;
283         rsi -= 8;
284     }
285 }
286
287 void aec_get_rsi_msb_24(struct aec_stream *strm)
288 {
289     uint32_t *out = strm->state->data_raw;
290     const unsigned char *in = strm->next_in;
291     int rsi = strm->rsi * strm->block_size;
292
293     strm->next_in += 3 * rsi;
294     strm->total_in += 3 * rsi;
295     strm->avail_in -= 3 * rsi;
296
297     while (rsi) {
298         out[0] = ((uint32_t)in[0] << 16)
299             | ((uint32_t)in[1] << 8)
300             | (uint32_t)in[2];
301         out[1] = ((uint32_t)in[3] << 16)
302             | ((uint32_t)in[4] << 8)
303             | (uint32_t)in[5];
304         out[2] = ((uint32_t)in[6] << 16)
305             | ((uint32_t)in[7] << 8)
306             | (uint32_t)in[8];
307         out[3] = ((uint32_t)in[9] << 16)
308             | ((uint32_t)in[10] << 8)
309             | (uint32_t)in[11];
310         out[4] = ((uint32_t)in[12] << 16)
311             | ((uint32_t)in[13] << 8)
312             | (uint32_t)in[14];
313         out[5] = ((uint32_t)in[15] << 16)
314             | ((uint32_t)in[16] << 8)
315             | (uint32_t)in[17];
316         out[6] = ((uint32_t)in[18] << 16)
317             | ((uint32_t)in[19] << 8)
318             | (uint32_t)in[20];
319         out[7] = ((uint32_t)in[21] << 16)
320             | ((uint32_t)in[22] << 8)
321             | (uint32_t)in[23];
322         in += 24;
323         out += 8;
324         rsi -= 8;
325     }
326 }
327
328 #define AEC_GET_RSI_NATIVE_32(BO)                       \
329     void aec_get_rsi_##BO##_32(struct aec_stream *strm) \
330     {                                               \
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;                  \
337     }
338
339 #ifdef WORDS_BIGENDIAN
340 void aec_get_rsi_lsb_32(struct aec_stream *strm)
341 {
342     uint32_t *out = strm->state->data_raw;
343     const unsigned char *in = strm->next_in;
344     int rsi = strm->rsi * strm->block_size;
345
346     strm->next_in += 4 * rsi;
347     strm->total_in += 4 * rsi;
348     strm->avail_in -= 4 * rsi;
349
350     while (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);
383         in += 32;
384         out += 8;
385         rsi -= 8;
386     }
387 }
388
389 AEC_GET_RSI_NATIVE_32(msb);
390
391 #else /* !WORDS_BIGENDIAN */
392 void aec_get_rsi_msb_32(struct aec_stream *strm)
393 {
394     uint32_t *out = strm->state->data_raw;
395     const unsigned char *in = strm->next_in;
396     int rsi = strm->rsi * strm->block_size;
397
398     strm->next_in += 4 * rsi;
399     strm->total_in += 4 * rsi;
400     strm->avail_in -= 4 * rsi;
401
402     while (rsi) {
403         out[0] = ((uint32_t)in[0] << 24)
404             | ((uint32_t)in[1] << 16)
405             | ((uint32_t)in[2] << 8)
406             | (uint32_t)in[3];
407         out[1] = ((uint32_t)in[4] << 24)
408             | ((uint32_t)in[5] << 16)
409             | ((uint32_t)in[6] << 8)
410             | (uint32_t)in[7];
411         out[2] = ((uint32_t)in[8] << 24)
412             | ((uint32_t)in[9] << 16)
413             | ((uint32_t)in[10] << 8)
414             | (uint32_t)in[11];
415         out[3] = ((uint32_t)in[12] << 24)
416             | ((uint32_t)in[13] << 16)
417             | ((uint32_t)in[14] << 8)
418             | (uint32_t)in[15];
419         out[4] = ((uint32_t)in[16] << 24)
420             | ((uint32_t)in[17] << 16)
421             | ((uint32_t)in[18] << 8)
422             | (uint32_t)in[19];
423         out[5] = ((uint32_t)in[20] << 24)
424             | ((uint32_t)in[21] << 16)
425             | ((uint32_t)in[22] << 8)
426             | (uint32_t)in[23];
427         out[6] = ((uint32_t)in[24] << 24)
428             | ((uint32_t)in[25] << 16)
429             | ((uint32_t)in[26] << 8)
430             | (uint32_t)in[27];
431         out[7] = ((uint32_t)in[28] << 24)
432             | ((uint32_t)in[29] << 16)
433             | ((uint32_t)in[30] << 8)
434             | (uint32_t)in[31];
435         in += 32;
436         out += 8;
437         rsi -= 8;
438     }
439 }
440
441 AEC_GET_RSI_NATIVE_32(lsb);
442
443 #endif /* !WORDS_BIGENDIAN */