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