/src/aom/av1/common/frame_buffers.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2016, Alliance for Open Media. All rights reserved. |
3 | | * |
4 | | * 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. |
10 | | */ |
11 | | |
12 | | #include <assert.h> |
13 | | |
14 | | #include "av1/common/frame_buffers.h" |
15 | | #include "aom_mem/aom_mem.h" |
16 | | |
17 | 16.1k | int av1_alloc_internal_frame_buffers(InternalFrameBufferList *list) { |
18 | 16.1k | assert(list != NULL); |
19 | 16.1k | av1_free_internal_frame_buffers(list); |
20 | | |
21 | 16.1k | list->num_internal_frame_buffers = |
22 | 16.1k | AOM_MAXIMUM_REF_BUFFERS + AOM_MAXIMUM_WORK_BUFFERS; |
23 | 16.1k | list->int_fb = (InternalFrameBuffer *)aom_calloc( |
24 | 16.1k | list->num_internal_frame_buffers, sizeof(*list->int_fb)); |
25 | 16.1k | if (list->int_fb == NULL) { |
26 | 0 | list->num_internal_frame_buffers = 0; |
27 | 0 | return 1; |
28 | 0 | } |
29 | 16.1k | return 0; |
30 | 16.1k | } |
31 | | |
32 | 32.2k | void av1_free_internal_frame_buffers(InternalFrameBufferList *list) { |
33 | 32.2k | int i; |
34 | | |
35 | 32.2k | assert(list != NULL); |
36 | | |
37 | 289k | for (i = 0; i < list->num_internal_frame_buffers; ++i) { |
38 | 257k | aom_free(list->int_fb[i].data); |
39 | 257k | list->int_fb[i].data = NULL; |
40 | 257k | } |
41 | 32.2k | aom_free(list->int_fb); |
42 | 32.2k | list->int_fb = NULL; |
43 | 32.2k | list->num_internal_frame_buffers = 0; |
44 | 32.2k | } |
45 | | |
46 | 27.5k | void av1_zero_unused_internal_frame_buffers(InternalFrameBufferList *list) { |
47 | 27.5k | int i; |
48 | | |
49 | 27.5k | assert(list != NULL); |
50 | | |
51 | 468k | for (i = 0; i < list->num_internal_frame_buffers; ++i) { |
52 | 441k | if (list->int_fb[i].data && !list->int_fb[i].in_use) |
53 | 80.2k | memset(list->int_fb[i].data, 0, list->int_fb[i].size); |
54 | 441k | } |
55 | 27.5k | } |
56 | | |
57 | | int av1_get_frame_buffer(void *cb_priv, size_t min_size, |
58 | 498k | aom_codec_frame_buffer_t *fb) { |
59 | 498k | int i; |
60 | 498k | InternalFrameBufferList *const int_fb_list = |
61 | 498k | (InternalFrameBufferList *)cb_priv; |
62 | 498k | if (int_fb_list == NULL) return -1; |
63 | | |
64 | | // Find a free frame buffer. |
65 | 1.91M | for (i = 0; i < int_fb_list->num_internal_frame_buffers; ++i) { |
66 | 1.91M | if (!int_fb_list->int_fb[i].in_use) break; |
67 | 1.91M | } |
68 | | |
69 | 498k | if (i == int_fb_list->num_internal_frame_buffers) return -1; |
70 | | |
71 | 498k | if (int_fb_list->int_fb[i].size < min_size) { |
72 | 51.2k | aom_free(int_fb_list->int_fb[i].data); |
73 | | // 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 | 51.2k | int_fb_list->int_fb[i].data = (uint8_t *)aom_calloc(1, min_size); |
77 | 51.2k | if (!int_fb_list->int_fb[i].data) { |
78 | 0 | int_fb_list->int_fb[i].size = 0; |
79 | 0 | return -1; |
80 | 0 | } |
81 | 51.2k | int_fb_list->int_fb[i].size = min_size; |
82 | 51.2k | } |
83 | | |
84 | 498k | fb->data = int_fb_list->int_fb[i].data; |
85 | 498k | fb->size = int_fb_list->int_fb[i].size; |
86 | 498k | 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 | 498k | fb->priv = &int_fb_list->int_fb[i]; |
90 | 498k | return 0; |
91 | 498k | } |
92 | | |
93 | 498k | int av1_release_frame_buffer(void *cb_priv, aom_codec_frame_buffer_t *fb) { |
94 | 498k | InternalFrameBuffer *const int_fb = (InternalFrameBuffer *)fb->priv; |
95 | 498k | (void)cb_priv; |
96 | 498k | if (int_fb) int_fb->in_use = 0; |
97 | 498k | return 0; |
98 | 498k | } |