| Index: source/libvpx/vpx_scale/generic/yv12config.c
|
| ===================================================================
|
| --- source/libvpx/vpx_scale/generic/yv12config.c (revision 251189)
|
| +++ source/libvpx/vpx_scale/generic/yv12config.c (working copy)
|
| @@ -8,6 +8,8 @@
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
|
|
| +#include <assert.h>
|
| +
|
| #include "./vpx_config.h"
|
| #include "vpx_scale/yv12config.h"
|
| #include "vpx_mem/vpx_mem.h"
|
| @@ -19,10 +21,17 @@
|
| /****************************************************************************
|
| *
|
| ****************************************************************************/
|
| +#define yv12_align_addr(addr, align) \
|
| + (void*)(((size_t)(addr) + ((align) - 1)) & (size_t)-(align))
|
| +
|
| int
|
| vp8_yv12_de_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf) {
|
| if (ybf) {
|
| - vpx_free(ybf->buffer_alloc);
|
| + // If libvpx is using frame buffer callbacks then buffer_alloc_sz must
|
| + // not be set.
|
| + if (ybf->buffer_alloc_sz > 0) {
|
| + vpx_free(ybf->buffer_alloc);
|
| + }
|
|
|
| /* buffer_alloc isn't accessed by most functions. Rather y_buffer,
|
| u_buffer and v_buffer point to buffer_alloc and are used. Clear out
|
| @@ -51,7 +60,7 @@
|
| const int frame_size = yplane_size + 2 * uvplane_size;
|
|
|
| if (!ybf->buffer_alloc) {
|
| - ybf->buffer_alloc = vpx_memalign(32, frame_size);
|
| + ybf->buffer_alloc = (uint8_t *)vpx_memalign(32, frame_size);
|
| ybf->buffer_alloc_sz = frame_size;
|
| }
|
|
|
| @@ -108,7 +117,9 @@
|
|
|
| int vp9_free_frame_buffer(YV12_BUFFER_CONFIG *ybf) {
|
| if (ybf) {
|
| - vpx_free(ybf->buffer_alloc);
|
| + if (ybf->buffer_alloc_sz > 0) {
|
| + vpx_free(ybf->buffer_alloc);
|
| + }
|
|
|
| /* buffer_alloc isn't accessed by most functions. Rather y_buffer,
|
| u_buffer and v_buffer point to buffer_alloc and are used. Clear out
|
| @@ -123,7 +134,10 @@
|
|
|
| int vp9_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf,
|
| int width, int height,
|
| - int ss_x, int ss_y, int border) {
|
| + int ss_x, int ss_y, int border,
|
| + vpx_codec_frame_buffer_t *fb,
|
| + vpx_get_frame_buffer_cb_fn_t cb,
|
| + void *cb_priv) {
|
| if (ybf) {
|
| const int aligned_width = (width + 7) & ~7;
|
| const int aligned_height = (height + 7) & ~7;
|
| @@ -148,25 +162,41 @@
|
| #else
|
| const int frame_size = yplane_size + 2 * uvplane_size;
|
| #endif
|
| - if (frame_size > ybf->buffer_alloc_sz) {
|
| + if (cb != NULL) {
|
| + const int align_addr_extra_size = 31;
|
| + const size_t external_frame_size = frame_size + align_addr_extra_size;
|
| +
|
| + assert(fb != NULL);
|
| +
|
| // Allocation to hold larger frame, or first allocation.
|
| + if (cb(cb_priv, external_frame_size, fb) < 0)
|
| + return -1;
|
| +
|
| + 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 > ybf->buffer_alloc_sz) {
|
| + // Allocation to hold larger frame, or first allocation.
|
| if (ybf->buffer_alloc)
|
| vpx_free(ybf->buffer_alloc);
|
| - ybf->buffer_alloc = vpx_memalign(32, frame_size);
|
| + ybf->buffer_alloc = (uint8_t *)vpx_memalign(32, frame_size);
|
| if (!ybf->buffer_alloc)
|
| return -1;
|
|
|
| ybf->buffer_alloc_sz = frame_size;
|
|
|
| // This memset is needed for fixing valgrind error from C loop filter
|
| - // due to access uninitialized memory in frame boarder. It could be
|
| + // due to access uninitialized memory in frame border. It could be
|
| // removed if border is totally removed.
|
| vpx_memset(ybf->buffer_alloc, 0, ybf->buffer_alloc_sz);
|
| }
|
|
|
| - if (ybf->buffer_alloc_sz < frame_size)
|
| - return -1;
|
| -
|
| /* Only support allocating buffers that have a border that's a multiple
|
| * of 32. The border restriction is required to get 16-byte alignment of
|
| * the start of the chroma rows without introducing an arbitrary gap
|
| @@ -214,7 +244,8 @@
|
| int ss_x, int ss_y, int border) {
|
| if (ybf) {
|
| vp9_free_frame_buffer(ybf);
|
| - return vp9_realloc_frame_buffer(ybf, width, height, ss_x, ss_y, border);
|
| + return vp9_realloc_frame_buffer(ybf, width, height, ss_x, ss_y, border,
|
| + NULL, NULL, NULL);
|
| }
|
| return -2;
|
| }
|
|
|