1
From 5b1f79b092a4684c1e700ea21d5da77c68ca7d44 Mon Sep 17 00:00:00 2001
2
From: Laurent Aimar <fenrir@videolan.org>
3
Date: Mon, 12 Sep 2011 23:46:49 +0200
4
Subject: [PATCH 58/70] Check and propagate errors when VLC trees cannot be built in smacker decoder.
6
Content-Type: text/plain; charset=UTF-8
7
Content-Transfer-Encoding: 8bit
9
Signed-off-by: Martin Storsjö <martin@martin.st>
10
(cherry picked from commit 9676ffba8346791f494451e68d2a3b37a2918a9b)
12
Signed-off-by: Anton Khirnov <anton@khirnov.net>
14
libavcodec/smacker.c | 20 ++++++++++++--------
15
1 files changed, 12 insertions(+), 8 deletions(-)
17
diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c
18
index 8060e1c..e8de0d8 100644
19
--- a/libavcodec/smacker.c
20
+++ b/libavcodec/smacker.c
21
@@ -134,10 +134,10 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, DBCtx *ctx
24
b1 = get_bits_count(gb);
25
- i1 = get_vlc2(gb, ctx->v1->table, SMKTREE_BITS, 3);
26
+ i1 = ctx->v1->table ? get_vlc2(gb, ctx->v1->table, SMKTREE_BITS, 3) : 0;
27
b1 = get_bits_count(gb) - b1;
28
b2 = get_bits_count(gb);
29
- i2 = get_vlc2(gb, ctx->v2->table, SMKTREE_BITS, 3);
30
+ i2 = ctx->v2->table ? get_vlc2(gb, ctx->v2->table, SMKTREE_BITS, 3) : 0;
31
b2 = get_bits_count(gb) - b2;
32
val = ctx->recode1[i1] | (ctx->recode2[i2] << 8);
33
if(val == ctx->escapes[0]) {
34
@@ -290,7 +290,8 @@ static int decode_header_trees(SmackVContext *smk) {
36
smk->mmap_last[0] = smk->mmap_last[1] = smk->mmap_last[2] = 1;
38
- smacker_decode_header_tree(smk, &gb, &smk->mmap_tbl, smk->mmap_last, mmap_size);
39
+ if (smacker_decode_header_tree(smk, &gb, &smk->mmap_tbl, smk->mmap_last, mmap_size))
43
av_log(smk->avctx, AV_LOG_INFO, "Skipping MCLR tree\n");
44
@@ -298,7 +299,8 @@ static int decode_header_trees(SmackVContext *smk) {
46
smk->mclr_last[0] = smk->mclr_last[1] = smk->mclr_last[2] = 1;
48
- smacker_decode_header_tree(smk, &gb, &smk->mclr_tbl, smk->mclr_last, mclr_size);
49
+ if (smacker_decode_header_tree(smk, &gb, &smk->mclr_tbl, smk->mclr_last, mclr_size))
53
av_log(smk->avctx, AV_LOG_INFO, "Skipping FULL tree\n");
54
@@ -306,7 +308,8 @@ static int decode_header_trees(SmackVContext *smk) {
56
smk->full_last[0] = smk->full_last[1] = smk->full_last[2] = 1;
58
- smacker_decode_header_tree(smk, &gb, &smk->full_tbl, smk->full_last, full_size);
59
+ if (smacker_decode_header_tree(smk, &gb, &smk->full_tbl, smk->full_last, full_size))
63
av_log(smk->avctx, AV_LOG_INFO, "Skipping TYPE tree\n");
64
@@ -314,7 +317,8 @@ static int decode_header_trees(SmackVContext *smk) {
66
smk->type_last[0] = smk->type_last[1] = smk->type_last[2] = 1;
68
- smacker_decode_header_tree(smk, &gb, &smk->type_tbl, smk->type_last, type_size);
69
+ if (smacker_decode_header_tree(smk, &gb, &smk->type_tbl, smk->type_last, type_size))
74
@@ -522,8 +526,8 @@ static av_cold int decode_init(AVCodecContext *avctx)
78
- decode_header_trees(c);
80
+ if (decode_header_trees(c))