vp9: allocate 'b', 'block/uvblock' and 'eob/uveob' dynamically.
This commit is contained in:
parent
fc7d910b2e
commit
46955ae430
@ -98,7 +98,7 @@ typedef struct VP9Context {
|
|||||||
VP56RangeCoder c;
|
VP56RangeCoder c;
|
||||||
VP56RangeCoder *c_b;
|
VP56RangeCoder *c_b;
|
||||||
unsigned c_b_size;
|
unsigned c_b_size;
|
||||||
VP9Block b;
|
VP9Block *b_base, *b;
|
||||||
int row, row7, col, col7;
|
int row, row7, col, col7;
|
||||||
uint8_t *dst[3];
|
uint8_t *dst[3];
|
||||||
ptrdiff_t y_stride, uv_stride;
|
ptrdiff_t y_stride, uv_stride;
|
||||||
@ -228,10 +228,8 @@ typedef struct VP9Context {
|
|||||||
DECLARE_ALIGNED(32, uint8_t, edge_emu_buffer)[71*80];
|
DECLARE_ALIGNED(32, uint8_t, edge_emu_buffer)[71*80];
|
||||||
|
|
||||||
// block reconstruction intermediates
|
// block reconstruction intermediates
|
||||||
DECLARE_ALIGNED(32, int16_t, block)[4096];
|
int16_t *block_base, *block, *uvblock_base[2], *uvblock[2];
|
||||||
DECLARE_ALIGNED(32, int16_t, uvblock)[2][1024];
|
uint8_t *eob_base, *uveob_base[2], *eob, *uveob[2];
|
||||||
uint8_t eob[256];
|
|
||||||
uint8_t uveob[2][64];
|
|
||||||
VP56mv min_mv, max_mv;
|
VP56mv min_mv, max_mv;
|
||||||
DECLARE_ALIGNED(32, uint8_t, tmp_y)[64*64];
|
DECLARE_ALIGNED(32, uint8_t, tmp_y)[64*64];
|
||||||
DECLARE_ALIGNED(32, uint8_t, tmp_uv)[2][32*32];
|
DECLARE_ALIGNED(32, uint8_t, tmp_uv)[2][32*32];
|
||||||
@ -330,6 +328,18 @@ static int update_size(AVCodecContext *ctx, int w, int h)
|
|||||||
assign(s->above_mv_ctx, VP56mv(*)[2], 16);
|
assign(s->above_mv_ctx, VP56mv(*)[2], 16);
|
||||||
#undef assign
|
#undef assign
|
||||||
|
|
||||||
|
av_free(s->b_base);
|
||||||
|
av_free(s->block_base);
|
||||||
|
s->b_base = av_malloc(sizeof(VP9Block));
|
||||||
|
s->block_base = av_mallocz((64 * 64 + 128) * 3);
|
||||||
|
if (!s->b_base || !s->block_base)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
s->uvblock_base[0] = s->block_base + 64 * 64;
|
||||||
|
s->uvblock_base[1] = s->uvblock_base[0] + 32 * 32;
|
||||||
|
s->eob_base = (uint8_t *) (s->uvblock_base[1] + 32 * 32);
|
||||||
|
s->uveob_base[0] = s->eob_base + 256;
|
||||||
|
s->uveob_base[1] = s->uveob_base[0] + 64;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -908,7 +918,7 @@ static void find_ref_mvs(VP9Context *s,
|
|||||||
[BS_4x4] = {{ 0, -1 }, { -1, 0 }, { -1, -1 }, { 0, -2 },
|
[BS_4x4] = {{ 0, -1 }, { -1, 0 }, { -1, -1 }, { 0, -2 },
|
||||||
{ -2, 0 }, { -1, -2 }, { -2, -1 }, { -2, -2 }},
|
{ -2, 0 }, { -1, -2 }, { -2, -1 }, { -2, -2 }},
|
||||||
};
|
};
|
||||||
VP9Block *const b = &s->b;
|
VP9Block *b = s->b;
|
||||||
int row = s->row, col = s->col, row7 = s->row7;
|
int row = s->row, col = s->col, row7 = s->row7;
|
||||||
const int8_t (*p)[2] = mv_ref_blk_off[b->bs];
|
const int8_t (*p)[2] = mv_ref_blk_off[b->bs];
|
||||||
#define INVALID_MV 0x80008000U
|
#define INVALID_MV 0x80008000U
|
||||||
@ -1121,7 +1131,7 @@ static av_always_inline int read_mv_component(VP9Context *s, int idx, int hp)
|
|||||||
static void fill_mv(VP9Context *s,
|
static void fill_mv(VP9Context *s,
|
||||||
VP56mv *mv, int mode, int sb)
|
VP56mv *mv, int mode, int sb)
|
||||||
{
|
{
|
||||||
VP9Block *const b = &s->b;
|
VP9Block *b = s->b;
|
||||||
|
|
||||||
if (mode == ZEROMV) {
|
if (mode == ZEROMV) {
|
||||||
memset(mv, 0, sizeof(*mv) * 2);
|
memset(mv, 0, sizeof(*mv) * 2);
|
||||||
@ -1204,7 +1214,7 @@ static void decode_mode(AVCodecContext *ctx)
|
|||||||
TX_16X16, TX_8X8, TX_8X8, TX_8X8, TX_4X4, TX_4X4, TX_4X4
|
TX_16X16, TX_8X8, TX_8X8, TX_8X8, TX_4X4, TX_4X4, TX_4X4
|
||||||
};
|
};
|
||||||
VP9Context *s = ctx->priv_data;
|
VP9Context *s = ctx->priv_data;
|
||||||
VP9Block *const b = &s->b;
|
VP9Block *b = s->b;
|
||||||
int row = s->row, col = s->col, row7 = s->row7;
|
int row = s->row, col = s->col, row7 = s->row7;
|
||||||
enum TxfmMode max_tx = max_tx_for_bl_bp[b->bs];
|
enum TxfmMode max_tx = max_tx_for_bl_bp[b->bs];
|
||||||
int w4 = FFMIN(s->cols - col, bwh_tab[1][b->bs][0]);
|
int w4 = FFMIN(s->cols - col, bwh_tab[1][b->bs][0]);
|
||||||
@ -1952,7 +1962,7 @@ static int decode_coeffs_b(VP56RangeCoder *c, int16_t *coef, int n_coeffs,
|
|||||||
static int decode_coeffs(AVCodecContext *ctx)
|
static int decode_coeffs(AVCodecContext *ctx)
|
||||||
{
|
{
|
||||||
VP9Context *s = ctx->priv_data;
|
VP9Context *s = ctx->priv_data;
|
||||||
VP9Block *const b = &s->b;
|
VP9Block *b = s->b;
|
||||||
int row = s->row, col = s->col;
|
int row = s->row, col = s->col;
|
||||||
uint8_t (*p)[6][11] = s->prob.coef[b->tx][0 /* y */][!b->intra];
|
uint8_t (*p)[6][11] = s->prob.coef[b->tx][0 /* y */][!b->intra];
|
||||||
unsigned (*c)[6][3] = s->counts.coef[b->tx][0 /* y */][!b->intra];
|
unsigned (*c)[6][3] = s->counts.coef[b->tx][0 /* y */][!b->intra];
|
||||||
@ -2196,7 +2206,7 @@ static av_always_inline int check_intra_mode(VP9Context *s, int mode, uint8_t **
|
|||||||
static void intra_recon(AVCodecContext *ctx, ptrdiff_t y_off, ptrdiff_t uv_off)
|
static void intra_recon(AVCodecContext *ctx, ptrdiff_t y_off, ptrdiff_t uv_off)
|
||||||
{
|
{
|
||||||
VP9Context *s = ctx->priv_data;
|
VP9Context *s = ctx->priv_data;
|
||||||
VP9Block *const b = &s->b;
|
VP9Block *b = s->b;
|
||||||
int row = s->row, col = s->col;
|
int row = s->row, col = s->col;
|
||||||
int w4 = bwh_tab[1][b->bs][0] << 1, step1d = 1 << b->tx, n;
|
int w4 = bwh_tab[1][b->bs][0] << 1, step1d = 1 << b->tx, n;
|
||||||
int h4 = bwh_tab[1][b->bs][1] << 1, x, y, step = 1 << (b->tx * 2);
|
int h4 = bwh_tab[1][b->bs][1] << 1, x, y, step = 1 << (b->tx * 2);
|
||||||
@ -2337,7 +2347,7 @@ static void inter_recon(AVCodecContext *ctx)
|
|||||||
{ 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4 },
|
{ 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4 },
|
||||||
};
|
};
|
||||||
VP9Context *s = ctx->priv_data;
|
VP9Context *s = ctx->priv_data;
|
||||||
VP9Block *const b = &s->b;
|
VP9Block *b = s->b;
|
||||||
int row = s->row, col = s->col;
|
int row = s->row, col = s->col;
|
||||||
ThreadFrame *tref1 = &s->refs[s->refidx[b->ref[0]]];
|
ThreadFrame *tref1 = &s->refs[s->refidx[b->ref[0]]];
|
||||||
AVFrame *ref1 = tref1->f;
|
AVFrame *ref1 = tref1->f;
|
||||||
@ -2654,7 +2664,7 @@ static int decode_b(AVCodecContext *ctx, int row, int col,
|
|||||||
enum BlockLevel bl, enum BlockPartition bp)
|
enum BlockLevel bl, enum BlockPartition bp)
|
||||||
{
|
{
|
||||||
VP9Context *s = ctx->priv_data;
|
VP9Context *s = ctx->priv_data;
|
||||||
VP9Block *const b = &s->b;
|
VP9Block *b = s->b;
|
||||||
enum BlockSize bs = bl * 3 + bp;
|
enum BlockSize bs = bl * 3 + bp;
|
||||||
int res, y, w4 = bwh_tab[1][bs][0], h4 = bwh_tab[1][bs][1], lvl;
|
int res, y, w4 = bwh_tab[1][bs][0], h4 = bwh_tab[1][bs][1], lvl;
|
||||||
int emu[2];
|
int emu[2];
|
||||||
@ -3367,6 +3377,8 @@ static av_cold int vp9_decode_free(AVCodecContext *ctx)
|
|||||||
}
|
}
|
||||||
av_freep(&s->above_partition_ctx);
|
av_freep(&s->above_partition_ctx);
|
||||||
av_freep(&s->c_b);
|
av_freep(&s->c_b);
|
||||||
|
av_freep(&s->b_base);
|
||||||
|
av_freep(&s->block_base);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3433,6 +3445,13 @@ static int vp9_decode_frame(AVCodecContext *ctx, AVFrame *frame,
|
|||||||
memset(s->above_uv_nnz_ctx[0], 0, s->sb_cols * 8);
|
memset(s->above_uv_nnz_ctx[0], 0, s->sb_cols * 8);
|
||||||
memset(s->above_uv_nnz_ctx[1], 0, s->sb_cols * 8);
|
memset(s->above_uv_nnz_ctx[1], 0, s->sb_cols * 8);
|
||||||
memset(s->above_segpred_ctx, 0, s->cols);
|
memset(s->above_segpred_ctx, 0, s->cols);
|
||||||
|
s->b = s->b_base;
|
||||||
|
s->block = s->block_base;
|
||||||
|
s->uvblock[0] = s->uvblock_base[0];
|
||||||
|
s->uvblock[1] = s->uvblock_base[1];
|
||||||
|
s->eob = s->eob_base;
|
||||||
|
s->uveob[0] = s->uveob_base[0];
|
||||||
|
s->uveob[1] = s->uveob_base[1];
|
||||||
for (tile_row = 0; tile_row < s->tiling.tile_rows; tile_row++) {
|
for (tile_row = 0; tile_row < s->tiling.tile_rows; tile_row++) {
|
||||||
set_tile_offset(&s->tiling.tile_row_start, &s->tiling.tile_row_end,
|
set_tile_offset(&s->tiling.tile_row_start, &s->tiling.tile_row_end,
|
||||||
tile_row, s->tiling.log2_tile_rows, s->sb_rows);
|
tile_row, s->tiling.log2_tile_rows, s->sb_rows);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user