diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-12-12 18:13:13 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-12-12 18:13:13 +0100 |
commit | e8dbecb99569e2054babab973e74a69017d02f09 (patch) | |
tree | 6e5631ef7b7d293ac20a4b1edfd3f98540cae113 /libavfilter/vf_spp.c | |
parent | eb725235b03fbaffd670409f12f3f9a71dd12cfd (diff) | |
download | ffmpeg-e8dbecb99569e2054babab973e74a69017d02f09.tar.gz |
avfilter/vf_spp: Allocate qp storage after qp_stride is known
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavfilter/vf_spp.c')
-rw-r--r-- | libavfilter/vf_spp.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/libavfilter/vf_spp.c b/libavfilter/vf_spp.c index 8eb0c7e296..406925ad72 100644 --- a/libavfilter/vf_spp.c +++ b/libavfilter/vf_spp.c @@ -290,13 +290,7 @@ static int config_input(AVFilterLink *inlink) spp->temp_linesize = FFALIGN(inlink->w + 16, 16); spp->temp = av_malloc_array(spp->temp_linesize, h * sizeof(*spp->temp)); spp->src = av_malloc_array(spp->temp_linesize, h * sizeof(*spp->src)); - if (!spp->use_bframe_qp) { - /* we are assuming here the qp blocks will not be smaller that 16x16 */ - spp->non_b_qp_alloc_size = FF_CEIL_RSHIFT(inlink->w, 4) * FF_CEIL_RSHIFT(inlink->h, 4); - spp->non_b_qp_table = av_calloc(spp->non_b_qp_alloc_size, sizeof(*spp->non_b_qp_table)); - if (!spp->non_b_qp_table) - return AVERROR(ENOMEM); - } + if (!spp->temp || !spp->src) return AVERROR(ENOMEM); return 0; @@ -330,6 +324,16 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) w = FF_CEIL_RSHIFT(qp_stride, 4); h = FF_CEIL_RSHIFT(inlink->h, 4); } + + if (w * h > spp->non_b_qp_alloc_size) { + int ret = av_reallocp_array(&spp->non_b_qp_table, w, h); + if (ret < 0) { + spp->non_b_qp_alloc_size = 0; + return ret; + } + spp->non_b_qp_alloc_size = w * h; + } + av_assert0(w * h <= spp->non_b_qp_alloc_size); memcpy(spp->non_b_qp_table, qp_table, w * h); } |