annotate lzo.c @ 240:80f17646fa2d libavutil

mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
author bcoudurier
date Sun, 11 Feb 2007 12:50:33 +0000
parents 5ad447ede15c
children 1b2867913935
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
1 /*
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
2 * LZO 1x decompression
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
3 * Copyright (c) 2006 Reimar Doeffinger
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
4 *
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
5 * This file is part of FFmpeg.
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
6 *
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
11 *
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
15 * Lesser General Public License for more details.
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
16 *
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
20 */
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
21 #include "common.h"
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
22 //! avoid e.g. MPlayers fast_memcpy, it slows things down here
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
23 #undef memcpy
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
24 #include <string.h>
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
25 #include "lzo.h"
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
26
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
27 //! define if we may write up to 12 bytes beyond the output buffer
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
28 #define OUTBUF_PADDED 1
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
29 //! define if we may read up to 8 bytes beyond the input buffer
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
30 #define INBUF_PADDED 1
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
31 typedef struct LZOContext {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
32 uint8_t *in, *in_end;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
33 uint8_t *out_start, *out, *out_end;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
34 int error;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
35 } LZOContext;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
36
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
37 /**
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
38 * \brief read one byte from input buffer, avoiding overrun
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
39 * \return byte read
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
40 */
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
41 static inline int get_byte(LZOContext *c) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
42 if (c->in < c->in_end)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
43 return *c->in++;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
44 c->error |= LZO_INPUT_DEPLETED;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
45 return 1;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
46 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
47
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
48 #ifdef INBUF_PADDED
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
49 #define GETB(c) (*(c).in++)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
50 #else
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
51 #define GETB(c) get_byte(&(c))
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
52 #endif
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
53
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
54 /**
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
55 * \brief decode a length value in the coding used by lzo
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
56 * \param x previous byte value
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
57 * \param mask bits used from x
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
58 * \return decoded length value
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
59 */
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
60 static inline int get_len(LZOContext *c, int x, int mask) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
61 int cnt = x & mask;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
62 if (!cnt) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
63 while (!(x = get_byte(c))) cnt += 255;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
64 cnt += mask + x;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
65 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
66 return cnt;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
67 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
68
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
69 //#define UNALIGNED_LOADSTORE
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
70 #define BUILTIN_MEMCPY
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
71 #ifdef UNALIGNED_LOADSTORE
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
72 #define COPY2(d, s) *(uint16_t *)(d) = *(uint16_t *)(s);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
73 #define COPY4(d, s) *(uint32_t *)(d) = *(uint32_t *)(s);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
74 #elif defined(BUILTIN_MEMCPY)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
75 #define COPY2(d, s) memcpy(d, s, 2);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
76 #define COPY4(d, s) memcpy(d, s, 4);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
77 #else
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
78 #define COPY2(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1];
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
79 #define COPY4(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1]; (d)[2] = (s)[2]; (d)[3] = (s)[3];
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
80 #endif
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
81
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
82 /**
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
83 * \brief copy bytes from input to output buffer with checking
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
84 * \param cnt number of bytes to copy, must be >= 0
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
85 */
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
86 static inline void copy(LZOContext *c, int cnt) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
87 register uint8_t *src = c->in;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
88 register uint8_t *dst = c->out;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
89 if (cnt > c->in_end - src) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
90 cnt = FFMAX(c->in_end - src, 0);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
91 c->error |= LZO_INPUT_DEPLETED;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
92 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
93 if (cnt > c->out_end - dst) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
94 cnt = FFMAX(c->out_end - dst, 0);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
95 c->error |= LZO_OUTPUT_FULL;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
96 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
97 #if defined(INBUF_PADDED) && defined(OUTBUF_PADDED)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
98 COPY4(dst, src);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
99 src += 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
100 dst += 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
101 cnt -= 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
102 if (cnt > 0)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
103 #endif
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
104 memcpy(dst, src, cnt);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
105 c->in = src + cnt;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
106 c->out = dst + cnt;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
107 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
108
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
109 /**
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
110 * \brief copy previously decoded bytes to current position
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
111 * \param back how many bytes back we start
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
112 * \param cnt number of bytes to copy, must be >= 0
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
113 *
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
114 * cnt > back is valid, this will copy the bytes we just copied,
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
115 * thus creating a repeating pattern with a period length of back.
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
116 */
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
117 static inline void copy_backptr(LZOContext *c, int back, int cnt) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
118 register uint8_t *src = &c->out[-back];
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
119 register uint8_t *dst = c->out;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
120 if (src < c->out_start || src > dst) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
121 c->error |= LZO_INVALID_BACKPTR;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
122 return;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
123 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
124 if (cnt > c->out_end - dst) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
125 cnt = FFMAX(c->out_end - dst, 0);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
126 c->error |= LZO_OUTPUT_FULL;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
127 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
128 if (back == 1) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
129 memset(dst, *src, cnt);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
130 dst += cnt;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
131 } else {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
132 #ifdef OUTBUF_PADDED
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
133 COPY2(dst, src);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
134 COPY2(dst + 2, src + 2);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
135 src += 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
136 dst += 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
137 cnt -= 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
138 if (cnt > 0) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
139 COPY2(dst, src);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
140 COPY2(dst + 2, src + 2);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
141 COPY2(dst + 4, src + 4);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
142 COPY2(dst + 6, src + 6);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
143 src += 8;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
144 dst += 8;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
145 cnt -= 8;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
146 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
147 #endif
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
148 if (cnt > 0) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
149 int blocklen = back;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
150 while (cnt > blocklen) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
151 memcpy(dst, src, blocklen);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
152 dst += blocklen;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
153 cnt -= blocklen;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
154 blocklen <<= 1;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
155 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
156 memcpy(dst, src, cnt);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
157 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
158 dst += cnt;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
159 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
160 c->out = dst;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
161 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
162
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
163 /**
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
164 * \brief decode LZO 1x compressed data
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
165 * \param out output buffer
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
166 * \param outlen size of output buffer, number of bytes left are returned here
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
167 * \param in input buffer
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
168 * \param inlen size of input buffer, number of bytes left are returned here
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
169 * \return 0 on success, otherwise error flags, see lzo.h
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
170 *
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
171 * make sure all buffers are appropriately padded, in must provide
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
172 * LZO_INPUT_PADDING, out must provide LZO_OUTPUT_PADDING additional bytes
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
173 */
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
174 int lzo1x_decode(void *out, int *outlen, void *in, int *inlen) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
175 int state= 0;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
176 int x;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
177 LZOContext c;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
178 c.in = in;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
179 c.in_end = (uint8_t *)in + *inlen;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
180 c.out = c.out_start = out;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
181 c.out_end = (uint8_t *)out + * outlen;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
182 c.error = 0;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
183 x = GETB(c);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
184 if (x > 17) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
185 copy(&c, x - 17);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
186 x = GETB(c);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
187 if (x < 16) c.error |= LZO_ERROR;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
188 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
189 if (c.in > c.in_end)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
190 c.error |= LZO_INPUT_DEPLETED;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
191 while (!c.error) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
192 int cnt, back;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
193 if (x > 15) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
194 if (x > 63) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
195 cnt = (x >> 5) - 1;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
196 back = (GETB(c) << 3) + ((x >> 2) & 7) + 1;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
197 } else if (x > 31) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
198 cnt = get_len(&c, x, 31);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
199 x = GETB(c);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
200 back = (GETB(c) << 6) + (x >> 2) + 1;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
201 } else {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
202 cnt = get_len(&c, x, 7);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
203 back = (1 << 14) + ((x & 8) << 11);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
204 x = GETB(c);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
205 back += (GETB(c) << 6) + (x >> 2);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
206 if (back == (1 << 14)) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
207 if (cnt != 1)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
208 c.error |= LZO_ERROR;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
209 break;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
210 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
211 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
212 } else if(!state){
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
213 cnt = get_len(&c, x, 15);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
214 copy(&c, cnt + 3);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
215 x = GETB(c);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
216 if (x > 15)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
217 continue;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
218 cnt = 1;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
219 back = (1 << 11) + (GETB(c) << 2) + (x >> 2) + 1;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
220 } else {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
221 cnt = 0;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
222 back = (GETB(c) << 2) + (x >> 2) + 1;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
223 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
224 copy_backptr(&c, back, cnt + 2);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
225 state=
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
226 cnt = x & 3;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
227 copy(&c, cnt);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
228 x = GETB(c);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
229 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
230 *inlen = c.in_end - c.in;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
231 if (c.in > c.in_end)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
232 *inlen = 0;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
233 *outlen = c.out_end - c.out;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
234 return c.error;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
235 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
236
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
237 #ifdef TEST
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
238 #include <stdio.h>
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
239 #include <lzo/lzo1x.h>
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
240 #include "log.h"
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
241 #define MAXSZ (10*1024*1024)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
242 int main(int argc, char *argv[]) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
243 FILE *in = fopen(argv[1], "rb");
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
244 uint8_t *orig = av_malloc(MAXSZ + 16);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
245 uint8_t *comp = av_malloc(2*MAXSZ + 16);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
246 uint8_t *decomp = av_malloc(MAXSZ + 16);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
247 size_t s = fread(orig, 1, MAXSZ, in);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
248 lzo_uint clen = 0;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
249 long tmp[LZO1X_MEM_COMPRESS];
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
250 int inlen, outlen;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
251 int i;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
252 av_log_level = AV_LOG_DEBUG;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
253 lzo1x_999_compress(orig, s, comp, &clen, tmp);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
254 for (i = 0; i < 300; i++) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
255 START_TIMER
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
256 inlen = clen; outlen = MAXSZ;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
257 #ifdef LIBLZO
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
258 if (lzo1x_decompress_safe(comp, inlen, decomp, &outlen, NULL))
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
259 #elif defined(LIBLZO_UNSAFE)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
260 if (lzo1x_decompress(comp, inlen, decomp, &outlen, NULL))
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
261 #else
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
262 if (lzo1x_decode(decomp, &outlen, comp, &inlen))
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
263 #endif
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
264 av_log(NULL, AV_LOG_ERROR, "decompression error\n");
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
265 STOP_TIMER("lzod")
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
266 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
267 if (memcmp(orig, decomp, s))
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
268 av_log(NULL, AV_LOG_ERROR, "decompression incorrect\n");
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
269 else
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
270 av_log(NULL, AV_LOG_ERROR, "decompression ok\n");
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
271 return 0;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
272 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
273 #endif