AJA NTV2 SDK  17.0.1.1246
NTV2 SDK 17.0.1.1246
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"
12 
13 #ifdef MSWindows
14  #include "windows.h"
15  #include "stdio.h"
16 #endif
17 
30 
31 
33 
35 enum // The three "states" of a Caption Channel Packet:
36 {
40 };
41 
42 
54 {
55  int ccpStatus;
56  int ccpSize;
59 
61 
63 
64 
69 {
70  // Class Methods
71  public:
77  static bool Create (CNTV2CaptionDecoder708Ptr & outDecoder);
78 
79 
80  // Instance Methods
81  public:
82  virtual ~CNTV2CaptionDecoder708 ();
83 
84  virtual void Reset (void);
85 
91  virtual bool SetDisplayChannel (const NTV2Line21Channel inChan);
92 
97  virtual inline NTV2Line21Channel GetDisplayChannel (void) const {return mLine21DisplayChannel;}
98 
107  virtual bool SetSMPTE334AncData (const UByte * pInAncData, const size_t inByteCount);
108 
118  virtual bool SetSMPTE334AncData (const UWord * pInAncData, const size_t inWordCount);
119 
126  virtual bool GetSMPTE334AncData (const UByte ** ppAncData, size_t & outAncSize) const;
127 
140  virtual bool ParseSMPTE334AncPacket (bool & outHasParityErrors);
141 
142 
153  virtual bool ParseSMPTE334AncPacket (void);
154  virtual bool ParseSMPTE334CCTimeCodeSection (size_t & index);
155  virtual bool ParseSMPTE334CCDataSection (size_t & index);
156  virtual bool ParseSMPTE334CCServiceInfoSection (size_t & index);
157  virtual bool UpdateServiceInfo (void);
158 
159  virtual bool Clear608CaptionData (void);
160 
161  virtual inline const CaptionData & GetCurrentFrameCC608Data (void) const {return mCC608FrameData;}
162 
167  virtual CaptionData GetCC608CaptionData (void);
168 
169  virtual bool GetCaptionChannelPacket (UBytePtr & outDataPtr, size_t & outSize);
170 
171  virtual inline const NTV2_CC708ServiceData & GetAllServiceInfoPtr (void) const {return mCurrentServiceInfo.GetAllServiceInfoPtr();}
172 
173  virtual bool GetNextServiceBlockInfoFromQueue (const size_t svcIndex, size_t & outBlockSize, size_t & outDataSize, int & outServiceNum, bool & outIsExtended) const;
174  virtual size_t GetNextServiceBlockFromQueue (const size_t svcIndex, std::vector<UByte> & outData);
175  virtual size_t GetNextServiceBlockDataFromQueue (const size_t svcIndex, std::vector<UByte> & outData);
176  virtual size_t GetNextServiceBlockFromQueue (const size_t svcIndex, UByte * pOutDataBuffer);
177  virtual size_t GetNextServiceBlockDataFromQueue (const size_t svcIndex, UByte * pOutDataBuffer);
178 
179  virtual inline void GetCDPData (NTV2_CC708CDPPtr pCDP) const {*pCDP = mParsedCDPData;}
180 
181  virtual void ClearAllCaptionChannelPacketInfo (void);
182  virtual void ClearCaptionChannelPacketInfo (CaptionChannelPacketInfoPtr pCCPInfo);
183  virtual int GetNumCompleteCaptionChannelPacketInfo (int * pCompleteCount = NULL, int * pStartedCount = NULL);
184  virtual void ResetCaptionChannelPacketInfoForNewCDP (void);
185  virtual void CloseCurrentCaptionChannelPacketInfo (void);
186  virtual bool AddCaptionChannelPacketInfoData (UByte newData);
187  virtual bool GetCaptionChannelPacketInfoData (int index, UByte ** ppData, int * pSize);
188 
189  virtual bool ParseAllCaptionChannelPackets (void);
190  virtual bool ParseCaptionChannelPacket (CaptionChannelPacketInfoPtr pCCPInfo);
191 
192  virtual bool FindSMPTE334AncPacketInVideoFrame (const UByte * pInVideoFrame, const NTV2VideoFormat inVideoFormat, const NTV2FrameBufferFormat inPixelFormat, bool & outHasParityErrors);
193  virtual bool FindSMPTE334AncPacketInVideoFrame (const UByte * pInVideoFrame, const NTV2VideoFormat inVideoFormat, const NTV2FrameBufferFormat inPixelFormat);
194 
195  #if defined (_DEBUG)
196  // Debugging Methods
197  virtual bool DebugParseSMPTE334AncPacket (bool & outHasErrors);
198  virtual bool DebugParseCDPHeader (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, NTV2_CC708CDPHeaderPtr pHdr, bool & outHasErrors);
199  virtual bool DebugParseCDPTimecode (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, NTV2_CC708CDPTimecodeSectionPtr pTC, bool & outHasErrors);
200  virtual bool DebugParseCDPData (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, NTV2_CC708CDPDataSectionPtr pCC, bool & outHasErrors);
201  virtual bool DebugParseCDPServiceInfo (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, NTV2_CC708CDPServiceInfoSectionPtr pSvc, bool & outHasErrors);
202  virtual bool DebugParseCDPFutureSection (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, bool & outHasErrors);
203  virtual bool DebugParseCDPFooter (const UByte * pInData, size_t pktIndex, size_t maxPacketSize, size_t * pNewIndex, NTV2_CC708CDPFooterPtr pFtr, bool & outHasErrors);
204 
212  virtual bool DebugParse608CaptionData (UByte inChar1, UByte inChar2, const int inFieldNum);
213  virtual bool DebugParse708CaptionData (const UByte * pInData, const size_t byteCount, const bool bHexDump = false) const;
214  virtual size_t DebugParse708CaptionChannelPacket (const UByte * pInData, const size_t byteCount, size_t currIndex) const;
215  virtual size_t DebugParse708ServiceBlock (const UByte * pInData, const size_t byteCount, size_t currIndex) const;
216  // virtual int DebugParse708Data (const UByte * pInData, const size_t byteCount, size_t currIndex);
217  virtual inline int GetDebugFrameNum (void) const {return mDebugFrameNumber;}
218  #endif // _DEBUG
219  public:
220  virtual NTV2CaptionLogMask SetLogMask (const NTV2CaptionLogMask inLogMask);
221 
222 
223  private:
224  explicit CNTV2CaptionDecoder708 ();
225  explicit CNTV2CaptionDecoder708 (const CNTV2CaptionDecoder708 & inDecoderToCopy);
226  virtual CNTV2CaptionDecoder708 & operator = (const CNTV2CaptionDecoder708 & inDecoderToCopy);
227 
228  virtual void StartNewCaptionChannelPacketInfo (int seqNum, int expectedSize);
229 
230 
231  // Instance Data
232  private:
233  UByte mRawVancDataBuffer [256];
234  size_t mRawVancByteCount;
235 
236  CaptionData mCC608FrameData;
237 
238  UByte mCC708FrameData [256];
239  size_t mCC708FrameDataByteCount;
240 
241  // debug stuff
242  int mDebugFrameNumber;
243  NTV2_CC708CDP mParsedCDPData;
244  UWord mPreviousSequenceCount;
245  bool mIsNonContiguousFrame;
246 
247  NTV2Line21Channel mLine21DisplayChannel;
248 
250  size_t mCurrentCCPIndex;
251 
252  //NTV2_CC708CDPTimecodeSection mLastCDPTimecode; ///< @brief The timecode info received in the last CDP
253 
254  // The service_info data has to be double-buffered because new data can trickle in over the course of multiple CDPs.
255  // "mCurrentServiceInfo" is a copy of the most recent "good" data. "mNewServiceInfo" is used to accumulate the new service_info
256  // data as it comes in. When a full set has been successfully received, it is copied into mCurrentServiceInfo".
257  CNTV2Caption708ServiceInfo mCurrentServiceInfo;
258  CNTV2Caption708ServiceInfo mNewServiceInfo;
259 
260  CNTV2Caption708Service mAvailableServices [NTV2_CC708MaxNumServices];
261 
262  CNTV2Caption608DataQueue mCC608QueueField1;
263  CNTV2Caption608DataQueue mCC608QueueField2;
264 
265  int mDebugPrintOffset;
266 }; // CNTV2CaptionDecoder708
268 
269 #endif // __NTV2_CEA708_DECODER_
CNTV2CaptionDecoder708::GetCDPData
virtual void GetCDPData(NTV2_CC708CDPPtr pCDP) const
Definition: ntv2captiondecoder708.h:179
ntv2caption708service.h
Declares the CNTV2Caption708Service class.
NTV2_CC708CDPHeader
Definition: ntv2captionencoder708.h:91
NTV2_CC708MaxNumServices
const int NTV2_CC708MaxNumServices
Definition: ntv2caption708serviceinfo.h:21
NULL
#define NULL
Definition: ntv2caption608types.h:19
CNTV2CaptionDecoder708Ptr
AJARefPtr< CNTV2CaptionDecoder708 > CNTV2CaptionDecoder708Ptr
Definition: ntv2captiondecoder708.h:28
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:55
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
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:244
UBytePtr
UByte * UBytePtr
Definition: ntv2captionencoder708.h:19
CNTV2Caption708Service
Definition: ntv2caption708service.h:19
CNTV2CaptionDecoder708::GetAllServiceInfoPtr
virtual const NTV2_CC708ServiceData & GetAllServiceInfoPtr(void) const
Definition: ntv2captiondecoder708.h:171
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:32
UByte
uint8_t UByte
Definition: ajatypes.h:241
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:56
NTV2Line21Channel
NTV2Line21Channel
The CEA-608 caption channels: CC1 thru CC4, TX1 thru TX4, plus XDS.
Definition: ntv2caption608types.h:82
kCaptionChannelPacketClear
@ kCaptionChannelPacketClear
"Empty" Caption Channel Packet
Definition: ntv2captiondecoder708.h:37
kCaptionChannelPacketStarted
@ kCaptionChannelPacketStarted
We've started pouring data into a Caption Channel Packet but haven't yet finished.
Definition: ntv2captiondecoder708.h:38
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:53
NTV2VideoFormat
enum _NTV2VideoFormat NTV2VideoFormat
Identifies a particular video format.
CaptionChannelPacketInfo::ccpData
UByte ccpData[NTV2_CC708_MaxCaptionChannelPacketSize]
Raw packet data.
Definition: ntv2captiondecoder708.h:60
CaptionChannelPacketInfo::ccpCurrentSize
int ccpCurrentSize
The number of data words actually loaded into the ccpData array.
Definition: ntv2captiondecoder708.h:58
NTV2CaptionLogMask
uint64_t NTV2CaptionLogMask
Selectors to control what information is logged.
Definition: ntv2captionlogging.h:38
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:57
CNTV2CaptionLogConfig
Definition: ntv2captionlogging.h:77
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:68
CNTV2CaptionDecoder708::GetCurrentFrameCC608Data
virtual const CaptionData & GetCurrentFrameCC608Data(void) const
Definition: ntv2captiondecoder708.h:161
kCaptionChannelPacketComplete
@ kCaptionChannelPacketComplete
The Caption Channel Packet is "complete": it has all the data it's going to get.
Definition: ntv2captiondecoder708.h:39
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:97