Mercurial > libavcodec.hg
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 |