[FFmpeg-cvslog] avfilter/vf_spp: Allocate qp storage after qp_stride is known

Michael Niedermayer git at videolan.org
Fri Dec 12 18:51:00 CET 2014


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Fri Dec 12 18:13:13 2014 +0100| [e8dbecb99569e2054babab973e74a69017d02f09] | committer: Michael Niedermayer

avfilter/vf_spp: Allocate qp storage after qp_stride is known

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e8dbecb99569e2054babab973e74a69017d02f09
---

 libavfilter/vf_spp.c |   18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/libavfilter/vf_spp.c b/libavfilter/vf_spp.c
index 8eb0c7e..406925a 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);
         }



More information about the ffmpeg-cvslog mailing list