1 /* 2 * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include <assert.h> 12 13 #include "vp9/common/vp9_frame_buffers.h" 14 #include "vpx_mem/vpx_mem.h" 15 vp9_alloc_internal_frame_buffers(InternalFrameBufferList * list)16int vp9_alloc_internal_frame_buffers(InternalFrameBufferList *list) { 17 const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS; 18 assert(list != NULL); 19 vp9_free_internal_frame_buffers(list); 20 21 list->int_fb = 22 (InternalFrameBuffer *)vpx_calloc(num_buffers, sizeof(*list->int_fb)); 23 if (list->int_fb) { 24 list->num_internal_frame_buffers = num_buffers; 25 return 0; 26 } 27 return -1; 28 } 29 vp9_free_internal_frame_buffers(InternalFrameBufferList * list)30void vp9_free_internal_frame_buffers(InternalFrameBufferList *list) { 31 int i; 32 33 assert(list != NULL); 34 35 for (i = 0; i < list->num_internal_frame_buffers; ++i) { 36 vpx_free(list->int_fb[i].data); 37 list->int_fb[i].data = NULL; 38 } 39 vpx_free(list->int_fb); 40 list->int_fb = NULL; 41 list->num_internal_frame_buffers = 0; 42 } 43 vp9_get_frame_buffer(void * cb_priv,size_t min_size,vpx_codec_frame_buffer_t * fb)44int vp9_get_frame_buffer(void *cb_priv, size_t min_size, 45 vpx_codec_frame_buffer_t *fb) { 46 int i; 47 InternalFrameBufferList *const int_fb_list = 48 (InternalFrameBufferList *)cb_priv; 49 if (int_fb_list == NULL) return -1; 50 51 // Find a free frame buffer. 52 for (i = 0; i < int_fb_list->num_internal_frame_buffers; ++i) { 53 if (!int_fb_list->int_fb[i].in_use) break; 54 } 55 56 if (i == int_fb_list->num_internal_frame_buffers) return -1; 57 58 if (int_fb_list->int_fb[i].size < min_size) { 59 vpx_free(int_fb_list->int_fb[i].data); 60 // The data must be zeroed to fix a valgrind error from the C loop filter 61 // due to access uninitialized memory in frame border. It could be 62 // skipped if border were totally removed. 63 int_fb_list->int_fb[i].data = (uint8_t *)vpx_calloc(1, min_size); 64 if (!int_fb_list->int_fb[i].data) return -1; 65 int_fb_list->int_fb[i].size = min_size; 66 } 67 68 fb->data = int_fb_list->int_fb[i].data; 69 fb->size = int_fb_list->int_fb[i].size; 70 int_fb_list->int_fb[i].in_use = 1; 71 72 // Set the frame buffer's private data to point at the internal frame buffer. 73 fb->priv = &int_fb_list->int_fb[i]; 74 return 0; 75 } 76 vp9_release_frame_buffer(void * cb_priv,vpx_codec_frame_buffer_t * fb)77int vp9_release_frame_buffer(void *cb_priv, vpx_codec_frame_buffer_t *fb) { 78 InternalFrameBuffer *const int_fb = (InternalFrameBuffer *)fb->priv; 79 (void)cb_priv; 80 if (int_fb) int_fb->in_use = 0; 81 return 0; 82 } 83