AJA NTV2 SDK  17.0.1.1246
NTV2 SDK 17.0.1.1246
ancillarylist.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 #ifndef AJA_ANCILLARYLIST_H
9 #define AJA_ANCILLARYLIST_H
10 
11 #include "ancillarydata.h"
12 #include "ntv2formatdescriptor.h"
13 #include <map>
14 #include <set>
15 
16 // Starting with SDK 16.3, AJAAncillaryList is implemented using std::vector,
17 // which is faster than std::list, which is what was used in SDK 16.2.x and earlier.
18 #define AJAANCLISTIMPL_VECTOR // Comment out this line to revert to pre-16.3 behavior
19 #if defined(AJAANCLISTIMPL_VECTOR)
20  #include <vector>
21 #else
22  #include <list>
23 #endif
24 
25 
26 // used for "match any" searches and counts
27 const uint8_t AJAAncillaryDataWildcard_DID = 0xFF;
28 const uint8_t AJAAncillaryDataWildcard_SID = 0xFF;
29 
36 typedef std::map <uint16_t, AJAAncDataType> AJAAncillaryAnalogTypeMap;
37 
38 typedef std::vector<ULWordSequence> AJAU32Pkts;
39 typedef AJAU32Pkts::const_iterator AJAU32PktsConstIter;
40 typedef AJAU32Pkts::iterator AJAU32PktsIter;
41 
43 typedef AJAAncPktCounts::const_iterator AJAAncPktCountsConstIter;
44 class CNTV2Card;
45 
46 typedef std::set<AJAAncPktDIDSID> AJAAncPktDIDSIDSet;
47 typedef AJAAncPktDIDSIDSet::const_iterator AJAAncPktDIDSIDSetConstIter;
48 typedef AJAAncPktDIDSIDSet::iterator AJAAncPktDIDSIDSetIter;
49 
50 
65 {
66 public: // CLASS METHODS
67 
71 
83  static AJAStatus SetFromVANCData (const NTV2Buffer & inFrameBuffer,
84  const NTV2FormatDescriptor & inFormatDesc,
85  AJAAncillaryList & outPackets,
86  const uint32_t inFrameNum = 0);
87 
96  static AJAStatus SetFromDeviceAncBuffers (const NTV2Buffer & inF1AncBuffer,
97  const NTV2Buffer & inF2AncBuffer,
98  AJAAncillaryList & outPackets,
99  const uint32_t inFrameNum = 0);
101 
102 
106 
111  static AJAStatus ClearAnalogAncillaryDataTypeMap (void);
112 
113 
119  static AJAStatus SetAnalogAncillaryDataTypeMap (const AJAAncillaryAnalogTypeMap & inMap);
120 
121 
127  static AJAStatus GetAnalogAncillaryDataTypeMap (AJAAncillaryAnalogTypeMap & outMap);
128 
129 
137  static AJAStatus SetAnalogAncillaryDataTypeForLine (const uint16_t inLineNum, const AJAAncDataType inType);
138 
139 
146  static AJAAncDataType GetAnalogAncillaryDataTypeForLine (const uint16_t inLineNum);
147 
148 
153  static void SetIncludeZeroLengthPackets (const bool inExclude);
154  static uint32_t GetExcludedZeroLengthPacketCount (void);
155  static void ResetExcludedZeroLengthPacketCount (void);
156  static bool IsIncludingZeroLengthPackets (void);
157 
159 
160 public: // INSTANCE METHODS
164  AJAAncillaryList ();
166  inline AJAAncillaryList (const AJAAncillaryList & inRHS) {*this = inRHS;}
167  virtual ~AJAAncillaryList ();
168 
174  virtual AJAAncillaryList & operator = (const AJAAncillaryList & inRHS);
176 
177 
181 
187  virtual inline uint32_t CountAncillaryData (void) const {return uint32_t(m_ancList.size());}
188 
192  virtual inline bool IsEmpty (void) const {return !CountAncillaryData();}
193 
200  virtual AJAAncillaryData * GetAncillaryDataAtIndex (const uint32_t inIndex) const;
201 
207  virtual uint32_t CountAncillaryDataWithType (const AJAAncDataType inMatchType) const;
208 
216  virtual AJAAncillaryData * GetAncillaryDataWithType (const AJAAncDataType inMatchType, const uint32_t inIndex = 0) const;
217 
224  virtual uint32_t CountAncillaryDataWithID (const uint8_t inDID, const uint8_t inSID) const;
225 
234  virtual AJAAncillaryData * GetAncillaryDataWithID (const uint8_t inDID, const uint8_t inSID, const uint32_t inIndex = 0) const;
235 
236  virtual AJAAncPktDIDSIDSet GetAncillaryPacketIDs (void) const;
237 
239 
243 
249  virtual AJAStatus Clear (void);
250 
256  virtual AJAStatus AddAncillaryData (const AJAAncillaryList & inPackets);
257 
263  virtual AJAStatus AddAncillaryData (const AJAAncillaryData * pInAncData);
264 
270  virtual inline AJAStatus AddAncillaryData (const AJAAncillaryData & inAncData) {return AddAncillaryData(&inAncData);}
271 
278  virtual AJAStatus RemoveAncillaryData (AJAAncillaryData * pInAncData);
279 
285  virtual AJAStatus DeleteAncillaryData (AJAAncillaryData * pInAncData);
287 
288 
292 
298  virtual AJAStatus SortListByDID (void);
299 
304  virtual AJAStatus SortListBySID (void);
305 
311  virtual AJAStatus SortListByLocation (void);
312 
321  virtual AJAStatus Compare (const AJAAncillaryList & inCompareList, const bool inIgnoreLocation = true, const bool inIgnoreChecksum = true) const;
322 
333  virtual std::string CompareWithInfo (const AJAAncillaryList & inCompareList, const bool inIgnoreLocation = true, const bool inIgnoreChecksum = true) const;
334 
344  virtual bool CompareWithInfo (std::vector<std::string> & outDiffs, const AJAAncillaryList & inCompareList, const bool inIgnoreLocation = true, const bool inIgnoreChecksum = true) const; // New in SDK 16.3
346 
347 
351 
361  virtual AJAStatus GetAncillaryDataTransmitSize (const bool inIsProgressive, const uint32_t inF2StartLine,
362  uint32_t & outF1ByteCount, uint32_t & outF2ByteCount);
363 
364 
378  virtual AJAStatus GetAncillaryDataTransmitData (const bool inIsProgressive, const uint32_t inF2StartLine,
379  uint8_t * pOutF1AncData, const uint32_t inF1ByteCountMax,
380  uint8_t * pOutF2AncData, const uint32_t inF2ByteCountMax);
381 
394  virtual AJAStatus GetTransmitData (NTV2Buffer & F1Buffer, NTV2Buffer & F2Buffer,
395  const bool inIsProgressive = true, const uint32_t inF2StartLine = 0);
396 
397  virtual inline AJAStatus GetSDITransmitData (NTV2Buffer & F1Buffer, NTV2Buffer & F2Buffer,
398  const bool inIsProgressive = true, const uint32_t inF2StartLine = 0)
399  {return GetTransmitData(F1Buffer, F2Buffer, inIsProgressive, inF2StartLine);}
400 
409  virtual AJAStatus GetVANCTransmitData (NTV2Buffer & inFrameBuffer, const NTV2FormatDescriptor & inFormatDesc);
410 
425  virtual AJAStatus GetIPTransmitData (NTV2Buffer & F1Buffer, NTV2Buffer & F2Buffer,
426  const bool inIsProgressive = true, const uint32_t inF2StartLine = 0);
427 
438  virtual AJAStatus GetIPTransmitDataLength (uint32_t & outF1ByteCount, uint32_t & outF2ByteCount,
439  const bool inIsProgressive = true, const uint32_t inF2StartLine = 0);
440 
446  virtual inline bool AllowMultiRTPTransmit (void) const {return m_xmitMultiRTP;}
447 
454  virtual inline void SetAllowMultiRTPTransmit (const bool inAllow) {m_xmitMultiRTP = inAllow;}
456 
457 
461 
474  virtual AJAStatus AddReceivedAncillaryData (const uint8_t * pInReceivedData, const uint32_t inByteCount, const uint32_t inFrameNum = 0);
475 
476 
486  virtual AJAStatus AddReceivedAncillaryData (const ULWordSequence & inReceivedData);
487 
488 
498  virtual AJAStatus AddVANCData (const UWordSequence & inPacketWords,
499  const AJAAncillaryDataLocation & inLocation,
500  const uint32_t inFrameNum = 0);
501 
507  virtual inline bool AllowMultiRTPReceive (void) const {return m_rcvMultiRTP;}
508 
514  virtual inline void SetAllowMultiRTPReceive (const bool inAllow) {m_rcvMultiRTP = inAllow;}
515 
522  virtual inline bool IgnoreChecksumErrors (void) const {return m_ignoreCS;}
523 
529  virtual inline void SetIgnoreChecksumErrors (const bool inIgnore) {m_ignoreCS = inIgnore;}
530 
535  virtual AJAStatus ParseAllAncillaryData (void);
537 
538 
542 
550  virtual std::ostream & Print (std::ostream & inOutStream, const bool inDetailed = true) const;
552 
553 
554 protected:
555  friend class CNTV2Card; // CNTV2Card's member functions can call AJAAncillaryList's private & protected member functions
556 
557 #if defined(AJAANCLISTIMPL_VECTOR)
558  typedef std::vector <AJAAncillaryData*> AJAAncillaryDataList;
559 #else
560  typedef std::list <AJAAncillaryData*> AJAAncillaryDataList;
561 #endif
562  typedef AJAAncillaryDataList::const_iterator AJAAncDataListConstIter;
563  typedef AJAAncillaryDataList::iterator AJAAncDataListIter;
564 
565  virtual inline AJAAncDataType GetAnalogAncillaryDataType (const AJAAncillaryData & inAncData) {return GetAnalogAncillaryDataTypeForLine(inAncData.GetLocationLineNumber());}
566 
567  static bool BufferHasGUMPData (const NTV2Buffer & inBuffer);
568 
577  static AJAStatus AddFromDeviceAncBuffer (const NTV2Buffer & inAncBuffer,
578  AJAAncillaryList & outPacketList,
579  const uint32_t inFrameNum = 0);
580 
593  virtual AJAStatus GetRTPPackets (AJAU32Pkts & outF1U32Pkts,
594  AJAU32Pkts & outF2U32Pkts,
595  AJAAncPktCounts & outF1AncCounts,
596  AJAAncPktCounts & outF2AncCounts,
597  const bool inIsProgressive,
598  const uint32_t inF2StartLine);
612  static AJAStatus WriteRTPPackets (NTV2Buffer & theBuffer,
613  uint32_t & outBytesWritten,
614  const AJAU32Pkts & inRTPPkts,
615  const AJAAncPktCounts & inAncCounts,
616  const bool inIsF2,
617  const bool inIsProgressive);
618 
619 private:
620  AJAAncillaryDataList m_ancList;
621  bool m_rcvMultiRTP;
622  bool m_xmitMultiRTP;
623  bool m_ignoreCS;
624 
625 }; // AJAAncillaryList
626 
627 
634 inline std::ostream & operator << (std::ostream & inOutStream, const AJAAncillaryList & inList) {return inList.Print(inOutStream);}
635 
642 AJAExport std::ostream & operator << (std::ostream & inOutStream, const AJAU32Pkts & inPkts);
643 
650 AJAExport std::ostream & operator << (std::ostream & inOutStream, const AJAAncPktDIDSIDSet & inSet); // New in SDK 16.0
651 
652 #endif // AJA_ANCILLARYLIST_H
AJAAncillaryList::AllowMultiRTPReceive
virtual bool AllowMultiRTPReceive(void) const
Answers true if multiple RTP packets are allowed for capture/receive. The default behavior is to proc...
Definition: ancillarylist.h:507
AJAAncPktCounts
UByteSequence AJAAncPktCounts
Ordered sequence of SMPTE Anc packet counts.
Definition: ancillarylist.h:42
AJAAncillaryList::AJAAncillaryDataList
std::vector< AJAAncillaryData * > AJAAncillaryDataList
Definition: ancillarylist.h:558
AJAAncDataLoc
Defines where the ancillary data can be found within a video stream.
Definition: ancillarydata.h:224
AJAAncillaryList::SetAllowMultiRTPTransmit
virtual void SetAllowMultiRTPTransmit(const bool inAllow)
Determines if multiple RTP packets will be encoded for playout (via GetIPTransmitData)....
Definition: ancillarylist.h:454
ancillarydata.h
Declares the AJAAncillaryData class.
AJAAncillaryList::SetIgnoreChecksumErrors
virtual void SetIgnoreChecksumErrors(const bool inIgnore)
Determines if checksum errors encountered during capture/ingest (via AddReceivedAncillaryData) will b...
Definition: ancillarylist.h:529
NTV2FormatDescriptor
Describes a video frame for a given video standard or format and pixel format, including the total nu...
Definition: ntv2formatdescriptor.h:41
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
UByteSequence
std::vector< uint8_t > UByteSequence
An ordered sequence of UByte (uint8_t) values.
Definition: ntv2publicinterface.h:37
AJAAncPktDIDSIDSet
std::set< AJAAncPktDIDSID > AJAAncPktDIDSIDSet
Set of distinct packet DID/SIDs (New in SDK 16.0)
Definition: ancillarylist.h:44
AJAU32PktsConstIter
AJAU32Pkts::const_iterator AJAU32PktsConstIter
Handy const iterator over AJAU32Pkts.
Definition: ancillarylist.h:39
AJAAncDataType
AJAAncDataType
Identifies the ancillary data types that are known to this module.
Definition: ancillarydata.h:44
AJAAncillaryList
I am an ordered collection of AJAAncillaryData instances which represent one or more SMPTE 291 data p...
Definition: ancillarylist.h:64
AJAAncillaryList::IsEmpty
virtual bool IsEmpty(void) const
Definition: ancillarylist.h:192
AJAStatus
AJAStatus
Definition: types.h:365
AJAAncillaryList::AJAAncDataListConstIter
AJAAncillaryDataList::const_iterator AJAAncDataListConstIter
Handy const iterator for iterating over members of an AJAAncillaryDataList.
Definition: ancillarylist.h:562
AJAAncillaryAnalogTypeMap
std::map< uint16_t, AJAAncDataType > AJAAncillaryAnalogTypeMap
Associates certain frame line numbers with specific types of "raw" or "analog" ancillary data....
Definition: ancillarylist.h:36
AJAAncillaryList::AJAAncDataListIter
AJAAncillaryDataList::iterator AJAAncDataListIter
Handy non-const iterator for iterating over members of an AJAAncillaryDataList.
Definition: ancillarylist.h:563
AJAAncillaryData
I am the principal class that stores a single SMPTE-291 SDI ancillary data packet OR the digitized co...
Definition: ancillarydata.h:550
AJAAncillaryList::AddAncillaryData
virtual AJAStatus AddAncillaryData(const AJAAncillaryData &inAncData)
Appends a copy of the given AJAAncillaryData object to me.
Definition: ancillarylist.h:270
UWordSequence
std::vector< uint16_t > UWordSequence
An ordered sequence of UWord (uint16_t) values.
Definition: ntv2publicinterface.h:41
AJAAncillaryDataWildcard_DID
const uint8_t AJAAncillaryDataWildcard_DID
Definition: ancillarylist.h:27
AJAU32Pkts
std::vector< ULWordSequence > AJAU32Pkts
Ordered sequence of U32 RTP packets (U32s in network byte order)
Definition: ancillarylist.h:38
AJAU32PktsIter
AJAU32Pkts::iterator AJAU32PktsIter
Handy non-const iterator over AJAU32Pkts.
Definition: ancillarylist.h:40
CNTV2Card
I interrogate and control an AJA video/audio capture/playout device.
Definition: ntv2card.h:262
AJAAncPktCountsConstIter
AJAAncPktCounts::const_iterator AJAAncPktCountsConstIter
Handy const iterator over AJAAncPktCounts.
Definition: ancillarylist.h:43
AJAAncillaryList::Print
virtual std::ostream & Print(std::ostream &inOutStream, const bool inDetailed=true) const
Dumps a human-readable description of every packet in my list to the given output stream.
Definition: ancillarylist.cpp:1550
AJAAncillaryList::AllowMultiRTPTransmit
virtual bool AllowMultiRTPTransmit(void) const
Answers true if multiple RTP packets will be transmitted/encoded. The default behavior is to transmit...
Definition: ancillarylist.h:446
AJAAncillaryList::CountAncillaryData
virtual uint32_t CountAncillaryData(void) const
Answers with the number of AJAAncillaryData objects I contain (any/all types).
Definition: ancillarylist.h:187
ntv2formatdescriptor.h
Declares the NTV2FormatDescriptor class.
AJAAncillaryDataWildcard_SID
const uint8_t AJAAncillaryDataWildcard_SID
Definition: ancillarylist.h:28
ULWordSequence
std::vector< uint32_t > ULWordSequence
An ordered sequence of ULWord (uint32_t) values.
Definition: ntv2publicinterface.h:45
AJAExport
#define AJAExport
Definition: export.h:33
AJAAncPktDIDSIDSetIter
AJAAncPktDIDSIDSet::iterator AJAAncPktDIDSIDSetIter
Handy non-const iterator for AJAAncPktDIDSIDSet (New in SDK 16.0)
Definition: ancillarylist.h:48
operator<<
std::ostream & operator<<(std::ostream &inOutStream, const AJAAncillaryList &inList)
Writes a human-readable rendition of the given AJAAncillaryList into the given output stream.
Definition: ancillarylist.h:634
AJAAncillaryList::GetAnalogAncillaryDataType
virtual AJAAncDataType GetAnalogAncillaryDataType(const AJAAncillaryData &inAncData)
Definition: ancillarylist.h:565
AJAAncillaryList::SetAllowMultiRTPReceive
virtual void SetAllowMultiRTPReceive(const bool inAllow)
Determines if more than one RTP packet will be processed/decoded (via AddReceivedAncillaryData).
Definition: ancillarylist.h:514
AJAAncillaryList::IgnoreChecksumErrors
virtual bool IgnoreChecksumErrors(void) const
Answers if checksum errors are to be ignored or not. The default behavior is to not ignore them.
Definition: ancillarylist.h:522
AJAAncPktDIDSIDSetConstIter
AJAAncPktDIDSIDSet::const_iterator AJAAncPktDIDSIDSetConstIter
Handy const iterator for AJAAncPktDIDSIDSet (New in SDK 16.0)
Definition: ancillarylist.h:47