* Ensure dst_buffer is bigger than src_buffer then resize afterwards * returns length of dst_buffer */
| 256 | * returns length of dst_buffer |
| 257 | */ |
| 258 | size_t EncodeChunkRLE(const uint8_t* src_buffer, uint8_t* dst_buffer, size_t length) |
| 259 | { |
| 260 | const uint8_t* src = src_buffer; |
| 261 | uint8_t* dst = dst_buffer; |
| 262 | const uint8_t* end_src = src + length; |
| 263 | uint8_t count = 0; |
| 264 | const uint8_t* src_norm_start = src; |
| 265 | |
| 266 | while (src < end_src - 1) |
| 267 | { |
| 268 | if ((count && *src == src[1]) || count > 125) |
| 269 | { |
| 270 | *dst++ = count - 1; |
| 271 | std::memcpy(dst, src_norm_start, count); |
| 272 | dst += count; |
| 273 | src_norm_start += count; |
| 274 | count = 0; |
| 275 | } |
| 276 | if (*src == src[1]) |
| 277 | { |
| 278 | for (; (count < 125) && ((src + count) < end_src); count++) |
| 279 | { |
| 280 | if (*src != src[count]) |
| 281 | break; |
| 282 | } |
| 283 | *dst++ = 257 - count; |
| 284 | *dst++ = *src; |
| 285 | src += count; |
| 286 | src_norm_start = src; |
| 287 | count = 0; |
| 288 | } |
| 289 | else |
| 290 | { |
| 291 | count++; |
| 292 | src++; |
| 293 | } |
| 294 | } |
| 295 | if (src == end_src - 1) |
| 296 | count++; |
| 297 | if (count) |
| 298 | { |
| 299 | *dst++ = count - 1; |
| 300 | std::memcpy(dst, src_norm_start, count); |
| 301 | dst += count; |
| 302 | } |
| 303 | return dst - dst_buffer; |
| 304 | } |
| 305 | |
| 306 | size_t EncodeChunkRepeat(const uint8_t* src_buffer, uint8_t* dst_buffer, size_t length) |
| 307 | { |
no outgoing calls
no test coverage detected