comparison lcldec.c @ 9761:b69de727fd7c libavcodec

Fix decoding of multithread-encoded lcl files on big-endian.
author reimar
date Sun, 31 May 2009 10:14:27 +0000
parents 14b65c693625
children 3242ae563430
comparison
equal deleted inserted replaced
9760:14b65c693625 9761:b69de727fd7c
187 switch (avctx->codec_id) { 187 switch (avctx->codec_id) {
188 case CODEC_ID_MSZH: 188 case CODEC_ID_MSZH:
189 switch (c->compression) { 189 switch (c->compression) {
190 case COMP_MSZH: 190 case COMP_MSZH:
191 if (c->flags & FLAG_MULTITHREAD) { 191 if (c->flags & FLAG_MULTITHREAD) {
192 mthread_inlen = *(unsigned int*)encoded; 192 mthread_inlen = AV_RL32(encoded);
193 mthread_inlen = FFMIN(mthread_inlen, len - 8); 193 mthread_inlen = FFMIN(mthread_inlen, len - 8);
194 mthread_outlen = *(unsigned int*)(encoded+4); 194 mthread_outlen = AV_RL32(encoded+4);
195 mthread_outlen = FFMIN(mthread_outlen, c->decomp_size); 195 mthread_outlen = FFMIN(mthread_outlen, c->decomp_size);
196 mszh_dlen = mszh_decomp(encoded + 8, mthread_inlen, c->decomp_buf, c->decomp_size); 196 mszh_dlen = mszh_decomp(encoded + 8, mthread_inlen, c->decomp_buf, c->decomp_size);
197 if (mthread_outlen != mszh_dlen) { 197 if (mthread_outlen != mszh_dlen) {
198 av_log(avctx, AV_LOG_ERROR, "Mthread1 decoded size differs (%d != %d)\n", 198 av_log(avctx, AV_LOG_ERROR, "Mthread1 decoded size differs (%d != %d)\n",
199 mthread_outlen, mszh_dlen); 199 mthread_outlen, mszh_dlen);
234 if (c->compression == COMP_ZLIB_NORMAL && c->imgtype == IMGTYPE_RGB24 && 234 if (c->compression == COMP_ZLIB_NORMAL && c->imgtype == IMGTYPE_RGB24 &&
235 len == width * height * 3) 235 len == width * height * 3)
236 break; 236 break;
237 if (c->flags & FLAG_MULTITHREAD) { 237 if (c->flags & FLAG_MULTITHREAD) {
238 int ret; 238 int ret;
239 mthread_inlen = *(unsigned int*)encoded; 239 mthread_inlen = AV_RL32(encoded);
240 mthread_inlen = FFMIN(mthread_inlen, len - 8); 240 mthread_inlen = FFMIN(mthread_inlen, len - 8);
241 mthread_outlen = *(unsigned int*)(encoded+4); 241 mthread_outlen = AV_RL32(encoded+4);
242 mthread_outlen = FFMIN(mthread_outlen, c->decomp_size); 242 mthread_outlen = FFMIN(mthread_outlen, c->decomp_size);
243 ret = zlib_decomp(avctx, encoded + 8, mthread_inlen, 0, mthread_outlen); 243 ret = zlib_decomp(avctx, encoded + 8, mthread_inlen, 0, mthread_outlen);
244 if (ret < 0) return ret; 244 if (ret < 0) return ret;
245 ret = zlib_decomp(avctx, encoded + 8 + mthread_inlen, len - 8 - mthread_inlen, 245 ret = zlib_decomp(avctx, encoded + 8 + mthread_inlen, len - 8 - mthread_inlen,
246 mthread_outlen, mthread_outlen); 246 mthread_outlen, mthread_outlen);