Mercurial > libavcodec.hg
comparison xan.c @ 9475:4faccfb98672 libavcodec
Replace bytecopy with the equivalent but faster av_memcpy_backptr.
Ca. 10% faster xan_unpack on x86_64 decoding of SC_32-part.MVE
author | reimar |
---|---|
date | Fri, 17 Apr 2009 17:46:10 +0000 |
parents | e38284cd69dc |
children | 94edfc2a9b8b |
comparison
equal
deleted
inserted
replaced
9474:e1d76267dce8 | 9475:4faccfb98672 |
---|---|
33 #include <string.h> | 33 #include <string.h> |
34 #include <unistd.h> | 34 #include <unistd.h> |
35 | 35 |
36 #include "libavutil/intreadwrite.h" | 36 #include "libavutil/intreadwrite.h" |
37 #include "avcodec.h" | 37 #include "avcodec.h" |
38 // for av_memcpy_backptr | |
39 #include "libavutil/lzo.h" | |
38 | 40 |
39 typedef struct XanContext { | 41 typedef struct XanContext { |
40 | 42 |
41 AVCodecContext *avctx; | 43 AVCodecContext *avctx; |
42 AVFrame last_frame; | 44 AVFrame last_frame; |
74 return -1; | 76 return -1; |
75 | 77 |
76 s->buffer1_size = avctx->width * avctx->height; | 78 s->buffer1_size = avctx->width * avctx->height; |
77 s->buffer1 = av_malloc(s->buffer1_size); | 79 s->buffer1 = av_malloc(s->buffer1_size); |
78 s->buffer2_size = avctx->width * avctx->height; | 80 s->buffer2_size = avctx->width * avctx->height; |
79 s->buffer2 = av_malloc(s->buffer2_size); | 81 s->buffer2 = av_malloc(s->buffer2_size + 12); |
80 if (!s->buffer1 || !s->buffer2) | 82 if (!s->buffer1 || !s->buffer2) |
81 return -1; | 83 return -1; |
82 | 84 |
83 return 0; | 85 return 0; |
84 } | |
85 | |
86 /* This function is used in lieu of memcpy(). This decoder cannot use | |
87 * memcpy because the memory locations often overlap and | |
88 * memcpy doesn't like that; it's not uncommon, for example, for | |
89 * dest = src+1, to turn byte A into pattern AAAAAAAA. | |
90 * This was originally repz movsb in Intel x86 ASM. */ | |
91 static inline void bytecopy(unsigned char *dest, const unsigned char *src, int count) | |
92 { | |
93 int i; | |
94 | |
95 for (i = 0; i < count; i++) | |
96 dest[i] = src[i]; | |
97 } | 86 } |
98 | 87 |
99 static int xan_huffman_decode(unsigned char *dest, const unsigned char *src, | 88 static int xan_huffman_decode(unsigned char *dest, const unsigned char *src, |
100 int dest_len) | 89 int dest_len) |
101 { | 90 { |
128 } | 117 } |
129 | 118 |
130 return 0; | 119 return 0; |
131 } | 120 } |
132 | 121 |
122 /** | |
123 * unpack simple compression | |
124 * | |
125 * @param dest destination buffer of dest_len, must be sufficiently padded for av_memcpy_backptr | |
126 */ | |
133 static void xan_unpack(unsigned char *dest, const unsigned char *src, int dest_len) | 127 static void xan_unpack(unsigned char *dest, const unsigned char *src, int dest_len) |
134 { | 128 { |
135 unsigned char opcode; | 129 unsigned char opcode; |
136 int size; | 130 int size; |
137 int offset; | 131 int offset; |
151 memcpy(dest, src, size); dest += size; src += size; | 145 memcpy(dest, src, size); dest += size; src += size; |
152 | 146 |
153 size = ((opcode & 0x1c) >> 2) + 3; | 147 size = ((opcode & 0x1c) >> 2) + 3; |
154 if (dest + size > dest_end) | 148 if (dest + size > dest_end) |
155 return; | 149 return; |
156 bytecopy (dest, dest - (((opcode & 0x60) << 3) + offset + 1), size); | 150 av_memcpy_backptr(dest, ((opcode & 0x60) << 3) + offset + 1, size); |
157 dest += size; | 151 dest += size; |
158 | 152 |
159 } else if ( (opcode & 0x40) == 0 ) { | 153 } else if ( (opcode & 0x40) == 0 ) { |
160 | 154 |
161 byte1 = *src++; | 155 byte1 = *src++; |
167 memcpy(dest, src, size); dest += size; src += size; | 161 memcpy(dest, src, size); dest += size; src += size; |
168 | 162 |
169 size = (opcode & 0x3f) + 4; | 163 size = (opcode & 0x3f) + 4; |
170 if (dest + size > dest_end) | 164 if (dest + size > dest_end) |
171 return; | 165 return; |
172 bytecopy (dest, dest - (((byte1 & 0x3f) << 8) + byte2 + 1), size); | 166 av_memcpy_backptr(dest, ((byte1 & 0x3f) << 8) + byte2 + 1, size); |
173 dest += size; | 167 dest += size; |
174 | 168 |
175 } else if ( (opcode & 0x20) == 0 ) { | 169 } else if ( (opcode & 0x20) == 0 ) { |
176 | 170 |
177 byte1 = *src++; | 171 byte1 = *src++; |
184 memcpy(dest, src, size); dest += size; src += size; | 178 memcpy(dest, src, size); dest += size; src += size; |
185 | 179 |
186 size = byte3 + 5 + ((opcode & 0xc) << 6); | 180 size = byte3 + 5 + ((opcode & 0xc) << 6); |
187 if (dest + size > dest_end) | 181 if (dest + size > dest_end) |
188 return; | 182 return; |
189 bytecopy (dest, | 183 av_memcpy_backptr(dest, |
190 dest - ((((opcode & 0x10) >> 4) << 0x10) + 1 + (byte1 << 8) + byte2), | 184 (((opcode & 0x10) >> 4) << 0x10) + 1 + (byte1 << 8) + byte2, |
191 size); | 185 size); |
192 dest += size; | 186 dest += size; |
193 } else { | 187 } else { |
194 size = ((opcode & 0x1f) << 2) + 4; | 188 size = ((opcode & 0x1f) << 2) + 4; |
195 | 189 |