164 if ( (hours >= 24) || (minutes >= 60) || (seconds >= 60) )
167 uint32_t framesPerSecond = 0;
176 default: framesPerSecond = 0;
break;
179 if (frames >= framesPerSecond)
186 bool bOddFrame = (frames % 2 == 1 ?
true :
false);
193 (uint8_t)(minutes / 10), (uint8_t)(minutes % 10),
194 (uint8_t)(seconds / 10), (uint8_t)(seconds % 10),
195 (uint8_t)(frames / 10), (uint8_t)(frames % 10) );
203 uint8_t hourTens, hourUnits, minuteTens, minuteUnits, secondTens, secondUnits, frameTens, frameUnits;
204 GetTimeDigits(hourTens, hourUnits, minuteTens, minuteUnits, secondTens, secondUnits, frameTens, frameUnits);
206 hours = (hourTens * 10) + hourUnits;
207 minutes = (minuteTens * 10) + minuteUnits;
208 seconds = (secondTens * 10) + secondUnits;
209 frames = (frameTens * 10) + frameUnits;
214 bool bFieldID =
false;
217 frames = (frames * 2) + (bFieldID ? 1 : 0);
226 uint32_t hours, minutes, seconds, frames;
227 inTimecode.
QueryHmsf (hours, minutes, seconds, frames, inTimeBase, inIsDropFrame);
229 SetTime (tcFmt, hours, minutes, seconds, frames);
239 uint32_t hours, minutes, seconds, frames;
240 GetTime(tcFmt, hours, minutes, seconds, frames);
242 bool bDropFrame =
false;
245 outTimecode.
SetHmsf(hours, minutes, seconds, frames, inTimeBase, bDropFrame);
516 if ((bgFlag & 0x04) != 0)
521 if ((bgFlag & 0x02) != 0)
526 if ((bgFlag & 0x01) != 0)
537 if ((bgFlag & 0x04) != 0)
542 if ((bgFlag & 0x02) != 0)
547 if ((bgFlag & 0x01) != 0)
558 if ((bgFlag & 0x04) != 0)
563 if ((bgFlag & 0x02) != 0)
568 if ((bgFlag & 0x01) != 0)
585 uint8_t bf2, bf1, bf0;
616 outBGFlag = (bf2 << 2) + (bf1 << 1) + bf0;
629 kFrameUnitsMask = 0xf, kFrameUnitsShift = 0,
630 kBinaryGroup1Mask = 0xf, kBinaryGroup1Shift = 4,
631 kFrameTensMask = 0x3, kFrameTensShift = 8,
632 kDropFrameMask = 0x1, kDropFrameShift = 10,
633 kColorFrameMask = 0x1, kColorFrameShift = 11,
634 kBinaryGroup2Mask = 0xf, kBinaryGroup2Shift = 12,
635 kSecondUnitsMask = 0xf, kSecondUnitsShift = 16,
636 kBinaryGroup3Mask = 0xf, kBinaryGroup3Shift = 20,
637 kSecondTensMask = 0x7, kSecondTensShift = 24,
638 kFieldIdLoMask = 0x1, kFieldIdLoShift = 27,
639 kBinaryGroup4Mask = 0xf, kBinaryGroup4Shift = 28,
641 kMinuteUnitsMask = 0xf, kMinuteUnitsShift = 0,
642 kBinaryGroup5Mask = 0xf, kBinaryGroup5Shift = 4,
643 kMinuteTensMask = 0x7, kMinuteTensShift = 8,
644 kBinaryGroup6Mask = 0xf, kBinaryGroup6Shift = 12,
645 kHourUnitsMask = 0xf, kHourUnitsShift = 16,
646 kBinaryGroup7Mask = 0xf, kBinaryGroup7Shift = 20,
647 kHourTensMask = 0x3, kHourTensShift = 24,
648 kBinaryGroupFlagMask= 0x3, kBinaryGroupFlagShift = 26,
649 kBinaryGroup8Mask = 0xf, kBinaryGroup8Shift = 28
657 const uint8_t frameUnits = (inLoWord >> kFrameUnitsShift) & kFrameUnitsMask;
658 const uint8_t bg1 = (inLoWord >> kBinaryGroup1Shift) & kBinaryGroup1Mask;
659 const uint8_t frameTens = (inLoWord >> kFrameTensShift) & kFrameTensMask;
660 const bool dropFrame = (inLoWord >> kDropFrameShift) & kDropFrameMask;
661 const bool colorFrame = (inLoWord >> kColorFrameShift) & kColorFrameMask;
662 const uint8_t bg2 = (inLoWord >> kBinaryGroup2Shift) & kBinaryGroup2Mask;
663 const uint8_t secUnits = (inLoWord >> kSecondUnitsShift) & kSecondUnitsMask;
664 const uint8_t bg3 = (inLoWord >> kBinaryGroup3Shift) & kBinaryGroup3Mask;
665 const uint8_t secTens = (inLoWord >> kSecondTensShift) & kSecondTensMask;
666 const uint8_t bg4 = (inLoWord >> kBinaryGroup4Shift) & kBinaryGroup4Mask;
668 const uint8_t minUnits = (inHiWord >> kMinuteUnitsShift) & kMinuteUnitsMask;
669 const uint8_t bg5 = (inHiWord >> kBinaryGroup5Shift) & kBinaryGroup5Mask;
670 const uint8_t minTens = (inHiWord >> kMinuteTensShift) & kMinuteTensMask;
671 const uint8_t hourUnits = (inHiWord >> kHourUnitsShift) & kHourUnitsMask;
672 const uint8_t bg7 = (inHiWord >> kBinaryGroup7Shift) & kBinaryGroup7Mask;
673 const uint8_t hourTens = (inHiWord >> kHourTensShift) & kHourTensMask;
674 const uint8_t bgFlag = (inHiWord >> kBinaryGroupFlagShift) & kBinaryGroupFlagMask;
675 const uint8_t bg6 = (inHiWord >> kBinaryGroup6Shift) & kBinaryGroup6Mask;
676 const uint8_t bg8 = (inHiWord >> kBinaryGroup8Shift) & kBinaryGroup8Mask;
688 const bool fieldId = fieldIdInHiWord
689 ? (bool)((inHiWord >> kFieldIdLoShift) & kFieldIdLoMask)
690 : (
bool)((inLoWord >> kFieldIdLoShift) & kFieldIdLoMask);
692 AJAStatus status =
SetTimeDigits(hourTens, hourUnits, minTens, minUnits, secTens, secUnits, frameTens, frameUnits);
709 uint8_t hourTens, hourUnits, minTens, minUnits, secTens, secUnits, frameTens, frameUnits;
710 AJAStatus status =
GetTimeDigits(hourTens, hourUnits, minTens, minUnits, secTens, secUnits, frameTens, frameUnits);
713 uint8_t bg1, bg2, bg3, bg4, bg5, bg6, bg7, bg8;
717 bool dropFrame =
false;
721 bool colorFrame =
false;
725 bool fieldID =
false;
734 outLoWord |= (frameUnits & kFrameUnitsMask) << kFrameUnitsShift;
735 outLoWord |= (bg1 & kBinaryGroup1Mask) << kBinaryGroup1Shift;
736 outLoWord |= (frameTens & kFrameTensMask) << kFrameTensShift;
737 outLoWord |= ((uint8_t)dropFrame & kDropFrameMask) << kDropFrameShift;
738 outLoWord |= ((uint8_t)colorFrame & kColorFrameMask) << kColorFrameShift;
739 outLoWord |= (bg2 & kBinaryGroup2Mask) << kBinaryGroup2Shift;
740 outLoWord |= (secUnits & kSecondUnitsMask) << kSecondUnitsShift;
741 outLoWord |= (bg3 & kBinaryGroup3Mask) << kBinaryGroup3Shift;
742 outLoWord |= (secTens & kSecondTensMask) << kSecondTensShift;
743 outLoWord |= (bg4 & kBinaryGroup4Mask) << kBinaryGroup4Shift;
746 outHiWord |= (minUnits & kMinuteUnitsMask) << kMinuteUnitsShift;
747 outHiWord |= (bg5 & kBinaryGroup5Mask) << kBinaryGroup5Shift;
748 outHiWord |= (minTens & kMinuteTensMask) << kMinuteTensShift;
749 outHiWord |= (bg6 & kBinaryGroup6Mask) << kBinaryGroup6Shift;
750 outHiWord |= (hourUnits & kHourUnitsMask) << kHourUnitsShift;
751 outHiWord |= (bg7 & kBinaryGroup7Mask) << kBinaryGroup7Shift;
752 outHiWord |= (hourTens & kHourTensMask) << kHourTensShift;
753 outHiWord |= (bgFlag & kBinaryGroupFlagMask) << kBinaryGroupFlagShift;
754 outHiWord |= (bg8 & kBinaryGroup8Mask) << kBinaryGroup8Shift;
766 outHiWord |= ((uint8_t)fieldID & kFieldIdLoMask) << kFieldIdLoShift;
768 outLoWord |= ((uint8_t)fieldID & kFieldIdLoMask) << kFieldIdLoShift;
777 int64_t rate, duration;
779 double frameRate = (double)rate / (
double)duration;
782 if (frameRate < 24.5)
784 else if (frameRate < 28.0)
786 else if (frameRate < 35.0)
788 else if (frameRate < 49.0)
790 else if (frameRate < 55.0)
804 bool bFieldIdFlag, bColorFrameFlag, bDropFrameFlag;
806 uint8_t binaryGroupFlag;
816 <<
"Base Timecode Info:" << endl
817 <<
"Time: " << dec << setw(1) << (uint32_t)timeDigits[
kTcHourTens] << setw(1) << (uint32_t)timeDigits[
kTcHourUnits]
821 <<
"Field ID Flag: " << (bFieldIdFlag ?
"f1" :
"f0") << endl
822 <<
"Drop Frame Flag: " << (bDropFrameFlag ?
"Drop" :
"Non-drop") << endl
823 <<
"Color Frame: " << (bColorFrameFlag ?
"On" :
"Off") << endl
824 <<
"Binary Group: " << hex << setw(1) << uint16_t(binaryGroup[
kBg8]) << setw(1) << uint16_t(binaryGroup[
kBg7])
825 <<
":" << setw(1) << uint16_t(binaryGroup[
kBg6]) << setw(1) << uint16_t(binaryGroup[
kBg5])
826 <<
":" << setw(1) << uint16_t(binaryGroup[
kBg4]) << setw(1) << uint16_t(binaryGroup[
kBg3])
827 <<
":" << setw(1) << uint16_t(binaryGroup[
kBg2]) << setw(1) << uint16_t(binaryGroup[
kBg1]) << endl
828 <<
"BG Flag: " << uint16_t(binaryGroupFlag);
AJAAncillaryData & operator=(const AJAAncillaryData &inRHS)
virtual AJAStatus SetFieldIdFlag(bool bFlag, AJAAncillaryData_Timecode_Format tcFmt=AJAAncillaryData_Timecode_Format_Unknown)
Sets my FieldID flag.
virtual AJAStatus GetBinaryGroupHexValue(uint8_t digitNum, uint8_t &hexValue, uint8_t mask=0x0f) const
virtual AJAStatus SetRP188Words(const uint32_t inLoWord, const uint32_t inHiWord, const AJATimeBase &inTimeBase)
Sets my timecode/binary-group state from the two 32-bit words used to carry SMPTE 12M timecode over N...
AJAAncillaryData_Timecode()
#define AJA_FAILURE(_status_)
AJAAncDataType
Identifies the ancillary data types that are known to this module.
virtual AJAStatus SetDropFrameFlag(bool bFlag, AJAAncillaryData_Timecode_Format tcFmt=AJAAncillaryData_Timecode_Format_Unknown)
Sets my drop frame flag.
virtual void Clear(void)
Frees my allocated memory, if any, and resets my members to their default values. ...
virtual AJAStatus GetRP188Words(uint32_t &outLoWord, uint32_t &outHiWord, const AJATimeBase &inTimeBase) const
Answers with my current timecode/binary-group state packed into the two 32-bit words used to carry SM...
AJA_FrameRate GetAJAFrameRate(void) const
AJAAncillaryData_Timecode & operator=(const AJAAncillaryData_Timecode &inRHS)
Assignment operator – replaces my contents with the right-hand-side value.
virtual AJAStatus GetTimeDigits(uint8_t &outHourTens, uint8_t &outHourOnes, uint8_t &outMinTens, uint8_t &outMinOnes, uint8_t &outSecsTens, uint8_t &outSecsOnes, uint8_t &outFrameTens, uint8_t &outFrameOnes) const
Answers with my current timecode "time" as discrete BCD digits.
AJAAncDataCoding m_coding
Analog or digital data.
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)
Sets my binary group values.
virtual std::ostream & Print(std::ostream &inOutStream, const bool inDetailed=false) const
Streams a human-readable representation of me to the given output stream.
static AJAAncillaryData_Timecode_Format GetTimecodeFormatFromTimeBase(const AJATimeBase &inTimeBase)
Get the timecode format that matches the input timebase.
Includes data that is valid, but we don't recognize.
virtual AJAStatus GetTimeHexValue(uint8_t inDigitNum, uint8_t &outHexValue, uint8_t inMask=0x0f) const
Answers with my current raw "time" hex values.
void GetFrameRate(int64_t &frameTimeScale, int64_t &frameDuration) const
Utility class for timecodes.
void SetHmsf(uint32_t h, uint32_t m, uint32_t s, uint32_t f, const AJATimeBase &timeBase, bool bDropFrame, bool bStdTcForHfr, uint32_t addFrame)
static AJAAncDataType RecognizeThisAncillaryData(const AJAAncillaryData *pInAncData)
for(int i=0;i< g_cTemplates;i++)
void QueryHmsf(uint32_t &h, uint32_t &m, uint32_t &s, uint32_t &f, const AJATimeBase &timeBase, bool bDropFrame) const
virtual AJAStatus GetColorFrameFlag(bool &bFlag, AJAAncillaryData_Timecode_Format tcFmt=AJAAncillaryData_Timecode_Format_Unknown) const
virtual AJAStatus SetBinaryGroupFlag(const uint8_t inBGFlag, const AJAAncillaryData_Timecode_Format inFormat=AJAAncillaryData_Timecode_Format_Unknown)
Sets my binary group flag (3 bits).
Declares the AJAAncillaryData_Timecode class.
virtual AJAStatus SetColorFrameFlag(bool bFlag, AJAAncillaryData_Timecode_Format tcFmt=AJAAncillaryData_Timecode_Format_Unknown)
Sets my color frame flag.
virtual AJAStatus GetBinaryGroupFlag(uint8_t &outBGFlag, const AJAAncillaryData_Timecode_Format inFormat=AJAAncillaryData_Timecode_Format_Unknown) const
Answers with my current binary group flag (3 bits).
virtual AJAStatus SetTime(const AJAAncillaryData_Timecode_Format inFormat, const uint32_t inHours, const uint32_t inMinutes, const uint32_t inSeconds, const uint32_t inFrames)
Sets my timecode "time" with hours, minutes, seconds, frames (in decimal, not BCD digits)...
This is the base class for the AJAAncillaryData_Timecode_ATC and AJAAncillaryData_Timecode_VITC class...
virtual AJAStatus ParsePayloadData(void)
Parses out (interprets) the "local" ancillary data from my payload data.
virtual AJAStatus SetTimecode(const AJATimeCode &inTimecode, const AJATimeBase &inTimeBase, const bool inIsDropFrame)
Sets my timecode "time" from an AJATimeCode.
virtual AJAStatus SetTimeDigits(const uint8_t inHourTens, const uint8_t inHourOnes, const uint8_t inMinTens, const uint8_t inMinOnes, const uint8_t inSecsTens, const uint8_t inSecsOnes, const uint8_t inFrameTens, const uint8_t inFrameOnes)
Sets my timecode "time" using discrete BCD digits.
virtual AJAStatus GetTime(const AJAAncillaryData_Timecode_Format inFormat, uint32_t &outHours, uint32_t &outMinutes, uint32_t &outSeconds, uint32_t &outFrames) const
Answers with my current timecode "time" as individual hour, minute, second, and frame components (in ...
virtual void Clear(void)
Frees my allocated memory, if any, and resets my members to their default values. ...
virtual AJAStatus GetFieldIdFlag(bool &bFlag, AJAAncillaryData_Timecode_Format tcFmt=AJAAncillaryData_Timecode_Format_Unknown) const
virtual AJAStatus GetTimecode(AJATimeCode &outTimecode, const AJATimeBase &inTimeBase) const
Answers with my timecode "time" as an AJATimeCode.
const std::string & AJAAncDataCodingToString(const AJAAncDataCoding inValue, const bool inCompact=true)
virtual std::string IDAsString(void) const
I am the principal class that stores a single SMPTE-291 SDI ancillary data packet OR the digitized co...
bool m_rcvDataValid
This is set true (or not) by ParsePayloadData()
uint8_t m_binaryGroup[kNumBinaryGroups]
virtual AJAStatus GetDropFrameFlag(bool &bFlag, AJAAncillaryData_Timecode_Format tcFmt=AJAAncillaryData_Timecode_Format_Unknown) const
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
AJAAncillaryData_Timecode_Format
virtual std::string TimecodeString(void) const
virtual AJAStatus SetTimeHexValue(const uint8_t inDigitNum, const uint8_t inHexValue, const uint8_t inMask=0x0f)
Sets my raw "time" hex values.
uint8_t m_timeDigits[kNumTimeDigits]
virtual std::ostream & Print(std::ostream &inOutStream, const bool inDetailed=false) const
Streams a human-readable representation of me to the given output stream.
virtual AJAStatus SetBinaryGroupHexValue(uint8_t digitNum, uint8_t hexValue, uint8_t mask=0x0f)
Sets my raw "Binary Group" hex values.