AJA NTV2 SDK  18.0.0.2122
NTV2 SDK 18.0.0.2122
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_
The Caption Channel Packet is "complete": it has all the data it&#39;s going to get.
virtual const uint8_t * GetPayloadData(void) const
UByte ccpData[NTV2_CC708_MaxCaptionChannelPacketSize]
Raw packet data.
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...
#define NULL
NTV2FrameBufferFormat
Identifies a particular video frame buffer pixel format. See Device Frame Buffer Formats for details...
Definition: ntv2enums.h:219
struct CaptionChannelPacketInfo CaptionChannelPacketInfo
I am a container for a "Caption Channel Packet" – i.e., a wrapper for a clump of CEA-708 caption dat...
enum _NTV2VideoFormat NTV2VideoFormat
Identifies a particular video format.
"Empty" Caption Channel Packet
virtual void GetCDPData(NTV2_CC708CDPPtr pCDP) const
I am a container for a "Caption Channel Packet" – i.e., a wrapper for a clump of CEA-708 caption dat...
I am a container for all of the CEA-708 "Service Information" that a decoder or encoder needs to keep...
virtual const NTV2_CC708ServiceData & GetAllServiceInfoPtr(void) const
const size_t NTV2_CC708_MaxCaptionChannelPacketSize
uint64_t NTV2CaptionLogMask
Selectors to control what information is logged.
We&#39;ve started pouring data into a Caption Channel Packet but haven&#39;t yet finished.
I am a CEA-708 captioning decoder used primarily to obtain CEA-608 captions carried in CEA-708 anc da...
virtual NTV2Line21Channel GetDisplayChannel(void) const
Answers with the caption channel that I&#39;m currently focused on (or that I&#39;m currently "burning" into ...
int ccpSize
The number of data words we&#39;re expecting according to the packet header (note, NOT the "packet_size_c...
AJARefPtr< CNTV2CaptionDecoder708 > CNTV2CaptionDecoder708Ptr
This class handles CEA-708 SMPTE 334 packets.
virtual size_t GetPayloadByteCount(void) const
uint8_t UByte
Definition: ajatypes.h:218
const int kMaxNumCaptionChannelPacketInfo
The max number of CaptionChannelPackets we can deal with in a single frame (a Caption Channel Packet ...
int ccpCurrentSize
The number of data words actually loaded into the ccpData array.
#define AJAExport
Definition: export.h:33
int ccpSequenceNum
The sequence number (0, 1, 2, or 3) from the header.
This structure encapsulates all possible CEA-608 caption data bytes that may be associated with a giv...
uint16_t UWord
Definition: ajatypes.h:221
I am a simple, thread-safe queue of CEA-608 caption byte pairs.
virtual const CaptionData & GetCurrentFrameCC608Data(void) const
Declaration for the CNTV2Caption608DataQueue class.
virtual NTV2CaptionLogMask SetLogMask(const NTV2CaptionLogMask inLogMask)
Specifies what, if any, debug information I will write to my log stream.
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...
Declares the CNTV2Caption708Service class.
NTV2Line21Channel
The CEA-608 caption channels: CC1 thru CC4, TX1 thru TX4, plus XDS.
Declares the AJAAncillaryData_Cea708 class.
struct CaptionChannelPacketInfo * CaptionChannelPacketInfoPtr
UByte * UBytePtr
int ccpStatus
kCaptionChannelClear/Started/Complete
const int NTV2_CC708MaxNumServices