49 #if CONFIG_ZLIB_DECODER
69 #if CONFIG_ZLIB_DECODER
79 static unsigned int mszh_decomp(
const unsigned char * srcptr,
int srclen,
unsigned char * destptr,
unsigned int destsize)
81 unsigned char *destptr_bak = destptr;
82 unsigned char *destptr_end = destptr + destsize;
83 const unsigned char *srcptr_end = srcptr + srclen;
84 unsigned mask = *srcptr++;
85 unsigned maskbit = 0x80;
87 while (srcptr < srcptr_end && destptr < destptr_end) {
88 if (!(mask & maskbit)) {
89 memcpy(destptr, srcptr, 4);
93 unsigned ofs = bytestream_get_le16(&srcptr);
94 unsigned cnt = (ofs >> 11) + 1;
96 ofs =
FFMIN(ofs, destptr - destptr_bak);
98 cnt =
FFMIN(cnt, destptr_end - destptr);
106 if (destptr_end - destptr < 32 || srcptr_end - srcptr < 32)
break;
107 memcpy(destptr, srcptr, 32);
116 return destptr - destptr_bak;
120 #if CONFIG_ZLIB_DECODER
128 static int zlib_decomp(
AVCodecContext *avctx,
const uint8_t *src,
int src_len,
int offset,
int expected)
131 int zret = inflateReset(&c->zstream);
136 c->zstream.next_in = src;
137 c->zstream.avail_in = src_len;
140 zret = inflate(&c->zstream, Z_FINISH);
141 if (zret != Z_OK && zret != Z_STREAM_END) {
145 if (expected != (
unsigned int)c->zstream.total_out) {
147 expected, c->zstream.total_out);
150 return c->zstream.total_out;
162 const uint8_t *buf = avpkt->
data;
163 int buf_size = avpkt->
size;
165 unsigned char *encoded = (
unsigned char *)buf;
166 unsigned int pixel_ptr;
168 unsigned char *outptr;
169 uint8_t *y_out, *u_out, *v_out;
172 unsigned int mszh_dlen;
173 unsigned char yq, y1q, uq, vq;
175 unsigned int mthread_inlen, mthread_outlen;
176 unsigned int len = buf_size;
196 mthread_inlen =
AV_RL32(encoded);
197 mthread_inlen =
FFMIN(mthread_inlen, len - 8);
198 mthread_outlen =
AV_RL32(encoded+4);
201 if (mthread_outlen != mszh_dlen) {
203 mthread_outlen, mszh_dlen);
206 mszh_dlen =
mszh_decomp(encoded + 8 + mthread_inlen, len - 8 - mthread_inlen,
208 if (mthread_outlen != mszh_dlen) {
210 mthread_outlen, mszh_dlen);
245 if (len < ((width * height * bppx2) >> 1))
254 #if CONFIG_ZLIB_DECODER
260 len == width * height * 3)
264 mthread_inlen =
AV_RL32(encoded);
265 mthread_inlen =
FFMIN(mthread_inlen, len - 8);
266 mthread_outlen =
AV_RL32(encoded+4);
268 ret = zlib_decomp(avctx, encoded + 8, mthread_inlen, 0, mthread_outlen);
269 if (ret < 0)
return ret;
270 ret = zlib_decomp(avctx, encoded + 8 + mthread_inlen, len - 8 - mthread_inlen,
271 mthread_outlen, mthread_outlen);
272 if (ret < 0)
return ret;
274 int ret = zlib_decomp(avctx, encoded, len, 0, c->
decomp_size);
275 if (ret < 0)
return ret;
282 av_log(avctx,
AV_LOG_ERROR,
"BUG! Unknown codec in frame decoder compression switch.\n");
292 for (row = 0; row <
height; row++) {
293 pixel_ptr = row * width * 3;
294 yq = encoded[pixel_ptr++];
295 uqvq =
AV_RL16(encoded+pixel_ptr);
297 for (col = 1; col <
width; col++) {
298 encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
299 uqvq -=
AV_RL16(encoded+pixel_ptr+1);
300 AV_WL16(encoded+pixel_ptr+1, uqvq);
306 for (row = 0; row <
height; row++) {
307 pixel_ptr = row * width * 2;
309 for (col = 0; col < width/4; col++) {
310 encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
311 encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
312 encoded[pixel_ptr+2] = yq -= encoded[pixel_ptr+2];
313 encoded[pixel_ptr+3] = yq -= encoded[pixel_ptr+3];
314 encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
315 encoded[pixel_ptr+5] = uq -= encoded[pixel_ptr+5];
316 encoded[pixel_ptr+6] = vq -= encoded[pixel_ptr+6];
317 encoded[pixel_ptr+7] = vq -= encoded[pixel_ptr+7];
323 for (row = 0; row <
height; row++) {
324 pixel_ptr = row * width / 2 * 3;
326 for (col = 0; col < width/4; col++) {
327 encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
328 encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
329 encoded[pixel_ptr+2] = yq -= encoded[pixel_ptr+2];
330 encoded[pixel_ptr+3] = yq -= encoded[pixel_ptr+3];
331 encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
332 encoded[pixel_ptr+5] = vq -= encoded[pixel_ptr+5];
338 for (row = 0; row <
height; row++) {
339 pixel_ptr = row * width * 2;
341 for (col = 0; col < width/2; col++) {
342 encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
343 encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
344 encoded[pixel_ptr+2] = uq -= encoded[pixel_ptr+2];
345 encoded[pixel_ptr+3] = vq -= encoded[pixel_ptr+3];
351 for (row = 0; row < height/2; row++) {
352 pixel_ptr = row * width * 3;
353 yq = y1q = uq = vq =0;
354 for (col = 0; col < width/2; col++) {
355 encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
356 encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
357 encoded[pixel_ptr+2] = y1q -= encoded[pixel_ptr+2];
358 encoded[pixel_ptr+3] = y1q -= encoded[pixel_ptr+3];
359 encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
360 encoded[pixel_ptr+5] = vq -= encoded[pixel_ptr+5];
377 for (row = 0; row <
height; row++) {
378 for (col = 0; col <
width; col++) {
379 y_out[col] = *encoded++;
380 u_out[col] = *encoded++ + 128;
381 v_out[col] = *encoded++ + 128;
389 for (row = 0; row <
height; row++) {
390 for (col = 0; col < width - 3; col += 4) {
391 memcpy(y_out + col, encoded, 4);
393 u_out[ col >> 1 ] = *encoded++ + 128;
394 u_out[(col >> 1) + 1] = *encoded++ + 128;
395 v_out[ col >> 1 ] = *encoded++ + 128;
396 v_out[(col >> 1) + 1] = *encoded++ + 128;
404 for (row = height - 1; row >= 0; row--) {
406 memcpy(outptr + pixel_ptr, encoded, 3 * width);
407 encoded += 3 *
width;
411 for (row = 0; row <
height; row++) {
412 for (col = 0; col < width - 3; col += 4) {
413 memcpy(y_out + col, encoded, 4);
415 u_out[col >> 2] = *encoded++ + 128;
416 v_out[col >> 2] = *encoded++ + 128;
424 for (row = 0; row <
height; row++) {
425 for (col = 0; col < width - 1; col += 2) {
426 memcpy(y_out + col, encoded, 2);
428 u_out[col >> 1] = *encoded++ + 128;
429 v_out[col >> 1] = *encoded++ + 128;
439 for (row = 0; row < height - 1; row += 2) {
440 for (col = 0; col < width - 1; col += 2) {
441 memcpy(y_out + col, encoded, 2);
443 memcpy(y_out + col - c->
pic.
linesize[0], encoded, 2);
445 u_out[col >> 1] = *encoded++ + 128;
446 v_out[col >> 1] = *encoded++ + 128;
473 unsigned int basesize = avctx->
width * avctx->
height;
475 unsigned int max_decomp_size;
485 av_log(avctx,
AV_LOG_ERROR,
"Codec id and codec type mismatch. This should not happen.\n");
492 max_decomp_size = max_basesize * 3;
498 max_decomp_size = max_basesize * 2;
504 max_decomp_size = max_basesize * 3;
510 max_decomp_size = max_basesize / 2 * 3;
516 max_decomp_size = max_basesize * 2;
522 max_decomp_size = max_basesize / 2 * 3;
548 #if CONFIG_ZLIB_DECODER
594 #if CONFIG_ZLIB_DECODER
597 c->zstream.zalloc = Z_NULL;
598 c->zstream.zfree = Z_NULL;
599 c->zstream.opaque = Z_NULL;
600 zret = inflateInit(&c->zstream);
624 #if CONFIG_ZLIB_DECODER
626 inflateEnd(&c->zstream);
632 #if CONFIG_MSZH_DECODER
646 #if CONFIG_ZLIB_DECODER