AJA NTV2 SDK  18.0.0.2122
NTV2 SDK 18.0.0.2122
ancillarydata_timecode.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 #ifndef AJA_ANCILLARYDATA_TIMECODE_H
9 #define AJA_ANCILLARYDATA_TIMECODE_H
10 
13 #include "ancillarydatafactory.h"
14 #include "ancillarydata.h"
15 
16 
18 {
19  AJAAncillaryData_Timecode_Format_Unknown, // not set (usually defaults to 30 fps)
20 
21  AJAAncillaryData_Timecode_Format_60fps, // 60/59.94 fps format ("NTSC")
22  AJAAncillaryData_Timecode_Format_50fps, // 50 fps format ("PAL")
24  AJAAncillaryData_Timecode_Format_30fps, // 30/29.97 fps format ("NTSC")
25  AJAAncillaryData_Timecode_Format_25fps, // 25 fps format ("PAL")
27 };
28 
29 
37 {
38 public:
43 
44  virtual inline ~AJAAncillaryData_Timecode () {}
45 
46  virtual void Clear (void);
47 
54 
55  virtual inline AJAAncillaryData_Timecode * Clone (void) const {return new AJAAncillaryData_Timecode (this);}
56 
61  virtual AJAStatus ParsePayloadData (void);
62 
63 
70 
71 
81  virtual AJAStatus SetTimeHexValue (const uint8_t inDigitNum, const uint8_t inHexValue, const uint8_t inMask = 0x0f);
82 
92  virtual AJAStatus GetTimeHexValue (uint8_t inDigitNum, uint8_t & outHexValue, uint8_t inMask = 0x0f) const;
93 
107  virtual AJAStatus SetTimeDigits ( const uint8_t inHourTens, const uint8_t inHourOnes,
108  const uint8_t inMinTens, const uint8_t inMinOnes,
109  const uint8_t inSecsTens, const uint8_t inSecsOnes,
110  const uint8_t inFrameTens, const uint8_t inFrameOnes);
111 
125  virtual AJAStatus GetTimeDigits ( uint8_t & outHourTens, uint8_t & outHourOnes,
126  uint8_t & outMinTens, uint8_t & outMinOnes,
127  uint8_t & outSecsTens, uint8_t & outSecsOnes,
128  uint8_t & outFrameTens, uint8_t & outFrameOnes) const;
129 
140  virtual AJAStatus SetTime (const AJAAncillaryData_Timecode_Format inFormat, const uint32_t inHours,
141  const uint32_t inMinutes, const uint32_t inSeconds, const uint32_t inFrames);
142 
153  virtual AJAStatus GetTime (const AJAAncillaryData_Timecode_Format inFormat, uint32_t & outHours,
154  uint32_t & outMinutes, uint32_t & outSeconds, uint32_t & outFrames) const;
155 
163  virtual AJAStatus SetTimecode (const AJATimeCode & inTimecode, const AJATimeBase & inTimeBase, const bool inIsDropFrame);
164 
171  virtual AJAStatus GetTimecode (AJATimeCode & outTimecode, const AJATimeBase & inTimeBase) const;
172 
173 
180  virtual AJAStatus SetBinaryGroupHexValue (uint8_t digitNum, uint8_t hexValue, uint8_t mask = 0x0f);
181  virtual AJAStatus GetBinaryGroupHexValue (uint8_t digitNum, uint8_t& hexValue, uint8_t mask = 0x0f) const;
182 
188  virtual AJAStatus SetBinaryGroups (uint8_t bg8, uint8_t bg7, uint8_t bg6, uint8_t bg5, uint8_t bg4, uint8_t bg3, uint8_t bg2, uint8_t bg1);
189  virtual AJAStatus GetBinaryGroups (uint8_t& bg8, uint8_t& bg7, uint8_t& bg6, uint8_t& bg5, uint8_t& bg4, uint8_t& bg3, uint8_t& bg2, uint8_t& bg1) const;
190 
191 
198  virtual AJAStatus SetFieldIdFlag (bool bFlag, AJAAncillaryData_Timecode_Format tcFmt = AJAAncillaryData_Timecode_Format_Unknown);
199  virtual AJAStatus GetFieldIdFlag (bool& bFlag, AJAAncillaryData_Timecode_Format tcFmt = AJAAncillaryData_Timecode_Format_Unknown) const;
200 
201 
208  virtual AJAStatus SetDropFrameFlag (bool bFlag, AJAAncillaryData_Timecode_Format tcFmt = AJAAncillaryData_Timecode_Format_Unknown);
209  virtual AJAStatus GetDropFrameFlag (bool& bFlag, AJAAncillaryData_Timecode_Format tcFmt = AJAAncillaryData_Timecode_Format_Unknown) const;
210 
211 
218  virtual AJAStatus SetColorFrameFlag (bool bFlag, AJAAncillaryData_Timecode_Format tcFmt = AJAAncillaryData_Timecode_Format_Unknown);
219  virtual AJAStatus GetColorFrameFlag (bool& bFlag, AJAAncillaryData_Timecode_Format tcFmt = AJAAncillaryData_Timecode_Format_Unknown) const;
220 
221 
228  virtual AJAStatus SetBinaryGroupFlag (const uint8_t inBGFlag, const AJAAncillaryData_Timecode_Format inFormat = AJAAncillaryData_Timecode_Format_Unknown);
229 
236  virtual AJAStatus GetBinaryGroupFlag (uint8_t & outBGFlag, const AJAAncillaryData_Timecode_Format inFormat = AJAAncillaryData_Timecode_Format_Unknown) const;
237 
242  static AJAAncDataType RecognizeThisAncillaryData (const AJAAncillaryData * pInAncData);
243 
250  virtual std::ostream & Print (std::ostream & inOutStream, const bool inDetailed = false) const;
251 
255  virtual std::string TimecodeString (void) const;
256 
262  static AJAAncillaryData_Timecode_Format GetTimecodeFormatFromTimeBase (const AJATimeBase & inTimeBase);
263 
264 protected:
265  void Init (void); // NOT virtual - called by constructors
266 
267  // Which timecode digits go in which elements of timeDigits[]
268  // Note that this is the same order as received/transmitted, i.e. ls digits FIRST!
269  enum
270  {
271  kTcFrameUnits = 0,
272  kTcFrameTens = 1,
273  kTcSecondUnits = 2,
274  kTcSecondTens = 3,
275  kTcMinuteUnits = 4,
276  kTcMinuteTens = 5,
277  kTcHourUnits = 6,
278  kTcHourTens = 7,
279  kNumTimeDigits = 8
280  };
281 
282  // Which binary groups go in which elements of binaryGroup[]?
283  // Note that this is the same order as received/transmitted, i.e. ls digits FIRST!
284  enum
285  {
286  kBg1 = 0,
287  kBg2 = 1,
288  kBg3 = 2,
289  kBg4 = 3,
290  kBg5 = 4,
291  kBg6 = 5,
292  kBg7 = 6,
293  kBg8 = 7,
294  kNumBinaryGroups = 8
295  };
296 
297  // Note: if you make a change to the local member data, be sure to ALSO make the appropriate
298  // changes in the Init() and operator= methods!
299 
300  // The timecode data is stored as "raw" hex nibbles of data, split up between "time" values and "binary group" values.
301  // This means that sundry "flags" which take advantage of unused time bits (e.g. bits 2 and 3 of the hour tens digit)
302  // are kept with the hex digit data, and only parsed in or out by the appropriate Set()/Get() methods.
303  uint8_t m_timeDigits[kNumTimeDigits]; // the 8 hex values of the time data, in order of received/transmitted (i.e. ls digits first)
304  uint8_t m_binaryGroup[kNumBinaryGroups]; // the 8 hex values of the "Binary Groups", in order from BG1 - BG8
305 
306 }; // AJAAncillaryData_Timecode
307 
308 
315 inline std::ostream & operator << (std::ostream & inOutStream, const AJAAncillaryData_Timecode & inAncData) {return inAncData.Print (inOutStream);}
316 
317 #endif // AJA_ANCILLARYDATA_TIMECODE_H
virtual AJAAncillaryData_Timecode * Clone(void) const
AJAAncillaryData & operator=(const AJAAncillaryData &inRHS)
AJAStatus
Definition: types.h:380
AJAAncDataType
Identifies the ancillary data types that are known to this module.
Definition: ancillarydata.h:44
virtual AJAStatus GeneratePayloadData(void)
Generate the payload data from the "local" ancillary data.
virtual void Clear(void)
Frees my allocated memory, if any, and resets my members to their default values. ...
Declares the AJATimeBase class.
virtual std::ostream & Print(std::ostream &inOutStream, const bool inDetailed=false) const
Streams a human-readable representation of me to the given output stream.
Utility class for timecodes.
Definition: timecode.h:28
virtual AJAStatus ParsePayloadData(void)
Parses (interprets) the "local" ancillary data from my payload data.
This is the base class for the AJAAncillaryData_Timecode_ATC and AJAAncillaryData_Timecode_VITC class...
Declares the AJATimeCode class.
Declaration of the AJAAncillaryDataFactory class.
#define AJAExport
Definition: export.h:33
Declares the AJAAncillaryData class.
std::ostream & operator<<(std::ostream &inOutStream, const AJAAncillaryData_Timecode &inAncData)
Writes a human-readable rendition of the given AJAAncillaryData_Timecode into the given output stream...
I am the principal class that stores a single SMPTE-291 SDI ancillary data packet OR the digitized co...
AJAAncillaryData_Timecode_Format
virtual std::ostream & Print(std::ostream &inOutStream, const bool inDetailed=false) const
Streams a human-readable representation of me to the given output stream.