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 44eba33..70b3009 100644 --- a/test/external_frame_buffer_test.cc +++ b/test/external_frame_buffer_test.cc
@@ -71,6 +71,7 @@ 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 733b3a9..34795b7 100644 --- a/vp9/common/vp9_frame_buffers.c +++ b/vp9/common/vp9_frame_buffers.c
@@ -61,6 +61,10 @@ 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 e69df4b..41038b1 100644 --- a/vpx/vpx_frame_buffer.h +++ b/vpx/vpx_frame_buffer.h
@@ -43,15 +43,15 @@ * * 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 70d7ac0..475d231 100644 --- a/vpx_scale/generic/yv12config.c +++ b/vpx_scale/generic/yv12config.c
@@ -199,11 +199,6 @@ 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 091522f..cf23c29 100644 --- a/vpxdec.c +++ b/vpxdec.c
@@ -384,7 +384,7 @@ 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;