mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
Add av_memcpy_backptr(): deliberately overlapping memcpy variant.
Originally committed as revision 14641 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
c0f0b34bba
commit
6ba10f338a
@ -106,6 +106,8 @@ static inline void copy(LZOContext *c, int cnt) {
|
||||
c->out = dst + cnt;
|
||||
}
|
||||
|
||||
static inline void memcpy_backptr(uint8_t *dst, int back, int cnt);
|
||||
|
||||
/**
|
||||
* \brief copy previously decoded bytes to current position
|
||||
* \param back how many bytes back we start
|
||||
@ -125,9 +127,14 @@ static inline void copy_backptr(LZOContext *c, int back, int cnt) {
|
||||
cnt = FFMAX(c->out_end - dst, 0);
|
||||
c->error |= LZO_OUTPUT_FULL;
|
||||
}
|
||||
memcpy_backptr(dst, back, cnt);
|
||||
c->out = dst + cnt;
|
||||
}
|
||||
|
||||
static inline void memcpy_backptr(uint8_t *dst, int back, int cnt) {
|
||||
const uint8_t *src = &dst[-back];
|
||||
if (back == 1) {
|
||||
memset(dst, *src, cnt);
|
||||
dst += cnt;
|
||||
} else {
|
||||
#ifdef OUTBUF_PADDED
|
||||
COPY2(dst, src);
|
||||
@ -155,9 +162,20 @@ static inline void copy_backptr(LZOContext *c, int back, int cnt) {
|
||||
}
|
||||
memcpy(dst, src, cnt);
|
||||
}
|
||||
dst += cnt;
|
||||
}
|
||||
c->out = dst;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief deliberately overlapping memcpy implementation
|
||||
* \param dst destination buffer; must be padded with 12 additional bytes
|
||||
* \param back how many bytes back we start (the initial size of the overlapping window)
|
||||
* \param cnt number of bytes to copy, must be >= 0
|
||||
*
|
||||
* cnt > back is valid, this will copy the bytes we just copied,
|
||||
* thus creating a repeating pattern with a period length of back.
|
||||
*/
|
||||
void av_memcpy_backptr(uint8_t *dst, int back, int cnt) {
|
||||
memcpy_backptr(dst, back, cnt);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -32,4 +32,6 @@
|
||||
|
||||
int lzo1x_decode(void *out, int *outlen, const void *in, int *inlen);
|
||||
|
||||
void av_memcpy_backptr(uint8_t *dst, int back, int cnt);
|
||||
|
||||
#endif /* FFMPEG_LZO_H */
|
||||
|
Loading…
Reference in New Issue
Block a user