encode_accessors.c 7.27 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
 * @file encode_accessors.c
 *
 * @author Mathis Rosenhauer, Deutsches Klimarechenzentrum
 * @author Moritz Hanke, Deutsches Klimarechenzentrum
 * @author Joerg Behrens, Deutsches Klimarechenzentrum
 * @author Luis Kornblueh, Max-Planck-Institut fuer Meteorologie
 *
 * @section LICENSE
 * Copyright 2012
 *
 * Mathis Rosenhauer,                 Luis Kornblueh
 * Moritz Hanke,
 * Joerg Behrens
 *
 * Deutsches Klimarechenzentrum GmbH  Max-Planck-Institut fuer Meteorologie
 * Bundesstr. 45a                     Bundesstr. 53
 * 20146 Hamburg                      20146 Hamburg
 * Germany                            Germany
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @section DESCRIPTION
 *
 * Read various data types from input stream
 *
 */

53
#include <config.h>
54
55
56
57
58

#if HAVE_STDINT_H
# include <stdint.h>
#endif

59
#include <string.h>
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
60
61
62
#include "libaec.h"
#include "encode.h"
#include "encode_accessors.h"
63

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
64
uint32_t aec_get_8(struct aec_stream *strm)
65
66
67
68
69
{
    strm->avail_in--;
    return *strm->next_in++;
}

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
70
uint32_t aec_get_lsb_16(struct aec_stream *strm)
71
72
73
74
75
76
77
78
79
80
81
{
    uint32_t data;

    data = ((uint32_t)strm->next_in[1] << 8)
        | (uint32_t)strm->next_in[0];

    strm->next_in += 2;
    strm->avail_in -= 2;
    return data;
}

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
82
uint32_t aec_get_msb_16(struct aec_stream *strm)
83
84
85
86
87
88
89
90
91
92
93
{
    uint32_t data;

    data = ((uint32_t)strm->next_in[0] << 8)
        | (uint32_t)strm->next_in[1];

    strm->next_in += 2;
    strm->avail_in -= 2;
    return data;
}

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
94
uint32_t aec_get_lsb_24(struct aec_stream *strm)
95
96
97
98
99
100
101
102
103
104
105
106
{
    uint32_t data;

    data = ((uint32_t)strm->next_in[2] << 16)
        | ((uint32_t)strm->next_in[1] << 8)
        | (uint32_t)strm->next_in[0];

    strm->next_in += 3;
    strm->avail_in -= 3;
    return data;
}

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
107
uint32_t aec_get_msb_24(struct aec_stream *strm)
108
109
110
111
112
113
114
115
116
117
118
119
{
    uint32_t data;

    data = ((uint32_t)strm->next_in[0] << 16)
        | ((uint32_t)strm->next_in[1] << 8)
        | (uint32_t)strm->next_in[2];

    strm->next_in += 3;
    strm->avail_in -= 3;
    return data;
}

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
120
uint32_t aec_get_lsb_32(struct aec_stream *strm)
121
122
123
124
125
126
127
128
129
130
131
132
133
{
    uint32_t data;

    data = ((uint32_t)strm->next_in[3] << 24)
        | ((uint32_t)strm->next_in[2] << 16)
        | ((uint32_t)strm->next_in[1] << 8)
        | (uint32_t)strm->next_in[0];

    strm->next_in += 4;
    strm->avail_in -= 4;
    return data;
}

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
134
uint32_t aec_get_msb_32(struct aec_stream *strm)
135
136
137
138
139
140
141
142
143
144
145
146
147
{
    uint32_t data;

    data = ((uint32_t)strm->next_in[0] << 24)
        | ((uint32_t)strm->next_in[1] << 16)
        | ((uint32_t)strm->next_in[2] << 8)
        | (uint32_t)strm->next_in[3];

    strm->next_in += 4;
    strm->avail_in -= 4;
    return data;
}

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
148
void aec_get_rsi_8(struct aec_stream *strm)
149
{
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
150
151
152
    int i;
    uint32_t *restrict out = strm->state->data_raw;
    unsigned const char *restrict in = strm->next_in;
153
154
    int rsi = strm->rsi * strm->block_size;

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
155
156
157
    for (i = 0; i < rsi; i++)
        out[i] = (uint32_t)in[i];

158
159
160
    strm->next_in += rsi;
    strm->avail_in -= rsi;
}
161

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
162
void aec_get_rsi_lsb_16(struct aec_stream *strm)
163
{
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
164
    int i;
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
165
166
    uint32_t *restrict out = strm->state->data_raw;
    const unsigned char *restrict in = strm->next_in;
167
168
    int rsi = strm->rsi * strm->block_size;

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
169
170
171
    for (i = 0; i < rsi; i++)
        out[i] = (uint32_t)in[2 * i] | ((uint32_t)in[2 * i + 1] << 8);

172
173
174
175
    strm->next_in += 2 * rsi;
    strm->avail_in -= 2 * rsi;
}

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
176
void aec_get_rsi_msb_16(struct aec_stream *strm)
177
{
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
178
179
180
    int i;
    uint32_t *restrict out = strm->state->data_raw;
    const unsigned char *restrict in = strm->next_in;
181
182
    int rsi = strm->rsi * strm->block_size;

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
183
184
185
    for (i = 0; i < rsi; i++)
        out[i] = ((uint32_t)in[2 * i] << 8) | (uint32_t)in[2 * i + 1];

186
187
188
189
    strm->next_in += 2 * rsi;
    strm->avail_in -= 2 * rsi;
}

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
190
void aec_get_rsi_lsb_24(struct aec_stream *strm)
191
{
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
192
193
194
    int i;
    uint32_t *restrict out = strm->state->data_raw;
    const unsigned char *restrict in = strm->next_in;
195
196
    int rsi = strm->rsi * strm->block_size;

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
197
198
199
200
201
    for (i = 0; i < rsi; i++)
        out[i] = (uint32_t)in[3 * i]
            | ((uint32_t)in[3 * i + 1] << 8)
            | ((uint32_t)in[3 * i + 2] << 16);

202
203
204
    strm->next_in += 3 * rsi;
    strm->avail_in -= 3 * rsi;
}
205

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
206
void aec_get_rsi_msb_24(struct aec_stream *strm)
207
{
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
208
209
210
    int i;
    uint32_t *restrict out = strm->state->data_raw;
    const unsigned char *restrict in = strm->next_in;
211
212
    int rsi = strm->rsi * strm->block_size;

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
213
214
215
216
217
    for (i = 0; i < rsi; i++)
        out[i] = ((uint32_t)in[3 * i] << 16)
            | ((uint32_t)in[3 * i + 1] << 8)
            | (uint32_t)in[3 * i + 2];

218
219
220
    strm->next_in += 3 * rsi;
    strm->avail_in -= 3 * rsi;
}
221

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
222
223
#define AEC_GET_RSI_NATIVE_32(BO)                       \
    void aec_get_rsi_##BO##_32(struct aec_stream *strm) \
224
225
    {                                               \
        int rsi = strm->rsi * strm->block_size;     \
226
        memcpy(strm->state->data_raw,               \
227
228
229
               strm->next_in, 4 * rsi);             \
        strm->next_in += 4 * rsi;                   \
        strm->avail_in -= 4 * rsi;                  \
230
231
    }

232
#ifdef WORDS_BIGENDIAN
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
233
void aec_get_rsi_lsb_32(struct aec_stream *strm)
234
{
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
235
236
237
    int i;
    uint32_t *restrict out = strm->state->data_raw;
    const unsigned char *restrict in = strm->next_in;
238
239
    int rsi = strm->rsi * strm->block_size;

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
240
241
242
243
244
245
    for (i = 0; i < rsi; i++)
        out[i] = (uint32_t)in[4 * i]
            | ((uint32_t)in[4 * i + 1] << 8)
            | ((uint32_t)in[4 * i + 2] << 16)
            | ((uint32_t)in[4 * i + 3] << 24);

246
247
248
    strm->next_in += 4 * rsi;
    strm->avail_in -= 4 * rsi;
}
249

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
250
AEC_GET_RSI_NATIVE_32(msb);
251

252
#else /* !WORDS_BIGENDIAN */
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
253
void aec_get_rsi_msb_32(struct aec_stream *strm)
254
{
Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
255
256
257
    int i;
    uint32_t *restrict out = strm->state->data_raw;
    const unsigned char *restrict in = strm->next_in;
258
259
260
261
262
    int rsi = strm->rsi * strm->block_size;

    strm->next_in += 4 * rsi;
    strm->avail_in -= 4 * rsi;

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
263
264
265
266
267
    for (i = 0; i < rsi; i++)
        out[i] = ((uint32_t)in[4 * i] << 24)
            | ((uint32_t)in[4 * i + 1] << 16)
            | ((uint32_t)in[4 * i + 2] << 8)
            | (uint32_t)in[4 * i + 3];
268
}
269

Mathis Rosenhauer's avatar
Mathis Rosenhauer committed
270
AEC_GET_RSI_NATIVE_32(lsb);
271

272
#endif /* !WORDS_BIGENDIAN */