AJA NTV2 SDK  17.0.1.1246
NTV2 SDK 17.0.1.1246
ntv2dma.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 #include "ntv2card.h"
9 #include "ntv2devicefeatures.h"
10 #include "ntv2utils.h"
11 #include "ajabase/system/debug.h"
12 #include <assert.h>
13 #include <map>
14 
15 
16 //#define HEX16(__x__) "0x" << hex << setw(16) << setfill('0') << uint64_t(__x__) << dec
17 #define INSTP(_p_) xHEX0N(uint64_t(_p_),16)
18 #define LOGGING_DMA_ANC (AJADebug::IsActive(AJA_DebugUnit_AncGeneric))
19 #define DMAANCFAIL(__x__) AJA_sERROR (AJA_DebugUnit_AncGeneric, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
20 #define DMAANCWARN(__x__) AJA_sWARNING(AJA_DebugUnit_AncGeneric, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
21 #define DMAANCNOTE(__x__) AJA_sNOTICE (AJA_DebugUnit_AncGeneric, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
22 #define DMAANCINFO(__x__) AJA_sINFO (AJA_DebugUnit_AncGeneric, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
23 #define DMAANCDBG(__x__) AJA_sDEBUG (AJA_DebugUnit_AncGeneric, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
24 
25 
26 using namespace std;
27 
28 
29 bool CNTV2Card::DMARead (const ULWord inFrameNumber, ULWord * pFrameBuffer, const ULWord inOffsetBytes, const ULWord inByteCount)
30 {
31  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, true, inFrameNumber, pFrameBuffer, inOffsetBytes, inByteCount, true);
32 }
33 
34 
35 bool CNTV2Card::DMAWrite (const ULWord inFrameNumber, const ULWord * pFrameBuffer, const ULWord inOffsetBytes, const ULWord inByteCount)
36 {
37  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, false, inFrameNumber, const_cast<ULWord*>(pFrameBuffer), inOffsetBytes, inByteCount, true);
38 }
39 
40 
41 bool CNTV2Card::DMAReadFrame (const ULWord inFrameNumber, ULWord * pFrameBuffer, const ULWord inByteCount)
42 {
43  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, true, inFrameNumber, pFrameBuffer, ULWord(0), inByteCount, true);
44 }
45 
46 bool CNTV2Card::DMAReadFrame (const ULWord inFrameNumber, ULWord * pFrameBuffer, const ULWord inByteCount, const NTV2Channel inChannel)
47 {
48  if (!NTV2_IS_VALID_CHANNEL(inChannel))
49  return DMAReadFrame (inFrameNumber, pFrameBuffer, inByteCount);
50 
52  GetFrameBufferSize(inChannel, hwFrameSize);
53  ULWord actualFrameSize (::NTV2FramesizeToByteCount(hwFrameSize));
54  bool quadEnabled(false), quadQuadEnabled(false);
55  GetQuadFrameEnable(quadEnabled, inChannel);
56  GetQuadQuadFrameEnable(quadQuadEnabled, inChannel);
57  if (quadEnabled)
58  actualFrameSize *= 4;
59  if (quadQuadEnabled)
60  actualFrameSize *= 4;
61  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, true, 0, pFrameBuffer, inFrameNumber * actualFrameSize, inByteCount, true);
62 }
63 
64 
65 bool CNTV2Card::DMAWriteFrame (const ULWord inFrameNumber, const ULWord * pFrameBuffer, const ULWord inByteCount)
66 {
67  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, false, inFrameNumber, const_cast <ULWord *> (pFrameBuffer), ULWord(0), inByteCount, true);
68 }
69 
70 bool CNTV2Card::DMAWriteFrame (const ULWord inFrameNumber, const ULWord * pFrameBuffer, const ULWord inByteCount, const NTV2Channel inChannel)
71 {
72  if (!NTV2_IS_VALID_CHANNEL(inChannel))
73  return DMAWriteFrame (inFrameNumber, pFrameBuffer, inByteCount);
74 
76  GetFrameBufferSize(inChannel, hwFrameSize);
77  ULWord actualFrameSize (::NTV2FramesizeToByteCount(hwFrameSize));
78  bool quadEnabled(false), quadQuadEnabled(false);
79  GetQuadFrameEnable(quadEnabled, inChannel);
80  GetQuadQuadFrameEnable(quadQuadEnabled, inChannel);
81  if (quadEnabled)
82  actualFrameSize *= 4;
83  if (quadQuadEnabled)
84  actualFrameSize *= 4;
85  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, false, 0, const_cast<ULWord*>(pFrameBuffer),
86  inFrameNumber * actualFrameSize, inByteCount, true);
87 }
88 
89 
90 bool CNTV2Card::DMAReadSegments ( const ULWord inFrameNumber,
91  ULWord * pFrameBuffer,
92  const ULWord inOffsetBytes,
93  const ULWord inTotalByteCount,
94  const ULWord inNumSegments,
95  const ULWord inSegmentHostPitch,
96  const ULWord inSegmentCardPitch)
97 {
98  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, true, inFrameNumber, pFrameBuffer, inOffsetBytes, inTotalByteCount,
99  inNumSegments, inSegmentHostPitch, inSegmentCardPitch, true);
100 }
101 
102 
103 bool CNTV2Card::DMAWriteSegments ( const ULWord inFrameNumber,
104  const ULWord * pFrameBuffer,
105  const ULWord inOffsetBytes,
106  const ULWord inTotalByteCount,
107  const ULWord inNumSegments,
108  const ULWord inSegmentHostPitch,
109  const ULWord inSegmentCardPitch)
110 {
111  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, false, inFrameNumber, const_cast<ULWord*>(pFrameBuffer),
112  inOffsetBytes, inTotalByteCount, inNumSegments, inSegmentHostPitch, inSegmentCardPitch, true);
113 }
114 
115 
116 bool CNTV2Card::DmaP2PTargetFrame (NTV2Channel channel, ULWord frameNumber, ULWord frameOffset, PCHANNEL_P2P_STRUCT pP2PData)
117 {
118  return DmaTransfer (NTV2_PIO, channel, true, frameNumber, frameOffset, 0, 0, 0, 0, pP2PData);
119 }
120 
121 
123  ULWord frameNumber,
124  ULWord frameOffset,
125  ULWord transferSize,
126  ULWord numSegments,
127  ULWord segmentTargetPitch,
128  ULWord segmentCardPitch,
129  PCHANNEL_P2P_STRUCT pP2PData)
130 {
131  return DmaTransfer (DMAEngine, NTV2_CHANNEL1, false, frameNumber, frameOffset, transferSize, numSegments,
132  segmentTargetPitch, segmentCardPitch, pP2PData);
133 }
134 
135 
136 bool CNTV2Card::DMAStreamStart (ULWord * inBuffer, const ULWord inByteCount, const NTV2Channel inChannel, const bool inToHost)
137 {
138  if (!_boardOpened)
139  return false; // Device not open!
140 
141  if (!inBuffer)
142  return false;
143 
144  NTV2DmaStream streamMsg (inBuffer, inByteCount, inChannel, DMASTREAM_START | (inToHost? DMASTREAM_TO_HOST : 0));
145  return NTV2Message (reinterpret_cast<NTV2_HEADER*>(&streamMsg));
146 }
147 
148 
149 bool CNTV2Card::DMAStreamStop (const NTV2Channel inChannel, const bool inToHost)
150 {
151  if (!_boardOpened)
152  return false; // Device not open!
153 
154  NTV2DmaStream streamMsg (inChannel, DMASTREAM_STOP | (inToHost? DMASTREAM_TO_HOST : 0));
155  return NTV2Message (reinterpret_cast<NTV2_HEADER*>(&streamMsg));
156 }
157 
158 
159 bool CNTV2Card::GetAudioMemoryOffset (const ULWord inOffsetBytes, ULWord & outAbsByteOffset,
160  const NTV2AudioSystem inAudioSystem, const bool inCaptureBuffer)
161 {
162  outAbsByteOffset = 0;
163  const NTV2DeviceID deviceID(GetDeviceID());
164  if (ULWord(inAudioSystem) >= GetNumSupported(kDeviceGetNumBufferedAudioSystems))
165  return false; // Invalid audio system
166 
167  if (::NTV2DeviceCanDoStackedAudio(deviceID))
168  {
169  const ULWord EIGHT_MEGABYTES (0x800000);
170  const ULWord memSize (::NTV2DeviceGetActiveMemorySize(deviceID));
171  const ULWord engineOffset (memSize - EIGHT_MEGABYTES * ULWord(inAudioSystem+1));
172  outAbsByteOffset = inOffsetBytes + engineOffset;
173  }
174  else
175  {
178  if (!GetFrameGeometry (fg, NTV2Channel(inAudioSystem)) || !GetFrameBufferFormat (NTV2Channel(inAudioSystem), fbf))
179  return false;
180 
181  const ULWord audioFrameBuffer (::NTV2DeviceGetNumberFrameBuffers(deviceID, fg, fbf) - 1);
182  outAbsByteOffset = inOffsetBytes + audioFrameBuffer * ::NTV2DeviceGetFrameBufferSize(deviceID, fg, fbf);
183  }
184 
185  if (inCaptureBuffer) // Capture mode?
186  { ULWord rdBufOffset(0x400000); // 4MB
187  GetAudioReadOffset (rdBufOffset, inAudioSystem);
188  outAbsByteOffset += rdBufOffset; // Add offset to point to capture buffer
189  }
190  return true;
191 }
192 
193 
194 bool CNTV2Card::DMAReadAudio ( const NTV2AudioSystem inAudioSystem,
195  ULWord * pOutAudioBuffer,
196  const ULWord inOffsetBytes,
197  const ULWord inByteCount)
198 {
199  if (!pOutAudioBuffer)
200  return false; // NULL buffer
201  if (!inByteCount)
202  return false; // Nothing to transfer
203 
204  ULWord absoluteByteOffset (0);
205  if (!GetAudioMemoryOffset (inOffsetBytes, absoluteByteOffset, inAudioSystem))
206  return false;
207 
208  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, true, 0, pOutAudioBuffer, absoluteByteOffset, inByteCount, true);
209 }
210 
211 
212 bool CNTV2Card::DMAWriteAudio ( const NTV2AudioSystem inAudioSystem,
213  const ULWord * pInAudioBuffer,
214  const ULWord inOffsetBytes,
215  const ULWord inByteCount)
216 {
217  if (!pInAudioBuffer)
218  return false; // NULL buffer
219  if (!inByteCount)
220  return false; // Nothing to transfer
221 
222  ULWord absoluteByteOffset (0);
223  if (!GetAudioMemoryOffset (inOffsetBytes, absoluteByteOffset, inAudioSystem))
224  return false;
225 
226  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, false, 0, const_cast <ULWord *> (pInAudioBuffer), absoluteByteOffset, inByteCount, true);
227 }
228 
229 
230 bool CNTV2Card::DMAReadAnc (const ULWord inFrameNumber,
231  NTV2Buffer & outAncF1Buffer,
232  NTV2Buffer & outAncF2Buffer,
233  const NTV2Channel inChannel)
234 {
235  ULWord F1Offset(0), F2Offset(0), inByteCount(0), bytesToTransfer(0), byteOffsetToAncData(0);
237  bool result(true);
238  if (!::NTV2DeviceCanDoCustomAnc(GetDeviceID()))
239  return false;
240  if (!ReadRegister (kVRegAncField1Offset, F1Offset))
241  return false;
242  if (!ReadRegister (kVRegAncField2Offset, F2Offset))
243  return false;
244  if (outAncF1Buffer.IsNULL() && outAncF2Buffer.IsNULL())
245  return false;
246  if (!GetFrameBufferSize (inChannel, hwFrameSize))
247  return false;
248 
249  ULWord frameSizeInBytes(::NTV2FramesizeToByteCount(hwFrameSize));
250  bool quadEnabled(false), quadQuadEnabled(false);
251  GetQuadFrameEnable(quadEnabled, inChannel);
252  GetQuadQuadFrameEnable(quadQuadEnabled, inChannel);
253  if (quadEnabled)
254  frameSizeInBytes *= 4;
255  if (quadQuadEnabled)
256  frameSizeInBytes *= 4;
257 
258  // IMPORTANT ASSUMPTION: F1 data is first (at lower address) in the frame buffer...!
259  inByteCount = outAncF1Buffer.IsNULL() ? 0 : outAncF1Buffer.GetByteCount();
260  bytesToTransfer = inByteCount > F1Offset ? F1Offset : inByteCount;
261  if (bytesToTransfer)
262  {
263  byteOffsetToAncData = frameSizeInBytes - F1Offset;
264  result = DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, /*isRead*/true, inFrameNumber,
265  reinterpret_cast <ULWord *> (outAncF1Buffer.GetHostPointer()),
266  byteOffsetToAncData, bytesToTransfer, true);
267  }
268  inByteCount = outAncF2Buffer.IsNULL() ? 0 : outAncF2Buffer.GetByteCount();
269  bytesToTransfer = inByteCount > F2Offset ? F2Offset : inByteCount;
270  if (result && bytesToTransfer)
271  {
272  byteOffsetToAncData = frameSizeInBytes - F2Offset;
273  result = DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, /*isRead*/true, inFrameNumber,
274  reinterpret_cast <ULWord *> (outAncF2Buffer.GetHostPointer()),
275  byteOffsetToAncData, bytesToTransfer, true);
276  }
277  if (result && ::NTV2DeviceCanDo2110(_boardID))
278  // S2110 Capture: So that most OEM ingest apps "just work" with S2110 RTP Anc streams, our
279  // classic SDI Anc data that device firmware normally de-embeds into registers
280  // e.g. VPID & RP188 -- the SDK here will automatically try to do the same.
281  S2110DeviceAncFromBuffers (inChannel, outAncF1Buffer, outAncF2Buffer);
282  return result;
283 }
284 
285 
286 bool CNTV2Card::DMAWriteAnc (const ULWord inFrameNumber,
287  NTV2Buffer & inAncF1Buffer,
288  NTV2Buffer & inAncF2Buffer,
289  const NTV2Channel inChannel)
290 {
291  ULWord F1Offset(0), F2Offset(0), inByteCount(0), bytesToTransfer(0), byteOffsetToAncData(0);
293  bool result(true);
294  if (!::NTV2DeviceCanDoCustomAnc(GetDeviceID()))
295  return false;
296  if (!ReadRegister (kVRegAncField1Offset, F1Offset))
297  return false;
298  if (!ReadRegister (kVRegAncField2Offset, F2Offset))
299  return false;
300  if (inAncF1Buffer.IsNULL() && inAncF2Buffer.IsNULL())
301  return false;
302  if (!GetFrameBufferSize (inChannel, hwFrameSize))
303  return false;
304 
305  ULWord frameSizeInBytes(::NTV2FramesizeToByteCount(hwFrameSize));
306  bool quadEnabled(false), quadQuadEnabled(false);
307  GetQuadFrameEnable(quadEnabled, inChannel);
308  GetQuadQuadFrameEnable(quadQuadEnabled, inChannel);
309  if (quadEnabled)
310  frameSizeInBytes *= 4;
311  if (quadQuadEnabled)
312  frameSizeInBytes *= 4;
313 
314  // Seamless Anc playout...
315  bool tmpLocalRP188F1AncBuffer(false), tmpLocalRP188F2AncBuffer(false);
316  if (::NTV2DeviceCanDo2110(_boardID) && NTV2_IS_VALID_CHANNEL(inChannel))
317  // S2110 Playout: So that most Retail & OEM playout apps "just work" with S2110 RTP Anc streams,
318  // our classic SDI Anc data that device firmware normally embeds into SDI output
319  // as derived from registers -- e.g. VPID & RP188 -- the SDK here will automatically
320  // insert these packets into the outgoing RTP streams, even if the client didn't
321  // provide Anc buffers. (But they MUST call DMAWriteAnc for this to work!)
322  {
323  if (inAncF1Buffer.IsNULL())
324  tmpLocalRP188F1AncBuffer = inAncF1Buffer.Allocate(2048);
325  if (inAncF2Buffer.IsNULL())
326  tmpLocalRP188F2AncBuffer = inAncF2Buffer.Allocate(2048);
327  S2110DeviceAncToBuffers (inChannel, inAncF1Buffer, inAncF2Buffer);
328  }
329 
330  // IMPORTANT ASSUMPTION: F1 data is first (at lower address) in the frame buffer...!
331  inByteCount = inAncF1Buffer.IsNULL() ? 0 : inAncF1Buffer.GetByteCount();
332  bytesToTransfer = inByteCount > F1Offset ? F1Offset : inByteCount;
333  if (bytesToTransfer)
334  {
335  byteOffsetToAncData = frameSizeInBytes - F1Offset;
336  result = DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, /*isRead*/false, inFrameNumber,
337  inAncF1Buffer, byteOffsetToAncData, bytesToTransfer, true);
338  }
339  inByteCount = inAncF2Buffer.IsNULL() ? 0 : inAncF2Buffer.GetByteCount();
340  bytesToTransfer = inByteCount > F2Offset ? F2Offset : inByteCount;
341  if (result && bytesToTransfer)
342  {
343  byteOffsetToAncData = frameSizeInBytes - F2Offset;
344  result = DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, /*isRead*/false, inFrameNumber,
345  inAncF2Buffer, byteOffsetToAncData, bytesToTransfer, true);
346  }
347 
348  if (tmpLocalRP188F1AncBuffer) inAncF1Buffer.Deallocate();
349  if (tmpLocalRP188F2AncBuffer) inAncF2Buffer.Deallocate();
350  return result;
351 }
352 
353 bool CNTV2Card::DMAWriteLUTTable (const ULWord inFrameNumber, const ULWord * pInLUTBuffer, const ULWord inLUTIndex, const ULWord inByteCount)
354 {
355  if (!pInLUTBuffer)
356  return false; // NULL buffer
357 
358  ULWord LUTIndexByteOffset = LUTTablePartitionSize * inLUTIndex;
359 
361  GetFrameBufferSize(NTV2_CHANNEL1, hwFrameSize);
362  ULWord actualFrameSize (::NTV2FramesizeToByteCount(hwFrameSize));
363  bool quadEnabled(false), quadQuadEnabled(false);
364  GetQuadFrameEnable(quadEnabled, NTV2_CHANNEL1);
365  GetQuadQuadFrameEnable(quadQuadEnabled, NTV2_CHANNEL1);
366  if (quadEnabled)
367  actualFrameSize *= 4;
368  if (quadQuadEnabled)
369  actualFrameSize *= 4;
370  return DmaTransfer (NTV2_DMA_FIRST_AVAILABLE, false, 0, const_cast<ULWord*>(pInLUTBuffer),
371  (inFrameNumber * actualFrameSize) + LUTIndexByteOffset, inByteCount, true);
372 }
373 
374 
375 bool CNTV2Card::GetDeviceFrameInfo (const UWord inFrameNumber, const NTV2Channel inChannel, ULWord & outIntrinsicSize,
376  bool & outMultiFormat, bool & outQuad, bool & outQuadQuad, bool & outSquares, bool & outTSI,
377  uint64_t & outAddress, uint64_t & outLength)
378 {
379  outAddress = outLength = 0;
380  static const ULWord frameSizes[] = {2, 4, 8, 16}; // '00'=2MB '01'=4MB '10'=8MB '11'=16MB
381  UWord frameSizeNdx(0);
382  const bool isMRWidgetChannel(IsMultiRasterWidgetChannel(inChannel));
383  outIntrinsicSize = 0;
384  outMultiFormat = outQuad = outQuadQuad = outSquares = outTSI = false;
385  NTV2Channel chan (inChannel);
386  if (!::NTV2DeviceCanDoMultiFormat(GetDeviceID()))
387  chan = NTV2_CHANNEL1; // Older uniformat-only device: use Ch1
388  else if (GetMultiFormatMode(outMultiFormat) && !outMultiFormat && !isMRWidgetChannel)
389  chan = NTV2_CHANNEL1; // Uniformat mode: Use Ch1
390 
392  outIntrinsicSize = frameSizes[frameSizeNdx] * 1024 * 1024;
393  if (::NTV2DeviceCanReportFrameSize(GetDeviceID()))
394  { // All modern devices
395  ULWord quadMultiplier(1);
396  if (GetQuadFrameEnable(outQuad, chan) && outQuad)
397  quadMultiplier = 4; // 4!
398  if (GetQuadQuadFrameEnable(outQuadQuad, chan) && outQuadQuad)
399  quadMultiplier = 16;// 16!
400  outLength = outIntrinsicSize * quadMultiplier;
401  if (quadMultiplier > 1)
402  {
403  Get4kSquaresEnable (outSquares, chan);
404  GetTsiFrameEnable(outTSI, chan);
405  }
406  }
407  else
408  { // Corvid1, Corvid22, Corvid3G, IoExpress, Kona3G, Kona3GQuad, KonaLHe+, KonaLHi, TTap
409  if (::NTV2DeviceSoftwareCanChangeFrameBufferSize(GetDeviceID()))
410  { // Kona3G only at this point
411  bool frameSizeSetBySW(false);
413  if (!GetQuadFrameEnable(outQuad, chan) || !outQuad)
414  if (frameSizeSetBySW)
415  outLength = outIntrinsicSize;
416  if (outQuad)
417  Get4kSquaresEnable (outSquares, chan);
418  }
419  }
420  if (!outLength)
421  {
422  NTV2FrameBufferFormat frameBufferFormat(NTV2_FBF_10BIT_YCBCR);
423  GetFrameBufferFormat(NTV2_CHANNEL1, frameBufferFormat);
424  NTV2FrameGeometry frameGeometry;
425  GetFrameGeometry(frameGeometry, NTV2_CHANNEL1);
426  outLength = ::NTV2DeviceGetFrameBufferSize (GetDeviceID(), frameGeometry, frameBufferFormat);
427  }
428  outAddress = uint64_t(inFrameNumber) * outLength;
429  return true;
430 }
431 
432 
433 bool CNTV2Card::GetDeviceFrameInfo (const UWord inFrameNumber, const NTV2Channel inChannel, uint64_t & outAddr, uint64_t & outLgth)
434 {
435  bool isMultiFormat(false), isQuad(false), isQuadQuad(false), isSquares(false), isTSI(false);
436  ULWord intrinsicSize(0);
437  return GetDeviceFrameInfo (inFrameNumber, inChannel, intrinsicSize, isMultiFormat, isQuad, isQuadQuad, isSquares, isTSI, outAddr, outLgth);
438 }
439 
440 bool CNTV2Card::DeviceAddressToFrameNumber (const uint64_t inAddress, UWord & outFrameNumber, const NTV2Channel inChannel)
441 {
442  static const ULWord frameSizes[] = {2, 4, 8, 16}; // '00'=2MB '01'=4MB '10'=8MB '11'=16MB
443  UWord frameSizeNdx(0);
444  bool quadEnabled(false), isMultiFormatMode(false);
445  uint64_t frameBytes(0);
446  NTV2Channel chan (inChannel);
447  if (!::NTV2DeviceCanDoMultiFormat(GetDeviceID()))
448  chan = NTV2_CHANNEL1; // Older uniformat-only device: use Ch1
449  else if (GetMultiFormatMode(isMultiFormatMode) && !isMultiFormatMode)
450  chan = NTV2_CHANNEL1; // Uniformat mode: Use Ch1
451 
452  outFrameNumber = 0;
454  if (::NTV2DeviceCanReportFrameSize(GetDeviceID()))
455  { // All modern devices
456  ULWord quadMultiplier(1);
457  if (GetQuadFrameEnable(quadEnabled, chan) && quadEnabled)
458  quadMultiplier = 8; // 4!
459  if (GetQuadQuadFrameEnable(quadEnabled, chan) && quadEnabled)
460  quadMultiplier = 32;// 16!
461  frameBytes = frameSizes[frameSizeNdx] * 1024 * 1024 * quadMultiplier;
462  }
463  else
464  { // Corvid1, Corvid22, Corvid3G, IoExpress, Kona3G, Kona3GQuad, KonaLHe+, KonaLHi, TTap
465  if (::NTV2DeviceSoftwareCanChangeFrameBufferSize(GetDeviceID()))
466  { // Kona3G only at this point
467  bool frameSizeSetBySW(false);
469  if (!GetQuadFrameEnable(quadEnabled, chan) || !quadEnabled)
470  if (frameSizeSetBySW)
471  frameBytes = frameSizes[frameSizeNdx] * 1024 * 1024;
472  }
473  }
474  if (!frameBytes)
475  {
476  NTV2FrameBufferFormat frameBufferFormat(NTV2_FBF_10BIT_YCBCR);
477  GetFrameBufferFormat(NTV2_CHANNEL1, frameBufferFormat);
478  NTV2FrameGeometry frameGeometry;
479  GetFrameGeometry(frameGeometry, NTV2_CHANNEL1);
480  frameBytes = ::NTV2DeviceGetFrameBufferSize (GetDeviceID(), frameGeometry, frameBufferFormat);
481  }
482  outFrameNumber = UWord(inAddress / frameBytes);
483  return true;
484 }
485 
486 
487 bool CNTV2Card::DMABufferLock (const NTV2Buffer & inBuffer, bool inMap, bool inRDMA)
488 {
489  if (!_boardOpened)
490  return false; // Device not open!
491 
492  if (!inBuffer)
493  return false;
494 
495  NTV2BufferLock lockMsg (inBuffer, (DMABUFFERLOCK_LOCK |
496  (inRDMA? DMABUFFERLOCK_RDMA : 0) |
497  (inMap? DMABUFFERLOCK_MAP : 0)));
498  return NTV2Message (reinterpret_cast<NTV2_HEADER*>(&lockMsg));
499 }
500 
501 
502 bool CNTV2Card::DMABufferUnlock (const NTV2Buffer & inBuffer)
503 {
504  if (!_boardOpened)
505  return false; // Device not open!
506 
507  if (!inBuffer)
508  return false;
509 
510  NTV2BufferLock lockMsg (inBuffer, DMABUFFERLOCK_UNLOCK);
511  return NTV2Message (reinterpret_cast<NTV2_HEADER*>(&lockMsg));
512 }
513 
514 
516 {
517  if (!_boardOpened)
518  return false; // Device not open!
519 
521  return NTV2Message (reinterpret_cast<NTV2_HEADER*>(&unlockAllMsg));
522 }
523 
524 bool CNTV2Card::DMABufferAutoLock (const bool inEnable, const bool inMap, const ULWord64 inMaxLockSize)
525 {
526  if (!_boardOpened)
527  return false; // Device not open!
528 
529  NTV2BufferLock autoMsg;
530  if (inEnable)
531  {
532  autoMsg.SetMaxLockSize (inMaxLockSize);
534  }
535  else
536  {
537  autoMsg.SetMaxLockSize (0);
539  }
540  return NTV2Message (reinterpret_cast<NTV2_HEADER*>(&autoMsg));
541 }
542 
543 typedef map<ULWord,NTV2AncDataRgn> OffsetAncRgns, SizeAncRgns;
544 typedef pair<ULWord,NTV2AncDataRgn> OffsetAncRgn, SizeAncRgn;
545 typedef OffsetAncRgns::const_iterator OffsetAncRgnsConstIter;
546 typedef OffsetAncRgns::const_reverse_iterator OffsetAncRgnsConstRIter;
547 typedef map<NTV2AncDataRgn,ULWord> AncRgnOffsets, AncRgnSizes;
548 typedef AncRgnOffsets::const_iterator AncRgnOffsetsConstIter;
549 typedef AncRgnSizes::const_iterator AncRgnSizesConstIter;
550 typedef pair<NTV2AncDataRgn,ULWord> AncRgnOffset, AncRgnSize;
551 
552 
553 bool CNTV2Card::DMAClearAncRegion (const UWord inStartFrameNumber, const UWord inEndFrameNumber,
554  const NTV2AncillaryDataRegion inAncRegion, const NTV2Channel inChannel)
555 {
556  if (!::NTV2DeviceCanDoCustomAnc(GetDeviceID()))
557  return false; // no anc inserters/extractors
558 
559  ULWord offsetInBytes(0), sizeInBytes(0);
560  if (!GetAncRegionOffsetAndSize(offsetInBytes, sizeInBytes, inAncRegion))
561  return false; // no such region
562  NTV2Buffer zeroBuffer(sizeInBytes);
563  if (!zeroBuffer)
564  return false;
565  zeroBuffer.Fill(ULWord64(0));
566 
567  for (UWord ndx(inStartFrameNumber); ndx < inEndFrameNumber + 1; ndx++)
568  if (!DMAWriteAnc (ULWord(ndx), zeroBuffer, zeroBuffer, inChannel))
569  return false; // DMA write failure
570  return true;
571 }
572 
573 
574 bool CNTV2Card::GetAncRegionOffsetAndSize (ULWord & outByteOffset, ULWord & outByteCount, const NTV2AncillaryDataRegion inAncRegion)
575 {
576  outByteOffset = outByteCount = 0;
577  if (!::NTV2DeviceCanDoCustomAnc(GetDeviceID()))
578  return false;
579  if (!NTV2_IS_VALID_ANC_RGN(inAncRegion))
580  return false; // Bad param
581 
583  if (!GetFrameBufferSize (NTV2_CHANNEL1, frameSize))
584  return false; // Bail
585 
586  const ULWord frameSizeInBytes(::NTV2FramesizeToByteCount(frameSize));
587  ULWord offsetFromEnd (0);
588 
589  // Map all Anc memory regions...
590  AncRgnOffsets ancRgnOffsets;
591  OffsetAncRgns offsetAncRgns;
592  for (NTV2AncDataRgn ancRgn(NTV2_AncRgn_Field1); ancRgn < NTV2_MAX_NUM_AncRgns; ancRgn = NTV2AncDataRgn(ancRgn+1))
593  {
594  ULWord bytesFromBottom(0);
595  if (GetAncRegionOffsetFromBottom(bytesFromBottom, ancRgn))
596  {
597  ancRgnOffsets.insert(AncRgnOffset(ancRgn, bytesFromBottom));
598  offsetAncRgns.insert(OffsetAncRgn(bytesFromBottom, ancRgn));
599  }
600  }
601  if (offsetAncRgns.empty())
602  return false;
603 
604  AncRgnSizes ancRgnSizes;
605  for (NTV2AncDataRgn ancRgn(NTV2_AncRgn_Field1); ancRgn < NTV2_MAX_NUM_AncRgns; ancRgn = NTV2AncDataRgn(ancRgn+1))
606  {
607  AncRgnOffsetsConstIter ancRgnOffsetIter (ancRgnOffsets.find(ancRgn));
608  if (ancRgnOffsetIter != ancRgnOffsets.end())
609  {
610  ULWord rgnSize(ancRgnOffsetIter->second); // Start with ancRgn's offset
611  OffsetAncRgnsConstIter offsetAncRgnIter (offsetAncRgns.find(ancRgnOffsetIter->second)); // Find ancRgn's offset in offsets table
612  if (offsetAncRgnIter != offsetAncRgns.end())
613  {
614  if (offsetAncRgnIter->second != ancRgn)
615  DMAANCWARN(::NTV2AncDataRgnToStr(ancRgn) << " and " << ::NTV2AncDataRgnToStr(offsetAncRgnIter->second) << " using same offset " << xHEX0N(offsetAncRgnIter->first,8));
616  else
617  {
618  if (offsetAncRgnIter != offsetAncRgns.begin() && --offsetAncRgnIter != offsetAncRgns.end()) // Has a neighbor?
619  rgnSize -= offsetAncRgnIter->first; // Yes -- subtract neighbor's offset
620  ancRgnSizes.insert(AncRgnSize(ancRgn, rgnSize));
621  //DMAANCDBG(::NTV2AncDataRgnToStr(ancRgn) << " offset=" << xHEX0N(ancRgnOffsets[ancRgn],8) << " size=" << xHEX0N(rgnSize,8));
622  }
623  }
624  //else DMAANCWARN("Offset " << xHEX0N(ancRgnOffsetIter->second,8) << " missing in OffsetAncRgns table");
625  }
626  //else DMAANCWARN(::NTV2AncDataRgnToStr(ancRgn) << " missing in AncRgnOffsets table");
627  }
628 
629  if (NTV2_IS_ALL_ANC_RGNS(inAncRegion))
630  {
631  // Use the largest offset-from-end, and the sum of all sizes
632  OffsetAncRgnsConstRIter rIter (offsetAncRgns.rbegin());
633  if (rIter == offsetAncRgns.rend())
634  return false; // Empty?
635  offsetFromEnd = rIter->first;
636  outByteOffset = frameSizeInBytes - offsetFromEnd; // Convert to offset from top of frame buffer
637  outByteCount = offsetFromEnd; // The whole shebang
638  return true;
639  }
640 
641  AncRgnOffsetsConstIter offIter(ancRgnOffsets.find(inAncRegion));
642  if (offIter == ancRgnOffsets.end())
643  return false; // Not there
644 
645  offsetFromEnd = offIter->second;
646  if (offsetFromEnd > frameSizeInBytes)
647  return false; // Bad offset
648 
649  AncRgnSizesConstIter sizeIter(ancRgnSizes.find(inAncRegion));
650  if (sizeIter == ancRgnSizes.end())
651  return false; // Not there
652 
653  outByteOffset = frameSizeInBytes - offsetFromEnd; // Convert to offset from top of frame buffer
654  outByteCount = sizeIter->second;
655  return outByteOffset && outByteCount;
656 }
657 
658 
659 bool CNTV2Card::GetAncRegionOffsetFromBottom (ULWord & bytesFromBottom, const NTV2AncillaryDataRegion inAncRegion)
660 {
661  bytesFromBottom = 0;
662 
663  if (!::NTV2DeviceCanDoCustomAnc(GetDeviceID()))
664  return false; // No custom anc support
665 
666  // IoIP SDIOut5 monitor anc support added in SDK/driver 15.3...
667  UWord majV(0), minV(0), pt(0), bld(0);
668  GetDriverVersionComponents(majV, minV, pt, bld);
669  const bool is153OrLater ((majV > 15) || (majV == 15 && minV >= 3) || (!majV && !minV && !pt && !bld));
670 
671  switch (inAncRegion)
672  {
673  default: return false; // Bad index
674  case NTV2_AncRgn_Field1: return ReadRegister(kVRegAncField1Offset, bytesFromBottom) && bytesFromBottom;// F1
675  case NTV2_AncRgn_Field2: return ReadRegister(kVRegAncField2Offset, bytesFromBottom) && bytesFromBottom;// F2
676  case NTV2_AncRgn_MonField1: return is153OrLater && ReadRegister(kVRegMonAncField1Offset, bytesFromBottom) && bytesFromBottom;// MonF1
677  case NTV2_AncRgn_MonField2: return is153OrLater && ReadRegister(kVRegMonAncField2Offset, bytesFromBottom) && bytesFromBottom;// MonF2
678  case NTV2_AncRgn_All: break; // All Anc regions -- calculate below
679  }
680 
681  // Read all and determine the largest...
682  ULWord temp(0);
683  if (ReadRegister(kVRegAncField1Offset, temp) && temp > bytesFromBottom)
684  bytesFromBottom = temp;
685  if (ReadRegister(kVRegAncField2Offset, temp) && temp > bytesFromBottom)
686  bytesFromBottom = temp;
687 
688  if (is153OrLater && ((GetDeviceID() == DEVICE_ID_IOIP_2110) ||
689  (GetDeviceID() == DEVICE_ID_IOIP_2110_RGB12)))
690  {
691  if (ReadRegister(kVRegMonAncField1Offset, temp) && temp > bytesFromBottom)
692  bytesFromBottom = temp;
693  if (ReadRegister(kVRegMonAncField2Offset, temp) && temp > bytesFromBottom)
694  bytesFromBottom = temp;
695  }
696  return bytesFromBottom > 0;
697 }
kVRegMonAncField1Offset
@ kVRegMonAncField1Offset
Monitor Anc Field1 byte offset from end of frame buffer (IoIP only, GUMP)
Definition: ntv2virtualregisters.h:331
NTV2_MAX_NUM_AncRgns
@ NTV2_MAX_NUM_AncRgns
Definition: ntv2enums.h:4144
NTV2AncDataRgnToStr
std::string NTV2AncDataRgnToStr(const NTV2AncDataRgn inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6593
CNTV2Card::DMABufferUnlock
virtual bool DMABufferUnlock(const NTV2Buffer &inBuffer)
Unlocks the given host buffer that was previously locked using CNTV2Card::DMABufferLock.
Definition: ntv2dma.cpp:502
DMABUFFERLOCK_MAP
#define DMABUFFERLOCK_MAP
Used in NTV2BufferLock to IO map a buffer.
Definition: ntv2publicinterface.h:5515
CNTV2Card::DMAStreamStop
virtual bool DMAStreamStop(const NTV2Channel inChannel, const bool inToHost)
Definition: ntv2dma.cpp:149
DMASTREAM_TO_HOST
#define DMASTREAM_TO_HOST
Used in NTV2DmaStream to host.
Definition: ntv2publicinterface.h:5545
CNTV2Card::GetAncRegionOffsetFromBottom
virtual bool GetAncRegionOffsetFromBottom(ULWord &outByteOffsetFromBottom, const NTV2AncillaryDataRegion inAncRegion=NTV2_AncRgn_All)
Answers with the byte offset to the start of an ancillary data region within a device frame buffer,...
Definition: ntv2dma.cpp:659
DMABUFFERLOCK_LOCK
#define DMABUFFERLOCK_LOCK
Used in NTV2BufferLock to page lock a buffer.
Definition: ntv2publicinterface.h:5513
ntv2devicefeatures.h
Declares device capability functions.
CNTV2Card::DMAWriteSegments
virtual bool DMAWriteSegments(const ULWord inFrameNumber, const ULWord *pFrameBuffer, const ULWord inOffsetBytes, const ULWord inSegmentByteCount, const ULWord inNumSegments, const ULWord inSegmentHostPitch, const ULWord inSegmentCardPitch)
Performs a segmented data transfer from the host to the AJA device.
Definition: ntv2dma.cpp:103
DMABUFFERLOCK_RDMA
#define DMABUFFERLOCK_RDMA
Used in NTV2BufferLock to page lock a rdma buffer.
Definition: ntv2publicinterface.h:5520
NTV2Channel
NTV2Channel
These enum values are mostly used to identify a specific Frame Store. They're also commonly used to i...
Definition: ntv2enums.h:1305
NTV2Buffer
A generic user-space buffer object that has an address and a length. Used most often to share an arbi...
Definition: ntv2publicinterface.h:5967
NTV2Buffer::GetByteCount
ULWord GetByteCount(void) const
Definition: ntv2publicinterface.h:6040
NTV2DeviceGetActiveMemorySize
ULWord NTV2DeviceGetActiveMemorySize(const NTV2DeviceID inDeviceID)
Definition: ntv2devicefeatures.hpp:8262
CNTV2Card::DmaP2PTargetFrame
virtual bool DmaP2PTargetFrame(NTV2Channel channel, ULWord frameNumber, ULWord frameOffset, PCHANNEL_P2P_STRUCT pP2PData)
DirectGMA p2p transfers (not GPUDirect: see DMABufferLock)
Definition: ntv2dma.cpp:116
NTV2_FG_INVALID
@ NTV2_FG_INVALID
Definition: ntv2enums.h:361
NTV2Buffer::Deallocate
bool Deallocate(void)
Deallocates my user-space storage (if I own it – i.e. from a prior call to Allocate).
Definition: ntv2publicinterface.cpp:1588
DMASTREAM_START
#define DMASTREAM_START
Used in NTV2DmaStream to start DMA streaming.
Definition: ntv2publicinterface.h:5543
CNTV2Card::DMAWrite
virtual bool DMAWrite(const ULWord inFrameNumber, const ULWord *pFrameBuffer, const ULWord inOffsetBytes, const ULWord inByteCount)
Transfers data from the host to the AJA device.
Definition: ntv2dma.cpp:35
CNTV2Card::DMARead
virtual bool DMARead(const ULWord inFrameNumber, ULWord *pFrameBuffer, const ULWord inOffsetBytes, const ULWord inByteCount)
Transfers data from the AJA device to the host.
Definition: ntv2dma.cpp:29
CNTV2Card::DMAReadAnc
virtual bool DMAReadAnc(const ULWord inFrameNumber, NTV2Buffer &outAncF1Buffer, NTV2Buffer &outAncF2Buffer=NULL_POINTER, const NTV2Channel inChannel=NTV2_CHANNEL1)
Transfers the contents of the ancillary data buffer(s) from a given frame on the AJA device to the ho...
Definition: ntv2dma.cpp:230
NTV2DeviceCanDoMultiFormat
bool NTV2DeviceCanDoMultiFormat(const NTV2DeviceID inDeviceID)
Definition: ntv2devicefeatures.hpp:4065
DMABUFFERLOCK_MANUAL
#define DMABUFFERLOCK_MANUAL
Used in NTV2BufferLock to manual page lock buffers.
Definition: ntv2publicinterface.h:5518
NTV2DeviceID
NTV2DeviceID
Identifies a specific AJA NTV2 device model number. The NTV2DeviceID is actually the PROM part number...
Definition: ntv2enums.h:20
NTV2_AncRgn_MonField1
@ NTV2_AncRgn_MonField1
Identifies the "monitor" or "auxiliary" Field 1 ancillary data region.
Definition: ntv2enums.h:4142
NTV2_AncRgn_Field2
@ NTV2_AncRgn_Field2
Identifies the "normal" Field 2 ancillary data region.
Definition: ntv2enums.h:4141
AncRgnOffsetsConstIter
AncRgnOffsets::const_iterator AncRgnOffsetsConstIter
Definition: ntv2dma.cpp:548
NTV2_FBF_INVALID
@ NTV2_FBF_INVALID
Definition: ntv2enums.h:245
NTV2FrameBufferFormat
NTV2FrameBufferFormat
Identifies a particular video frame buffer format. See Device Frame Buffer Formats for details.
Definition: ntv2enums.h:207
NTV2Buffer::Allocate
bool Allocate(const size_t inByteCount, const bool inPageAligned=false)
Allocates (or re-allocates) my user-space storage using the given byte count. I assume full responsib...
Definition: ntv2publicinterface.cpp:1554
NTV2BufferLock
This is used to prelock a video/audio/anc buffer used as the source or target of DMA transfers....
Definition: ntv2publicinterface.h:8376
NTV2_CHANNEL1
@ NTV2_CHANNEL1
Specifies channel or Frame Store 1 (or the first item).
Definition: ntv2enums.h:1307
DMABUFFERLOCK_UNLOCK_ALL
#define DMABUFFERLOCK_UNLOCK_ALL
Used in NTV2BufferLock to unlock all locked buffers.
Definition: ntv2publicinterface.h:5514
NTV2FramesizeToByteCount
ULWord NTV2FramesizeToByteCount(const NTV2Framesize inFrameSize)
Converts the given NTV2Framesize value into an exact byte count.
Definition: ntv2utils.cpp:5319
AncRgnSizesConstIter
AncRgnSizes::const_iterator AncRgnSizesConstIter
Definition: ntv2dma.cpp:549
kVRegMonAncField2Offset
@ kVRegMonAncField2Offset
Monitor Anc Field2 byte offset from end of frame buffer (IoIP only, GUMP)
Definition: ntv2virtualregisters.h:332
kDeviceGetNumBufferedAudioSystems
@ kDeviceGetNumBufferedAudioSystems
The total number of audio systems on the device that can read/write audio buffer memory....
Definition: ntv2devicefeatures.h:205
NTV2BufferLock::SetFlags
void SetFlags(const ULWord inFlags)
Sets the action flags for use in a subsequent call to CNTV2Card::DMABufferLock.
Definition: ntv2publicinterface.h:8442
kVRegAncField2Offset
@ kVRegAncField2Offset
Anc Field2 byte offset from end of frame buffer (GUMP on all boards except RTP for SMPTE2022/IP)
Definition: ntv2virtualregisters.h:336
CNTV2Card::GetAncRegionOffsetAndSize
virtual bool GetAncRegionOffsetAndSize(ULWord &outByteOffset, ULWord &outByteCount, const NTV2AncillaryDataRegion inAncRegion=NTV2_AncRgn_All)
Answers with the offset and size of an ancillary data region within a device frame buffer.
Definition: ntv2dma.cpp:574
CNTV2DriverInterface::ReadRegister
virtual bool ReadRegister(const ULWord inRegNum, ULWord &outValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Reads all or part of the 32-bit contents of a specific register (real or virtual) on the AJA device....
Definition: ntv2driverinterface.cpp:393
AncRgnOffset
pair< NTV2AncDataRgn, ULWord > AncRgnOffset
Definition: ntv2dma.cpp:550
CNTV2Card::DMAWriteAudio
virtual bool DMAWriteAudio(const NTV2AudioSystem inAudioSystem, const ULWord *pInAudioBuffer, const ULWord inOffsetBytes, const ULWord inByteCount)
Synchronously transfers audio data from the specified host buffer to the given Audio System's buffer ...
Definition: ntv2dma.cpp:212
CNTV2Card::DMABufferUnlockAll
virtual bool DMABufferUnlockAll()
Unlocks all previously-locked buffers used for DMA transfers.
Definition: ntv2dma.cpp:515
NTV2_IS_VALID_ANC_RGN
#define NTV2_IS_VALID_ANC_RGN(_x_)
Definition: ntv2enums.h:4152
NTV2DMAEngine
NTV2DMAEngine
Definition: ntv2enums.h:1801
CNTV2Card::DMAReadSegments
virtual bool DMAReadSegments(const ULWord inFrameNumber, ULWord *pFrameBuffer, const ULWord inCardOffsetBytes, const ULWord inSegmentByteCount, const ULWord inNumSegments, const ULWord inSegmentHostPitch, const ULWord inSegmentCardPitch)
Performs a segmented data transfer from the AJA device to the host.
Definition: ntv2dma.cpp:90
DMASTREAM_STOP
#define DMASTREAM_STOP
Used in NTV2DmaStream to stop DMA streaming.
Definition: ntv2publicinterface.h:5544
NTV2Buffer::IsNULL
bool IsNULL(void) const
Definition: ntv2publicinterface.h:6062
ULWord
uint32_t ULWord
Definition: ajatypes.h:246
kRegMaskFrameSizeSetBySW
@ kRegMaskFrameSizeSetBySW
Definition: ntv2publicinterface.h:1222
kVRegAncField1Offset
@ kVRegAncField1Offset
Anc Field1 byte offset from end of frame buffer (GUMP on all boards except RTP for SMPTE2022/IP)
Definition: ntv2virtualregisters.h:335
NTV2_AncRgn_Field1
@ NTV2_AncRgn_Field1
Identifies the "normal" Field 1 ancillary data region.
Definition: ntv2enums.h:4140
kK2RegShiftFrameSize
@ kK2RegShiftFrameSize
Definition: ntv2publicinterface.h:2297
DMAANCWARN
#define DMAANCWARN(__x__)
Definition: ntv2dma.cpp:20
NTV2DeviceSoftwareCanChangeFrameBufferSize
bool NTV2DeviceSoftwareCanChangeFrameBufferSize(const NTV2DeviceID inDeviceID)
Definition: ntv2devicefeatures.hpp:8172
ntv2card.h
Declares the CNTV2Card class.
NTV2DeviceCanReportFrameSize
bool NTV2DeviceCanReportFrameSize(const NTV2DeviceID inDeviceID)
Definition: ntv2devicefeatures.hpp:6004
CNTV2Card::GetDeviceFrameInfo
virtual bool GetDeviceFrameInfo(const UWord inFrameNumber, const NTV2Channel inChannel, uint64_t &outAddress, uint64_t &outLength)
Answers with the address and size of the given frame.
Definition: ntv2dma.cpp:433
NTV2_HEADER
All new NTV2 structs start with this common header.
Definition: ntv2publicinterface.h:6899
CNTV2Card::DMAWriteAnc
virtual bool DMAWriteAnc(const ULWord inFrameNumber, NTV2Buffer &inAncF1Buffer, NTV2Buffer &inAncF2Buffer=NULL_POINTER, const NTV2Channel inChannel=NTV2_CHANNEL1)
Transfers the contents of the ancillary data buffer(s) from the host to a given frame on the AJA devi...
Definition: ntv2dma.cpp:286
UWord
uint16_t UWord
Definition: ajatypes.h:244
AncRgnOffsets
map< NTV2AncDataRgn, ULWord > AncRgnOffsets
Definition: ntv2dma.cpp:547
DMAEngine
DMAEngine
Definition: ntv2macpublicinterface.h:103
ntv2utils.h
Declares numerous NTV2 utility functions.
NTV2Framesize
NTV2Framesize
Kona2/Xena2 specific enums.
Definition: ntv2enums.h:2057
CNTV2Card::DMAReadFrame
virtual bool DMAReadFrame(const ULWord inFrameNumber, ULWord *pOutFrameBuffer, const ULWord inByteCount)
Transfers a single frame from the AJA device to the host.
Definition: ntv2dma.cpp:41
CNTV2Card::DMAWriteLUTTable
virtual bool DMAWriteLUTTable(const ULWord inFrameNumber, const ULWord *pInLUTBuffer, const ULWord inLUTIndex, const ULWord inByteCount=LUTTablePartitionSize)
Synchronously transfers LUT data from the specified host buffer to the given buffer memory on the AJA...
Definition: ntv2dma.cpp:353
CNTV2Card::DMABufferLock
virtual bool DMABufferLock(const NTV2Buffer &inBuffer, bool inMap=false, bool inRDMA=false)
Page-locks the given host buffer to reduce transfer time and CPU usage of DMA transfers.
Definition: ntv2dma.cpp:487
SizeAncRgns
map< ULWord, NTV2AncDataRgn > SizeAncRgns
Definition: ntv2dma.cpp:543
CNTV2Card::DMAReadAudio
virtual bool DMAReadAudio(const NTV2AudioSystem inAudioSystem, ULWord *pOutAudioBuffer, const ULWord inOffsetBytes, const ULWord inByteCount)
Synchronously transfers audio data from a given Audio System's buffer memory on the AJA device to the...
Definition: ntv2dma.cpp:194
kRegShiftFrameSizeSetBySW
@ kRegShiftFrameSizeSetBySW
Definition: ntv2publicinterface.h:2305
NTV2_AncRgn_MonField2
@ NTV2_AncRgn_MonField2
Identifies the "monitor" or "auxiliary" Field 2 ancillary data region.
Definition: ntv2enums.h:4143
NTV2_DMA_FIRST_AVAILABLE
@ NTV2_DMA_FIRST_AVAILABLE
Definition: ntv2enums.h:1810
NTV2_IS_VALID_CHANNEL
#define NTV2_IS_VALID_CHANNEL(__x__)
Definition: ntv2enums.h:1319
OffsetAncRgnsConstRIter
OffsetAncRgns::const_reverse_iterator OffsetAncRgnsConstRIter
Definition: ntv2dma.cpp:546
NTV2Buffer::GetHostPointer
void * GetHostPointer(void) const
Definition: ntv2publicinterface.h:6023
DEVICE_ID_IOIP_2110
@ DEVICE_ID_IOIP_2110
See Io IP.
Definition: ntv2enums.h:39
NTV2BufferLock::SetMaxLockSize
void SetMaxLockSize(const ULWord64 inNumBytes)
Sets the maximum lock size for use in a subsequent call to CNTV2Card::DMABufferLock.
Definition: ntv2publicinterface.h:8448
SizeAncRgn
pair< ULWord, NTV2AncDataRgn > SizeAncRgn
Definition: ntv2dma.cpp:544
NTV2_FBF_10BIT_YCBCR
@ NTV2_FBF_10BIT_YCBCR
See 10-Bit YCbCr Format.
Definition: ntv2enums.h:210
CNTV2Card::DmaP2PTransferFrame
virtual bool DmaP2PTransferFrame(NTV2DMAEngine DMAEngine, ULWord frameNumber, ULWord frameOffset, ULWord transferSize, ULWord numSegments, ULWord segmentTargetPitch, ULWord segmentCardPitch, PCHANNEL_P2P_STRUCT pP2PData)
Definition: ntv2dma.cpp:122
AncRgnSize
pair< NTV2AncDataRgn, ULWord > AncRgnSize
Definition: ntv2dma.cpp:550
OffsetAncRgns
map< ULWord, NTV2AncDataRgn > OffsetAncRgns
Definition: ntv2dma.cpp:543
ULWord64
uint64_t ULWord64
Definition: ajatypes.h:249
DMABUFFERLOCK_AUTO
#define DMABUFFERLOCK_AUTO
Used in NTV2BufferLock to auto page lock buffers.
Definition: ntv2publicinterface.h:5517
AUTOCIRCULATE_P2P_STRUCT
Definition: ntv2publicinterface.h:4626
AncRgnSizes
map< NTV2AncDataRgn, ULWord > AncRgnSizes
Definition: ntv2dma.cpp:547
NTV2DeviceCanDoStackedAudio
bool NTV2DeviceCanDoStackedAudio(const NTV2DeviceID inDeviceID)
Definition: ntv2devicefeatures.hpp:5196
NTV2FrameGeometry
NTV2FrameGeometry
Identifies a particular video frame geometry.
Definition: ntv2enums.h:336
kK2RegMaskFrameSize
@ kK2RegMaskFrameSize
Definition: ntv2publicinterface.h:1215
kRegCh1Control
@ kRegCh1Control
Definition: ntv2publicinterface.h:74
CNTV2Card::DeviceAddressToFrameNumber
virtual bool DeviceAddressToFrameNumber(const uint64_t inAddress, UWord &outFrameNumber, const NTV2Channel inChannel=NTV2_CHANNEL1)
Answers with the frame number that contains the given address.
Definition: ntv2dma.cpp:440
DMABUFFERLOCK_MAX_SIZE
#define DMABUFFERLOCK_MAX_SIZE
Used in NTV2BufferLock to set max locked size.
Definition: ntv2publicinterface.h:5519
CNTV2Card::DMAWriteFrame
virtual bool DMAWriteFrame(const ULWord inFrameNumber, const ULWord *pInFrameBuffer, const ULWord inByteCount)
Transfers a single frame from the host to the AJA device.
Definition: ntv2dma.cpp:65
OffsetAncRgn
pair< ULWord, NTV2AncDataRgn > OffsetAncRgn
Definition: ntv2dma.cpp:544
CNTV2Card::DMAClearAncRegion
virtual bool DMAClearAncRegion(const UWord inStartFrameNumber, const UWord inEndFrameNumber, const NTV2AncillaryDataRegion inAncRegion=NTV2_AncRgn_All, const NTV2Channel=NTV2_CHANNEL1)
Clears the ancillary data region in the device frame buffer for the specified frames.
Definition: ntv2dma.cpp:553
NTV2DmaStream
This is used for streaming dma.
Definition: ntv2publicinterface.h:8568
NTV2AncDataRgn
enum NTV2AncillaryDataRegion NTV2AncDataRgn
CNTV2Card::DMAStreamStart
virtual bool DMAStreamStart(ULWord *inBuffer, const ULWord inByteCount, const NTV2Channel inChannel, const bool inToHost)
Streaming transfers.
Definition: ntv2dma.cpp:136
NTV2Buffer::Fill
bool Fill(const T &inValue)
Fills me with the given scalar value.
Definition: ntv2publicinterface.h:6192
OffsetAncRgnsConstIter
OffsetAncRgns::const_iterator OffsetAncRgnsConstIter
Definition: ntv2dma.cpp:545
NTV2DeviceCanDoCustomAnc
bool NTV2DeviceCanDoCustomAnc(const NTV2DeviceID inDeviceID)
Definition: ntv2devicefeatures.hpp:2087
CNTV2Card::DMABufferAutoLock
virtual bool DMABufferAutoLock(const bool inEnable, const bool inMap=false, const ULWord64 inMaxLockSize=0)
Enables or disables automatic buffer locking.
Definition: ntv2dma.cpp:524
NTV2_PIO
@ NTV2_PIO
Definition: ntv2enums.h:1803
NTV2AncillaryDataRegion
NTV2AncillaryDataRegion
These enumerations identify the various ancillary data regions located at the bottom of each frame bu...
Definition: ntv2enums.h:4138
CNTV2Card::GetAudioMemoryOffset
virtual bool GetAudioMemoryOffset(const ULWord inOffsetBytes, ULWord &outAbsByteOffset, const NTV2AudioSystem inAudioSystem, const bool inCaptureBuffer=false)
Answers with the byte offset in device SDRAM into the specified Audio System's audio buffer.
Definition: ntv2dma.cpp:159
xHEX0N
#define xHEX0N(__x__, __n__)
Definition: ntv2publicinterface.h:5578
NTV2AudioSystem
NTV2AudioSystem
Used to identify an Audio System on an NTV2 device. See Audio System Operation for more information.
Definition: ntv2enums.h:3809
DEVICE_ID_IOIP_2110_RGB12
@ DEVICE_ID_IOIP_2110_RGB12
See Io IP.
Definition: ntv2enums.h:40
NTV2DeviceGetFrameBufferSize
ULWord NTV2DeviceGetFrameBufferSize(NTV2DeviceID boardID, NTV2FrameGeometry frameGeometry, NTV2FrameBufferFormat frameFormat)
Definition: ntv2devicefeatures.cpp:245
NTV2_IS_ALL_ANC_RGNS
#define NTV2_IS_ALL_ANC_RGNS(_x_)
Definition: ntv2enums.h:4151
NTV2_FRAMESIZE_INVALID
@ NTV2_FRAMESIZE_INVALID
Definition: ntv2enums.h:2076
DMABUFFERLOCK_UNLOCK
#define DMABUFFERLOCK_UNLOCK
Used in NTV2BufferLock to unlock a buffer.
Definition: ntv2publicinterface.h:5516
NTV2DeviceCanDo2110
bool NTV2DeviceCanDo2110(const NTV2DeviceID inDeviceID)
Definition: ntv2devicefeatures.hpp:467
NTV2_AncRgn_All
@ NTV2_AncRgn_All
Identifies "all" ancillary data regions.
Definition: ntv2enums.h:4148
NTV2DeviceGetNumberFrameBuffers
ULWord NTV2DeviceGetNumberFrameBuffers(NTV2DeviceID boardID, NTV2FrameGeometry frameGeometry, NTV2FrameBufferFormat frameFormat)
Definition: ntv2devicefeatures.cpp:510
debug.h
Declares the AJADebug class.
LUTTablePartitionSize
const ULWord LUTTablePartitionSize
Definition: ntv2card.h:56