AJA NTV2 SDK  17.5.0.1242
NTV2 SDK 17.5.0.1242
buffer.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 //#include "common.h"
9 #include "buffer.h"
10 #include "ajabase/system/memory.h"
11 #include "ajabase/system/debug.h"
12 #include <string.h>
13 
14 
16 {
17  mpAllocate = NULL;
18  mAllocateSize = 0;
19  mAllocateAlignment = 0;
20 
21  mpBuffer = NULL;
22  mBufferSize = 0;
23  mBufferAlignment = 0;
24  mpAllocateName = NULL;
25 
26  mDataOffset = 0;
27  mDataSize = 0;
28 }
29 
30 
32 {
33  FreeBuffer();
34 }
35 
36 
37 AJAStatus
38 AJABuffer::AttachBuffer(uint8_t* pBuffer, size_t size)
39 {
40  FreeBuffer();
41 
42  // use specified buffer
43  mpBuffer = pBuffer;
44  mBufferSize = size;
45 
46  // determine buffer alignment
47  ComputeAlignment();
48 
49  return AJA_STATUS_SUCCESS;
50 }
51 
52 
53 AJAStatus
54 AJABuffer::AllocateBuffer(size_t size, size_t alignment, char* pName)
55 {
56  FreeBuffer();
57 
58  // if shared buffer name specified then allocate a shared buffer
59  if (pName != NULL && *pName != '\0')
60  {
61  size_t sharedSize = size;
62 
63  mpAllocate = (uint8_t*)AJAMemory::AllocateShared(&sharedSize, pName);
64  if ((mpAllocate == NULL) && (sharedSize != 0))
65  {
66  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJABuffer::AllocateBuffer Shared buffer allocation failed");
67  return AJA_STATUS_FAIL;
68  }
69  mAllocateSize = sharedSize;
70 
71  mpBuffer = mpAllocate;
72  mBufferSize = mAllocateSize;
73 
74  ComputeAlignment();
75 
76  size_t bytesForNameStr = strlen(pName) + 1;
77  mpAllocateName = new char[bytesForNameStr];
78  AJA_ASSERT(mpAllocateName != NULL);
79  strncpy(mpAllocateName, pName, bytesForNameStr);
80  }
81  // allocate a non shared buffer
82  else
83  {
84  if(size == 0)
85  {
86  return AJA_STATUS_FAIL;
87  }
88 
89  // if alignment is 0 then allocate with any alignment
90  if (alignment == 0)
91  {
92  mpAllocate = (uint8_t*)AJAMemory::Allocate(size);
93  if (mpAllocate == NULL)
94  {
95  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJABuffer::AllocateBuffer Buffer allocation failed");
96  return AJA_STATUS_FAIL;
97  }
98  mAllocateSize = size;
99 
100  mpBuffer = mpAllocate;
101  mBufferSize = mAllocateSize;
102  }
103  // if alignment is specified allocate aligned
104  else
105  {
106  mpAllocate = (uint8_t*)AJAMemory::AllocateAligned(size, alignment);
107  if (mpAllocate == NULL)
108  {
109  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJABuffer::AllocateBuffer Aligned buffer allocation failed");
110  return AJA_STATUS_FAIL;
111  }
112  mAllocateSize = size;
113  mAllocateAlignment = alignment;
114 
115  mpBuffer = mpAllocate;
116  mBufferSize = mAllocateSize;
117  }
118 
119  // determine the buffer alignment
120  ComputeAlignment();
121 
122  // if alignment was specified, be sure that allocated buffer met the requirement
123  if ((mAllocateAlignment != 0) && (mBufferAlignment < mAllocateAlignment))
124  {
125  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJABuffer::AllocateBuffer Aligned buffer allocation failed");
126  FreeBuffer();
127  return AJA_STATUS_FAIL;
128  }
129  }
130 
131  return AJA_STATUS_SUCCESS;
132 }
133 
134 
135 AJAStatus
137 {
138  if (mpAllocate != NULL)
139  {
140  if (mpAllocateName != NULL)
141  {
142  AJAMemory::FreeShared(mpAllocateName);
143  }
144  else
145  {
146  if (mAllocateAlignment != 0)
147  {
148  AJAMemory::FreeAligned(mpAllocate);
149  }
150  else
151  {
152  AJAMemory::Free(mpAllocate);
153  }
154  }
155  }
156 
157  mpAllocate = NULL;
158  mAllocateSize = 0;
159  mAllocateAlignment = 0;
160 
161  mpBuffer = NULL;
162  mBufferSize = 0;
163  mBufferAlignment = 0;
164  mpAllocateName = NULL;
165 
166  mDataOffset = 0;
167  mDataSize = 0;
168 
169  return AJA_STATUS_SUCCESS;
170 }
171 
172 
173 uint8_t*
175 {
176  return mpBuffer;
177 }
178 
179 uint32_t*
181 {
182  return (uint32_t*)mpBuffer;
183 }
184 
185 
186 size_t
188 {
189  return mBufferSize;
190 }
191 
192 
193 size_t
195 {
196  return mBufferAlignment;
197 }
198 
199 
200 const char*
202 {
203  return mpAllocateName;
204 }
205 
206 
207 AJAStatus
209 {
210  mDataOffset = offset;
211 
212  if ((mDataOffset + mDataSize) > mBufferSize)
213  {
214  return AJA_STATUS_RANGE;
215  }
216  return AJA_STATUS_SUCCESS;
217 }
218 
219 
220 size_t
222 {
223  return mDataOffset;
224 }
225 
226 
227 AJAStatus
229 {
230  mDataSize = size;
231 
232  if ((mDataOffset + mDataSize) > mBufferSize)
233  {
234  return AJA_STATUS_RANGE;
235  }
236  return AJA_STATUS_SUCCESS;
237 }
238 
239 
240 size_t
242 {
243  return mDataSize;
244 }
245 
246 
247 uint8_t*
249 {
250  return mpBuffer + mDataOffset;
251 }
252 
253 
254 void
255 AJABuffer::ComputeAlignment()
256 {
257  mBufferAlignment = 0;
258  if (mpBuffer != NULL)
259  {
260  mBufferAlignment = 1;
261  for (int32_t i = 0; i < 12; i++)
262  {
263  if (((uintptr_t)mpBuffer & ((uintptr_t)0x1 << i)) != 0)
264  {
265  break;
266  }
267  mBufferAlignment *= 2;
268  }
269  }
270 }
AJABuffer::GetBufferSize
size_t GetBufferSize()
Definition: buffer.cpp:187
NULL
#define NULL
Definition: ntv2caption608types.h:19
AJA_STATUS_SUCCESS
@ AJA_STATUS_SUCCESS
Definition: types.h:381
AJA_DebugSeverity_Error
@ AJA_DebugSeverity_Error
Definition: debugshare.h:28
AJABuffer::FreeBuffer
AJAStatus FreeBuffer()
Definition: buffer.cpp:136
AJABuffer::GetUINT32Buffer
uint32_t * GetUINT32Buffer()
Definition: buffer.cpp:180
AJABuffer::GetBufferAlignment
size_t GetBufferAlignment()
Definition: buffer.cpp:194
AJAMemory::FreeAligned
static void FreeAligned(void *pMemory)
Definition: memory.cpp:145
AJAStatus
AJAStatus
Definition: types.h:378
AJA_STATUS_FAIL
@ AJA_STATUS_FAIL
Definition: types.h:382
AJABuffer::GetBufferName
const char * GetBufferName()
Definition: buffer.cpp:201
AJAMemory::AllocateShared
static void * AllocateShared(size_t *size, const char *pShareName, bool global=true)
Definition: memory.cpp:169
AJAMemory::Allocate
static void * Allocate(size_t size)
Definition: memory.cpp:71
AJABuffer::SetDataSize
AJAStatus SetDataSize(size_t size)
Definition: buffer.cpp:228
AJABuffer::SetDataOffset
AJAStatus SetDataOffset(size_t offset)
Definition: buffer.cpp:208
AJA_REPORT
#define AJA_REPORT(_index_, _severity_, _format_,...)
Definition: debug.h:117
AJABuffer::GetBuffer
uint8_t * GetBuffer()
Definition: buffer.cpp:174
AJAMemory::FreeShared
static void FreeShared(void *pMemory)
Definition: memory.cpp:366
buffer.h
Implementation of AJABuffer class.
AJA_STATUS_RANGE
@ AJA_STATUS_RANGE
Definition: types.h:385
AJABuffer::AllocateBuffer
AJAStatus AllocateBuffer(size_t size, size_t alignment=0, char *pName=NULL)
Definition: buffer.cpp:54
AJABuffer::AJABuffer
AJABuffer()
Definition: buffer.cpp:15
AJABuffer::AttachBuffer
AJAStatus AttachBuffer(uint8_t *pBuffer, size_t size)
Definition: buffer.cpp:38
AJABuffer::GetDataOffset
size_t GetDataOffset()
Definition: buffer.cpp:221
AJABuffer::~AJABuffer
virtual ~AJABuffer()
Definition: buffer.cpp:31
AJABuffer::GetDataSize
size_t GetDataSize()
Definition: buffer.cpp:241
AJABuffer::GetData
uint8_t * GetData()
Definition: buffer.cpp:248
AJA_ASSERT
#define AJA_ASSERT(_expression_)
Definition: debug.h:113
AJAMemory::AllocateAligned
static void * AllocateAligned(size_t size, size_t alignment)
Definition: memory.cpp:115
memory.h
Declares the AJAMemory class.
debug.h
Declares the AJADebug class.
AJAMemory::Free
static void Free(void *pMemory)
Definition: memory.cpp:97