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 assert(list != NULL); 18 vp9_free_internal_frame_buffers(list); 19 20 list->num_internal_frame_buffers = 21 VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS; 22 list->int_fb = (InternalFrameBuffer *)vpx_calloc( 23 list->num_internal_frame_buffers, sizeof(*list->int_fb)); 24 return (list->int_fb == NULL); 25 } 26 vp9_free_internal_frame_buffers(InternalFrameBufferList * list)27void vp9_free_internal_frame_buffers(InternalFrameBufferList *list) { 28 int i; 29 30 assert(list != NULL); 31 32 for (i = 0; i < list->num_internal_frame_buffers; ++i) { 33 vpx_free(list->int_fb[i].data); 34 list->int_fb[i].data = NULL; 35 } 36 vpx_free(list->int_fb); 37 list->int_fb = NULL; 38 } 39 vp9_get_frame_buffer(void * cb_priv,size_t min_size,vpx_codec_frame_buffer_t * fb)40int vp9_get_frame_buffer(void *cb_priv, size_t min_size, 41 vpx_codec_frame_buffer_t *fb) { 42 int i; 43 InternalFrameBufferList *const int_fb_list = 44 (InternalFrameBufferList *)cb_priv; 45 if (int_fb_list == NULL) return -1; 46 47 // Find a free frame buffer. 48 for (i = 0; i < int_fb_list->num_internal_frame_buffers; ++i) { 49 if (!int_fb_list->int_fb[i].in_use) break; 50 } 51 52 if (i == int_fb_list->num_internal_frame_buffers) return -1; 53 54 if (int_fb_list->int_fb[i].size < min_size) { 55 vpx_free(int_fb_list->int_fb[i].data); 56 // The data must be zeroed to fix a valgrind error from the C loop filter 57 // due to access uninitialized memory in frame border. It could be 58 // skipped if border were totally removed. 59 int_fb_list->int_fb[i].data = (uint8_t *)vpx_calloc(1, min_size); 60 if (!int_fb_list->int_fb[i].data) return -1; 61 int_fb_list->int_fb[i].size = min_size; 62 } 63 64 fb->data = int_fb_list->int_fb[i].data; 65 fb->size = int_fb_list->int_fb[i].size; 66 int_fb_list->int_fb[i].in_use = 1; 67 68 // Set the frame buffer's private data to point at the internal frame buffer. 69 fb->priv = &int_fb_list->int_fb[i]; 70 return 0; 71 } 72 vp9_release_frame_buffer(void * cb_priv,vpx_codec_frame_buffer_t * fb)73int vp9_release_frame_buffer(void *cb_priv, vpx_codec_frame_buffer_t *fb) { 74 InternalFrameBuffer *const int_fb = (InternalFrameBuffer *)fb->priv; 75 (void)cb_priv; 76 if (int_fb) int_fb->in_use = 0; 77 return 0; 78 } 79