Browse Source

Z991239-6333 #comment 增加虚拟摄像头图像源队列

80274480 4 months ago
parent
commit
4f9a1c9673

+ 3 - 0
Other/rvcmediacommon/rvc_media_common.h

@@ -83,3 +83,6 @@
 #define REC_COMMON_AUDIO_SALESOL_SHM_QUEUE		    "54A66218-7FAD-4A73-85CD-3BAF89EDED02"		//"rvc.shm.salesol_audio.q"
 #define REC_COMMON_AUDIO_SALES_SHM_QUEUE		    "72030F8D-5248-434C-BB36-FB0871EE461D"		//"rvc.shm.sales_audio.q"
 #define REC_COMMON_REMOTEAUDIO_SHM_QUEUE		    "55934743-4E27-4A91-A237-9B6E02F03F96"		//"rvc.shm.agentaudio.q"
+
+#define REC_COMMON_VIDEO_ENV_SHM_ORIGINAL_QUEUE		"D831F1E0-A6CA-4166-B16A-F57E8AE9C2A3"		//"rvc.shm.original.video.env.q"	    // 640x360@15fps YUYV
+#define REC_COMMON_VIDEO_OPT_SHM_ORIGINAL_QUEUE		"F86D6E09-0082-4888-882B-B743EEB97F71"		//"rvc.shm.original.video.opt.q"		// 640x360@15fps YUYV

+ 5 - 16
Other/win/queue/share_queue.h

@@ -8,13 +8,8 @@
 #include <Windows.h>
 #include "libavutil/pixfmt.h"
 #include "libavutil/samplefmt.h"
+#include "../../rvcmediacommon/rvc_media_common.h"
 
-#define AUDIO_SIZE 4096
-#define MAPPING_NAMEV  "OBSVirtualVideo"
-#define MAPPING_NAMEV2 "OBSVirtualVideo2"
-#define MAPPING_NAMEV3 "OBSVirtualVideo3"
-#define MAPPING_NAMEV4 "OBSVirtualVideo4"
-#define MAPPING_NAMEA  "OBSVirtualAudio"
 
 typedef signed char        int8_t;
 typedef short              int16_t;
@@ -26,11 +21,8 @@ typedef unsigned int       uint32_t;
 typedef unsigned long long uint64_t;
 
 enum {
-	ModeVideo = 0,
-	ModeVideo2 = 1,
-	ModeVideo3 = 2,
-	ModeVideo4 = 3,
-	ModeAudio = 5,
+	ModeVideoEnv = 0,
+	ModeVideoOpt = 1
 };
 
 enum {
@@ -74,11 +66,8 @@ struct share_queue {
 inline char* get_mapping_name(int mode)
 {
 	switch (mode){
-		case ModeVideo:    return MAPPING_NAMEV;
-		case ModeVideo2:   return MAPPING_NAMEV2;
-		case ModeVideo3:   return MAPPING_NAMEV3;
-		case ModeVideo4:   return MAPPING_NAMEV4;
-		case ModeAudio:    return MAPPING_NAMEA;
+		case ModeVideoEnv:    return REC_COMMON_VIDEO_ENV_SHM_ORIGINAL_QUEUE;
+		case ModeVideoOpt:   return REC_COMMON_VIDEO_OPT_SHM_ORIGINAL_QUEUE;
 		default:           return NULL;
 	}
 }

+ 4 - 34
Other/win/queue/share_queue_read.cpp

@@ -46,39 +46,9 @@ bool share_queue_init_index(share_queue* q)
 	if (!q || !q->header)
 		return false;
 
-
-	if (q->mode < ModeAudio) {
-		q->index = q->header->write_index - q->header->delay_frame;
-		if (q->index < 0)
-			q->index += q->header->queue_length;
-
-	} else if (q->mode == ModeAudio) {
-		int write_index = q->header->write_index;
-		int delay_frame = max(q->header->delay_frame, 3);
-		int64_t frame_time = q->header->frame_time;
-		int64_t last_ts = q->header->last_ts;
-		uint64_t start_ts = last_ts - frame_time * delay_frame;
-
-		int index = write_index;
-		uint64_t frame_ts = 0;
-
-		do {
-			index--;
-			if (index < 0)
-				index += q->header->queue_length;
-
-			frame_header* frame = get_frame_header(q->header, index);
-			frame_ts = frame->timestamp;
-
-		} while (frame_ts > start_ts && index != write_index);
-
-		if (index == write_index) {
-			q->index = write_index - q->header->queue_length / 2;
-			if (q->index < 0)
-				q->index += q->header->queue_length;
-		} else
-			q->index = index;
-	}
+	q->index = q->header->write_index - q->header->delay_frame;
+	if (q->index < 0)
+		q->index += q->header->queue_length;
 
 	return true;
 }
@@ -90,7 +60,7 @@ bool shared_queue_get_video_format(int mode, int* format, uint32_t* width,
 	HANDLE hwnd;
 	queue_header* header;
 
-	if (mode < ModeVideo || mode >= ModeAudio)
+	if (mode < ModeVideoEnv)
 		return false;
 
 	const char* name = get_mapping_name(mode);

+ 28 - 30
Other/win/virtualcam/dllmain.cpp

@@ -2,9 +2,8 @@
 #include <initguid.h>
 #include "virtualcam.h"
 
-STDAPI AMovieSetupRegisterServer(CLSID clsServer, LPCWSTR szDescription, 
-	LPCWSTR szFileName, LPCWSTR szThreadingModel = L"Both", 
-	LPCWSTR szServerType = L"InprocServer32");
+STDAPI AMovieSetupRegisterServer(CLSID clsServer, LPCWSTR szDescription, LPCWSTR szFileName, LPCWSTR szThreadingModel = L"Both", LPCWSTR szServerType = L"InprocServer32");
+
 STDAPI AMovieSetupUnregisterServer(CLSID clsServer);
 
 #define NUM_VIDEO_FILTERS 2
@@ -15,7 +14,6 @@ const AMOVIESETUP_MEDIATYPE AMSMediaTypesV =
 	&MEDIASUBTYPE_YUY2
 };
 
-
 const AMOVIESETUP_PIN AMSPinV =
 {
 	L"Output",            
@@ -29,8 +27,7 @@ const AMOVIESETUP_PIN AMSPinV =
 	&AMSMediaTypesV
 };
 
-
-const AMOVIESETUP_FILTER AMSFilterV =
+const AMOVIESETUP_FILTER AMSFilterENV =
 {
 	&CLSID_RVC_ENV_VirtualV,
 	L"RVC_ENV_Virtual_Camera",     
@@ -39,7 +36,7 @@ const AMOVIESETUP_FILTER AMSFilterV =
 	&AMSPinV
 };
 
-const AMOVIESETUP_FILTER AMSFilterV2 =
+const AMOVIESETUP_FILTER AMSFilterOPT =
 {
 	&CLSID_RVC_OPT_VirtualV,
 	L"RVC_OPT_Virtual_Camera",
@@ -54,16 +51,16 @@ CFactoryTemplate g_Templates[NUM_VIDEO_FILTERS] =
 	{
 		L"RVC_ENV_Virtual_Camera",
 		&CLSID_RVC_ENV_VirtualV,
-		CreateInstance,
+		CreateEnvInstance,
 		NULL,
-		&AMSFilterV
+		&AMSFilterENV
 	},
 	{
 		L"RVC_OPT_Virtual_Camera",
 		&CLSID_RVC_OPT_VirtualV,
-		CreateInstance2,
+		CreateOptInstance,
 		NULL,
-		&AMSFilterV2
+		&AMSFilterOPT
 	}
 };
 
@@ -76,19 +73,17 @@ STDAPI RegisterFilters(bool bRegister, int reg_video_filters)
 	char achTemp[MAX_PATH] = {0};
 	ASSERT(g_hInst != 0);
 
-	if (0 == GetModuleFileNameA(g_hInst, achTemp, sizeof(achTemp)))
-		return AmHresultFromWin32 (GetLastError());
-
-	MultiByteToWideChar(CP_ACP, 0L, achTemp, lstrlenA(achTemp) + 1,
-		achFileName, NUMELMS(achFileName));
+	if (0 == GetModuleFileNameA(g_hInst, achTemp, sizeof(achTemp))) {
+		return AmHresultFromWin32(GetLastError());
+	}
+		
+	MultiByteToWideChar(CP_ACP, 0L, achTemp, lstrlenA(achTemp) + 1, achFileName, NUMELMS(achFileName));
 
 	hr = CoInitialize(0);
 	if (bRegister) {
 		for (int i = 0; i < reg_video_filters; i++) {
-			hr |= AMovieSetupRegisterServer(*(g_Templates[i].m_ClsID),
-				g_Templates[i].m_Name, achFileName);
+			hr |= AMovieSetupRegisterServer(*(g_Templates[i].m_ClsID), g_Templates[i].m_Name, achFileName);
 		}
-
 	}
 
 	if (SUCCEEDED(hr)) 
@@ -104,21 +99,19 @@ STDAPI RegisterFilters(bool bRegister, int reg_video_filters)
 				rf2.rgPins = &AMSPinV;
 				for (int i = 0; i < reg_video_filters; i++) {
 					IMoniker *moniker_video = 0;
-					hr = fm->RegisterFilter(*(g_Templates[i].m_ClsID), 
-						g_Templates[i].m_Name, &moniker_video, 
-						&CLSID_VideoInputDeviceCategory, NULL, &rf2);
+					hr = fm->RegisterFilter(*(g_Templates[i].m_ClsID), g_Templates[i].m_Name, &moniker_video, &CLSID_VideoInputDeviceCategory, NULL, &rf2);
 				}
 			} 
 			else {
 				for (int i = 0; i < reg_video_filters; i++) {
-					hr = fm->UnregisterFilter(&CLSID_VideoInputDeviceCategory, 0,
-						*(g_Templates[i].m_ClsID));
+					hr = fm->UnregisterFilter(&CLSID_VideoInputDeviceCategory, 0, *(g_Templates[i].m_ClsID));
 				}
 			}
 		}
 
-		if (fm)
+		if (fm) {
 			fm->Release();
+		}
 	}
 
 	if (SUCCEEDED(hr) && !bRegister){
@@ -137,16 +130,21 @@ STDAPI RegisterFilters(bool bRegister, int reg_video_filters)
 
 STDAPI DllInstall(bool bInstall, _In_opt_ LPCWSTR pszCmdLine)
 {
-	if (!bInstall)
+	if (!bInstall) {
 		return RegisterFilters(false, NUM_VIDEO_FILTERS);
-	else if (lstrcmpW(pszCmdLine, L"1") == 0)
+	}
+	else if (lstrcmpW(pszCmdLine, L"1") == 0) {
 		return RegisterFilters(true, 1);
-	else if (lstrcmpW(pszCmdLine, L"2") == 0)
+	}
+	else if (lstrcmpW(pszCmdLine, L"2") == 0) {
 		return RegisterFilters(true, 2);
-	else if (lstrcmpW(pszCmdLine, L"3") == 0)
+	}
+	else if (lstrcmpW(pszCmdLine, L"3") == 0) {
 		return RegisterFilters(true, 3);
-	else
+	}
+	else {
 		return RegisterFilters(true, NUM_VIDEO_FILTERS);
+	}
 }
 
 STDAPI DllRegisterServer()

+ 4 - 4
Other/win/virtualcam/virtualcam.cpp

@@ -15,17 +15,17 @@
 #define SLEEP_DURATION 5
 
 
-CUnknown * WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT *phr)
+CUnknown * WINAPI CreateEnvInstance(LPUNKNOWN lpunk, HRESULT *phr)
 {
 	ASSERT(phr);
-	CUnknown *punk = new CVCam(lpunk, phr, CLSID_RVC_ENV_VirtualV, ModeVideo);
+	CUnknown *punk = new CVCam(lpunk, phr, CLSID_RVC_ENV_VirtualV, ModeVideoEnv);
 	return punk;
 }
 
-CUnknown * WINAPI CreateInstance2(LPUNKNOWN lpunk, HRESULT *phr)
+CUnknown * WINAPI CreateOptInstance(LPUNKNOWN lpunk, HRESULT *phr)
 {
 	ASSERT(phr);
-	CUnknown *punk = new CVCam(lpunk, phr, CLSID_RVC_OPT_VirtualV, ModeVideo2);
+	CUnknown *punk = new CVCam(lpunk, phr, CLSID_RVC_OPT_VirtualV, ModeVideoOpt);
 	return punk;
 }
 

+ 2 - 2
Other/win/virtualcam/virtualcam.h

@@ -37,8 +37,8 @@ struct format
 	int64_t time_per_frame;
 };
 
-extern CUnknown * WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT *phr);
-extern CUnknown * WINAPI CreateInstance2(LPUNKNOWN lpunk, HRESULT *phr);
+extern CUnknown * WINAPI CreateEnvInstance(LPUNKNOWN lpunk, HRESULT *phr);
+extern CUnknown * WINAPI CreateOptInstance(LPUNKNOWN lpunk, HRESULT *phr);
 
 class CVCam : public CSource
 {