• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)16 int 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)30 void 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)44 int 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)77 int 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