Skip to content

Commit b921379

Browse files
committed
Add unit tests
1 parent b4c351e commit b921379

4 files changed

Lines changed: 623 additions & 77 deletions

File tree

src/ccap_dshow_guids.h

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
/**
2+
* @file ccap_dshow_guids.h
3+
* @author wysaid (this@wysaid.org)
4+
* @brief DirectShow GUID definitions to avoid strmiids.lib dependency.
5+
* @date 2025-04
6+
*
7+
* This header defines all DirectShow GUIDs required by ccap locally,
8+
* eliminating the need to link against strmiids.lib. This is particularly
9+
* useful for MinGW/cross-compilation scenarios where the library may not
10+
* be available or causes linking issues with static libraries.
11+
*
12+
* GUID values are sourced from Windows SDK headers (uuids.h, strmif.h, etc.)
13+
* and are verified by unit tests against strmiids.lib on MSVC.
14+
*
15+
* Usage:
16+
* - Include <initguid.h> BEFORE including this header in exactly ONE .cpp file
17+
* - This ensures GUIDs are defined (not just declared) in that compilation unit
18+
*/
19+
20+
#pragma once
21+
22+
#ifndef CCAP_DSHOW_GUIDS_H
23+
#define CCAP_DSHOW_GUIDS_H
24+
25+
#if defined(_WIN32) || defined(_MSC_VER)
26+
27+
#include <guiddef.h>
28+
29+
// clang-format off
30+
31+
// ============================================================================
32+
// DirectShow Interface IIDs
33+
// ============================================================================
34+
DEFINE_GUID(CCAP_IID_ICreateDevEnum, 0x29840822, 0x5b84, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
35+
DEFINE_GUID(CCAP_IID_IBaseFilter, 0x56a86895, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
36+
DEFINE_GUID(CCAP_IID_IGraphBuilder, 0x56a868a9, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
37+
DEFINE_GUID(CCAP_IID_ICaptureGraphBuilder2,0x93e5a4e0, 0x2d50, 0x11d2, 0xab, 0xfa, 0x00, 0xa0, 0xc9, 0xc6, 0xe3, 0x8d);
38+
DEFINE_GUID(CCAP_IID_IMediaControl, 0x56a868b1, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
39+
DEFINE_GUID(CCAP_IID_IMediaFilter, 0x56a86899, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
40+
DEFINE_GUID(CCAP_IID_IVideoWindow, 0x56a868b4, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
41+
DEFINE_GUID(CCAP_IID_IAMStreamConfig, 0xc6e13340, 0x30ac, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56);
42+
DEFINE_GUID(CCAP_IID_IPropertyBag, 0x55272a00, 0x42cb, 0x11ce, 0x81, 0x35, 0x00, 0xaa, 0x00, 0x4b, 0xb8, 0x51);
43+
DEFINE_GUID(CCAP_IID_ISampleGrabber, 0x6b652fff, 0x11fe, 0x4fce, 0x92, 0xad, 0x02, 0x66, 0xb5, 0xd7, 0xc7, 0x8f);
44+
45+
// ============================================================================
46+
// DirectShow CLSIDs
47+
// ============================================================================
48+
DEFINE_GUID(CCAP_CLSID_SystemDeviceEnum, 0x62be5d10, 0x60eb, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
49+
DEFINE_GUID(CCAP_CLSID_VideoInputDeviceCategory,0x860bb310,0x5d01, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
50+
DEFINE_GUID(CCAP_CLSID_FilterGraph, 0xe436ebb3, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
51+
DEFINE_GUID(CCAP_CLSID_CaptureGraphBuilder2, 0xbf87b6e1, 0x8c27, 0x11d0, 0xb3, 0xf0, 0x00, 0xaa, 0x00, 0x37, 0x61, 0xc5);
52+
DEFINE_GUID(CCAP_CLSID_SampleGrabber, 0xc1f400a0, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37);
53+
DEFINE_GUID(CCAP_CLSID_NullRenderer, 0xc1f400a4, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37);
54+
55+
// ============================================================================
56+
// Media Types and Format Types
57+
// ============================================================================
58+
DEFINE_GUID(CCAP_MEDIATYPE_Video, 0x73646976, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
59+
DEFINE_GUID(CCAP_FORMAT_VideoInfo, 0x05589f80, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a);
60+
DEFINE_GUID(CCAP_FORMAT_VideoInfo2, 0xf72a76a0, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
61+
62+
// ============================================================================
63+
// Pin Categories
64+
// ============================================================================
65+
DEFINE_GUID(CCAP_PIN_CATEGORY_CAPTURE, 0xfb6c4281, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
66+
DEFINE_GUID(CCAP_PIN_CATEGORY_PREVIEW, 0xfb6c4282, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
67+
68+
// ============================================================================
69+
// Video Subtype GUIDs (MEDIASUBTYPE_*)
70+
// ============================================================================
71+
DEFINE_GUID(CCAP_MEDIASUBTYPE_None, 0xe436eb8e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
72+
DEFINE_GUID(CCAP_MEDIASUBTYPE_MJPG, 0x47504A4D, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
73+
DEFINE_GUID(CCAP_MEDIASUBTYPE_RGB24, 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
74+
DEFINE_GUID(CCAP_MEDIASUBTYPE_RGB32, 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
75+
DEFINE_GUID(CCAP_MEDIASUBTYPE_RGB555,0xe436eb7c, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
76+
DEFINE_GUID(CCAP_MEDIASUBTYPE_RGB565,0xe436eb7b, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
77+
78+
// YUV format GUIDs - FourCC based GUIDs follow the pattern:
79+
// {FOURCC-0000-0010-8000-00AA00389B71}
80+
DEFINE_GUID(CCAP_MEDIASUBTYPE_NV12, 0x3231564E, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'NV12'
81+
DEFINE_GUID(CCAP_MEDIASUBTYPE_I420, 0x30323449, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'I420'
82+
DEFINE_GUID(CCAP_MEDIASUBTYPE_IYUV, 0x56555949, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IYUV'
83+
DEFINE_GUID(CCAP_MEDIASUBTYPE_YUY2, 0x32595559, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'YUY2'
84+
DEFINE_GUID(CCAP_MEDIASUBTYPE_YV12, 0x32315659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'YV12'
85+
DEFINE_GUID(CCAP_MEDIASUBTYPE_UYVY, 0x59565955, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'UYVY'
86+
DEFINE_GUID(CCAP_MEDIASUBTYPE_YUYV, 0x56595559, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'YUYV'
87+
DEFINE_GUID(CCAP_MEDIASUBTYPE_YVYU, 0x55595659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'YVYU'
88+
DEFINE_GUID(CCAP_MEDIASUBTYPE_YVU9, 0x39555659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'YVU9'
89+
DEFINE_GUID(CCAP_MEDIASUBTYPE_Y411, 0x31313459, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'Y411'
90+
DEFINE_GUID(CCAP_MEDIASUBTYPE_Y41P, 0x50313459, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'Y41P'
91+
DEFINE_GUID(CCAP_MEDIASUBTYPE_CLJR, 0x524A4C43, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'CLJR'
92+
DEFINE_GUID(CCAP_MEDIASUBTYPE_IF09, 0x39304649, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IF09'
93+
DEFINE_GUID(CCAP_MEDIASUBTYPE_CPLA, 0x414C5043, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'CPLA'
94+
DEFINE_GUID(CCAP_MEDIASUBTYPE_AYUV, 0x56555941, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'AYUV'
95+
DEFINE_GUID(CCAP_MEDIASUBTYPE_AI44, 0x34344941, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'AI44'
96+
DEFINE_GUID(CCAP_MEDIASUBTYPE_IA44, 0x34344149, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IA44'
97+
DEFINE_GUID(CCAP_MEDIASUBTYPE_IMC1, 0x31434D49, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IMC1'
98+
DEFINE_GUID(CCAP_MEDIASUBTYPE_IMC2, 0x32434D49, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IMC2'
99+
DEFINE_GUID(CCAP_MEDIASUBTYPE_IMC3, 0x33434D49, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IMC3'
100+
DEFINE_GUID(CCAP_MEDIASUBTYPE_IMC4, 0x34434D49, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IMC4'
101+
102+
// clang-format on
103+
104+
// ============================================================================
105+
// Aliases for compatibility - allows source code to use standard names
106+
// These are defined as macros to reference the CCAP_ prefixed versions
107+
// ============================================================================
108+
#ifndef CCAP_NO_GUID_ALIASES
109+
110+
#define IID_ICreateDevEnum CCAP_IID_ICreateDevEnum
111+
#define IID_IBaseFilter CCAP_IID_IBaseFilter
112+
#define IID_IGraphBuilder CCAP_IID_IGraphBuilder
113+
#define IID_ICaptureGraphBuilder2 CCAP_IID_ICaptureGraphBuilder2
114+
#define IID_IMediaControl CCAP_IID_IMediaControl
115+
#define IID_IMediaFilter CCAP_IID_IMediaFilter
116+
#define IID_IVideoWindow CCAP_IID_IVideoWindow
117+
#define IID_IAMStreamConfig CCAP_IID_IAMStreamConfig
118+
#define IID_IPropertyBag CCAP_IID_IPropertyBag
119+
#define IID_ISampleGrabber CCAP_IID_ISampleGrabber
120+
121+
#define CLSID_SystemDeviceEnum CCAP_CLSID_SystemDeviceEnum
122+
#define CLSID_VideoInputDeviceCategory CCAP_CLSID_VideoInputDeviceCategory
123+
#define CLSID_FilterGraph CCAP_CLSID_FilterGraph
124+
#define CLSID_CaptureGraphBuilder2 CCAP_CLSID_CaptureGraphBuilder2
125+
#define CLSID_SampleGrabber CCAP_CLSID_SampleGrabber
126+
#define CLSID_NullRenderer CCAP_CLSID_NullRenderer
127+
128+
#define MEDIATYPE_Video CCAP_MEDIATYPE_Video
129+
#define FORMAT_VideoInfo CCAP_FORMAT_VideoInfo
130+
#define FORMAT_VideoInfo2 CCAP_FORMAT_VideoInfo2
131+
132+
#define PIN_CATEGORY_CAPTURE CCAP_PIN_CATEGORY_CAPTURE
133+
#define PIN_CATEGORY_PREVIEW CCAP_PIN_CATEGORY_PREVIEW
134+
135+
#define MEDIASUBTYPE_None CCAP_MEDIASUBTYPE_None
136+
#define MEDIASUBTYPE_MJPG CCAP_MEDIASUBTYPE_MJPG
137+
#define MEDIASUBTYPE_RGB24 CCAP_MEDIASUBTYPE_RGB24
138+
#define MEDIASUBTYPE_RGB32 CCAP_MEDIASUBTYPE_RGB32
139+
#define MEDIASUBTYPE_RGB555 CCAP_MEDIASUBTYPE_RGB555
140+
#define MEDIASUBTYPE_RGB565 CCAP_MEDIASUBTYPE_RGB565
141+
#define MEDIASUBTYPE_NV12 CCAP_MEDIASUBTYPE_NV12
142+
#define MEDIASUBTYPE_I420 CCAP_MEDIASUBTYPE_I420
143+
#define MEDIASUBTYPE_IYUV CCAP_MEDIASUBTYPE_IYUV
144+
#define MEDIASUBTYPE_YUY2 CCAP_MEDIASUBTYPE_YUY2
145+
#define MEDIASUBTYPE_YV12 CCAP_MEDIASUBTYPE_YV12
146+
#define MEDIASUBTYPE_UYVY CCAP_MEDIASUBTYPE_UYVY
147+
#define MEDIASUBTYPE_YUYV CCAP_MEDIASUBTYPE_YUYV
148+
#define MEDIASUBTYPE_YVYU CCAP_MEDIASUBTYPE_YVYU
149+
#define MEDIASUBTYPE_YVU9 CCAP_MEDIASUBTYPE_YVU9
150+
#define MEDIASUBTYPE_Y411 CCAP_MEDIASUBTYPE_Y411
151+
#define MEDIASUBTYPE_Y41P CCAP_MEDIASUBTYPE_Y41P
152+
#define MEDIASUBTYPE_CLJR CCAP_MEDIASUBTYPE_CLJR
153+
#define MEDIASUBTYPE_IF09 CCAP_MEDIASUBTYPE_IF09
154+
#define MEDIASUBTYPE_CPLA CCAP_MEDIASUBTYPE_CPLA
155+
#define MEDIASUBTYPE_AYUV CCAP_MEDIASUBTYPE_AYUV
156+
#define MEDIASUBTYPE_AI44 CCAP_MEDIASUBTYPE_AI44
157+
#define MEDIASUBTYPE_IA44 CCAP_MEDIASUBTYPE_IA44
158+
#define MEDIASUBTYPE_IMC1 CCAP_MEDIASUBTYPE_IMC1
159+
#define MEDIASUBTYPE_IMC2 CCAP_MEDIASUBTYPE_IMC2
160+
#define MEDIASUBTYPE_IMC3 CCAP_MEDIASUBTYPE_IMC3
161+
#define MEDIASUBTYPE_IMC4 CCAP_MEDIASUBTYPE_IMC4
162+
163+
#endif // CCAP_NO_GUID_ALIASES
164+
165+
#endif // _WIN32 || _MSC_VER
166+
167+
#endif // CCAP_DSHOW_GUIDS_H

src/ccap_imp_windows.cpp

Lines changed: 5 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -25,89 +25,17 @@
2525
#include <cmath>
2626
#include <guiddef.h>
2727
#include <immintrin.h> // AVX2
28-
#include <initguid.h>
2928
#include <vector>
3029

3130
#if _CCAP_LOG_ENABLED_
3231
#include <deque>
3332
#endif
3433

35-
// Define all required GUIDs locally to avoid strmiids.lib dependency.
36-
// This is a common practice in cross-platform/MinGW builds.
37-
// GUID values are from Windows SDK headers (uuids.h, strmif.h, wmcodecdsp.h, etc.)
38-
39-
// clang-format off
40-
41-
// ============================================================================
42-
// DirectShow Interface IIDs
43-
// ============================================================================
44-
DEFINE_GUID(IID_ICreateDevEnum, 0x29840822, 0x5b84, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
45-
DEFINE_GUID(IID_IBaseFilter, 0x56a86895, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
46-
DEFINE_GUID(IID_IGraphBuilder, 0x56a868a9, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
47-
DEFINE_GUID(IID_ICaptureGraphBuilder2,0x93e5a4e0, 0x2d50, 0x11d2, 0xab, 0xfa, 0x00, 0xa0, 0xc9, 0xc6, 0xe3, 0x8d);
48-
DEFINE_GUID(IID_IMediaControl, 0x56a868b1, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
49-
DEFINE_GUID(IID_IMediaFilter, 0x56a86899, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
50-
DEFINE_GUID(IID_IVideoWindow, 0x56a868b4, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
51-
DEFINE_GUID(IID_IAMStreamConfig, 0xc6e13340, 0x30ac, 0x11d0, 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56);
52-
DEFINE_GUID(IID_IPropertyBag, 0x55272a00, 0x42cb, 0x11ce, 0x81, 0x35, 0x00, 0xaa, 0x00, 0x4b, 0xb8, 0x51);
53-
DEFINE_GUID(IID_ISampleGrabber, 0x6b652fff, 0x11fe, 0x4fce, 0x92, 0xad, 0x02, 0x66, 0xb5, 0xd7, 0xc7, 0x8f);
54-
55-
// ============================================================================
56-
// DirectShow CLSIDs
57-
// ============================================================================
58-
DEFINE_GUID(CLSID_SystemDeviceEnum, 0x62be5d10, 0x60eb, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
59-
DEFINE_GUID(CLSID_VideoInputDeviceCategory,0x860bb310,0x5d01, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
60-
DEFINE_GUID(CLSID_FilterGraph, 0xe436ebb3, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
61-
DEFINE_GUID(CLSID_CaptureGraphBuilder2, 0xbf87b6e1, 0x8c27, 0x11d0, 0xb3, 0xf0, 0x00, 0xaa, 0x00, 0x37, 0x61, 0xc5);
62-
DEFINE_GUID(CLSID_SampleGrabber, 0xc1f400a0, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37);
63-
DEFINE_GUID(CLSID_NullRenderer, 0xc1f400a4, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37);
64-
65-
// ============================================================================
66-
// Media Types and Format Types
67-
// ============================================================================
68-
DEFINE_GUID(MEDIATYPE_Video, 0x73646976, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
69-
DEFINE_GUID(FORMAT_VideoInfo, 0x05589f80, 0xc356, 0x11ce, 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a);
70-
DEFINE_GUID(FORMAT_VideoInfo2, 0xf72a76a0, 0xeb0a, 0x11d0, 0xac, 0xe4, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
71-
72-
// ============================================================================
73-
// Pin Categories
74-
// ============================================================================
75-
DEFINE_GUID(PIN_CATEGORY_CAPTURE, 0xfb6c4281, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
76-
DEFINE_GUID(PIN_CATEGORY_PREVIEW, 0xfb6c4282, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba);
77-
78-
// ============================================================================
79-
// Video Subtype GUIDs (MEDIASUBTYPE_*)
80-
// ============================================================================
81-
DEFINE_GUID(MEDIASUBTYPE_None, 0xe436eb8e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
82-
DEFINE_GUID(MEDIASUBTYPE_MJPG, 0x47504A4D, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
83-
DEFINE_GUID(MEDIASUBTYPE_RGB24, 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
84-
DEFINE_GUID(MEDIASUBTYPE_RGB32, 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
85-
DEFINE_GUID(MEDIASUBTYPE_RGB555,0xe436eb7c, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
86-
DEFINE_GUID(MEDIASUBTYPE_RGB565,0xe436eb7b, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70);
87-
88-
// YUV format GUIDs - FourCC based GUIDs follow the pattern:
89-
// {FOURCC-0000-0010-8000-00AA00389B71}
90-
DEFINE_GUID(MEDIASUBTYPE_NV12, 0x3231564E, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'NV12'
91-
DEFINE_GUID(MEDIASUBTYPE_I420, 0x30323449, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'I420'
92-
DEFINE_GUID(MEDIASUBTYPE_IYUV, 0x56555949, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IYUV'
93-
DEFINE_GUID(MEDIASUBTYPE_YUY2, 0x32595559, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'YUY2'
94-
DEFINE_GUID(MEDIASUBTYPE_YV12, 0x32315659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'YV12'
95-
DEFINE_GUID(MEDIASUBTYPE_UYVY, 0x59565955, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'UYVY'
96-
DEFINE_GUID(MEDIASUBTYPE_YUYV, 0x56595559, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'YUYV'
97-
DEFINE_GUID(MEDIASUBTYPE_YVYU, 0x55595659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'YVYU'
98-
DEFINE_GUID(MEDIASUBTYPE_YVU9, 0x39555659, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'YVU9'
99-
DEFINE_GUID(MEDIASUBTYPE_Y411, 0x31313459, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'Y411'
100-
DEFINE_GUID(MEDIASUBTYPE_Y41P, 0x50313459, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'Y41P'
101-
DEFINE_GUID(MEDIASUBTYPE_CLJR, 0x524A4C43, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'CLJR'
102-
DEFINE_GUID(MEDIASUBTYPE_IF09, 0x39304649, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IF09'
103-
DEFINE_GUID(MEDIASUBTYPE_CPLA, 0x414C5043, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'CPLA'
104-
DEFINE_GUID(MEDIASUBTYPE_AYUV, 0x56555941, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'AYUV'
105-
DEFINE_GUID(MEDIASUBTYPE_AI44, 0x34344941, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'AI44'
106-
DEFINE_GUID(MEDIASUBTYPE_IA44, 0x34344149, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IA44'
107-
DEFINE_GUID(MEDIASUBTYPE_IMC1, 0x31434D49, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IMC1'
108-
DEFINE_GUID(MEDIASUBTYPE_IMC2, 0x32434D49, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IMC2'
109-
DEFINE_GUID(MEDIASUBTYPE_IMC3, 0x33434D49, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IMC3'
110-
DEFINE_GUID(MEDIASUBTYPE_IMC4, 0x34434D49, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); // 'IMC4'
34+
// Include initguid.h before our GUID definitions header so that DEFINE_GUID
35+
// actually defines the GUIDs (rather than just declaring them as extern).
36+
// This avoids the need to link against strmiids.lib.
37+
#include <initguid.h>
38+
#include "ccap_dshow_guids.h"
11139

11240
// clang-format on
11341

tests/CMakeLists.txt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,39 @@ target_link_libraries(
8080
gtest_main
8181
)
8282

83+
# GUID definition verification test (Windows only)
84+
# This test verifies that locally defined GUIDs match strmiids.lib values
85+
if(WIN32)
86+
add_executable(
87+
ccap_guid_test
88+
test_guid_definitions.cpp
89+
)
90+
91+
target_link_libraries(
92+
ccap_guid_test
93+
gtest
94+
gtest_main
95+
strmiids # Link against strmiids.lib to get reference GUID values
96+
ole32 # For CoCreateInstance, CoInitializeEx
97+
)
98+
99+
set_target_properties(ccap_guid_test PROPERTIES
100+
CXX_STANDARD 17
101+
CXX_STANDARD_REQUIRED ON
102+
)
103+
104+
if(MSVC)
105+
target_compile_options(ccap_guid_test PRIVATE
106+
/MP
107+
/std:c++17
108+
/Zc:__cplusplus
109+
/bigobj
110+
/wd4996
111+
/D_CRT_SECURE_NO_WARNINGS
112+
)
113+
endif()
114+
endif()
115+
83116
# Performance test executable - should be compiled in Release mode
84117
add_executable(
85118
ccap_performance_test
@@ -108,6 +141,9 @@ if(NOT CMAKE_CROSSCOMPILING)
108141
# Defer discovery to test time to avoid executing the binary during configure
109142
gtest_discover_tests(ccap_convert_test DISCOVERY_MODE PRE_TEST)
110143
gtest_discover_tests(ccap_performance_test DISCOVERY_MODE PRE_TEST)
144+
if(WIN32)
145+
gtest_discover_tests(ccap_guid_test DISCOVERY_MODE PRE_TEST)
146+
endif()
111147
else()
112148
message(STATUS "CMAKE_CROSSCOMPILING is ON: skipping GoogleTest discovery at configure time.")
113149
endif()

0 commit comments

Comments
 (0)