annotate lzo.c @ 992:a13125b5be3a libavutil

bswap: change ME to NE in macro names Other parts of FFmpeg use NE (native endian) rather than ME (machine). This makes it consistent.
author mru
date Sat, 10 Jul 2010 22:09:01 +0000
parents 0a1867c7ec5e
children
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 */
646
8e5654be3500 Add necessary header for LIBAVUTIL_VERSION_MAJOR, fixes the warning:
diego
parents: 644
diff changeset
21
8e5654be3500 Add necessary header for LIBAVUTIL_VERSION_MAJOR, fixes the warning:
diego
parents: 644
diff changeset
22 #include "avutil.h"
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
23 #include "common.h"
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 541
diff changeset
24 //! Avoid e.g. MPlayers fast_memcpy, it slows things down here.
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
25 #undef memcpy
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
26 #include <string.h>
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
27 #include "lzo.h"
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
28
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 541
diff changeset
29 //! Define if we may write up to 12 bytes beyond the output buffer.
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
30 #define OUTBUF_PADDED 1
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 541
diff changeset
31 //! Define if we may read up to 8 bytes beyond the input buffer.
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
32 #define INBUF_PADDED 1
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
33 typedef struct LZOContext {
445
1b2867913935 LZO decoder input is const
reimar
parents: 234
diff changeset
34 const uint8_t *in, *in_end;
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
35 uint8_t *out_start, *out, *out_end;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
36 int error;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
37 } LZOContext;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
38
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
39 /**
636
c04808220c83 spelling/grammar/consistency review part II
diego
parents: 633
diff changeset
40 * \brief Reads one byte from the input buffer, avoiding an overrun.
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
41 * \return byte read
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
42 */
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
43 static inline int get_byte(LZOContext *c) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
44 if (c->in < c->in_end)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
45 return *c->in++;
643
db8f45986cff Add av_ prefix to LZO stuff and thus make it officially part of the public API.
reimar
parents: 636
diff changeset
46 c->error |= AV_LZO_INPUT_DEPLETED;
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
47 return 1;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
48 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
49
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
50 #ifdef INBUF_PADDED
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
51 #define GETB(c) (*(c).in++)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
52 #else
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
53 #define GETB(c) get_byte(&(c))
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
54 #endif
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
55
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
56 /**
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 541
diff changeset
57 * \brief Decodes a length value in the coding used by lzo.
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
58 * \param x previous byte value
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
59 * \param mask bits used from x
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
60 * \return decoded length value
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
61 */
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
62 static inline int get_len(LZOContext *c, int x, int mask) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
63 int cnt = x & mask;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
64 if (!cnt) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
65 while (!(x = get_byte(c))) cnt += 255;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
66 cnt += mask + x;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
67 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
68 return cnt;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
69 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
70
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
71 //#define UNALIGNED_LOADSTORE
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
72 #define BUILTIN_MEMCPY
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
73 #ifdef UNALIGNED_LOADSTORE
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
74 #define COPY2(d, s) *(uint16_t *)(d) = *(uint16_t *)(s);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
75 #define COPY4(d, s) *(uint32_t *)(d) = *(uint32_t *)(s);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
76 #elif defined(BUILTIN_MEMCPY)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
77 #define COPY2(d, s) memcpy(d, s, 2);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
78 #define COPY4(d, s) memcpy(d, s, 4);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
79 #else
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
80 #define COPY2(d, s) (d)[0] = (s)[0]; (d)[1] = (s)[1];
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
81 #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
82 #endif
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
83
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
84 /**
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 541
diff changeset
85 * \brief Copies bytes from input to output buffer with checking.
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
86 * \param cnt number of bytes to copy, must be >= 0
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
87 */
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
88 static inline void copy(LZOContext *c, int cnt) {
445
1b2867913935 LZO decoder input is const
reimar
parents: 234
diff changeset
89 register const uint8_t *src = c->in;
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
90 register uint8_t *dst = c->out;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
91 if (cnt > c->in_end - src) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
92 cnt = FFMAX(c->in_end - src, 0);
643
db8f45986cff Add av_ prefix to LZO stuff and thus make it officially part of the public API.
reimar
parents: 636
diff changeset
93 c->error |= AV_LZO_INPUT_DEPLETED;
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
94 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
95 if (cnt > c->out_end - dst) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
96 cnt = FFMAX(c->out_end - dst, 0);
643
db8f45986cff Add av_ prefix to LZO stuff and thus make it officially part of the public API.
reimar
parents: 636
diff changeset
97 c->error |= AV_LZO_OUTPUT_FULL;
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
98 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
99 #if defined(INBUF_PADDED) && defined(OUTBUF_PADDED)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
100 COPY4(dst, src);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
101 src += 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
102 dst += 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
103 cnt -= 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
104 if (cnt > 0)
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
105 #endif
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
106 memcpy(dst, src, cnt);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
107 c->in = src + cnt;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
108 c->out = dst + cnt;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
109 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
110
541
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
111 static inline void memcpy_backptr(uint8_t *dst, int back, int cnt);
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
112
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
113 /**
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 541
diff changeset
114 * \brief Copies previously decoded bytes to current position.
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
115 * \param back how many bytes back we start
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
116 * \param cnt number of bytes to copy, must be >= 0
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
117 *
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
118 * cnt > back is valid, this will copy the bytes we just copied,
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
119 * thus creating a repeating pattern with a period length of back.
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
120 */
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
121 static inline void copy_backptr(LZOContext *c, int back, int cnt) {
445
1b2867913935 LZO decoder input is const
reimar
parents: 234
diff changeset
122 register const uint8_t *src = &c->out[-back];
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
123 register uint8_t *dst = c->out;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
124 if (src < c->out_start || src > dst) {
643
db8f45986cff Add av_ prefix to LZO stuff and thus make it officially part of the public API.
reimar
parents: 636
diff changeset
125 c->error |= AV_LZO_INVALID_BACKPTR;
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
126 return;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
127 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
128 if (cnt > c->out_end - dst) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
129 cnt = FFMAX(c->out_end - dst, 0);
643
db8f45986cff Add av_ prefix to LZO stuff and thus make it officially part of the public API.
reimar
parents: 636
diff changeset
130 c->error |= AV_LZO_OUTPUT_FULL;
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
131 }
541
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
132 memcpy_backptr(dst, back, cnt);
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
133 c->out = dst + cnt;
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
134 }
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
135
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
136 static inline void memcpy_backptr(uint8_t *dst, int back, int cnt) {
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
137 const uint8_t *src = &dst[-back];
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
138 if (back == 1) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
139 memset(dst, *src, cnt);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
140 } else {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
141 #ifdef OUTBUF_PADDED
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
142 COPY2(dst, src);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
143 COPY2(dst + 2, src + 2);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
144 src += 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
145 dst += 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
146 cnt -= 4;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
147 if (cnt > 0) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
148 COPY2(dst, src);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
149 COPY2(dst + 2, src + 2);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
150 COPY2(dst + 4, src + 4);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
151 COPY2(dst + 6, src + 6);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
152 src += 8;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
153 dst += 8;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
154 cnt -= 8;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
155 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
156 #endif
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
157 if (cnt > 0) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
158 int blocklen = back;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
159 while (cnt > blocklen) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
160 memcpy(dst, src, blocklen);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
161 dst += blocklen;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
162 cnt -= blocklen;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
163 blocklen <<= 1;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
164 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
165 memcpy(dst, src, cnt);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
166 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
167 }
541
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
168 }
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
169
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
170 void av_memcpy_backptr(uint8_t *dst, int back, int cnt) {
b8574db98875 Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
pross
parents: 445
diff changeset
171 memcpy_backptr(dst, back, cnt);
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
172 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
173
643
db8f45986cff Add av_ prefix to LZO stuff and thus make it officially part of the public API.
reimar
parents: 636
diff changeset
174 int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen) {
234
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;
445
1b2867913935 LZO decoder input is const
reimar
parents: 234
diff changeset
179 c.in_end = (const uint8_t *)in + *inlen;
234
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);
643
db8f45986cff Add av_ prefix to LZO stuff and thus make it officially part of the public API.
reimar
parents: 636
diff changeset
187 if (x < 16) c.error |= AV_LZO_ERROR;
234
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)
643
db8f45986cff Add av_ prefix to LZO stuff and thus make it officially part of the public API.
reimar
parents: 636
diff changeset
190 c.error |= AV_LZO_INPUT_DEPLETED;
234
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)
643
db8f45986cff Add av_ prefix to LZO stuff and thus make it officially part of the public API.
reimar
parents: 636
diff changeset
208 c.error |= AV_LZO_ERROR;
234
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)
724
0a1867c7ec5e Give liblzo benchmark conditionals more descriptive names and add convenience
diego
parents: 720
diff changeset
242
0a1867c7ec5e Give liblzo benchmark conditionals more descriptive names and add convenience
diego
parents: 720
diff changeset
243 /* Define one of these to 1 if you wish to benchmark liblzo
0a1867c7ec5e Give liblzo benchmark conditionals more descriptive names and add convenience
diego
parents: 720
diff changeset
244 * instead of our native implementation. */
0a1867c7ec5e Give liblzo benchmark conditionals more descriptive names and add convenience
diego
parents: 720
diff changeset
245 #define BENCHMARK_LIBLZO_SAFE 0
0a1867c7ec5e Give liblzo benchmark conditionals more descriptive names and add convenience
diego
parents: 720
diff changeset
246 #define BENCHMARK_LIBLZO_UNSAFE 0
0a1867c7ec5e Give liblzo benchmark conditionals more descriptive names and add convenience
diego
parents: 720
diff changeset
247
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
248 int main(int argc, char *argv[]) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
249 FILE *in = fopen(argv[1], "rb");
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
250 uint8_t *orig = av_malloc(MAXSZ + 16);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
251 uint8_t *comp = av_malloc(2*MAXSZ + 16);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
252 uint8_t *decomp = av_malloc(MAXSZ + 16);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
253 size_t s = fread(orig, 1, MAXSZ, in);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
254 lzo_uint clen = 0;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
255 long tmp[LZO1X_MEM_COMPRESS];
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
256 int inlen, outlen;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
257 int i;
720
a44606418c82 Replace manual setting of the removed av_log_level variable by the
diego
parents: 686
diff changeset
258 av_log_set_level(AV_LOG_DEBUG);
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
259 lzo1x_999_compress(orig, s, comp, &clen, tmp);
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
260 for (i = 0; i < 300; i++) {
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
261 START_TIMER
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
262 inlen = clen; outlen = MAXSZ;
724
0a1867c7ec5e Give liblzo benchmark conditionals more descriptive names and add convenience
diego
parents: 720
diff changeset
263 #if BENCHMARK_LIBLZO_SAFE
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
264 if (lzo1x_decompress_safe(comp, inlen, decomp, &outlen, NULL))
724
0a1867c7ec5e Give liblzo benchmark conditionals more descriptive names and add convenience
diego
parents: 720
diff changeset
265 #elif BENCHMARK_LIBLZO_UNSAFE
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
266 if (lzo1x_decompress(comp, inlen, decomp, &outlen, NULL))
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
267 #else
643
db8f45986cff Add av_ prefix to LZO stuff and thus make it officially part of the public API.
reimar
parents: 636
diff changeset
268 if (av_lzo1x_decode(decomp, &outlen, comp, &inlen))
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
269 #endif
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
270 av_log(NULL, AV_LOG_ERROR, "decompression error\n");
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
271 STOP_TIMER("lzod")
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
272 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
273 if (memcmp(orig, decomp, s))
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
274 av_log(NULL, AV_LOG_ERROR, "decompression incorrect\n");
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
275 else
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 541
diff changeset
276 av_log(NULL, AV_LOG_ERROR, "decompression OK\n");
234
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
277 return 0;
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
278 }
5ad447ede15c Move lzo decompression to libavutil
reimar
parents:
diff changeset
279 #endif