From: Frank Galligan Date: Thu, 11 Sep 2014 15:39:38 +0000 (-0700) Subject: Remove memset of every external frame buffer. X-Git-Tag: v1.4.0~761^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=175d9dfe0af6912fb9ecf7f94bd581a6b45d57a9;p=libvpx Remove memset of every external frame buffer. Libvpx was memseting every external frame buffer before decode. This was to work around a valgrind issue in our C loop filter. Most of the time this was not needed and we have noticed some significant performance loss on some platforms. Now we require the application to zero out the buffers if it is using external frame buffers. Change-Id: I7330d00a315e65137ed30edd5f813e8929b76242 --- diff --git a/test/external_frame_buffer_test.cc b/test/external_frame_buffer_test.cc index 44eba3317..70b300928 100644 --- a/test/external_frame_buffer_test.cc +++ b/test/external_frame_buffer_test.cc @@ -71,6 +71,7 @@ class ExternalFrameBufferList { if (ext_fb_list_[idx].size < min_size) { delete [] ext_fb_list_[idx].data; ext_fb_list_[idx].data = new uint8_t[min_size]; + memset(ext_fb_list_[idx].data, 0, min_size); ext_fb_list_[idx].size = min_size; } diff --git a/vp9/common/vp9_frame_buffers.c b/vp9/common/vp9_frame_buffers.c index 733b3a927..34795b74e 100644 --- a/vp9/common/vp9_frame_buffers.c +++ b/vp9/common/vp9_frame_buffers.c @@ -61,6 +61,10 @@ int vp9_get_frame_buffer(void *cb_priv, size_t min_size, if (!int_fb_list->int_fb[i].data) return -1; + // This memset is needed for fixing valgrind error from C loop filter + // due to access uninitialized memory in frame border. It could be + // removed if border is totally removed. + vpx_memset(int_fb_list->int_fb[i].data, 0, min_size); int_fb_list->int_fb[i].size = min_size; } diff --git a/vpx/vpx_frame_buffer.h b/vpx/vpx_frame_buffer.h index e69df4bc8..41038b10d 100644 --- a/vpx/vpx_frame_buffer.h +++ b/vpx/vpx_frame_buffer.h @@ -43,15 +43,15 @@ typedef struct vpx_codec_frame_buffer { * * This callback is invoked by the decoder to retrieve data for the frame * buffer in order for the decode call to complete. The callback must - * allocate at least min_size in bytes and assign it to fb->data. Then the - * callback must set fb->size to the allocated size. The application does not - * need to align the allocated data. The callback is triggered when the - * decoder needs a frame buffer to decode a compressed image into. This - * function may be called more than once for every call to vpx_codec_decode. - * The application may set fb->priv to some data which will be passed - * back in the ximage and the release function call. |fb| is guaranteed to - * not be NULL. On success the callback must return 0. Any failure the - * callback must return a value less than 0. + * allocate at least min_size in bytes and assign it to fb->data. The callback + * must zero out all the data allocated. Then the callback must set fb->size + * to the allocated size. The application does not need to align the allocated + * data. The callback is triggered when the decoder needs a frame buffer to + * decode a compressed image into. This function may be called more than once + * for every call to vpx_codec_decode. The application may set fb->priv to + * some data which will be passed back in the ximage and the release function + * call. |fb| is guaranteed to not be NULL. On success the callback must + * return 0. Any failure the callback must return a value less than 0. * * \param[in] priv Callback's private data * \param[in] new_size Size in bytes needed by the buffer diff --git a/vpx_scale/generic/yv12config.c b/vpx_scale/generic/yv12config.c index 70d7ac0c8..475d231e1 100644 --- a/vpx_scale/generic/yv12config.c +++ b/vpx_scale/generic/yv12config.c @@ -199,11 +199,6 @@ int vp9_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, if (fb->data == NULL || fb->size < external_frame_size) return -1; - // This memset is needed for fixing valgrind error from C loop filter - // due to access uninitialized memory in frame border. It could be - // removed if border is totally removed. - vpx_memset(fb->data, 0, fb->size); - ybf->buffer_alloc = (uint8_t *)yv12_align_addr(fb->data, 32); } else if (frame_size > (size_t)ybf->buffer_alloc_sz) { // Allocation to hold larger frame, or first allocation. diff --git a/vpxdec.c b/vpxdec.c index 091522f06..cf23c295e 100644 --- a/vpxdec.c +++ b/vpxdec.c @@ -384,7 +384,7 @@ int get_vp9_frame_buffer(void *cb_priv, size_t min_size, if (ext_fb_list->ext_fb[i].size < min_size) { free(ext_fb_list->ext_fb[i].data); - ext_fb_list->ext_fb[i].data = (uint8_t *)malloc(min_size); + ext_fb_list->ext_fb[i].data = (uint8_t *)calloc(min_size, sizeof(uint8_t)); if (!ext_fb_list->ext_fb[i].data) return -1;