AJA NTV2 SDK  17.1.1.1245
NTV2 SDK 17.1.1.1245
ancillarydata_cea608_vanc.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
9 #include <ios>
10 #include <iomanip>
11 
12 using namespace std;
13 
14 
17 {
18  Init();
19 }
20 
21 
24 {
25  Init();
26  *this = clone;
27 }
28 
29 
32 {
33  Init();
34  if (pClone != NULL_PTR)
35  *this = *pClone;
36 }
37 
38 
40  : AJAAncillaryData_Cea608 (pData)
41 {
42  Init();
43 }
44 
45 
47 {
48 }
49 
50 
52 {
57 
58  m_isF2 = false; // default to field 1
59  m_lineNum = 12; // line 21 (0 = line 9 in 525i)
60 }
61 
62 
64 {
65  if (this != &rhs) // ignore self-assignment
66  {
67  AJAAncillaryData_Cea608::operator= (rhs); // copy the base class stuff
68 
69  // copy the local stuff
70  m_isF2 = rhs.m_isF2;
71  m_lineNum = rhs.m_lineNum;
72  }
73  return *this;
74 }
75 
76 
78 {
80  Init();
81 }
82 
83 
84 AJAStatus AJAAncillaryData_Cea608_Vanc::SetLine (const bool inIsF2, const uint8_t lineNum)
85 {
86  m_isF2 = inIsF2;
87  m_lineNum = lineNum & 0x1F; // valid range is 0 (= line 9) to 31 (= line 40)
88  return AJA_STATUS_SUCCESS;
89 }
90 
91 
92 AJAStatus AJAAncillaryData_Cea608_Vanc::GetLine (uint8_t & fieldNum, uint8_t & lineNum) const
93 {
94  fieldNum = IsField2() ? 0x01/*NTV2_FIELD1*/ : 0x00/*NTV2_FIELD0*/;
95  lineNum = uint8_t(GetLineNumber());
96  return AJA_STATUS_SUCCESS;
97 }
98 
99 
101 {
103  {
104  Init(); // load default values
105  m_rcvDataValid = false;
106  return AJA_STATUS_FAIL;
107  }
108 
109  // Parse the payload data...
110  m_isF2 = ((m_payload[0] >> 7) & 0x01) ? false : true; // Field number (flag) is bit 7 of the 1st payload word
111  // SDKs prior to 16.0 had the sense of this bit wrong.
112  m_lineNum = (m_payload[0] & 0x1F); // Line number is bits [4:0] of the 1st payload word
113  m_char1 = m_payload[1]; // the 1st character
114  m_char2 = m_payload[2]; // the 2nd character
115  m_rcvDataValid = true;
116  return AJA_STATUS_SUCCESS;
117 }
118 
119 
121 {
124 
126  if (AJA_SUCCESS (status))
127  {
128  /*
129  From S334-1 and S334-2 standards documents:
130  The LINE value at the start of the UDW represents the field number and line where the data are intended to be carried.
131  Bit b7 of the LINE value is the field number (0 for field 2; 1 for field 1).
132  Bits b6 and b5 are 0.
133  Bits b4-b0 form a 5-bit unsigned integer which represents the offset (in lines) of the data insertion line,
134  relative to the base line for the original image format:
135  line 9 of 525-line F1
136  line 272 of 525-line F2
137  line 5 of 625-line F1
138  line 318 of 625-line F2
139  NOTE: SDKs prior to 16.0 used the opposite sense of this bit.
140  */
141  m_payload[0] = uint8_t((m_isF2 ? 0x00 : 0x01) << 7) | (m_lineNum & 0x1F); // F2 flag goes in b7, line num in bits [4:0]
142  m_payload[1] = m_char1;
143  m_payload[2] = m_char2;
144  }
145 
147  return status;
148 }
149 
150 ostream & AJAAncillaryData_Cea608_Vanc::Print (ostream & debugStream, const bool bShowDetail) const
151 {
152  debugStream << IDAsString() << "(" << ::AJAAncDataCodingToString (m_coding) << ")" << endl;
153  AJAAncillaryData_Cea608::Print (debugStream, bShowDetail);
154  debugStream << endl
155  << "Field: " << (m_isF2 ? "F2" : "F1") << endl
156  << "Line: " << dec << uint16_t(m_lineNum);
157  return debugStream;
158 }
159 
160 
162 {
163  if (pInAncData->GetDataCoding() == AJAAncDataCoding_Digital)
164  if (pInAncData->GetDID() == AJAAncillaryData_Cea608_Vanc_DID)
165  if (pInAncData->GetSID() == AJAAncillaryData_Cea608_Vanc_SID)
166  if (pInAncData->GetDC() == AJAAncillaryData_Cea608_Vanc_PayloadSize)
168  return AJAAncDataType_Unknown;
169 }
NULL_PTR
#define NULL_PTR
Definition: types.h:325
AJAAncillaryData_Cea608_Vanc::RecognizeThisAncillaryData
static AJAAncDataType RecognizeThisAncillaryData(const AJAAncillaryData *pInAncData)
Definition: ancillarydata_cea608_vanc.cpp:161
AJAAncillaryData_Cea608::Print
virtual std::ostream & Print(std::ostream &inOutStream, const bool inDetailed=false) const
Streams a human-readable representation of me to the given output stream.
Definition: ancillarydata_cea608.cpp:149
AJAAncDataType_Cea608_Vanc
@ AJAAncDataType_Cea608_Vanc
CEA608 SD Closed Captioning (SMPTE 334 VANC packet)
Definition: ancillarydata.h:51
AJAAncillaryData::m_DID
uint8_t m_DID
Official SMPTE ancillary packet ID (w/o parity)
Definition: ancillarydata.h:1152
AJAAncillaryData_Cea608_Vanc::~AJAAncillaryData_Cea608_Vanc
virtual ~AJAAncillaryData_Cea608_Vanc()
My destructor.
Definition: ancillarydata_cea608_vanc.cpp:46
AJAAncillaryData_Cea608_Vanc_SID
const uint8_t AJAAncillaryData_Cea608_Vanc_SID
Definition: ancillarydata_cea608_vanc.h:18
AJAAncDataType_Unknown
@ AJAAncDataType_Unknown
Includes data that is valid, but we don't recognize.
Definition: ancillarydata.h:46
AJAAncillaryData_Cea608_Vanc::operator=
virtual AJAAncillaryData_Cea608_Vanc & operator=(const AJAAncillaryData_Cea608_Vanc &inRHS)
Assignment operator – replaces my contents with the right-hand-side value.
Definition: ancillarydata_cea608_vanc.cpp:63
AJA_STATUS_SUCCESS
@ AJA_STATUS_SUCCESS
Definition: types.h:381
AJAAncillaryData_Cea608::Clear
virtual void Clear(void)
Frees my allocated memory, if any, and resets my members to their default values.
Definition: ancillarydata_cea608.cpp:71
AJAAncillaryData_Cea608_Vanc::m_lineNum
uint8_t m_lineNum
Definition: ancillarydata_cea608_vanc.h:109
AJAAncillaryData_Cea608_Vanc::GetLine
virtual AJAStatus GetLine(uint8_t &outFieldNum, uint8_t &outLineNum) const
Definition: ancillarydata_cea608_vanc.cpp:92
AJAAncillaryData_Cea608_Vanc_DID
const uint8_t AJAAncillaryData_Cea608_Vanc_DID
Definition: ancillarydata_cea608_vanc.h:17
AJAAncDataType
AJAAncDataType
Identifies the ancillary data types that are known to this module.
Definition: ancillarydata.h:44
AJAAncillaryData_Cea608_Vanc::ParsePayloadData
virtual AJAStatus ParsePayloadData(void)
Parses out (interprets) the "local" ancillary data from my payload data.
Definition: ancillarydata_cea608_vanc.cpp:100
AJAAncillaryData::AllocDataMemory
AJAStatus AllocDataMemory(const uint32_t inNumBytes)
Definition: ancillarydata.cpp:171
AJAAncillaryData_Cea608_Vanc::AJAAncillaryData_Cea608_Vanc
AJAAncillaryData_Cea608_Vanc()
My default constructor.
Definition: ancillarydata_cea608_vanc.cpp:15
AJAStatus
AJAStatus
Definition: types.h:378
AJA_STATUS_FAIL
@ AJA_STATUS_FAIL
Definition: types.h:382
AJAAncillaryData_Cea608
This is the base class for handling CEA-608 caption data packets.
Definition: ancillarydata_cea608.h:18
AJAAncillaryData
I am the principal class that stores a single SMPTE-291 SDI ancillary data packet OR the digitized co...
Definition: ancillarydata.h:552
AJAAncillaryData_Cea608_Vanc::m_isF2
bool m_isF2
Definition: ancillarydata_cea608_vanc.h:108
AJAAncillaryData::m_coding
AJAAncDataCoding m_coding
Analog or digital data.
Definition: ancillarydata.h:1156
AJA_SUCCESS
#define AJA_SUCCESS(_status_)
Definition: types.h:370
AJAAncillaryData_Cea608_Vanc_PayloadSize
const uint32_t AJAAncillaryData_Cea608_Vanc_PayloadSize
Definition: ancillarydata_cea608_vanc.h:20
AJAAncillaryData_Cea608_Vanc::Clear
virtual void Clear(void)
Frees my allocated memory, if any, and resets my members to their default values.
Definition: ancillarydata_cea608_vanc.cpp:77
AJAAncillaryData::m_rcvDataValid
bool m_rcvDataValid
This is set true (or not) by ParsePayloadData()
Definition: ancillarydata.h:1158
AJAAncillaryData::m_SID
uint8_t m_SID
Official SMPTE secondary ID (or DBN - w/o parity)
Definition: ancillarydata.h:1153
AJAAncillaryData::Calculate8BitChecksum
virtual uint8_t Calculate8BitChecksum(void) const
Generates an 8-bit checksum from the DID + SID + DC + payload data.
Definition: ancillarydata.cpp:233
AJAAncillaryData::IDAsString
virtual std::string IDAsString(void) const
Definition: ancillarydata.cpp:1428
AJAAncillaryData_Cea608_Vanc::GeneratePayloadData
virtual AJAStatus GeneratePayloadData(void)
Generate the payload data from my "local" ancillary data.
Definition: ancillarydata_cea608_vanc.cpp:120
false
#define false
Definition: ntv2devicefeatures.h:25
AJAAncillaryData::m_payload
ByteVector m_payload
My payload data (DC = size)
Definition: ancillarydata.h:1157
AJAAncillaryData_Cea608_Vanc::Print
virtual std::ostream & Print(std::ostream &inOutStream, const bool inDetailed=false) const
Streams a human-readable representation of me to the given output stream.
Definition: ancillarydata_cea608_vanc.cpp:150
ancillarydata_cea608_vanc.h
Declares the AJAAncillaryData_Cea608_Vanc class.
std
Definition: json.hpp:5362
AJAAncillaryData_Cea608_Vanc::Init
void Init(void)
Definition: ancillarydata_cea608_vanc.cpp:51
AJAAncDataCodingToString
const std::string & AJAAncDataCodingToString(const AJAAncDataCoding inValue, const bool inCompact=true)
Definition: ancillarydata.cpp:1372
AJAAncDataCoding_Digital
@ AJAAncDataCoding_Digital
The ancillary data is in the form of a SMPTE-291 Ancillary Packet.
Definition: ancillarydata.h:476
AJAAncillaryData_Cea608_Vanc::SetLine
virtual AJAStatus SetLine(const bool inIsF2, const uint8_t inLineNum)
Sets my SMPTE 334 (CEA608) field/line numbers.
Definition: ancillarydata_cea608_vanc.cpp:84
AJAAncillaryData_Cea608_Vanc
This class handles VANC-based CEA-608 caption data packets (not "analog" Line 21).
Definition: ancillarydata_cea608_vanc.h:26
AJAAncillaryData_Cea608::m_char1
uint8_t m_char1
Definition: ancillarydata_cea608.h:118
AJAAncillaryData_Cea608::m_char2
uint8_t m_char2
Definition: ancillarydata_cea608.h:119
AJAAncillaryData::m_ancType
AJAAncDataType m_ancType
One of a known set of ancillary data types (or "Custom" if not identified)
Definition: ancillarydata.h:1159
AJAAncillaryData_Cea608::operator=
AJAAncillaryData_Cea608 & operator=(const AJAAncillaryData_Cea608 &inRHS)
Assignment operator – replaces my contents with the right-hand-side value.
Definition: ancillarydata_cea608.cpp:57
AJAAncillaryData::m_checksum
uint8_t m_checksum
My 8-bit checksum: DID + SID + DC + payload (w/o parity) [note: NOT the same as the 9-bit checksum in...
Definition: ancillarydata.h:1154