blob: f10ccd59420e953eeae285278561065457a467bf [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07004 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
12#include <assert.h>
13
14#include "av1/common/frame_buffers.h"
Yaowu Xuf883b422016-08-30 14:01:10 -070015#include "aom_mem/aom_mem.h"
Yaowu Xuc27fc142016-08-22 16:08:15 -070016
Yaowu Xuf883b422016-08-30 14:01:10 -070017int av1_alloc_internal_frame_buffers(InternalFrameBufferList *list) {
Yaowu Xuc27fc142016-08-22 16:08:15 -070018 assert(list != NULL);
Yaowu Xuf883b422016-08-30 14:01:10 -070019 av1_free_internal_frame_buffers(list);
Yaowu Xuc27fc142016-08-22 16:08:15 -070020
21 list->num_internal_frame_buffers =
Yaowu Xuf883b422016-08-30 14:01:10 -070022 AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS;
23 list->int_fb = (InternalFrameBuffer *)aom_calloc(
Yaowu Xuc27fc142016-08-22 16:08:15 -070024 list->num_internal_frame_buffers, sizeof(*list->int_fb));
Wan-Teh Chang2ab147d2018-10-02 16:06:26 -070025 if (list->int_fb == NULL) {
26 list->num_internal_frame_buffers = 0;
27 return 1;
28 }
29 return 0;
Yaowu Xuc27fc142016-08-22 16:08:15 -070030}
31
Yaowu Xuf883b422016-08-30 14:01:10 -070032void av1_free_internal_frame_buffers(InternalFrameBufferList *list) {
Yaowu Xuc27fc142016-08-22 16:08:15 -070033 int i;
34
35 assert(list != NULL);
36
37 for (i = 0; i < list->num_internal_frame_buffers; ++i) {
Yaowu Xuf883b422016-08-30 14:01:10 -070038 aom_free(list->int_fb[i].data);
Yaowu Xuc27fc142016-08-22 16:08:15 -070039 list->int_fb[i].data = NULL;
40 }
Yaowu Xuf883b422016-08-30 14:01:10 -070041 aom_free(list->int_fb);
Yaowu Xuc27fc142016-08-22 16:08:15 -070042 list->int_fb = NULL;
Wan-Teh Chang2ab147d2018-10-02 16:06:26 -070043 list->num_internal_frame_buffers = 0;
Yaowu Xuc27fc142016-08-22 16:08:15 -070044}
45
Wan-Teh Changc613fd42018-09-06 12:31:17 -070046void av1_zero_unused_internal_frame_buffers(InternalFrameBufferList *list) {
47 int i;
48
49 assert(list != NULL);
50
51 for (i = 0; i < list->num_internal_frame_buffers; ++i) {
52 if (list->int_fb[i].data && !list->int_fb[i].in_use)
53 memset(list->int_fb[i].data, 0, list->int_fb[i].size);
54 }
55}
56
Yaowu Xuf883b422016-08-30 14:01:10 -070057int av1_get_frame_buffer(void *cb_priv, size_t min_size,
58 aom_codec_frame_buffer_t *fb) {
Yaowu Xuc27fc142016-08-22 16:08:15 -070059 int i;
60 InternalFrameBufferList *const int_fb_list =
61 (InternalFrameBufferList *)cb_priv;
62 if (int_fb_list == NULL) return -1;
63
64 // Find a free frame buffer.
65 for (i = 0; i < int_fb_list->num_internal_frame_buffers; ++i) {
66 if (!int_fb_list->int_fb[i].in_use) break;
67 }
68
69 if (i == int_fb_list->num_internal_frame_buffers) return -1;
70
71 if (int_fb_list->int_fb[i].size < min_size) {
Alex Converse7f094f12017-02-23 17:29:40 -080072 aom_free(int_fb_list->int_fb[i].data);
Wan-Teh Changc613fd42018-09-06 12:31:17 -070073 // The data must be zeroed to fix a valgrind error from the C loop filter
74 // due to access uninitialized memory in frame border. It could be
75 // skipped if border were totally removed.
76 int_fb_list->int_fb[i].data = (uint8_t *)aom_calloc(1, min_size);
Wan-Teh Chang2ab147d2018-10-02 16:06:26 -070077 if (!int_fb_list->int_fb[i].data) {
78 int_fb_list->int_fb[i].size = 0;
79 return -1;
80 }
Yaowu Xuc27fc142016-08-22 16:08:15 -070081 int_fb_list->int_fb[i].size = min_size;
82 }
83
84 fb->data = int_fb_list->int_fb[i].data;
85 fb->size = int_fb_list->int_fb[i].size;
86 int_fb_list->int_fb[i].in_use = 1;
87
88 // Set the frame buffer's private data to point at the internal frame buffer.
89 fb->priv = &int_fb_list->int_fb[i];
90 return 0;
91}
92
Yaowu Xuf883b422016-08-30 14:01:10 -070093int av1_release_frame_buffer(void *cb_priv, aom_codec_frame_buffer_t *fb) {
Yaowu Xuc27fc142016-08-22 16:08:15 -070094 InternalFrameBuffer *const int_fb = (InternalFrameBuffer *)fb->priv;
95 (void)cb_priv;
96 if (int_fb) int_fb->in_use = 0;
Yaowu Xuc27fc142016-08-22 16:08:15 -070097 return 0;
98}