MWCapture SDK Mac  3.3.0.12920
MWFOURCC.h
1 // CONFIDENTIAL and PROPRIETARY software of Magewell Electronics Co., Ltd.
3 // Copyright (c) 2011-2019 Magewell Electronics Co., Ltd. (Nanjing)
4 // All rights reserved.
5 // This copyright notice MUST be reproduced on all authorized copies.
7 
8 #pragma once
9 
10 #include "LibMWCapture/WinTypes.h"
11 
12 #ifndef MWFOURCC
13 #define MWFOURCC(ch0, ch1, ch2, ch3) \
14  ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
15  ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24))
16 #endif
17 
23 #define MWFOURCC_UNK MWFOURCC('U', 'N', 'K', 'N')
24 
34 #define MWFOURCC_GREY MWFOURCC('G', 'R', 'E', 'Y')
35 
45 #define MWFOURCC_Y800 MWFOURCC('Y', '8', '0', '0')
46 
56 #define MWFOURCC_Y8 MWFOURCC('Y', '8', ' ', ' ')
57 
67 #define MWFOURCC_Y16 MWFOURCC('Y', '1', '6', ' ')
68 
78 #define MWFOURCC_RGB15 MWFOURCC('R', 'G', 'B', '5')
79 
89 #define MWFOURCC_RGB16 MWFOURCC('R', 'G', 'B', '6')
90 
100 #define MWFOURCC_RGB24 MWFOURCC('R', 'G', 'B', ' ')
101 
111 #define MWFOURCC_RGBA MWFOURCC('R', 'G', 'B', 'A')
112 
122 #define MWFOURCC_ARGB MWFOURCC('A', 'R', 'G', 'B')
123 
133 #define MWFOURCC_BGR15 MWFOURCC('B', 'G', 'R', '5')
134 
144 #define MWFOURCC_BGR16 MWFOURCC('B', 'G', 'R', '6')
145 
155 #define MWFOURCC_BGR24 MWFOURCC('B', 'G', 'R', ' ')
156 
166 #define MWFOURCC_BGRA MWFOURCC('B', 'G', 'R', 'A')
167 
177 #define MWFOURCC_ABGR MWFOURCC('A', 'B', 'G', 'R')
178 
199 #define MWFOURCC_NV16 MWFOURCC('N', 'V', '1', '6')
200 
221 #define MWFOURCC_NV61 MWFOURCC('N', 'V', '6', '1')
222 
248 #define MWFOURCC_I422 MWFOURCC('I', '4', '2', '2')
249 
275 #define MWFOURCC_YV16 MWFOURCC('Y', 'V', '1', '6')
276 
277 
290 #define MWFOURCC_YUY2 MWFOURCC('Y', 'U', 'Y', '2')
291 
304 #define MWFOURCC_YUYV MWFOURCC('Y', 'U', 'Y', 'V')
305 
318 #define MWFOURCC_UYVY MWFOURCC('U', 'Y', 'V', 'Y')
319 
332 #define MWFOURCC_YVYU MWFOURCC('Y', 'V', 'Y', 'U')
333 
346 #define MWFOURCC_VYUY MWFOURCC('V', 'Y', 'U', 'Y')
347 
372 #define MWFOURCC_I420 MWFOURCC('I', '4', '2', '0')
373 
398 #define MWFOURCC_IYUV MWFOURCC('I', 'Y', 'U', 'V')
399 
422 #define MWFOURCC_NV12 MWFOURCC('N', 'V', '1', '2')
423 
448 #define MWFOURCC_YV12 MWFOURCC('Y', 'V', '1', '2')
449 
472 #define MWFOURCC_NV21 MWFOURCC('N', 'V', '2', '1')
473 
496 #define MWFOURCC_P010 MWFOURCC('P', '0', '1', '0')
497 
522 #define MWFOURCC_P210 MWFOURCC('P', '2', '1', '0')
523 
536 #define MWFOURCC_IYU2 MWFOURCC('I', 'Y', 'U', '2')
537 
550 #define MWFOURCC_V308 MWFOURCC('v', '3', '0', '8')
551 
552 
565 #define MWFOURCC_AYUV MWFOURCC('A', 'Y', 'U', 'V')
566 
579 #define MWFOURCC_UYVA MWFOURCC('U', 'Y', 'V', 'A')
580 
593 #define MWFOURCC_V408 MWFOURCC('v', '4', '0', '8')
594 
607 #define MWFOURCC_VYUA MWFOURCC('V', 'Y', 'U', 'A')
608 
622 #define MWFOURCC_V210 MWFOURCC('v', '2', '1', '0')
623 
636 #define MWFOURCC_Y410 MWFOURCC('Y', '4', '1', '0')
637 
650 #define MWFOURCC_V410 MWFOURCC('v', '4', '1', '0')
651 
661 #define MWFOURCC_RGB10 MWFOURCC('R', 'G', '1', '0')
662 
672 #define MWFOURCC_BGR10 MWFOURCC('B', 'G', '1', '0')
673 
680 inline BOOLEAN FOURCC_IsRGB(
681  DWORD dwFOURCC
682  )
683 {
684  switch (dwFOURCC) {
685  case MWFOURCC_RGB15:
686  case MWFOURCC_BGR15:
687  case MWFOURCC_RGB16:
688  case MWFOURCC_BGR16:
689  case MWFOURCC_RGB24:
690  case MWFOURCC_BGR24:
691  case MWFOURCC_RGBA:
692  case MWFOURCC_BGRA:
693  case MWFOURCC_ARGB:
694  case MWFOURCC_ABGR:
695  case MWFOURCC_RGB10:
696  case MWFOURCC_BGR10:
697  return TRUE;
698  default:
699  return FALSE;
700  }
701 }
702 
709 inline BOOLEAN FOURCC_IsPacked(
710  DWORD dwFOURCC
711  )
712 {
713  switch (dwFOURCC) {
714  case MWFOURCC_NV12:
715  case MWFOURCC_NV21:
716  case MWFOURCC_YV12:
717  case MWFOURCC_IYUV:
718  case MWFOURCC_I420:
719  case MWFOURCC_I422:
720  case MWFOURCC_YV16:
721  case MWFOURCC_NV16:
722  case MWFOURCC_NV61:
723  case MWFOURCC_P010:
724  case MWFOURCC_P210:
725  return FALSE;
726  default:
727  return TRUE;
728  }
729 }
730 
737 inline int FOURCC_GetBpp(
738  DWORD dwFOURCC
739  )
740 {
741  switch (dwFOURCC) {
742  case MWFOURCC_GREY:
743  case MWFOURCC_Y800:
744  case MWFOURCC_Y8:
745  return 8;
746 
747  case MWFOURCC_I420:
748  case MWFOURCC_IYUV:
749  case MWFOURCC_YV12:
750  case MWFOURCC_NV12:
751  case MWFOURCC_NV21:
752  return 12;
753 
754  case MWFOURCC_Y16:
755  case MWFOURCC_RGB15:
756  case MWFOURCC_BGR15:
757  case MWFOURCC_RGB16:
758  case MWFOURCC_BGR16:
759  case MWFOURCC_YUY2:
760  case MWFOURCC_YUYV:
761  case MWFOURCC_UYVY:
762  case MWFOURCC_YVYU:
763  case MWFOURCC_VYUY:
764  case MWFOURCC_I422:
765  case MWFOURCC_YV16:
766  case MWFOURCC_NV16:
767  case MWFOURCC_NV61:
768  return 16;
769 
770  case MWFOURCC_IYU2:
771  case MWFOURCC_V308:
772  case MWFOURCC_RGB24:
773  case MWFOURCC_BGR24:
774  case MWFOURCC_P010:
775  case MWFOURCC_V210:
776  return 24;
777 
778  case MWFOURCC_AYUV:
779  case MWFOURCC_UYVA:
780  case MWFOURCC_V408:
781  case MWFOURCC_VYUA:
782  case MWFOURCC_RGBA:
783  case MWFOURCC_BGRA:
784  case MWFOURCC_ARGB:
785  case MWFOURCC_ABGR:
786  case MWFOURCC_Y410:
787  case MWFOURCC_V410:
788  case MWFOURCC_P210:
789  return 32;
790 
791  default:
792  return 0;
793  }
794 }
795 
804 inline DWORD FOURCC_CalcMinStride(
805  DWORD dwFOURCC,
806  int cx,
807  DWORD dwAlign
808  )
809 {
810  BOOLEAN bPacked = FOURCC_IsPacked(dwFOURCC);
811 
812  DWORD cbLine;
813 
814  if (bPacked) {
815  if (dwFOURCC == MWFOURCC_V210) {
816  cx = (cx + 47) / 48 * 48;
817  cbLine = cx * 8 / 3;
818  } else {
819  int nBpp = FOURCC_GetBpp(dwFOURCC);
820  cbLine = (cx * nBpp) / 8;
821  }
822  } else {
823  switch (dwFOURCC) {
824  case MWFOURCC_P010:
825  case MWFOURCC_P210:
826  cbLine = cx * 2;
827  break;
828  default:
829  cbLine = cx;
830  break;
831  }
832  }
833 
834  return (cbLine + dwAlign - 1) & ~(dwAlign - 1);
835 }
836 
846 inline DWORD FOURCC_CalcImageSize(
847  DWORD dwFOURCC,
848  int cx,
849  int cy,
850  DWORD cbStride
851  )
852 {
853  BOOLEAN bPacked = FOURCC_IsPacked(dwFOURCC);
854 
855  if (bPacked) {
856  DWORD cbLine;
857 
858  if (dwFOURCC == MWFOURCC_V210) {
859  cx = (cx + 47) / 48 * 48;
860  cbLine = cx * 8 / 3;
861  } else {
862  int nBpp = FOURCC_GetBpp(dwFOURCC);
863  cbLine = (cx * nBpp) / 8;
864  }
865 
866  if (cbStride < cbLine)
867  return 0;
868 
869  return cbStride * cy;
870  }
871  else {
872  if (cbStride < (DWORD)cx)
873  return 0;
874 
875  switch (dwFOURCC) {
876  case MWFOURCC_NV12:
877  case MWFOURCC_NV21:
878  case MWFOURCC_YV12:
879  case MWFOURCC_IYUV:
880  case MWFOURCC_I420:
881  if ((cbStride & 1) || (cy & 1))
882  return 0;
883  return cbStride * cy * 3 / 2;
884  case MWFOURCC_I422:
885  case MWFOURCC_YV16:
886  case MWFOURCC_NV16:
887  case MWFOURCC_NV61:
888  if (cbStride & 1)
889  return 0;
890  return cbStride * cy * 2;
891  case MWFOURCC_P010:
892  if ((cbStride & 3) || (cy & 1))
893  return 0;
894  return cbStride * cy * 3 / 2;
895  case MWFOURCC_P210:
896  if (cbStride & 3)
897  return 0;
898  return cbStride * cy * 2;
899 
900  default:
901  return 0;
902  }
903  }
904 }
905 
906 #pragma pack(push, 1)
907 typedef struct tagKS_BITMAPINFOHEADER {
908  DWORD biSize;
909  int biWidth;
910  int biHeight;
911  WORD biPlanes;
912  WORD biBitCount;
913  DWORD biCompression;
914  DWORD biSizeImage;
915  int biXPelsPerMeter;
916  int biYPelsPerMeter;
917  DWORD biClrUsed;
918  DWORD biClrImportant;
920 #pragma pack(pop)
921 #define KS_BI_RGB 0L
922 #define KS_BI_RLE8 1L
923 #define KS_BI_RLE4 2L
924 #define KS_BI_BITFIELDS 3L
925 #define MWCAP_BITMAPINFOHEADER KS_BITMAPINFOHEADER
926 #define MWCAP_BI_RGB KS_BI_RGB
927 #define MWCAP_BI_BITFIELDS KS_BI_BITFIELDS
928 
938 inline BOOLEAN FOURCC_IsMask(const DWORD * pdwMasks, DWORD dwRedMask, DWORD dwGreenMask, DWORD dwBlueMask)
939 {
940  return ((pdwMasks[0] == dwRedMask) && (pdwMasks[1] == dwGreenMask) && (pdwMasks[2] == dwBlueMask));
941 }
942 
952  DWORD biCompression,
953  WORD biBitCount,
954  DWORD * pdwMasks
955  )
956 {
957  switch (biCompression) {
958  case MWCAP_BI_RGB:
959  switch (biBitCount) {
960  case 16:
961  return MWFOURCC_BGR15;
962  case 24:
963  return MWFOURCC_BGR24;
964  case 32:
965  return MWFOURCC_BGRA;
966  default:
967  return MWFOURCC_UNK;
968  }
969  break;
970 
971  case MWCAP_BI_BITFIELDS:
972  {
973  switch (biBitCount) {
974  case 16:
975  if (FOURCC_IsMask(pdwMasks, 0x0000F800, 0x000007E0, 0x0000001F))
976  return MWFOURCC_BGR16;
977  else if (FOURCC_IsMask(pdwMasks, 0x0000001F, 0x000007E0, 0x0000F800))
978  return MWFOURCC_RGB16;
979  else if (FOURCC_IsMask(pdwMasks, 0x00007C00, 0x000003E0, 0x0000001F))
980  return MWFOURCC_BGR15;
981  else if (FOURCC_IsMask(pdwMasks, 0x0000001F, 0x000003E0, 0x00007C00))
982  return MWFOURCC_RGB15;
983  else
984  return MWFOURCC_UNK;
985 
986  case 24:
987  if (FOURCC_IsMask(pdwMasks, 0x00FF0000, 0x0000FF00, 0x000000FF))
988  return MWFOURCC_BGR24;
989  else if (FOURCC_IsMask(pdwMasks, 0x000000FF, 0x0000FF00, 0x00FF0000))
990  return MWFOURCC_RGB24;
991  else
992  return MWFOURCC_UNK;
993 
994  case 32:
995  if (FOURCC_IsMask(pdwMasks, 0x00FF0000, 0x0000FF00, 0x000000FF))
996  return MWFOURCC_BGRA;
997  else if (FOURCC_IsMask(pdwMasks, 0x000000FF, 0x0000FF00, 0x00FF0000))
998  return MWFOURCC_RGBA;
999  else if (FOURCC_IsMask(pdwMasks, 0xFF000000, 0x00FF0000, 0x0000FF00))
1000  return MWFOURCC_ABGR;
1001  else if (FOURCC_IsMask(pdwMasks, 0x0000FF00, 0x00FF0000, 0xFF000000))
1002  return MWFOURCC_ARGB;
1003  else
1004  return MWFOURCC_UNK;
1005 
1006  default:
1007  return MWFOURCC_UNK;
1008  }
1009  }
1010  break;
1011 
1012  default:
1013  return biCompression;
1014  }
1015 }
1016 
1024  const MWCAP_BITMAPINFOHEADER * pbmih
1025  )
1026 {
1027  DWORD *pdwMasks = (DWORD *)(pbmih + 1);
1028  return FOURCC_GetFromBitmapHeader(pbmih->biCompression, pbmih->biBitCount, pdwMasks);
1029 }
1030 
MWFOURCC_BGR15
#define MWFOURCC_BGR15
16bits B5G5R5A1
Definition: MWFOURCC.h:133
MWFOURCC_BGR10
#define MWFOURCC_BGR10
BGR10.
Definition: MWFOURCC.h:672
MWFOURCC_YV12
#define MWFOURCC_YV12
YV12.
Definition: MWFOURCC.h:448
MWFOURCC_BGRA
#define MWFOURCC_BGRA
32bits B8G8R8A8
Definition: MWFOURCC.h:166
MWFOURCC_ARGB
#define MWFOURCC_ARGB
32bits A8R8G8B8
Definition: MWFOURCC.h:122
FOURCC_IsPacked
BOOLEAN FOURCC_IsPacked(DWORD dwFOURCC)
Determines whether the color format is packed.
Definition: MWFOURCC.h:709
MWFOURCC_P010
#define MWFOURCC_P010
P010.
Definition: MWFOURCC.h:496
MWFOURCC_RGB10
#define MWFOURCC_RGB10
RGB10.
Definition: MWFOURCC.h:661
MWFOURCC_P210
#define MWFOURCC_P210
P210.
Definition: MWFOURCC.h:522
FOURCC_IsRGB
BOOLEAN FOURCC_IsRGB(DWORD dwFOURCC)
Determines whether the color format is RGB.
Definition: MWFOURCC.h:680
MWFOURCC_Y410
#define MWFOURCC_Y410
Y410.
Definition: MWFOURCC.h:636
MWFOURCC_UYVY
#define MWFOURCC_UYVY
UYVY.
Definition: MWFOURCC.h:318
tagKS_BITMAPINFOHEADER
Definition: MWFOURCC.h:907
MWFOURCC_I420
#define MWFOURCC_I420
I420.
Definition: MWFOURCC.h:372
MWFOURCC_UYVA
#define MWFOURCC_UYVA
UYVA.
Definition: MWFOURCC.h:579
FOURCC_CalcMinStride
DWORD FOURCC_CalcMinStride(DWORD dwFOURCC, int cx, DWORD dwAlign)
Counts the number of bytes that a line data of image takes, depending on the width of image and the c...
Definition: MWFOURCC.h:804
MWFOURCC_IYUV
#define MWFOURCC_IYUV
IYUV.
Definition: MWFOURCC.h:398
MWFOURCC_IYU2
#define MWFOURCC_IYU2
IYU2.
Definition: MWFOURCC.h:536
MWFOURCC_Y8
#define MWFOURCC_Y8
8bits Grey
Definition: MWFOURCC.h:56
MWFOURCC_YUYV
#define MWFOURCC_YUYV
YUYV.
Definition: MWFOURCC.h:304
FOURCC_GetFromBitmapHeader2
DWORD FOURCC_GetFromBitmapHeader2(const MWCAP_BITMAPINFOHEADER *pbmih)
Gets color format from the bitmap header.
Definition: MWFOURCC.h:1023
MWFOURCC_RGB16
#define MWFOURCC_RGB16
16bits R5G6B5
Definition: MWFOURCC.h:89
MWFOURCC_GREY
#define MWFOURCC_GREY
8bits Grey
Definition: MWFOURCC.h:34
MWFOURCC_AYUV
#define MWFOURCC_AYUV
AYUV.
Definition: MWFOURCC.h:565
FOURCC_GetFromBitmapHeader
DWORD FOURCC_GetFromBitmapHeader(DWORD biCompression, WORD biBitCount, DWORD *pdwMasks)
Gets color format from the bitmap header.
Definition: MWFOURCC.h:951
MWFOURCC_RGB24
#define MWFOURCC_RGB24
24bits R8G8B8
Definition: MWFOURCC.h:100
MWFOURCC_ABGR
#define MWFOURCC_ABGR
32bits A8B8G8R8
Definition: MWFOURCC.h:177
MWFOURCC_NV12
#define MWFOURCC_NV12
NV12.
Definition: MWFOURCC.h:422
FOURCC_IsMask
BOOLEAN FOURCC_IsMask(const DWORD *pdwMasks, DWORD dwRedMask, DWORD dwGreenMask, DWORD dwBlueMask)
Determins whether the mask is the same as specified color format.
Definition: MWFOURCC.h:938
MWFOURCC_V308
#define MWFOURCC_V308
V308.
Definition: MWFOURCC.h:550
FOURCC_CalcImageSize
DWORD FOURCC_CalcImageSize(DWORD dwFOURCC, int cx, int cy, DWORD cbStride)
Counts the number of bytes that a frame takes, depending on the color format, resolution and the line...
Definition: MWFOURCC.h:846
MWFOURCC_BGR16
#define MWFOURCC_BGR16
16bits B5G6R5
Definition: MWFOURCC.h:144
MWFOURCC_V410
#define MWFOURCC_V410
V410.
Definition: MWFOURCC.h:650
MWFOURCC_RGB15
#define MWFOURCC_RGB15
16bits R5G5B5A1
Definition: MWFOURCC.h:78
MWFOURCC_YUY2
#define MWFOURCC_YUY2
YUY2.
Definition: MWFOURCC.h:290
MWFOURCC_VYUA
#define MWFOURCC_VYUA
VYUA.
Definition: MWFOURCC.h:607
MWFOURCC_UNK
#define MWFOURCC_UNK
Unknown color formate.
Definition: MWFOURCC.h:23
MWFOURCC_V408
#define MWFOURCC_V408
V408.
Definition: MWFOURCC.h:593
MWFOURCC_V210
#define MWFOURCC_V210
Definition: MWFOURCC.h:622
FOURCC_GetBpp
int FOURCC_GetBpp(DWORD dwFOURCC)
Gets the bits that pixel of color format takes.
Definition: MWFOURCC.h:737
MWFOURCC_NV61
#define MWFOURCC_NV61
NV61.
Definition: MWFOURCC.h:221
MWFOURCC_I422
#define MWFOURCC_I422
I422.
Definition: MWFOURCC.h:248
MWFOURCC_RGBA
#define MWFOURCC_RGBA
32bits R8G8B8A8
Definition: MWFOURCC.h:111
MWFOURCC_YV16
#define MWFOURCC_YV16
YV16.
Definition: MWFOURCC.h:275
MWFOURCC_BGR24
#define MWFOURCC_BGR24
24bits B8G8R8
Definition: MWFOURCC.h:155
MWFOURCC_VYUY
#define MWFOURCC_VYUY
VYUY.
Definition: MWFOURCC.h:346
MWFOURCC_NV21
#define MWFOURCC_NV21
NV21.
Definition: MWFOURCC.h:472
MWFOURCC_Y800
#define MWFOURCC_Y800
8bits Grey
Definition: MWFOURCC.h:45
MWFOURCC_Y16
#define MWFOURCC_Y16
16bits Grey
Definition: MWFOURCC.h:67
MWFOURCC_YVYU
#define MWFOURCC_YVYU
YVYU.
Definition: MWFOURCC.h:332
MWFOURCC_NV16
#define MWFOURCC_NV16
NV16.
Definition: MWFOURCC.h:199