comparison lcldec.c @ 9775:3fd46320ab12 libavcodec

Take advantage of available input padding to optimize mszh_decomp
author reimar
date Sun, 31 May 2009 11:32:03 +0000
parents 69395e6a4d03
children 18d149e8fc7f
comparison
equal deleted inserted replaced
9774:69395e6a4d03 9775:3fd46320ab12
71 #endif 71 #endif
72 } LclDecContext; 72 } LclDecContext;
73 73
74 74
75 /** 75 /**
76 * \param srcptr compressed source buffer, must be padded with at least 4 extra bytes 76 * \param srcptr compressed source buffer, must be padded with at least 5 extra bytes
77 * \param destptr must be padded sufficiently for av_memcpy_backptr 77 * \param destptr must be padded sufficiently for av_memcpy_backptr
78 */ 78 */
79 static unsigned int mszh_decomp(const unsigned char * srcptr, int srclen, unsigned char * destptr, unsigned int destsize) 79 static unsigned int mszh_decomp(const unsigned char * srcptr, int srclen, unsigned char * destptr, unsigned int destsize)
80 { 80 {
81 unsigned char *destptr_bak = destptr; 81 unsigned char *destptr_bak = destptr;
82 unsigned char *destptr_end = destptr + destsize; 82 unsigned char *destptr_end = destptr + destsize;
83 const unsigned char *srcptr_end = srcptr + srclen; 83 const unsigned char *srcptr_end = srcptr + srclen;
84 unsigned char mask = 0; 84 unsigned char mask = *srcptr++;
85 unsigned char maskbit = 0; 85 unsigned char maskbit = 0x80;
86 unsigned int ofs, cnt; 86 unsigned int ofs, cnt;
87 87
88 while (srcptr < srcptr_end && destptr < destptr_end) { 88 while (srcptr < srcptr_end && destptr < destptr_end) {
89 if (maskbit == 0) {
90 mask = *srcptr++;
91 maskbit = 0x80;
92 continue;
93 }
94 if (!(mask & maskbit)) { 89 if (!(mask & maskbit)) {
95 memcpy(destptr, srcptr, 4); 90 memcpy(destptr, srcptr, 4);
96 destptr += 4; 91 destptr += 4;
97 srcptr += 4; 92 srcptr += 4;
98 } else { 93 } else {
103 cnt = FFMIN(cnt, destptr_end - destptr); 98 cnt = FFMIN(cnt, destptr_end - destptr);
104 av_memcpy_backptr(destptr, ofs, cnt); 99 av_memcpy_backptr(destptr, ofs, cnt);
105 destptr += cnt; 100 destptr += cnt;
106 } 101 }
107 maskbit >>= 1; 102 maskbit >>= 1;
103 if (!maskbit) {
104 mask = *srcptr++;
105 maskbit = 0x80;
106 }
108 } 107 }
109 108
110 return destptr - destptr_bak; 109 return destptr - destptr_bak;
111 } 110 }
112 111