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