AJA NTV2 SDK  18.0.0.2122
NTV2 SDK 18.0.0.2122
ntv2vpid.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 #include "ntv2vpid.h"
9 #include "ntv2vpidfromspec.h"
10 #include "ntv2debug.h"
11 #include "ntv2utils.h"
12 #include "ntv2registerexpert.h" // For YesNo macro
13 #include <sstream>
14 
15 using namespace std;
16 
17 #ifndef NULL
18 #define NULL (0)
19 #endif
20 
36 static bool stTablesInitialized (false);
37 
39 {
40  public:
42  {
43  for (int i = 0; i < VPIDPictureRate_ReservedF + 1; i++)
44  {
54  }
55 
57  // stTable720p[VPIDPictureRate_2400] = NTV2_FORMAT_720p_2400;
59  // stTable720p[VPIDPictureRate_2997] = NTV2_FORMAT_720p_2997;
60  // stTable720p[VPIDPictureRate_3000] = NTV2_FORMAT_720p_3000;
64 
75 
81  // stTable1920p[VPIDPictureRate_4795] = NTV2_FORMAT_1080p_4795; // 3G-A
82  // stTable1920p[VPIDPictureRate_4800] = NTV2_FORMAT_1080p_4800; // 3G-A
86 
90  // stTable2048psf[VPIDPictureRate_2997] = NTV2_FORMAT_1080psf_2K_2997;
91  // stTable2048psf[VPIDPictureRate_3000] = NTV2_FORMAT_1080psf_2K_3000;
97 
103  // stTable1920psf[VPIDPictureRate_4795] = NTV2_FORMAT_1080p_4795; // 3G-B or Duallink 1.5G
104  // stTable1920psf[VPIDPictureRate_4800] = NTV2_FORMAT_1080p_4800; // 3G-B or Duallink 1.5G
108 
109  // stTable2048i[VPIDPictureRate_2500] = NTV2_FORMAT_2048x1080i_2500;
110  // stTable2048i[VPIDPictureRate_2997] = NTV2_FORMAT_2048x1080i_2997;
111  // stTable2048i[VPIDPictureRate_3000] = NTV2_FORMAT_2048x1080i_3000;
112 
116 
125 
134 
145 
156 
165 
176 
185 
196 
197  stTablesInitialized = true;
198  } // constructor
199 
200 }; // VPIDTableInitializer
201 
202 
204 
205 
207  : m_uVPID (inData)
208 {
210 }
211 
212 
214 {
216  m_uVPID = inVPID.m_uVPID;
217 }
218 
219 
221 {
223  if (&inRHS != this)
224  m_uVPID = inRHS.m_uVPID;
225  return *this;
226 }
227 
228 
230  NTV2FrameBufferFormat frameBufferFormat,
231  bool progressive,
232  bool aspect16x9,
233  VPIDChannel channel)
234 {
235  return SetVPIDData (m_uVPID, videoFormat, frameBufferFormat, progressive, aspect16x9, channel);
236 }
237 
238 
240  bool dualLink,
241  bool format48Bit,
242  bool output3Gb,
243  bool st425,
244  VPIDChannel channel)
245 {
246  return SetVPIDData (m_uVPID, videoFormat, dualLink, format48Bit, output3Gb, st425, channel);
247 }
248 
249 
250 bool CNTV2VPID::IsStandard3Ga (void) const
251 {
252  switch(GetStandard())
253  {
254  case VPIDStandard_720_3Ga: // Not to be used for aspect ratio. 720p is always zero.
258  return true;
259  default:
260  break;
261  }
262 
263  return false;
264 }
265 
267 {
268  switch(GetStandard())
269  {
272  return true;
273  default:
274  break;
275  }
276 
277  return false;
278 }
279 
280 
282 {
283  switch(GetStandard())
284  {
288  return true;
289  default:
290  break;
291  }
292 
293  return false;
294 }
295 
297 {
298  m_uVPID = (m_uVPID & ~kRegMaskVPIDVersionID) |
299  ((ULWord(inVPIDVersion) << kRegShiftVPIDVersionID) & kRegMaskVPIDVersionID);
300  return *this;
301 }
302 
303 
305 {
307 }
308 
309 
311 {
312  m_uVPID = (m_uVPID & ~kRegMaskVPIDStandard) |
314  return *this;
315 }
316 
317 
319 {
321 }
322 
323 
324 CNTV2VPID & CNTV2VPID::SetProgressiveTransport (const bool inIsProgressiveTransport)
325 {
326  m_uVPID = (m_uVPID & ~kRegMaskVPIDProgressiveTransport) |
327  (((inIsProgressiveTransport ? 1UL : 0UL) << kRegShiftVPIDProgressiveTransport) & kRegMaskVPIDProgressiveTransport);
328  return *this;
329 }
330 
331 
333 {
334  return (m_uVPID & kRegMaskVPIDProgressiveTransport) != 0;
335 }
336 
337 
338 CNTV2VPID & CNTV2VPID::SetProgressivePicture (const bool inIsProgressivePicture)
339 {
340  m_uVPID = (m_uVPID & ~kRegMaskVPIDProgressivePicture) |
341  (((inIsProgressivePicture ? 1UL : 0UL) << kRegShiftVPIDProgressivePicture) & kRegMaskVPIDProgressivePicture);
342  return *this;
343 }
344 
345 
347 {
348  return (m_uVPID & kRegMaskVPIDProgressivePicture) != 0;
349 }
350 
351 
353 {
354  m_uVPID = (m_uVPID & ~kRegMaskVPIDPictureRate) |
356  return *this;
357 }
358 
360 {
362 }
363 
364 
365 CNTV2VPID & CNTV2VPID::SetImageAspect16x9 (const bool inIs16x9Aspect)
366 {
367  VPIDStandard standard = GetStandard();
368  if(standard == VPIDStandard_1080 ||
369  standard == VPIDStandard_1080_DualLink ||
370  standard == VPIDStandard_1080_DualLink_3Gb ||
372  standard == VPIDStandard_2160_DualLink)
373  {
374  m_uVPID = (m_uVPID & ~kRegMaskVPIDImageAspect16x9Alt) |
375  (((inIs16x9Aspect ? 1UL : 0UL) << kRegShiftVPIDImageAspect16x9Alt) & kRegMaskVPIDImageAspect16x9Alt);
376  }
377  else
378  {
379  m_uVPID = (m_uVPID & ~kRegMaskVPIDImageAspect16x9) |
380  (((inIs16x9Aspect ? 1UL : 0UL) << kRegShiftVPIDImageAspect16x9) & kRegMaskVPIDImageAspect16x9);
381  }
382  return *this;
383 }
384 
385 
387 {
388  VPIDStandard standard = GetStandard();
389  if(standard == VPIDStandard_1080 ||
390  standard == VPIDStandard_1080_DualLink ||
391  standard == VPIDStandard_1080_DualLink_3Gb ||
393  standard == VPIDStandard_2160_DualLink)
394  {
395  return (m_uVPID & kRegMaskVPIDImageAspect16x9Alt) != 0;
396  }
397  return (m_uVPID & kRegMaskVPIDImageAspect16x9) != 0;
398 }
399 
400 
402 {
403  m_uVPID = (m_uVPID & ~kRegMaskVPIDSampling) |
405  return *this;
406 }
407 
408 
410 {
412 }
413 
414 bool CNTV2VPID::IsRGBSampling (void) const
415 {
416  switch (GetSampling())
417  {
420  case VPIDSampling_GBRD_4444: return true;
421  default: break;
422  }
423  return false;
424 }
425 
427 {
428  m_uVPID = (m_uVPID & ~kRegMaskVPIDChannel) |
429  ((ULWord(inChannel) << kRegShiftVPIDChannel) & kRegMaskVPIDChannel);
430  return *this;
431 }
432 
433 
435 {
436  return VPIDChannel((m_uVPID & kRegMaskVPIDChannel) >> kRegShiftVPIDChannel);
437 }
438 
439 
441 {
442  m_uVPID = (m_uVPID & ~kRegMaskVPIDDualLinkChannel) |
444  return *this;
445 }
446 
447 
449 {
451 }
452 
453 
455 {
456  m_uVPID = (m_uVPID & ~kRegMaskVPIDBitDepth) |
458  return *this;
459 }
460 
461 
463 {
465 }
466 
468 {
469  m_uVPID = (m_uVPID & ~kRegMaskVPIDXferChars) |
471  return *this;
472 }
473 
474 
476 {
478 }
479 
481 {
482  VPIDStandard standard (GetStandard());
483  if (standard == VPIDStandard_1080 ||
484  standard == VPIDStandard_1080_DualLink ||
485  standard == VPIDStandard_1080_DualLink_3Gb ||
487  standard == VPIDStandard_2160_DualLink)
488  {
489  ULWord lowBit(0), highBit(0);
490  highBit = (inColorimetry&0x2)>>1;
491  lowBit = inColorimetry&0x1;
492  m_uVPID = (m_uVPID & ~kRegMaskVPIDColorimetryAltHigh) |
494  m_uVPID = (m_uVPID & ~kRegMaskVPIDColorimetryAltLow) |
496  }
497  else
498  {
499  m_uVPID = (m_uVPID & ~kRegMaskVPIDColorimetry) |
501  }
502  return *this;
503 }
504 
505 
507 {
508  VPIDStandard standard (GetStandard());
509  if(standard == VPIDStandard_1080 ||
510  standard == VPIDStandard_1080_DualLink ||
511  standard == VPIDStandard_1080_DualLink_3Gb ||
513  standard == VPIDStandard_2160_DualLink)
514  {
515  //The bits are sparse so...
516  uint8_t lowBit(0), highBit(0), value(0);
519  value = (highBit << 1)|lowBit;
520  return NTV2VPIDColorimetry(value);
521  }
523 }
524 
526 {
527  m_uVPID = (m_uVPID & ~kRegmaskVPIDLuminance) |
529  return *this;
530 }
531 
532 
534 {
536 }
537 
539 {
540  switch(GetBitDepth())
541  {
543  case VPIDBitDepth_10:
544  if(inRGBRange == NTV2_VPID_Range_Narrow || !IsRGBSampling())
546  else
548  break;
550  case VPIDBitDepth_12:
551  if(inRGBRange == NTV2_VPID_Range_Narrow || !IsRGBSampling())
553  else
555  }
556 
557  return *this;
558 }
559 
560 
562 {
563  if(!IsRGBSampling())
564  return NTV2_VPID_Range_Narrow;
565 
566  switch(GetBitDepth())
567  {
570  return NTV2_VPID_Range_Full;
571  default:
572  return NTV2_VPID_Range_Narrow;
573  }
574 }
575 
576 
577 // static - this one doesn't support 3Gb
579  const NTV2VideoFormat inOutputFormat,
580  const NTV2FrameBufferFormat inFrameBufferFormat,
581  const bool inIsProgressive,
582  const bool inIs16x9Aspect,
583  const VPIDChannel inChannel,
584  const bool inUseChannel)
585 {
586  (void)inIsProgressive;
587  (void)inIs16x9Aspect;
588 
589  bool bRGB48Bit (false);
590  bool bDualLinkRGB (false);
591  const bool kOutput3Gb (false);
592 
593  switch(inFrameBufferFormat)
594  {
595  case NTV2_FBF_48BIT_RGB:
596  bRGB48Bit = true;
597  bDualLinkRGB = true; // RGB 12 bit
598  break;
599  case NTV2_FBF_ARGB:
600  case NTV2_FBF_RGBA:
601  case NTV2_FBF_ABGR:
602  case NTV2_FBF_10BIT_RGB:
603  case NTV2_FBF_10BIT_DPX:
604  case NTV2_FBF_24BIT_RGB:
605  case NTV2_FBF_24BIT_BGR:
608  case NTV2_FBF_10BIT_ARGB:
609  case NTV2_FBF_16BIT_ARGB:
610  bDualLinkRGB = true; // RGB 8+10 bit;
611  bRGB48Bit = false;
612  break;
613  default:
614  bDualLinkRGB = false; // All other
615  bRGB48Bit = false;
616  break;
617  }
618 
619  // should use this call directly
620  return SetVPIDData (outVPID,
621  inOutputFormat,
622  bDualLinkRGB,
623  bRGB48Bit,
624  kOutput3Gb,
625  false, // not ST525
626  inChannel,
627  inUseChannel);
628 }
629 
630 
632  const NTV2VideoFormat inOutputFormat,
633  const bool inIsDualLinkRGB,
634  const bool inIsRGB48Bit,
635  const bool inOutputIs3Gb,
636  const bool inIsSMPTE425,
637  const VPIDChannel inChannel,
638  const bool inUseChannel,
639  const bool inOutputIs6G,
640  const bool inOutputIs12G,
641  const NTV2VPIDXferChars inXferChars,
642  const NTV2VPIDColorimetry inColorimetry,
643  const NTV2VPIDLuminance inLuminance,
644  const NTV2VPIDRGBRange inRGBRange)
645 {
646  VPIDSpec vpidSpec;
647 
648 
649  ::memset (&vpidSpec, 0, sizeof(vpidSpec));
650 
651  vpidSpec.videoFormat = inOutputFormat;
652  vpidSpec.pixelFormat = inIsRGB48Bit ? NTV2_FBF_48BIT_RGB : NTV2_FBF_INVALID;
653  vpidSpec.isRGBOnWire = inIsDualLinkRGB;
654  vpidSpec.isOutputLevelA = (NTV2_IS_3G_FORMAT (inOutputFormat) && ! inOutputIs3Gb) ? true : false;
655  vpidSpec.isOutputLevelB = inOutputIs3Gb;
656  vpidSpec.isDualLink = inIsDualLinkRGB || (NTV2_IS_372_DUALLINK_FORMAT(inOutputFormat) && !vpidSpec.isOutputLevelA);
657  vpidSpec.isTwoSampleInterleave = inIsSMPTE425;
658  vpidSpec.useChannel = inUseChannel;
659  vpidSpec.vpidChannel = inChannel;
660  vpidSpec.isStereo = false;
661  vpidSpec.isRightEye = false;
662  vpidSpec.audioCarriage = VPIDAudio_Unknown;
663  vpidSpec.isOutput6G = inOutputIs6G;
664  vpidSpec.isOutput12G = inOutputIs12G;
665  vpidSpec.transferCharacteristics = inXferChars;
666  vpidSpec.colorimetry = inColorimetry;
667  vpidSpec.luminance = inLuminance;
668  vpidSpec.rgbRange = inRGBRange;
669 
670  return ::SetVPIDFromSpec (&outVPID, &vpidSpec);
671 }
672 
673 
675 {
676  NTV2VideoFormat videoFormat = NTV2_FORMAT_UNKNOWN;
677  VPIDStandard vpidStandard = GetStandard();
678  bool vpidProgPicture = GetProgressivePicture();
679  bool vpidProgTransport = GetProgressiveTransport();
680  bool vpidHorizontal2048 = ((m_uVPID & kRegMaskVPIDHorizontalSampling) != 0);
681 
682  VPIDPictureRate vpidFrameRate = GetPictureRate();
683 
684  switch (vpidStandard)
685  {
686  case VPIDStandard_483_576:
687  switch (vpidFrameRate)
688  {
690  videoFormat = NTV2_FORMAT_625_5000;
691  break;
693  videoFormat = NTV2_FORMAT_525_5994;
694  break;
695  default:
696  break;
697  }
698  break;
699  case VPIDStandard_720:
700  switch (vpidFrameRate)
701  {
703  videoFormat = NTV2_FORMAT_720p_5000;
704  break;
706  videoFormat = NTV2_FORMAT_720p_5994;
707  break;
709  videoFormat = NTV2_FORMAT_720p_6000;
710  break;
711  default:
712  break;
713  }
714  break;
717  videoFormat = stTable720p[vpidFrameRate];
718  break;
719  case VPIDStandard_1080:
726  if (vpidProgPicture)
727  {
728  if (vpidProgTransport)
729  {
730  if (vpidHorizontal2048)
731  {
732  videoFormat = stTable2048p[vpidFrameRate];
733  }
734  else
735  {
736  videoFormat = stTable1920p[vpidFrameRate];
737  }
738  }
739  else
740  {
741  if (vpidHorizontal2048)
742  {
743  videoFormat = stTable2048psf[vpidFrameRate];
744  }
745  else
746  {
747  videoFormat = stTable1920psf[vpidFrameRate];
748  }
749  }
750  }
751  else
752  {
753  if (vpidHorizontal2048)
754  {
755  videoFormat = stTable2048i[vpidFrameRate];
756  }
757  else
758  {
759  videoFormat = stTable1920i[vpidFrameRate];
760  }
761  }
762  break;
766  if (vpidProgTransport)
767  {
768  if (vpidHorizontal2048)
769  {
770  videoFormat = stTable4096pSID[vpidFrameRate];
771  }
772  else
773  {
774  videoFormat = stTable3840pSID[vpidFrameRate];
775  }
776  }
777  else
778  {
779  if (vpidHorizontal2048)
780  {
781  videoFormat = stTable4096psfSID[vpidFrameRate];
782  }
783  else
784  {
785  videoFormat = stTable3840psfSID[vpidFrameRate];
786  }
787  }
788  break;
791  if (vpidHorizontal2048)
792  {
793  videoFormat = stTable4096pTSI[vpidFrameRate];
794  }
795  else
796  {
797  videoFormat = stTable3840pTSI[vpidFrameRate];
798  }
799  break;
801  if (vpidHorizontal2048)
802  {
803  videoFormat = stTable4096pTSI[vpidFrameRate];
804  }
805  else
806  {
807  videoFormat = stTable3840pTSI[vpidFrameRate];
808  }
809  break;
812  if (vpidHorizontal2048)
813  {
814  videoFormat = stTable8192p[vpidFrameRate];
815  }
816  else
817  {
818  videoFormat = stTable7680p[vpidFrameRate];
819  }
820  break;
821  default:
822  break;
823  }
824 
825  return videoFormat;
826 }
827 
828 // Macro to simplify returning of string for given enum
829 #define VPID_ENUM_CASE_RETURN_STR(enum_name) case(enum_name): return #enum_name
830 
831 const string CNTV2VPID::VersionString (const VPIDVersion version)
832 {
833  switch (version)
834  {
837  // intentionally not setting a default: so compiler will warn about missing enums
838  }
839  return "";
840 }
841 
843 {
844  switch (std)
845  {
893  // intentionally not setting a default: so compiler will warn about missing enums
894  }
895  return "";
896 }
897 
899 {
900  switch (rate)
901  {
918  // intentionally not setting a default: so compiler will warn about missing enums
919  }
920  return "";
921 }
922 
923 const string CNTV2VPID::SamplingString (const VPIDSampling sample)
924 {
925  switch (sample)
926  {
943  // intentionally not setting a default: so compiler will warn about missing enums
944  }
945  return "";
946 }
947 
948 const string CNTV2VPID::ChannelString (const VPIDChannel chan)
949 {
950  switch (chan)
951  {
960  // intentionally not setting a default: so compiler will warn about missing enums
961  }
962  return "";
963 }
964 
966 {
967  switch (range)
968  {
973  // intentionally not setting a default: so compiler will warn about missing enums
974  }
975  return "";
976 }
977 
978 const string CNTV2VPID::BitDepthString (const VPIDBitDepth depth)
979 {
980  switch (depth)
981  {
986  // intentionally not setting a default: so compiler will warn about missing enums
987  }
988  return "";
989 }
990 
991 const string CNTV2VPID::LinkString (const VPIDLink link)
992 {
993  switch (link)
994  {
1003  // intentionally not setting a default: so compiler will warn about missing enums
1004  }
1005  return "";
1006 }
1007 
1008 const string CNTV2VPID::AudioString (const VPIDAudio audio)
1009 {
1010  switch (audio)
1011  {
1016  // intentionally not setting a default: so compiler will warn about missing enums
1017  }
1018  return "";
1019 }
1020 
1021 const string CNTV2VPID::VPIDVersionToString (const VPIDVersion inVers)
1022 {
1023  switch (inVers)
1024  {
1025  case VPIDVersion_0: return "0";
1026  case VPIDVersion_1: return "1";
1027  #if !defined(_DEBUG)
1028  default: break;
1029  #endif
1030  }
1031  return "";
1032 }
1033 
1035 {
1036  switch (inStd)
1037  {
1038  case VPIDStandard_Unknown: return "Unknown";
1039  case VPIDStandard_483_576: return "Standard Definition";
1040  case VPIDStandard_483_576_DualLink: return "SD Dual Link?";
1041  case VPIDStandard_483_576_540Mbs: return "SD 540Mbs?";
1042  case VPIDStandard_720: return "720 Single Link";
1043  case VPIDStandard_1080: return "1080 Single Link";
1044  case VPIDStandard_483_576_1485Mbs: return "SD 1485Mbs?";
1045  case VPIDStandard_1080_DualLink: return "1080 Dual Link";
1046  case VPIDStandard_720_3Ga: return "720 3G Level A";
1047  case VPIDStandard_1080_3Ga: return "1080 3G Level A";
1048  case VPIDStandard_1080_DualLink_3Gb: return "1080 Dual Link 3G Level B";
1049  case VPIDStandard_720_3Gb: return "2x720 3G Level B";
1050  case VPIDStandard_1080_3Gb: return "2x1080 3G Level B";
1051  case VPIDStandard_483_576_3Gb: return "SD 3G Level B?";
1052  case VPIDStandard_720_Stereo_3Gb: return "720_Stereo_3Gb";
1053  case VPIDStandard_1080_Stereo_3Gb: return "1080_Stereo_3Gb";
1054  case VPIDStandard_1080_QuadLink: return "1080 Quad Link";
1055  case VPIDStandard_720_Stereo_3Ga: return "720_Stereo_3Ga";
1056  case VPIDStandard_1080_Stereo_3Ga: return "1080_Stereo_3Ga";
1057  case VPIDStandard_1080_Stereo_DualLink_3Gb: return "1080_Stereo_DualLink_3Gb";
1058  case VPIDStandard_1080_Dual_3Ga: return "1080 Dual Link 3Ga";
1059  case VPIDStandard_1080_Dual_3Gb: return "1080 Dual Link 3Gb";
1060  case VPIDStandard_2160_DualLink: return "2160 Dual Link";
1061  case VPIDStandard_2160_QuadLink_3Ga: return "2160 Quad Link 3Ga";
1062  case VPIDStandard_2160_QuadDualLink_3Gb: return "2160 Quad Dual Link 3Gb";
1063  case VPIDStandard_1080_Stereo_Quad_3Ga: return "1080_Stereo_Quad_3Ga";
1064  case VPIDStandard_1080_Stereo_Quad_3Gb: return "1080_Stereo_Quad_3Gb";
1065  case VPIDStandard_2160_Stereo_Quad_3Gb: return "2160_Stereo_Quad_3Gb";
1066  case VPIDStandard_1080_OctLink: return "1080 Octa Link";
1067  case VPIDStandard_UHDTV1_Single_DualLink_10Gb: return "UHDTV1_Single_DualLink_10Gb";
1068  case VPIDStandard_UHDTV2_Quad_OctaLink_10Gb: return "UHDTV2_Quad_OctaLink_10Gb";
1069  case VPIDStandard_UHDTV1_MultiLink_10Gb: return "UHDTV1_MultiLink_10Gb";
1070  case VPIDStandard_UHDTV2_MultiLink_10Gb: return "UHDTV2_MultiLink_10Gb";
1071  case VPIDStandard_VC2: return "VC2";
1072  case VPIDStandard_720_1080_Stereo: return "720_1080_Stereo";
1073  case VPIDStandard_VC2_Level65_270Mbs: return "VC2_Level65_270Mbs";
1074  case VPIDStandard_4K_DCPIF_FSW709_10Gbs: return "4K_DCPIF_FSW709_10Gbs";
1075  case VPIDStandard_FT_2048x1556_Dual: return "FT_2048x1556_Dual";
1076  case VPIDStandard_FT_2048x1556_3Gb: return "FT_2048x1556_3Gb";
1077  case VPIDStandard_2160_Single_6Gb: return "2160_Single_6Gb";
1078  case VPIDStandard_1080_Single_6Gb: return "1080_Single_6Gb";
1079  case VPIDStandard_1080_AFR_Single_6Gb: return "1080_AFR_Single_6Gb";
1080  case VPIDStandard_2160_Single_12Gb: return "2160_Single_12Gb";
1081  case VPIDStandard_1080_10_12_AFR_Single_12Gb: return "1080_10_12_AFR_Single_12Gb";
1082  case VPIDStandard_4320_DualLink_12Gb: return "4320_DualLink_12Gb";
1083  case VPIDStandard_2160_DualLink_12Gb: return "2160_DualLink_12Gb";
1084  case VPIDStandard_4320_QuadLink_12Gb: return "4320_QuadLink_12Gb";
1085  #if !defined(_DEBUG)
1086  default: break;
1087  #endif
1088  }
1089  return "";
1090 }
1091 
1093 {
1094  switch (inStd)
1095  {
1096  case VPIDStandard_483_576:
1098  case VPIDStandard_720:
1099  case VPIDStandard_1080:
1100  case VPIDStandard_720_3Ga:
1101  case VPIDStandard_1080_3Ga:
1102  case VPIDStandard_720_3Gb:
1103  case VPIDStandard_1080_3Gb:
1105  case VPIDStandard_VC2:
1112  case VPIDStandard_1080_10_12_AFR_Single_12Gb: return true;
1113 
1119 // case VPIDStandard_483_576_360Mbs:
1144  default: break;
1145  }
1146  return false;
1147 }
1148 
1150 {
1151  switch (inStd)
1152  {
1158 // case VPIDStandard_483_576_360Mbs:
1171  case VPIDStandard_4320_QuadLink_12Gb: return true;
1172 
1173  case VPIDStandard_483_576:
1175  case VPIDStandard_720:
1176  case VPIDStandard_1080:
1177  case VPIDStandard_720_3Ga:
1178  case VPIDStandard_1080_3Ga:
1179  case VPIDStandard_720_3Gb:
1180  case VPIDStandard_1080_3Gb:
1182  case VPIDStandard_VC2:
1201  default: break;
1202  }
1203  return false;
1204 }
1205 
1207 {
1208  switch (inStd)
1209  {
1217  case VPIDStandard_4320_QuadLink_12Gb: return true;
1218 
1224 // case VPIDStandard_483_576_360Mbs:
1236  case VPIDStandard_483_576:
1238  case VPIDStandard_720:
1239  case VPIDStandard_1080:
1240  case VPIDStandard_720_3Ga:
1241  case VPIDStandard_1080_3Ga:
1242  case VPIDStandard_720_3Gb:
1243  case VPIDStandard_1080_3Gb:
1245  case VPIDStandard_VC2:
1258  default: break;
1259  }
1260  return false;
1261 }
1262 
1264 {
1265  switch (inStd)
1266  {
1268  case VPIDStandard_1080_OctLink: return true;
1269 
1282 // case VPIDStandard_483_576_360Mbs:
1294  case VPIDStandard_483_576:
1296  case VPIDStandard_720:
1297  case VPIDStandard_1080:
1298  case VPIDStandard_720_3Ga:
1299  case VPIDStandard_1080_3Ga:
1300  case VPIDStandard_720_3Gb:
1301  case VPIDStandard_1080_3Gb:
1303  case VPIDStandard_VC2:
1315  default: break;
1316  }
1317  return false;
1318 }
1319 
1320 
1321 static const string sVPIDPictureRate[] = { "None", "Reserved1", "23.98", "24.00", "47.95", "25.00", "29.97", "30.00", "48.00", "50.00", "59.94", "60.00",
1322  "ReservedC", "ReservedD", "ReservedE", "ReservedF" };
1323 static const string sVPIDSampling[] = { "YCbCr 4:2:2", "YCbCr 4:4:4", "GBR 4:4:4", "YCbCr 4:2:0", "YCbCrA 4:2:2:4", "YCbCrA 4:4:4:4",
1324  "GBRA 4:4:4:4", "Reserved7", "YCbCrD 4:2:2:4", "YCbCrD 4:4:4:4", "GBRD 4:4:4:4", "ReservedB",
1325  "ReservedC", "ReservedD", "ReservedE", "XYZ 4:4:4" };
1326 static const string sVPIDChannel[] = { "1", "2", "3", "4", "5", "6", "7", "8" };
1327 static const string sVPIDDynamicRange[] = { "100", "200", "400", "Reserved3" };
1328 static const string sVPIDBitDepth[] = { "10 Full", "10", "12", "12 Full" };
1329 static const string sVPIDLink[] = { "1", "2", "3", "4", "5", "6", "7", "8" };
1330 static const string sVPIDAudio[] = { "Unknown", "Copied", "Additional", "Reserved" };
1331 static const string sVPIDTransfer[] = { "SDR", "HLG", "PQ", "Unspecified" };
1332 static const string sVPIDColorimetry[] = { "Rec709", "Reserved", "UHDTV", "Unknown" };
1333 static const string sVPIDLuminance[] = { "YCbCr", "ICtCp" };
1334 static const string sVPIDRGBRange[] = { "Narrow", "Full" };
1335 
1336 
1337 
1338 ostream & CNTV2VPID::Print (ostream & ostrm) const
1339 {
1340  ostrm << "VPID " << xHEX0N(m_uVPID,8)
1342  if (IsValid())
1343  ostrm << " " << CNTV2VPID::VPIDStandardToString(GetStandard())
1345  << " rate=" << sVPIDPictureRate[GetPictureRate()]
1346  << " samp=" << sVPIDSampling[GetSampling()]
1347  << " chan=" << sVPIDChannel[GetChannel()]
1348  << " links=" << (VPIDStandardIsSingleLink(GetStandard()) ? "1" : "mult")
1349  // << " dynRange=" << sVPIDDynamicRange[GetDynamicRange()]
1350  << " bitd=" << sVPIDBitDepth[GetBitDepth()]
1351  << " 3Ga=" << YesNo(IsStandard3Ga())
1352  << " tsi=" << YesNo(IsStandardTwoSampleInterleave())
1353  << " 16x9=" << YesNo(GetImageAspect16x9())
1354  << " xfer=" << sVPIDTransfer[GetTransferCharacteristics()]
1355  << " colo=" << sVPIDColorimetry[GetColorimetry()]
1356  << " lumi=" << sVPIDLuminance[GetLuminance()]
1357  << " rng=" << sVPIDRGBRange[GetRGBRange()];
1358  return ostrm;
1359 }
1360 
1361 ostream & CNTV2VPID::PrintPretty (ostream & ostrm) const
1362 {
1363  ostrm << "VPID " << xHEX0N(m_uVPID,8) << endl
1364  << "Version = " << CNTV2VPID::VPIDVersionToString(GetVersion()) << endl;
1365  if (IsValid())
1366  ostrm << "Standard = " << CNTV2VPID::VPIDStandardToString(GetStandard()) << endl
1367  << "Format = " << ::NTV2VideoFormatToString(GetVideoFormat()) << endl
1368  << "Frame Rate = " << sVPIDPictureRate[GetPictureRate()] << endl
1369  << "Sampling = " << sVPIDSampling[GetSampling()] << endl
1370  << "Channel = " << sVPIDChannel[GetChannel()] << endl
1371  << "Links = " << (VPIDStandardIsSingleLink(GetStandard()) ? "1" : "mult") << endl
1372  // << " dynRange=" << sVPIDDynamicRange[GetDynamicRange()] << endl
1373  << "Bit Depth =" << sVPIDBitDepth[GetBitDepth()] << endl
1374  << "3Ga= " << YesNo(IsStandard3Ga()) << endl
1375  << "TSI = " << YesNo(IsStandardTwoSampleInterleave()) << endl
1376  << "16x9 = " << YesNo(GetImageAspect16x9()) << endl
1377  << "Xfer Char = " << sVPIDTransfer[GetTransferCharacteristics()] << endl
1378  << "Colorimetry =" << sVPIDColorimetry[GetColorimetry()] << endl
1379  << "Luminance = " << sVPIDLuminance[GetLuminance()] << endl
1380  << "RGB Range = " << sVPIDRGBRange[GetRGBRange()] << endl;
1381  return ostrm;
1382 }
1383 
1384 #define YesOrNo(__x__) ((__x__) ? "Yes" : "No")
1385 
1387 {
1388  ostringstream hexConv; hexConv << xHEX0N(m_uVPID,8);
1389  AJASystemInfo::append(outInfo, "Raw Value", hexConv.str());
1391  if (!IsValid())
1392  return outInfo;
1394  AJASystemInfo::append(outInfo, "Video Format", ::NTV2VideoFormatToString(GetVideoFormat()));
1395  AJASystemInfo::append(outInfo, "Progressive Transport", YesOrNo(GetProgressiveTransport()));
1396  AJASystemInfo::append(outInfo, "Progressive Picture", YesOrNo(GetProgressivePicture()));
1397  AJASystemInfo::append(outInfo, "Frame Rate", sVPIDPictureRate[GetPictureRate()]);
1398  AJASystemInfo::append(outInfo, "Sampling", sVPIDSampling[GetSampling()]);
1399  AJASystemInfo::append(outInfo, "Channel", sVPIDChannel[GetChannel()]);
1400  AJASystemInfo::append(outInfo, "Links", VPIDStandardIsSingleLink(GetStandard()) ? "1" : "multiple");
1401 // AJASystemInfo::append(outInfo, "Dynamic Range", sVPIDDynamicRange[GetDynamicRange()]);
1402  AJASystemInfo::append(outInfo, "Bit Depth", sVPIDBitDepth[GetBitDepth()]);
1403  AJASystemInfo::append(outInfo, "3Ga", YesOrNo(IsStandard3Ga()));
1404  AJASystemInfo::append(outInfo, "Two Sample Interleave", YesOrNo(IsStandardTwoSampleInterleave()));
1405  AJASystemInfo::append(outInfo, "Aspect Ratio", GetImageAspect16x9() ? "16x9" : "4x3");
1406  AJASystemInfo::append(outInfo, "Xfer Characteristics", sVPIDTransfer[GetTransferCharacteristics()]);
1407  AJASystemInfo::append(outInfo, "Colorimetry", sVPIDColorimetry[GetColorimetry()]);
1408  AJASystemInfo::append(outInfo, "Luminance", sVPIDLuminance[GetLuminance()]);
1409  AJASystemInfo::append(outInfo, "RGB Range", sVPIDRGBRange[GetRGBRange()]);
1410  return outInfo;
1411 }
1412 
1413 string CNTV2VPID::AsString (const bool inTabular) const
1414 {
1415  if (inTabular)
1416  { AJALabelValuePairs table;
1417  return AJASystemInfo::ToString(GetInfo(table));
1418  }
1419  else
1420  { ostringstream oss;
1421  Print(oss);
1422  return oss.str();
1423  }
1424 }
1425 
1426 ostream & operator << (std::ostream & ostrm, const CNTV2VPID & inData)
1427 {
1428  return inData.Print(ostrm);
1429 }
static const std::string VersionString(const VPIDVersion version)
Definition: ntv2vpid.cpp:831
VPIDDynamicRange
Definition: ntv2enums.h:4120
NTV2VPIDLuminance luminance
Describes the luminance and color difference.
static NTV2VideoFormat stTable2048p[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:22
bool isStereo
If true, the video stream is part of a stereo pair.
virtual CNTV2VPID & SetColorimetry(const NTV2VPIDColorimetry inColorimetry)
Definition: ntv2vpid.cpp:480
NTV2VPIDColorimetry colorimetry
Describes the Colorimetry.
static const string sVPIDPictureRate[]
Definition: ntv2vpid.cpp:1321
static const string sVPIDBitDepth[]
Definition: ntv2vpid.cpp:1328
#define VPID_ENUM_CASE_RETURN_STR(enum_name)
Definition: ntv2vpid.cpp:829
static NTV2VideoFormat stTable3840psfSID[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:30
virtual NTV2VPIDRGBRange GetRGBRange(void) const
Definition: ntv2vpid.cpp:561
virtual CNTV2VPID & SetProgressiveTransport(const bool inIsProgressiveTransport)
Definition: ntv2vpid.cpp:324
virtual VPIDSampling GetSampling(void) const
Definition: ntv2vpid.cpp:409
static const std::string DynamicRangeString(const VPIDDynamicRange range)
Definition: ntv2vpid.cpp:965
virtual AJALabelValuePairs & GetInfo(AJALabelValuePairs &outInfo) const
Definition: ntv2vpid.cpp:1386
VPIDAudio audioCarriage
Specifies how audio is carried in additional channels.
NTV2FrameBufferFormat
Identifies a particular video frame buffer pixel format. See Device Frame Buffer Formats for details...
Definition: ntv2enums.h:219
enum NTV2VPIDTransferCharacteristics NTV2VPIDXferChars
virtual std::ostream & PrintPretty(std::ostream &ostrm) const
Definition: ntv2vpid.cpp:1361
static const string sVPIDAudio[]
Definition: ntv2vpid.cpp:1330
static bool VPIDStandardIsQuadLink(const VPIDStandard inStd)
Definition: ntv2vpid.cpp:1206
Declares the CNTV2VPID class. See SMPTE 352 standard for details.
NTV2VideoFormat videoFormat
Specifies the format of the video stream.
enum _NTV2VideoFormat NTV2VideoFormat
Identifies a particular video format.
static const string sVPIDDynamicRange[]
Definition: ntv2vpid.cpp:1327
static const string sVPIDLuminance[]
Definition: ntv2vpid.cpp:1333
NTV2VPIDLuminance
Definition: ntv2enums.h:4262
Declares functions for the C implementations of VPID generation from a VPIDSpec.
virtual NTV2VPIDXferChars GetTransferCharacteristics(void) const
Definition: ntv2vpid.cpp:475
std::vector< AJALabelValuePair > AJALabelValuePairs
An ordered sequence of label/value pairs.
Definition: info.h:71
virtual CNTV2VPID & SetTransferCharacteristics(const NTV2VPIDXferChars inXferChars)
Definition: ntv2vpid.cpp:467
virtual VPIDPictureRate GetPictureRate(void) const
Definition: ntv2vpid.cpp:359
virtual bool GetProgressivePicture(void) const
Definition: ntv2vpid.cpp:346
static NTV2VideoFormat stTable8192p[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:35
static const std::string BitDepthString(const VPIDBitDepth depth)
Definition: ntv2vpid.cpp:978
static const std::string VPIDStandardToString(const VPIDStandard inStd)
Definition: ntv2vpid.cpp:1034
Definition: json.hpp:5362
virtual CNTV2VPID & SetVersion(const VPIDVersion inVersion)
Definition: ntv2vpid.cpp:296
bool isOutputLevelB
If true, the video stream will leave the device as a level B signal.
static bool SetVPIDData(ULWord &outVPID, const NTV2VideoFormat inOutputFormat, const NTV2FrameBufferFormat inFrameBufferFormat, const bool inIsProgressive, const bool inIs16x9Aspect, const VPIDChannel inVPIDChannel, const bool inUseVPIDChannel=true)
Definition: ntv2vpid.cpp:578
uint32_t ULWord
Definition: ajatypes.h:223
VPIDPictureRate
Definition: ntv2enums.h:4068
static VPIDTableInitializer gVPIDTableInitializer
Definition: ntv2vpid.cpp:203
ostream & operator<<(std::ostream &ostrm, const CNTV2VPID &inData)
Definition: ntv2vpid.cpp:1426
static const std::string StandardString(const VPIDStandard std)
Definition: ntv2vpid.cpp:842
#define NTV2_ASSERT(_expr_)
Definition: ajatypes.h:476
virtual CNTV2VPID & SetImageAspect16x9(const bool inIs16x9Aspect)
Definition: ntv2vpid.cpp:365
NTV2VPIDTransferCharacteristics transferCharacteristics
Describes the transfer characteristics.
static NTV2VideoFormat stTable2048psf[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:24
static const string sVPIDChannel[]
Definition: ntv2vpid.cpp:1326
virtual VPIDVersion GetVersion(void) const
Definition: ntv2vpid.cpp:304
#define YesNo(__x__)
bool isTwoSampleInterleave
If true, the video stream is in SMPTE 425-3 two sample interleave format.
16-Bit ARGB
Definition: ntv2enums.h:245
static const string sVPIDSampling[]
Definition: ntv2vpid.cpp:1323
virtual VPIDBitDepth GetBitDepth(void) const
Definition: ntv2vpid.cpp:462
See 10-Bit RGB Format.
Definition: ntv2enums.h:226
static const string sVPIDColorimetry[]
Definition: ntv2vpid.cpp:1332
virtual CNTV2VPID & SetLuminance(const NTV2VPIDLuminance inLuminance)
Definition: ntv2vpid.cpp:525
VPIDBitDepth
Definition: ntv2enums.h:4128
virtual NTV2VPIDColorimetry GetColorimetry(void) const
Definition: ntv2vpid.cpp:506
virtual std::ostream & Print(std::ostream &ostrm) const
Definition: ntv2vpid.cpp:1338
static bool VPIDStandardIsOctLink(const VPIDStandard inStd)
Definition: ntv2vpid.cpp:1263
bool isOutputLevelA
If true, the video stream will leave the device as a level A signal.
NTV2VPIDRGBRange rgbRange
Describes the RGB range as full or SMPTE.
static NTV2VideoFormat stTable1920psf[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:25
std::string NTV2VideoFormatToString(const NTV2VideoFormat inValue, const bool inUseFrameRate=false)
Definition: ntv2utils.cpp:6746
See 8-Bit ARGB, RGBA, ABGR Formats.
Definition: ntv2enums.h:228
See 8-Bit ARGB, RGBA, ABGR Formats.
Definition: ntv2enums.h:224
VPIDChannel vpidChannel
Specifies the channel number of the video stream.
static NTV2VideoFormat stTable7680p[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:34
NTV2VPIDColorimetry
Definition: ntv2enums.h:4254
static NTV2VideoFormat stTable4096psfSID[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:31
virtual std::string AsString(const bool inTabular=false) const
Definition: ntv2vpid.cpp:1413
bool SetVPIDFromSpec(ULWord *const pOutVPID, const VPIDSpec *const pInVPIDSpec)
Generates a VPID based on the supplied specification.
static NTV2VideoFormat stTable2048i[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:26
static const string sVPIDLink[]
Definition: ntv2vpid.cpp:1329
static const std::string LinkString(const VPIDLink link)
Definition: ntv2vpid.cpp:991
VPIDSampling
Definition: ntv2enums.h:4088
virtual CNTV2VPID & SetBitDepth(const VPIDBitDepth inBitDepth)
Definition: ntv2vpid.cpp:454
CNTV2VPID(const ULWord inData=0)
Definition: ntv2vpid.cpp:206
static const std::string SamplingString(const VPIDSampling sample)
Definition: ntv2vpid.cpp:923
#define NTV2_IS_372_DUALLINK_FORMAT(__f__)
Definition: ntv2enums.h:898
10-Bit DPX Little-Endian
Definition: ntv2enums.h:238
static const string sVPIDTransfer[]
Definition: ntv2vpid.cpp:1331
VPIDAudio
Definition: ntv2enums.h:4150
static NTV2VideoFormat stTable4096pSID[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:29
virtual bool GetProgressiveTransport(void) const
Definition: ntv2vpid.cpp:332
virtual CNTV2VPID & SetChannel(const VPIDChannel inChannel)
Definition: ntv2vpid.cpp:426
static AJALabelValuePairs & append(AJALabelValuePairs &inOutTable, const std::string &inLabel, const std::string &inValue=std::string())
A convenience function that appends the given label and value strings to the provided AJALabelValuePa...
Definition: info.h:170
static const std::string PictureRateString(const VPIDPictureRate rate)
Definition: ntv2vpid.cpp:898
#define YesOrNo(__x__)
Definition: ntv2vpid.cpp:1384
static NTV2VideoFormat stTable4096pTSI[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:33
10-Bit ARGB
Definition: ntv2enums.h:244
Declares numerous NTV2 utility functions.
bool isOutput12G
If true, the transport on the wire is 12G.
virtual CNTV2VPID & SetVPID(const ULWord inData)
Definition: ntv2vpid.h:71
virtual CNTV2VPID & SetRGBRange(const NTV2VPIDRGBRange inRGBRange)
Definition: ntv2vpid.cpp:538
static NTV2VideoFormat stTable3840pTSI[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:32
See 8-Bit ARGB, RGBA, ABGR Formats.
Definition: ntv2enums.h:225
virtual CNTV2VPID & SetPictureRate(const VPIDPictureRate inPictureRate)
Definition: ntv2vpid.cpp:352
See 48-Bit RGB.
Definition: ntv2enums.h:239
virtual bool GetImageAspect16x9(void) const
Definition: ntv2vpid.cpp:386
#define xHEX0N(__x__, __n__)
A convenience class that simplifies encoding or decoding the 4-byte VPID payload that can be read or ...
Definition: ntv2vpid.h:23
virtual bool IsStandardMultiLink4320(void) const
Definition: ntv2vpid.cpp:266
NTV2FrameBufferFormat pixelFormat
Specifies the pixel format of the source of the video stream.
bool isDualLink
If true, the video stream is part of a SMPTE 372 dual link signal.
virtual bool IsStandardTwoSampleInterleave(void) const
Definition: ntv2vpid.cpp:281
VPIDLink
Definition: ntv2enums.h:4138
See 10-Bit RGB - DPX Format.
Definition: ntv2enums.h:230
virtual CNTV2VPID & SetProgressivePicture(const bool inIsProgressivePicture)
Definition: ntv2vpid.cpp:338
static const string sVPIDRGBRange[]
Definition: ntv2vpid.cpp:1334
static NTV2VideoFormat stTable3840pSID[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:28
VPIDVersion
Definition: ntv2enums.h:4010
See 24-Bit RGB.
Definition: ntv2enums.h:235
bool useChannel
If true, the following vpidChannel value should be inserted into th VPID.
virtual VPIDChannel GetChannel(void) const
Definition: ntv2vpid.cpp:434
VPIDChannel
Definition: ntv2enums.h:4108
virtual VPIDStandard GetStandard(void) const
Definition: ntv2vpid.cpp:318
NTV2VPIDRGBRange
Definition: ntv2enums.h:4268
static const std::string ChannelString(const VPIDChannel chan)
Definition: ntv2vpid.cpp:948
static NTV2VideoFormat stTable1920p[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:23
virtual NTV2VideoFormat GetVideoFormat(void) const
Definition: ntv2vpid.cpp:674
static const std::string VPIDVersionToString(const VPIDVersion inVers)
Definition: ntv2vpid.cpp:1021
#define NTV2_IS_3G_FORMAT(__f__)
Definition: ntv2enums.h:924
10-Bit Packed RGB
Definition: ntv2enums.h:243
virtual NTV2VPIDLuminance GetLuminance(void) const
Definition: ntv2vpid.cpp:533
VPIDStandard
Definition: ntv2enums.h:4016
virtual CNTV2VPID & SetSampling(const VPIDSampling inSampling)
Definition: ntv2vpid.cpp:401
virtual CNTV2VPID & operator=(const CNTV2VPID &inRHS)
Definition: ntv2vpid.cpp:220
static NTV2VideoFormat stTable720p[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:21
virtual bool IsRGBSampling(void) const
Definition: ntv2vpid.cpp:414
bool isRGBOnWire
If true, the transport on the wire is RGB.
virtual bool IsValid(void) const
Definition: ntv2vpid.h:56
virtual void ToString(std::string &outAllLabelsAndValues) const
Answers with a multi-line string that contains the complete host system info table.
bool isRightEye
If true, the video stream is the right eye of a stereo pair.
bool isOutput6G
If true, the transport on the wire is 6G.
See 24-Bit BGR.
Definition: ntv2enums.h:236
virtual bool IsStandard3Ga(void) const
Definition: ntv2vpid.cpp:250
static bool VPIDStandardIsDualLink(const VPIDStandard inStd)
Definition: ntv2vpid.cpp:1149
static bool VPIDStandardIsSingleLink(const VPIDStandard inStd)
Definition: ntv2vpid.cpp:1092
Contains all the information needed to generate a valid VPID.
virtual VPIDChannel GetDualLinkChannel(void) const
Definition: ntv2vpid.cpp:448
Declares the CNTV2RegisterExpert class.
static bool stTablesInitialized(false)
static NTV2VideoFormat stTable1920i[VPIDPictureRate_ReservedF+1]
Definition: ntv2vpid.cpp:27
static const std::string AudioString(const VPIDAudio audio)
Definition: ntv2vpid.cpp:1008
virtual CNTV2VPID & SetStandard(const VPIDStandard inStandard)
Definition: ntv2vpid.cpp:310
virtual CNTV2VPID & SetDualLinkChannel(const VPIDChannel inChannel)
Definition: ntv2vpid.cpp:440