Ejemplo n.º 1
0
        public DeckLinkDevice(IDeckLink deckLink)
        {
            this.deckLink = deckLink;

            // Get input interface
            try
            {
                deckLinkInput  = (IDeckLinkInput)this.deckLink;
                deckLinkStatus = (IDeckLinkStatus)this.deckLink;

                bool videoInputSignalLocked = false;
                deckLinkStatus.GetFlag(_BMDDeckLinkStatusID.bmdDeckLinkStatusVideoInputSignalLocked, out int videoInputSignalLockedFlag);
                videoInputSignalLocked = (videoInputSignalLockedFlag != 0);

                if (videoInputSignalLocked)
                {
                    throw new Exception("Video input locked");
                }

                this.deckLink.GetDisplayName(out deviceName);
                this.deckLink.GetModelName(out modelName);


                var deckLinkAttributes = (IDeckLinkProfileAttributes)deckLink;
                deckLinkAttributes.GetFlag(_BMDDeckLinkAttributeID.BMDDeckLinkSupportsInputFormatDetection, out int supportsFormatDetectionFlag);
                supportsFormatDetection = (supportsFormatDetectionFlag != 0);


                logger.Debug("------------------------- " + deviceName + " -------------------------");

                IDeckLinkDisplayModeIterator iterator = null;
                deckLinkInput.GetDisplayModeIterator(out iterator);
                IDeckLinkDisplayMode displayMode = null;
                do
                {
                    if (iterator != null)
                    {
                        iterator.Next(out displayMode);
                        if (displayMode != null)
                        {
                            displayMode.GetName(out string displayName);
                            displayMode.GetFrameRate(out long frameDuration, out long timeScale);

                            int width            = displayMode.GetWidth();
                            int height           = displayMode.GetHeight();
                            var bdmDisplayMode   = displayMode.GetDisplayMode();
                            var displayModeFlags = displayMode.GetFlags();
                            var fieldDominance   = displayMode.GetFieldDominance();


                            var resolution = width + "x" + height;

                            // var log = string.Join(", " , displayName, resolution, bdmDisplayMode, displayModeFlags, frameDuration, timeScale, fieldDominance);
                            var videoModeFlags = _BMDSupportedVideoModeFlags.bmdSupportedVideoModeDefault;

                            //var allPixelFormats = Enum.GetValues(typeof(_BMDPixelFormat));
                            var formatLog = "";
                            foreach (var fmtObj in pixelFormats)
                            {
                                var pixelFormat = (_BMDPixelFormat)fmtObj;
                                deckLinkInput.DoesSupportVideoMode(_BMDVideoConnection.bmdVideoConnectionHDMI, bdmDisplayMode, pixelFormat, videoModeFlags, out int supported);
                                if (supported != 0)
                                {
                                    formatLog += " " + pixelFormat;
                                }
                            }

                            var log = string.Join(", ", displayName, resolution);
                            logger.Debug(displayName + " " + resolution + " (" + formatLog + ")");
                        }
                        else
                        {
                            break;
                        }
                    }
                }while (displayMode != null);


                logger.Debug("-----------------------------------------------------");
            }
            catch (InvalidCastException)
            {
                // No output interface found, eg in case of DeckLink Mini Monitor
                return;
            }
        }
Ejemplo n.º 2
0
            internal DeckLinkDeviceDescription GetDeviceDescription()
            {
                if (!initialized)
                {
                    return(null);
                }

                DeckLinkDeviceDescription deviceDescription = null;

                deckLink.GetDisplayName(out string deviceName);

                deckLinkAttrs.GetString(_BMDDeckLinkAttributeID.BMDDeckLinkDeviceHandle, out string deviceHandle);

                deckLinkStatus.GetFlag(_BMDDeckLinkStatusID.bmdDeckLinkStatusVideoInputSignalLocked, out int videoInputSignalLockedFlag);
                bool available = (videoInputSignalLockedFlag != 0);

                deckLinkStatus.GetInt(_BMDDeckLinkStatusID.bmdDeckLinkStatusBusy, out long deviceBusyStateFlag);
                _BMDDeviceBusyState deviceBusyState = (_BMDDeviceBusyState)deviceBusyStateFlag;
                bool isBusy = (deviceBusyState == _BMDDeviceBusyState.bmdDeviceCaptureBusy);

                deckLinkStatus.GetInt(_BMDDeckLinkStatusID.bmdDeckLinkStatusCurrentVideoInputMode, out long bmdDeckLinkStatusCurrentVideoInputModeFlag);
                _BMDDisplayMode displayModeId = (_BMDDisplayMode)bmdDeckLinkStatusCurrentVideoInputModeFlag;

                deckLinkStatus.GetInt(_BMDDeckLinkStatusID.bmdDeckLinkStatusCurrentVideoInputPixelFormat, out long currentVideoInputPixelFormatFlag);
                _BMDPixelFormat pixelFormat = (_BMDPixelFormat)currentVideoInputPixelFormatFlag;

                DeckLinkDisplayModeDescription displayDescription = null;
                IDeckLinkDisplayMode           displayMode        = null;

                try
                {
                    deckLinkInput.GetDisplayMode(displayModeId, out displayMode);

                    int width  = displayMode.GetWidth();
                    int height = displayMode.GetHeight();
                    displayMode.GetFrameRate(out long duration, out long scale);
                    displayMode.GetName(out string displayName);

                    displayDescription = new DeckLinkDisplayModeDescription
                    {
                        Width       = width,
                        Height      = height,
                        PixFmt      = (long)pixelFormat,
                        Fps         = ((double)scale / duration),
                        Description = displayName,
                    };
                }
                finally
                {
                    if (displayMode != null)
                    {
                        Marshal.ReleaseComObject(displayMode);
                    }
                }

                deviceDescription = new DeckLinkDeviceDescription
                {
                    DeviceHandle   = deviceHandle,
                    DeviceName     = deviceName,
                    Available      = available,
                    IsBusy         = isBusy,
                    DisplayModeIds = new List <DeckLinkDisplayModeDescription> {
                        displayDescription
                    },
                };

                return(deviceDescription);
            }