DELTACAST DVI: compat with new SDK

This commit is contained in:
Martin Pulec
2018-06-27 12:36:09 +02:00
parent 63f28f5795
commit e015adaf1e
2 changed files with 84 additions and 47 deletions

View File

@@ -43,12 +43,20 @@
#include <unordered_map>
#ifdef HAVE_MACOSX
#include <VideoMasterHD/VideoMasterHD_Core.h>
#ifdef ENUMBASE_DV
#include <VideoMasterHD/VideoMasterHD_Dv.h>
#else
#include <VideoMasterHD/VideoMasterHD_Dvi.h>
#endif
#include <VideoMasterHD/VideoMasterHD_Sdi.h>
#include <VideoMasterHD_Audio/VideoMasterHD_Sdi_Audio.h>
#else
#include <VideoMasterHD_Core.h>
#ifdef ENUMBASE_DV
#include <VideoMasterHD_Dv.h>
#else
#include <VideoMasterHD_Dvi.h>
#endif
#include <VideoMasterHD_Sdi.h>
#include <VideoMasterHD_Sdi_Audio.h>
#endif
@@ -133,9 +141,9 @@ static void print_available_delta_boards() {
if (IsBiDir && NbChanOnBoard >= (RequestedRx + RequestedTx)) {
std::map<std::pair<ULONG, ULONG>, ULONG> mapping = { // key - (NbChanOnBoard, RequestedRX), value - member of VHD_BIDIRCFG_2C, VHD_BIDIRCFG_4C or VHD_BIDIRCFG_8C
{{2, 0}, VHD_BIDIR_02},
{{2, 1}, VHD_BIDIR_11},
{{2, 2}, VHD_BIDIR_20},
//{{2, 0}, VHD_BIDIR_02},
//{{2, 1}, VHD_BIDIR_11},
//{{2, 2}, VHD_BIDIR_20},
{{4, 0}, VHD_BIDIR_04},
{{4, 1}, VHD_BIDIR_13},

View File

@@ -95,6 +95,35 @@ struct vidcap_deltacast_dvi_state {
#define EEDDIDOK 0
#define BADEEDID 1
// compat
#ifndef ENUMBASE_DV
#define VHD_DV_MODE VHD_DVI_MODE
#define VHD_DV_SP_MODE VHD_DVI_SP_MODE
#define VHD_DV_MODE_DVI_A VHD_DVI_MODE_DVI_A
#define VHD_DV_MODE_DVI_D VHD_DVI_MODE_DVI_D
#define VHD_DV_MODE_ANALOG_COMPONENT_VIDEO VHD_DVI_MODE_ANALOG_COMPONENT_VIDEO
#define VHD_DV_MODE_HDMI VHD_DVI_MODE_HDMI
#define VHD_DV_SP_DISABLE_EDID_AUTO_LOAD VHD_DVI_SP_DISABLE_EDID_AUTO_LOAD
#define VHD_DV_DVI_A_STANDARD VHD_DVI_A_STANDARD
#define VHD_DV_DVIA_STD_DMT VHD_DVIA_STD_DMT
#define VHD_DV_SP_ACTIVE_WIDTH VHD_DVI_SP_ACTIVE_WIDTH
#define VHD_DV_SP_ACTIVE_HEIGHT VHD_DVI_SP_ACTIVE_HEIGHT
#define VHD_DV_SP_ACTIVE_INTERLACED VHD_DVI_SP_ACTIVE_INTERLACED
#define VHD_DV_SP_ACTIVE_REFRESH_RATE VHD_DVI_SP_ACTIVE_REFRESH_RATE
#define VHD_DV_SP_ACTIVE_DUAL_LINK VHD_DVI_SP_ACTIVE_DUAL_LINK
#define VHD_DV_MODE_ANALOG_COMPONENT_VIDEO VHD_DVI_MODE_ANALOG_COMPONENT_VIDEO
#define VHD_DV_CS VHD_HDMI_CS
#define VHD_DV_SP_PIXEL_CLOCK VHD_DVI_SP_PIXEL_CLOCK
#define VHD_DV_SP_INPUT_CS VHD_DVI_SP_INPUT_CS
#define NB_VHD_DV_MODES NB_VHD_DVI_MODES
#define VHD_DV_STPROC_JOINED VHD_DVI_STPROC_JOINED
#define VHD_DV_STPROC_DEFAULT VHD_DVI_STPROC_DEFAULT
#define VHD_DV_EEDID_DVID VHD_EEDID_DVID
#define VHD_DV_EEDID_DVIA VHD_EEDID_DVIA
#define VHD_DV_EEDID_HDMI VHD_EEDID_HDMI
#define VHD_DV_BT_VIDEO VHD_DVI_BT_VIDEO
#endif
static void usage(void);
static decltype(EEDDIDOK) CheckEEDID(BYTE pEEDIDBuffer[256]);
static const char * GetErrorDescription(ULONG CodeError) __attribute__((unused));
@@ -237,7 +266,7 @@ vidcap_deltacast_dvi_probe(bool verbose)
}
static bool wait_for_channel_locked(struct vidcap_deltacast_dvi_state *s, bool have_preset,
VHD_DVI_MODE DviMode,
VHD_DV_MODE DviMode,
ULONG Width, ULONG Height, ULONG RefreshRate)
{
BOOL32 Interlaced_B = FALSE;
@@ -252,7 +281,7 @@ static bool wait_for_channel_locked(struct vidcap_deltacast_dvi_state *s, bool h
printf("Waiting for incoming signal...\n");
do
{
Result = VHD_GetStreamProperty(s->StreamHandle, VHD_DVI_SP_MODE, (ULONG *) &DviMode);
Result = VHD_GetStreamProperty(s->StreamHandle, VHD_DV_SP_MODE, (ULONG *) &DviMode);
gettimeofday(&t, NULL);
if(tv_diff(t, t0) > 1.0) break;
} while (Result != VHDERR_NOERROR);
@@ -264,26 +293,26 @@ static bool wait_for_channel_locked(struct vidcap_deltacast_dvi_state *s, bool h
printf("\nIncoming Dvi mode detected: ");
switch(DviMode)
{
case VHD_DVI_MODE_DVI_D : printf("DVI-D\n");break;
case VHD_DVI_MODE_DVI_A : printf("DVI-A\n");break;
case VHD_DVI_MODE_ANALOG_COMPONENT_VIDEO : printf("Analog component video\n");break;
case VHD_DVI_MODE_HDMI : printf("HDMI\n");break;
case VHD_DV_MODE_DVI_D : printf("DVI-D\n");break;
case VHD_DV_MODE_DVI_A : printf("DVI-A\n");break;
case VHD_DV_MODE_ANALOG_COMPONENT_VIDEO : printf("Analog component video\n");break;
case VHD_DV_MODE_HDMI : printf("HDMI\n");break;
default : break;
}
/* Disable EDID auto load */
Result = VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_DISABLE_EDID_AUTO_LOAD,TRUE);
Result = VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_DISABLE_EDID_AUTO_LOAD,TRUE);
if(Result != VHDERR_NOERROR)
return false;
/* Set the DVI mode of this channel to the detected one */
Result = VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_MODE, DviMode);
Result = VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_MODE, DviMode);
if(Result != VHDERR_NOERROR)
return false;
if(DviMode == VHD_DVI_MODE_DVI_A)
if(DviMode == VHD_DV_MODE_DVI_A)
{
VHD_DVI_A_STANDARD DviAStd = VHD_DVIA_STD_DMT;
VHD_DV_DVI_A_STANDARD DviAStd = VHD_DV_DVIA_STD_DMT;
if(!have_preset) {
/* Auto-detection is now available for DVI-A.
VHD_DVI_SP_ACTIVE_HEIGHT, VHD_DVI_SP_INTERLACED, VHD_DVI_SP_REFRESH_RATE,
@@ -312,28 +341,28 @@ static bool wait_for_channel_locked(struct vidcap_deltacast_dvi_state *s, bool h
return false;
}
}
else if(DviMode == VHD_DVI_MODE_DVI_D)
else if(DviMode == VHD_DV_MODE_DVI_D)
{
int Dual_B = FALSE;
/* Get auto-detected resolution */
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_ACTIVE_WIDTH,&Width);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_ACTIVE_WIDTH,&Width);
if(Result == VHDERR_NOERROR)
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_ACTIVE_HEIGHT,&Height);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_ACTIVE_HEIGHT,&Height);
else
printf("ERROR : Cannot detect incoming active width from RX0. "
"Result = 0x%08lX\n", Result);
if(Result == VHDERR_NOERROR)
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_INTERLACED,(ULONG*)&Interlaced_B);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_INTERLACED,(ULONG*)&Interlaced_B);
else
printf("ERROR : Cannot detect incoming active height from RX0. "
"Result = 0x%08lX\n", Result);
if(Result == VHDERR_NOERROR)
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_REFRESH_RATE,&RefreshRate);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_REFRESH_RATE,&RefreshRate);
else
printf("ERROR : Cannot detect if incoming stream from RX0 is "
"interlaced or progressive. Result = 0x%08lX\n", Result);
if(Result == VHDERR_NOERROR)
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_DUAL_LINK,(ULONG*)&Dual_B);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_DUAL_LINK,(ULONG*)&Dual_B);
else
printf("ERROR : Cannot detect incoming refresh rate from RX0. "
"Result = 0x%08lX\n", Result);
@@ -354,38 +383,38 @@ static bool wait_for_channel_locked(struct vidcap_deltacast_dvi_state *s, bool h
VHD_DVI_SP_H_SYNC, VHD_DVI_SP_H_FRONT_PORCH, VHD_DVI_SP_V_SYNC and
VHD_DVI_SP_V_FRONT_PORCH properties are not applicable for DVI-D */
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_ACTIVE_WIDTH,Width);
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_ACTIVE_HEIGHT,Height);
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_INTERLACED,Interlaced_B);
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_REFRESH_RATE,RefreshRate);
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_DUAL_LINK,Dual_B);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_ACTIVE_WIDTH,Width);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_ACTIVE_HEIGHT,Height);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_INTERLACED,Interlaced_B);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_REFRESH_RATE,RefreshRate);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_DUAL_LINK,Dual_B);
}
else if(DviMode == VHD_DVI_MODE_HDMI || DviMode == VHD_DVI_MODE_ANALOG_COMPONENT_VIDEO)
else if(DviMode == VHD_DV_MODE_HDMI || DviMode == VHD_DV_MODE_ANALOG_COMPONENT_VIDEO)
{
VHD_HDMI_CS InputCS;
VHD_DV_CS InputCS;
ULONG PxlClk = 0;
/* Get auto-detected resolution */
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_ACTIVE_WIDTH,&Width);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_ACTIVE_WIDTH,&Width);
if(Result == VHDERR_NOERROR)
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_ACTIVE_HEIGHT,&Height);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_ACTIVE_HEIGHT,&Height);
else
printf("ERROR : Cannot detect incoming active width from RX0. "
"Result = 0x%08lX\n", Result);
if(Result == VHDERR_NOERROR)
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_INTERLACED,(ULONG*)&Interlaced_B);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_INTERLACED,(ULONG*)&Interlaced_B);
else
printf("ERROR : Cannot detect incoming active height from RX0. "
"Result = 0x%08lX\n", Result);
if(Result == VHDERR_NOERROR)
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_REFRESH_RATE,&RefreshRate);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_REFRESH_RATE,&RefreshRate);
else
printf("ERROR : Cannot detect if incoming stream from RX0 is "
"interlaced or progressive. Result = 0x%08lX\n", Result);
if (Result == VHDERR_NOERROR) {
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_REFRESH_RATE,&RefreshRate);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_REFRESH_RATE,&RefreshRate);
if(s->BoardType == VHD_BOARDTYPE_HDMI)
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_INPUT_CS,(ULONG*)&InputCS);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_INPUT_CS,(ULONG*)&InputCS);
else
printf("ERROR : Cannot detect incoming color space from RX0. Result = 0x%08lX (%s)\n", Result,
GetErrorDescription(Result));
@@ -393,7 +422,7 @@ static bool wait_for_channel_locked(struct vidcap_deltacast_dvi_state *s, bool h
if (Result == VHDERR_NOERROR) {
if (s->BoardType == VHD_BOARDTYPE_HDMI)
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DVI_SP_PIXEL_CLOCK,&PxlClk);
Result = VHD_GetStreamProperty(s->StreamHandle,VHD_DV_SP_PIXEL_CLOCK,&PxlClk);
else
printf("ERROR : Cannot detect incoming pixel clock from RX0. Result = 0x%08lX (%s)\n", Result,
GetErrorDescription(Result));
@@ -415,13 +444,13 @@ static bool wait_for_channel_locked(struct vidcap_deltacast_dvi_state *s, bool h
VHD_DVI_SP_H_SYNC, VHD_DVI_SP_H_FRONT_PORCH, VHD_DVI_SP_V_SYNC and
VHD_DVI_SP_V_FRONT_PORCH properties are not applicable for DVI-D, HDMI and Component */
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_ACTIVE_WIDTH,Width);
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_ACTIVE_HEIGHT,Height);
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_INTERLACED,Interlaced_B);
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_REFRESH_RATE, RefreshRate);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_ACTIVE_WIDTH,Width);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_ACTIVE_HEIGHT,Height);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_INTERLACED,Interlaced_B);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_REFRESH_RATE, RefreshRate);
if (s->BoardType == VHD_BOARDTYPE_HDMI) {
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_INPUT_CS, InputCS);
VHD_SetStreamProperty(s->StreamHandle,VHD_DVI_SP_PIXEL_CLOCK, PxlClk);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_INPUT_CS, InputCS);
VHD_SetStreamProperty(s->StreamHandle,VHD_DV_SP_PIXEL_CLOCK, PxlClk);
}
}
@@ -463,7 +492,7 @@ vidcap_deltacast_dvi_init(const struct vidcap_params *params, void **state)
int channel = 0;
ULONG ChannelId;
bool have_preset = false;
VHD_DVI_MODE DviMode = NB_VHD_DVI_MODES;
VHD_DV_MODE DviMode = NB_VHD_DV_MODES;
printf("vidcap_deltacast_dvi_init\n");
@@ -598,7 +627,7 @@ vidcap_deltacast_dvi_init(const struct vidcap_params *params, void **state)
goto no_stream;
}
Result = VHD_OpenStreamHandle(s->BoardHandle, ChannelId,
s->BoardType == VHD_BOARDTYPE_HDMI ? VHD_DVI_STPROC_JOINED : VHD_DVI_STPROC_DEFAULT,
s->BoardType == VHD_BOARDTYPE_HDMI ? VHD_DV_STPROC_JOINED : VHD_DV_STPROC_DEFAULT,
NULL, &s->StreamHandle, NULL);
if (Result != VHDERR_NOERROR)
{
@@ -631,17 +660,17 @@ vidcap_deltacast_dvi_init(const struct vidcap_params *params, void **state)
}
if(have_preset) {
DviMode = VHD_DVI_MODE_DVI_A;
DviMode = VHD_DV_MODE_DVI_A;
} else {
switch(edid)
{
case 0 : VHD_PresetEEDID(VHD_EEDID_DVID,pEEDIDBuffer,256);
case 0 : VHD_PresetEEDID(VHD_DV_EEDID_DVID,pEEDIDBuffer,256);
VHD_LoadEEDID(s->StreamHandle,pEEDIDBuffer,256);
break;
case 1 : VHD_PresetEEDID(VHD_EEDID_DVIA,pEEDIDBuffer,256);
case 1 : VHD_PresetEEDID(VHD_DV_EEDID_DVIA,pEEDIDBuffer,256);
VHD_LoadEEDID(s->StreamHandle,pEEDIDBuffer,256);
break;
case 2 : VHD_PresetEEDID(VHD_EEDID_HDMI,pEEDIDBuffer,256);
case 2 : VHD_PresetEEDID(VHD_DV_EEDID_HDMI,pEEDIDBuffer,256);
VHD_LoadEEDID(s->StreamHandle,pEEDIDBuffer,256);
break;
default : break;
@@ -719,7 +748,7 @@ vidcap_deltacast_dvi_grab(void *state, struct audio_frame **audio)
HANDLE SlotHandle;
if(!s->configured) {
s->configured = wait_for_channel_locked(s, false, NB_VHD_DVI_MODES, 0, 0, 0);
s->configured = wait_for_channel_locked(s, false, NB_VHD_DV_MODES, 0, 0, 0);
}
if(!s->configured) {
return NULL;
@@ -738,7 +767,7 @@ vidcap_deltacast_dvi_grab(void *state, struct audio_frame **audio)
return NULL;
}
Result = VHD_GetSlotBuffer(SlotHandle, VHD_DVI_BT_VIDEO, &pBuffer, &BufferSize);
Result = VHD_GetSlotBuffer(SlotHandle, VHD_DV_BT_VIDEO, &pBuffer, &BufferSize);
if (Result != VHDERR_NOERROR) {
fprintf(stderr, "\nERROR : Cannot get slot buffer. Result = 0x%08lX\n",Result);