| @@ -121,10 +121,11 @@ static av_cold int flashsv_decode_init(AVCodecContext *avctx) | |||||
| } | } | ||||
| static void flashsv2_prime(FlashSVContext *s, uint8_t *src, | |||||
| int size, int unp_size) | |||||
| static int flashsv2_prime(FlashSVContext *s, uint8_t *src, | |||||
| int size, int unp_size) | |||||
| { | { | ||||
| z_stream zs; | z_stream zs; | ||||
| int zret; // Zlib return code | |||||
| zs.zalloc = NULL; | zs.zalloc = NULL; | ||||
| zs.zfree = NULL; | zs.zfree = NULL; | ||||
| @@ -144,13 +145,18 @@ static void flashsv2_prime(FlashSVContext *s, uint8_t *src, | |||||
| deflate(&zs, Z_SYNC_FLUSH); | deflate(&zs, Z_SYNC_FLUSH); | ||||
| deflateEnd(&zs); | deflateEnd(&zs); | ||||
| inflateReset(&s->zstream); | |||||
| if ((zret = inflateReset(&s->zstream)) != Z_OK) { | |||||
| av_log(s->avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", zret); | |||||
| return AVERROR_UNKNOWN; | |||||
| } | |||||
| s->zstream.next_in = s->deflate_block; | s->zstream.next_in = s->deflate_block; | ||||
| s->zstream.avail_in = s->deflate_block_size - zs.avail_out; | s->zstream.avail_in = s->deflate_block_size - zs.avail_out; | ||||
| s->zstream.next_out = s->tmpblock; | s->zstream.next_out = s->tmpblock; | ||||
| s->zstream.avail_out = s->block_size * 3; | s->zstream.avail_out = s->block_size * 3; | ||||
| inflate(&s->zstream, Z_SYNC_FLUSH); | inflate(&s->zstream, Z_SYNC_FLUSH); | ||||
| return 0; | |||||
| } | } | ||||
| static int flashsv_decode_block(AVCodecContext *avctx, AVPacket *avpkt, | static int flashsv_decode_block(AVCodecContext *avctx, AVPacket *avpkt, | ||||
| @@ -163,11 +169,14 @@ static int flashsv_decode_block(AVCodecContext *avctx, AVPacket *avpkt, | |||||
| int k; | int k; | ||||
| int ret = inflateReset(&s->zstream); | int ret = inflateReset(&s->zstream); | ||||
| if (ret != Z_OK) { | if (ret != Z_OK) { | ||||
| //return -1; | |||||
| av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", ret); | |||||
| return AVERROR_UNKNOWN; | |||||
| } | } | ||||
| if (s->zlibprime_curr || s->zlibprime_prev) { | if (s->zlibprime_curr || s->zlibprime_prev) { | ||||
| flashsv2_prime(s, s->blocks[blk_idx].pos, s->blocks[blk_idx].size, | |||||
| ret = flashsv2_prime(s, s->blocks[blk_idx].pos, s->blocks[blk_idx].size, | |||||
| s->blocks[blk_idx].unp_size); | s->blocks[blk_idx].unp_size); | ||||
| if (ret < 0) | |||||
| return ret; | |||||
| } | } | ||||
| s->zstream.next_in = avpkt->data + get_bits_count(gb) / 8; | s->zstream.next_in = avpkt->data + get_bits_count(gb) / 8; | ||||
| s->zstream.avail_in = block_size; | s->zstream.avail_in = block_size; | ||||