|
|
|
@@ -223,6 +223,10 @@ typedef struct Vp3DecodeContext { |
|
|
|
* which of the fragments are coded */ |
|
|
|
int *coded_fragment_list[3]; |
|
|
|
|
|
|
|
int *kf_coded_fragment_list; |
|
|
|
int *nkf_coded_fragment_list; |
|
|
|
int num_kf_coded_fragment[3]; |
|
|
|
|
|
|
|
VLC dc_vlc[16]; |
|
|
|
VLC ac_vlc_1[16]; |
|
|
|
VLC ac_vlc_2[16]; |
|
|
|
@@ -271,7 +275,8 @@ static av_cold void free_tables(AVCodecContext *avctx) |
|
|
|
|
|
|
|
av_freep(&s->superblock_coding); |
|
|
|
av_freep(&s->all_fragments); |
|
|
|
av_freep(&s->coded_fragment_list[0]); |
|
|
|
av_freep(&s->nkf_coded_fragment_list); |
|
|
|
av_freep(&s->kf_coded_fragment_list); |
|
|
|
av_freep(&s->dct_tokens_base); |
|
|
|
av_freep(&s->superblock_fragments); |
|
|
|
av_freep(&s->macroblock_coding); |
|
|
|
@@ -538,6 +543,9 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) |
|
|
|
s->total_num_coded_frags = 0; |
|
|
|
memset(s->macroblock_coding, MODE_COPY, s->macroblock_count); |
|
|
|
|
|
|
|
s->coded_fragment_list[0] = s->keyframe ? s->kf_coded_fragment_list |
|
|
|
: s->nkf_coded_fragment_list; |
|
|
|
|
|
|
|
for (plane = 0; plane < 3; plane++) { |
|
|
|
int sb_start = superblock_starts[plane]; |
|
|
|
int sb_end = sb_start + (plane ? s->c_superblock_count |
|
|
|
@@ -545,17 +553,21 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) |
|
|
|
int num_coded_frags = 0; |
|
|
|
|
|
|
|
if (s->keyframe) { |
|
|
|
for (i = sb_start; i < sb_end; i++) { |
|
|
|
/* iterate through all 16 fragments in a superblock */ |
|
|
|
for (j = 0; j < 16; j++) { |
|
|
|
/* if the fragment is in bounds, check its coding status */ |
|
|
|
current_fragment = s->superblock_fragments[i * 16 + j]; |
|
|
|
if (current_fragment != -1) { |
|
|
|
s->coded_fragment_list[plane][num_coded_frags++] = |
|
|
|
current_fragment; |
|
|
|
if (s->num_kf_coded_fragment[plane] == -1) { |
|
|
|
for (i = sb_start; i < sb_end; i++) { |
|
|
|
/* iterate through all 16 fragments in a superblock */ |
|
|
|
for (j = 0; j < 16; j++) { |
|
|
|
/* if the fragment is in bounds, check its coding status */ |
|
|
|
current_fragment = s->superblock_fragments[i * 16 + j]; |
|
|
|
if (current_fragment != -1) { |
|
|
|
s->coded_fragment_list[plane][num_coded_frags++] = |
|
|
|
current_fragment; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
s->num_kf_coded_fragment[plane] = num_coded_frags; |
|
|
|
} else |
|
|
|
num_coded_frags = s->num_kf_coded_fragment[plane]; |
|
|
|
} else { |
|
|
|
for (i = sb_start; i < sb_end && get_bits_left(gb) > 0; i++) { |
|
|
|
if (get_bits_left(gb) < plane0_num_coded_frags >> 2) { |
|
|
|
@@ -1705,7 +1717,9 @@ static av_cold int allocate_tables(AVCodecContext *avctx) |
|
|
|
s->superblock_coding = av_mallocz(s->superblock_count); |
|
|
|
s->all_fragments = av_mallocz_array(s->fragment_count, sizeof(Vp3Fragment)); |
|
|
|
|
|
|
|
s->coded_fragment_list[0] = av_mallocz_array(s->fragment_count, sizeof(int)); |
|
|
|
s-> kf_coded_fragment_list = av_mallocz_array(s->fragment_count, sizeof(int)); |
|
|
|
s->nkf_coded_fragment_list = av_mallocz_array(s->fragment_count, sizeof(int)); |
|
|
|
memset(s-> num_kf_coded_fragment, -1, sizeof(s-> num_kf_coded_fragment)); |
|
|
|
|
|
|
|
s->dct_tokens_base = av_mallocz_array(s->fragment_count, |
|
|
|
64 * sizeof(*s->dct_tokens_base)); |
|
|
|
@@ -1717,7 +1731,8 @@ static av_cold int allocate_tables(AVCodecContext *avctx) |
|
|
|
s->macroblock_coding = av_mallocz(s->macroblock_count + 1); |
|
|
|
|
|
|
|
if (!s->superblock_coding || !s->all_fragments || |
|
|
|
!s->dct_tokens_base || !s->coded_fragment_list[0] || |
|
|
|
!s->dct_tokens_base || !s->kf_coded_fragment_list || |
|
|
|
!s->nkf_coded_fragment_list || |
|
|
|
!s->superblock_fragments || !s->macroblock_coding || |
|
|
|
!s->motion_val[0] || !s->motion_val[1]) { |
|
|
|
vp3_decode_end(avctx); |
|
|
|
@@ -2271,6 +2286,8 @@ static int vp3_init_thread_copy(AVCodecContext *avctx) |
|
|
|
s->superblock_coding = NULL; |
|
|
|
s->all_fragments = NULL; |
|
|
|
s->coded_fragment_list[0] = NULL; |
|
|
|
s-> kf_coded_fragment_list= NULL; |
|
|
|
s->nkf_coded_fragment_list= NULL; |
|
|
|
s->dct_tokens_base = NULL; |
|
|
|
s->superblock_fragments = NULL; |
|
|
|
s->macroblock_coding = NULL; |
|
|
|
|