// block reconstruction intermediates
int16_t *block_base, *block, *uvblock_base[2], *uvblock[2];
uint8_t *eob_base, *uveob_base[2], *eob, *uveob[2];
- VP56mv min_mv, max_mv;
+ struct { int x, y; } min_mv, max_mv;
DECLARE_ALIGNED(32, uint8_t, tmp_y)[64*64];
DECLARE_ALIGNED(32, uint8_t, tmp_uv)[2][32*32];
} VP9Context;
f->mv = (struct VP9mvrefPair *) (f->extradata->data + sz);
// retain segmentation map if it doesn't update
- if (s->segmentation.enabled && !s->segmentation.update_map) {
+ if (s->segmentation.enabled && !s->segmentation.update_map &&
+ !s->keyframe && !s->intraonly) {
memcpy(f->segmentation_map, s->frames[LAST_FRAME].segmentation_map, sz);
}
// allows to support emu-edge and so on even if we have large block
// overhangs
emu[0] = (col + w4) * 8 > f->linesize[0] ||
- (row + h4) > s->rows + 2 * !(ctx->flags & CODEC_FLAG_EMU_EDGE);
+ (row + h4) > s->rows;
emu[1] = (col + w4) * 4 > f->linesize[1] ||
- (row + h4) > s->rows + 2 * !(ctx->flags & CODEC_FLAG_EMU_EDGE);
+ (row + h4) > s->rows;
if (emu[0]) {
s->dst[0] = s->tmp_y;
s->y_stride = 64;
}
}
+static void free_buffers(VP9Context *s)
+{
+ av_freep(&s->above_partition_ctx);
+ av_freep(&s->b_base);
+ av_freep(&s->block_base);
+}
+
static av_cold int vp9_decode_free(AVCodecContext *ctx)
{
VP9Context *s = ctx->priv_data;
ff_thread_release_buffer(ctx, &s->next_refs[i]);
av_frame_free(&s->next_refs[i].f);
}
- av_freep(&s->above_partition_ctx);
+ free_buffers(s);
av_freep(&s->c_b);
s->c_b_size = 0;
- av_freep(&s->b_base);
- av_freep(&s->block_base);
return 0;
}
if (s->refreshctx && s->parallelmode) {
int j, k, l, m;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++) {
for (j = 0; j < 2; j++)
for (k = 0; k < 2; k++)
for (l = 0; l < 6; l++)
for (m = 0; m < 6; m++)
memcpy(s->prob_ctx[s->framectxid].coef[i][j][k][l][m],
s->prob.coef[i][j][k][l][m], 3);
+ if (s->txfmmode == i)
+ break;
+ }
s->prob_ctx[s->framectxid].p = s->prob.p;
ff_thread_finish_setup(ctx);
}
int i, res;
VP9Context *s = dst->priv_data, *ssrc = src->priv_data;
- // FIXME scalability, size, etc.
+ // detect size changes in other threads
+ if (s->above_partition_ctx && (s->cols != ssrc->cols || s->rows != ssrc->rows)) {
+ free_buffers(s);
+ }
for (i = 0; i < 2; i++) {
if (s->frames[i].tf.f->data[0])