AJA NTV2 SDK  17.1.1.1245
NTV2 SDK 17.1.1.1245
ntv2captiondecoder708.h
Go to the documentation of this file.
1 
7 #ifndef __NTV2_CEA708_DECODER_
8 #define __NTV2_CEA708_DECODER_
9 
10 #include "ntv2caption708service.h"
13 
14 #ifdef MSWindows
15  #include "windows.h"
16  #include "stdio.h"
17 #endif
18 
31 
32 
34 
36 enum // The three "states" of a Caption Channel Packet:
37 {
41 };
42 
43 
55 {
56  int ccpStatus;
57  int ccpSize;
60 
62 
64 
65 
70 {
71  // Class Methods
72  public:
78  static bool Create (CNTV2CaptionDecoder708Ptr & outDecoder);
79 
80 
81  // Instance Methods
82  public:
83  virtual ~CNTV2CaptionDecoder708 ();
84 
85  virtual void Reset (void);
86 
92  virtual bool SetDisplayChannel (const NTV2Line21Channel inChan);
93 
98  virtual inline NTV2Line21Channel GetDisplayChannel (void) const {return mLine21DisplayChannel;}
99 
106  virtual inline bool SetSMPTE334AncData (const AJAAncillaryData_Cea708 & inPacket)
107  {return SetSMPTE334AncData(inPacket.GetPayloadData(), inPacket.GetPayloadByteCount());}
114  virtual inline bool SetSMPTE334AncData (const AJAAncillaryData_Cea708 * pInPacket)
115  {return pInPacket ? SetSMPTE334AncData(pInPacket->GetPayloadData(), pInPacket->GetPayloadByteCount()) : false;}
116 
125  virtual bool SetSMPTE334AncData (const UByte * pInAncData, const size_t inByteCount);
126 
136  virtual bool SetSMPTE334AncData (const UWord * pInAncData, const size_t inWordCount);
137 
144  virtual bool GetSMPTE334AncData (const UByte ** ppAncData, size_t & outAncSize) const;
145 
158  virtual bool ParseSMPTE334AncPacket (bool & outHasParityErrors);
159 
160 
171  virtual bool ParseSMPTE334AncPacket (void);
172  virtual bool ParseSMPTE334CCTimeCodeSection (size_t & index);
173  virtual bool ParseSMPTE334CCDataSection (size_t & index);
174  virtual bool ParseSMPTE334CCServiceInfoSection (size_t & index);
175  virtual bool UpdateServiceInfo (void);
176 
177  virtual bool Clear608CaptionData (void);
178 
179  virtual inline const CaptionData & GetCurrentFrameCC608Data (void) const {return mCC608FrameData;}
180 
185  virtual CaptionData GetCC608CaptionData (void);
186 
187  virtual bool GetCaptionChannelPacket (UBytePtr & outDataPtr, size_t & outSize);
188 
189  virtual inline const NTV2_CC708ServiceData & GetAllServiceInfoPtr (void) const {return mCurrentServiceInfo.GetAllServiceInfoPtr();}
190 
191  virtual bool GetNextServiceBlockInfoFromQueue (const size_t svcIndex, size_t & outBlockSize, size_t & outDataSize, int & outServiceNum, bool & outIsExtended) const;
192  virtual size_t GetNextServiceBlockFromQueue (const size_t svcIndex, std::vector<UByte> & outData);
193  virtual size_t GetNextServiceBlockDataFromQueue (const size_t svcIndex, std::vector<UByte> & outData);
194  virtual size_t GetNextServiceBlockFromQueue (const size_t svcIndex, UByte * pOutDataBuffer);
195  virtual size_t GetNextServiceBlockDataFromQueue (const size_t svcIndex, UByte * pOutDataBuffer);
196 
197  virtual inline void GetCDPData (NTV2_CC708CDPPtr pCDP) const {*pCDP = mParsedCDPData;}
198 
199  virtual void ClearAllCaptionChannelPacketInfo (void);
200  virtual void ClearCaptionChannelPacketInfo (CaptionChannelPacketInfoPtr pCCPInfo);
201  virtual int GetNumCompleteCaptionChannelPacketInfo (int * pCompleteCount = NULL, int * pStartedCount = NULL);
202  virtual void ResetCaptionChannelPacketInfoForNewCDP (void);
203  virtual void CloseCurrentCaptionChannelPacketInfo (void);
204  virtual bool AddCaptionChannelPacketInfoData (UByte newData);
205  virtual bool GetCaptionChannelPacketInfoData (int index, UByte ** ppData, int * pSize);
206 
207  virtual bool ParseAllCaptionChannelPackets (void);
208  virtual bool ParseCaptionChannelPacket (CaptionChannelPacketInfoPtr pCCPInfo);
209 
210  virtual bool FindSMPTE334AncPacketInVideoFrame (const UByte * pInVideoFrame, const NTV2VideoFormat inVideoFormat, const NTV2FrameBufferFormat inPixelFormat, bool & outHasParityErrors);
211  virtual bool FindSMPTE334AncPacketInVideoFrame (const UByte * pInVideoFrame, const NTV2VideoFormat inVideoFormat, const NTV2FrameBufferFormat inPixelFormat);
212 
213  #if defined (_DEBUG)
214  // Debugging Methods
215  virtual bool DebugParseSMPTE334AncPacket (bool & outHasErrors);
216  virtual bool DebugParseCDPHeader (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, NTV2_CC708CDPHeaderPtr pHdr, bool & outHasErrors);
217  virtual bool DebugParseCDPTimecode (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, NTV2_CC708CDPTimecodeSectionPtr pTC, bool & outHasErrors);
218  virtual bool DebugParseCDPData (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, NTV2_CC708CDPDataSectionPtr pCC, bool & outHasErrors);
219  virtual bool DebugParseCDPServiceInfo (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, NTV2_CC708CDPServiceInfoSectionPtr pSvc, bool & outHasErrors);
220  virtual bool DebugParseCDPFutureSection (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, bool & outHasErrors);
221  virtual bool DebugParseCDPFooter (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, NTV2_CC708CDPFooterPtr pFtr, bool & outHasErrors);
222 
230  virtual bool DebugParse608CaptionData (UByte inChar1, UByte inChar2, const int inFieldNum);
231  virtual bool DebugParse708CaptionData (const UByte * pInData, const size_t byteCount, const bool bHexDump = false) const;
232  virtual size_t DebugParse708CaptionChannelPacket (const UByte * pInData, const size_t byteCount, size_t currIndex) const;
233  virtual size_t DebugParse708ServiceBlock (const UByte * pInData, const size_t byteCount, size_t currIndex) const;
234  // virtual int DebugParse708Data (const UByte * pInData, const size_t byteCount, size_t currIndex);
235  virtual inline int GetDebugFrameNum (void) const {return mDebugFrameNumber;}
236  #endif // _DEBUG
237  public:
238  virtual NTV2CaptionLogMask SetLogMask (const NTV2CaptionLogMask inLogMask);
239 
240 
241  private:
242  explicit CNTV2CaptionDecoder708 ();
243  explicit CNTV2CaptionDecoder708 (const CNTV2CaptionDecoder708 & inDecoderToCopy);
244  virtual CNTV2CaptionDecoder708 & operator = (const CNTV2CaptionDecoder708 & inDecoderToCopy);
245 
246  virtual void StartNewCaptionChannelPacketInfo (int seqNum, int expectedSize);
247 
248 
249  // Instance Data
250  private:
251  UByte mRawVancDataBuffer [256];
252  size_t mRawVancByteCount;
253 
254  CaptionData mCC608FrameData;
255 
256  UByte mCC708FrameData [256];
257  size_t mCC708FrameDataByteCount;
258 
259  // debug stuff
260  int mDebugFrameNumber;
261  NTV2_CC708CDP mParsedCDPData;
262  UWord mPreviousSequenceCount;
263  bool mIsNonContiguousFrame;
264 
265  NTV2Line21Channel mLine21DisplayChannel;
266 
268  size_t mCurrentCCPIndex;
269 
270  //NTV2_CC708CDPTimecodeSection mLastCDPTimecode; ///< @brief The timecode info received in the last CDP
271 
272  // The service_info data has to be double-buffered because new data can trickle in over the course of multiple CDPs.
273  // "mCurrentServiceInfo" is a copy of the most recent "good" data. "mNewServiceInfo" is used to accumulate the new service_info
274  // data as it comes in. When a full set has been successfully received, it is copied into mCurrentServiceInfo".
275  CNTV2Caption708ServiceInfo mCurrentServiceInfo;
276  CNTV2Caption708ServiceInfo mNewServiceInfo;
277 
278  CNTV2Caption708Service mAvailableServices [NTV2_CC708MaxNumServices];
279 
280  CNTV2Caption608DataQueue mCC608QueueField1;
281  CNTV2Caption608DataQueue mCC608QueueField2;
282 
283  int mDebugPrintOffset;
284 }; // CNTV2CaptionDecoder708
286 
287 #endif // __NTV2_CEA708_DECODER_
kCaptionChannelPacketStarted
@ kCaptionChannelPacketStarted
We've started pouring data into a Caption Channel Packet but haven't yet finished.
Definition: ntv2captiondecoder708.h:39
CNTV2CaptionDecoder708::GetCDPData
virtual void GetCDPData(NTV2_CC708CDPPtr pCDP) const
Definition: ntv2captiondecoder708.h:197
ntv2caption708service.h
Declares the CNTV2Caption708Service class.
NTV2_CC708CDPHeader
Definition: ntv2captionencoder708.h:91
NTV2_CC708MaxNumServices
const int NTV2_CC708MaxNumServices
Definition: ntv2caption708serviceinfo.h:21
kCaptionChannelPacketComplete
@ kCaptionChannelPacketComplete
The Caption Channel Packet is "complete": it has all the data it's going to get.
Definition: ntv2captiondecoder708.h:40
NULL
#define NULL
Definition: ntv2caption608types.h:19
CNTV2CaptionDecoder708Ptr
AJARefPtr< CNTV2CaptionDecoder708 > CNTV2CaptionDecoder708Ptr
Definition: ntv2captiondecoder708.h:29
CaptionChannelPacketInfoPtr
struct CaptionChannelPacketInfo * CaptionChannelPacketInfoPtr
AJARefPtr< CNTV2CaptionDecoder708 >
NTV2_CC708_MaxCaptionChannelPacketSize
const size_t NTV2_CC708_MaxCaptionChannelPacketSize
Definition: ntv2captionencoder708.h:36
NTV2_CC708CDPTimecodeSection
Definition: ntv2captionencoder708.h:103
CaptionChannelPacketInfo::ccpStatus
int ccpStatus
kCaptionChannelClear/Started/Complete
Definition: ntv2captiondecoder708.h:56
NTV2_CC708CDPDataSection
Definition: ntv2captionencoder708.h:134
NTV2FrameBufferFormat
NTV2FrameBufferFormat
Identifies a particular video frame buffer format. See Device Frame Buffer Formats for details.
Definition: ntv2enums.h:207
CaptionChannelPacketInfo
struct CaptionChannelPacketInfo CaptionChannelPacketInfo
I am a container for a "Caption Channel Packet" – i.e., a wrapper for a clump of CEA-708 caption data...
CNTV2Caption708ServiceInfo
I am a container for all of the CEA-708 "Service Information" that a decoder or encoder needs to keep...
Definition: ntv2caption708serviceinfo.h:115
NTV2_CC708CDP
Definition: ntv2captionencoder708.h:167
AJAAncillaryData_Cea708
This class handles CEA-708 SMPTE 334 packets.
Definition: ancillarydata_cea708.h:23
AJAAncillaryData::GetPayloadData
virtual const uint8_t * GetPayloadData(void) const
Definition: ancillarydata.h:801
CNTV2CaptionLogConfig::SetLogMask
virtual NTV2CaptionLogMask SetLogMask(const NTV2CaptionLogMask inLogMask)
Specifies what, if any, debug information I will write to my log stream.
Definition: ntv2captionlogging.h:187
UWord
uint16_t UWord
Definition: ajatypes.h:251
kCaptionChannelPacketClear
@ kCaptionChannelPacketClear
"Empty" Caption Channel Packet
Definition: ntv2captiondecoder708.h:38
UBytePtr
UByte * UBytePtr
Definition: ntv2captionencoder708.h:19
CNTV2Caption708Service
Definition: ntv2caption708service.h:19
CNTV2CaptionDecoder708::GetAllServiceInfoPtr
virtual const NTV2_CC708ServiceData & GetAllServiceInfoPtr(void) const
Definition: ntv2captiondecoder708.h:189
NTV2_CC708ServiceData
Definition: ntv2caption708serviceinfo.h:90
kMaxNumCaptionChannelPacketInfo
const int kMaxNumCaptionChannelPacketInfo
The max number of CaptionChannelPackets we can deal with in a single frame (a Caption Channel Packet ...
Definition: ntv2captiondecoder708.h:33
UByte
uint8_t UByte
Definition: ajatypes.h:248
CaptionChannelPacketInfo::ccpSize
int ccpSize
The number of data words we're expecting according to the packet header (note, NOT the "packet_size_c...
Definition: ntv2captiondecoder708.h:57
NTV2Line21Channel
NTV2Line21Channel
The CEA-608 caption channels: CC1 thru CC4, TX1 thru TX4, plus XDS.
Definition: ntv2caption608types.h:82
AJAExport
#define AJAExport
Definition: export.h:33
CaptionChannelPacketInfo
I am a container for a "Caption Channel Packet" – i.e., a wrapper for a clump of CEA-708 caption data...
Definition: ntv2captiondecoder708.h:54
NTV2VideoFormat
enum _NTV2VideoFormat NTV2VideoFormat
Identifies a particular video format.
CaptionChannelPacketInfo::ccpData
UByte ccpData[NTV2_CC708_MaxCaptionChannelPacketSize]
Raw packet data.
Definition: ntv2captiondecoder708.h:61
CaptionChannelPacketInfo::ccpCurrentSize
int ccpCurrentSize
The number of data words actually loaded into the ccpData array.
Definition: ntv2captiondecoder708.h:59
NTV2CaptionLogMask
uint64_t NTV2CaptionLogMask
Selectors to control what information is logged.
Definition: ntv2captionlogging.h:38
CNTV2CaptionDecoder708::SetSMPTE334AncData
virtual bool SetSMPTE334AncData(const AJAAncillaryData_Cea708 *pInPacket)
Copies the given SMPTE 334 CDP data from the given ancillary data packet into my private CDP buffer.
Definition: ntv2captiondecoder708.h:114
NTV2_CC708CDPServiceInfoSection
Definition: ntv2captionencoder708.h:144
CNTV2Caption608DataQueue
I am a simple, thread-safe queue of CEA-608 caption byte pairs.
Definition: ntv2caption608dataqueue.h:34
ntv2caption608dataqueue.h
Declaration for the CNTV2Caption608DataQueue class.
CaptionChannelPacketInfo::ccpSequenceNum
int ccpSequenceNum
The sequence number (0, 1, 2, or 3) from the header.
Definition: ntv2captiondecoder708.h:58
CNTV2CaptionLogConfig
Definition: ntv2captionlogging.h:77
ancillarydata_cea708.h
Declares the AJAAncillaryData_Cea708 class.
CaptionData
This structure encapsulates all possible CEA-608 caption data bytes that may be associated with a giv...
Definition: ntv2caption608types.h:655
CNTV2CaptionDecoder708
I am a CEA-708 captioning decoder used primarily to obtain CEA-608 captions carried in CEA-708 anc da...
Definition: ntv2captiondecoder708.h:69
CNTV2CaptionDecoder708::GetCurrentFrameCC608Data
virtual const CaptionData & GetCurrentFrameCC608Data(void) const
Definition: ntv2captiondecoder708.h:179
CNTV2CaptionDecoder708::SetSMPTE334AncData
virtual bool SetSMPTE334AncData(const AJAAncillaryData_Cea708 &inPacket)
Copies the given SMPTE 334 CDP data from the given ancillary data packet into my private CDP buffer.
Definition: ntv2captiondecoder708.h:106
CNTV2CaptionDecoder708::GetDisplayChannel
virtual NTV2Line21Channel GetDisplayChannel(void) const
Answers with the caption channel that I'm currently focused on (or that I'm currently "burning" into ...
Definition: ntv2captiondecoder708.h:98