Objekte die mit CoCreateInstance erzeugt wurden in mehreren Klassen nutzen



  • @hustbaer

    Ja, stimmt, so funktioniert der Code nicht. Ich weiß auch nicht mehr wie das return result da reingekommen ist. Getestet hatte ich es aber ohne und so läuft es dann ja.

    Danke für deinen Hinweis die Hilfsfunktion direkt an ControlVideo zu übergeben. Da wäre ich so gar nicht drauf gekommen... 🙈



  • Hallo,

    ich habe noch eine Frage zum Thema.
    Bisher hatte ich in der main-Methode zentral eine DeckLink Instanz mit CoCreateInstance erzeugt. Hat super funktioniert. Nun erstelle ich mit Qt die GUI und die Initialisierung der DeckLink Instanz in der main macht in meinen Augen keinen Sinn mehr.
    Statt die Objekte von z.B. ControlVideo in der main zu erzeugen, mache ich das jetzt in den einzelnen Funktionen. Ich habe z.B. eine Funktion QStartVideo(), in der ich ein Objekt von ControlVideo erstelle und damit die Funktion StartVideo() aufrufe, welche den Stream startet. ControlVideo übergebe ich hier meine Hilfsfunktion CreateDeckLinkInstance(), um StartVideo() mit der DeckLink Instanz zu initialisieren.

    StartVideo:

    HRESULT ControlVideo::StartVideo(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat,
    	BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType,
    	unsigned int channelCount, bool enableFormatDetection) {
    
    	HRESULT result = S_OK;
    
    	if (m_deckLinkInput->EnableVideoInput(displayMode, pixelFormat, videoInputFlags) == S_OK) {
    		std::cout << "Video input is enabled." << std::endl;
    	}
    
    	if (m_deckLinkInput->StartStreams() == S_OK) {
    		std::cout << "Stream has started." << std::endl;
    	}
    	else {
    		std::cout << "Something goes wrong in the startVideo method.";
    	}
    
    	return result;
    }
    

    QStartVideo:

    void QVideoMeter::QStartVideo() {
    
        CComPtr<IDeckLinkIterator> deckLinkIterator = nullptr;
        CComPtr<IDeckLink> deckLink = nullptr;
        CComPtr<InitializeDeckLink> init;
        
        auto control = std::make_unique<ControlVideo>(init->CreateDeckLinkInstance(deckLinkIterator, deckLink));
        
        //'p' avoid the call of Release()
        while (deckLinkIterator->Next(&deckLink.p) == S_OK) {
    
            HRESULT inputVideoData = control->StartVideo(bmdModeHD1080p50, bmdFormat8BitYUV, bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger, 2, false);
    
            if (inputVideoData == S_OK) {
                ui.startBtn->setText("Running");
            }
        }
    }
    

    Hilfsfunktion:

    CComPtr<IDeckLink> InitializeDeckLink::CreateDeckLinkInstance(CComPtr<IDeckLinkIterator> deckLinkIterator, CComPtr<IDeckLink> deckLink) {
    
    	if (FAILED(CoCreateInstance(CLSID_CDeckLinkIterator, nullptr, CLSCTX_ALL, IID_IDeckLinkIterator, (void**)&deckLinkIterator))) {
    		std::cout << "DeckLink Driver is not installed." << std::endl;
    	}
    	return deckLink;
    }
    

    Problem was ich sehe: wenn ich in der Hilfsfunktion deckLink zurückgebe, dies in QStatVideo aber mit NULL initialisiert wird, kann das Erzeugen der DeckLink Instanz nicht funktioniert oder? Denn wenn ich das Programm ausführe wird eine Exception ausgelöst und es kommt die Fehlermeldung das deckLinkInput NULL ist.

    Konstruktor ControlVideo:

    /**
    * Contructor with initializer list
    */
    ControlVideo::ControlVideo(CComPtr<IDeckLink> deckLink)
    	: m_deckLink(deckLink), m_deckLinkInput(deckLink),
    	m_inputCallback(nullptr), m_referenceCounter(1) {
    
    	if (!m_deckLink) {
    		throw std::runtime_error("No DeckLink Interface found.");
    	}
    
    	if (!m_deckLinkInput) {
    		throw std::runtime_error("No DeckLink Input Interface found.");
    	}
    }
    

    Hat jemand einen Tipp? Ich stehe da leider komplett auf dem Schlauch.



  • Habe das Problem durch die folgende Anpassung der Hilfsfunktion behoben:

    CComPtr<IDeckLink> InitializeDeckLink::CreateDeckLinkInstance() {
    
        CComPtr<IDeckLink> deckLink = nullptr;
        CComPtr<IDeckLinkIterator> deckLinkIterator = nullptr;
    
        HRESULT result = S_OK;
        result = CoCreateInstance(CLSID_CDeckLinkIterator, nullptr, CLSCTX_ALL, IID_IDeckLinkIterator, (void**)&deckLinkIterator);
    
        if (FAILED(result)) {
            std::cout << "DeckLink Driver is not installed." << std::endl;
            QMessageBox::warning(nullptr, "DeckLink Treiber nicht installiert", "Bitte installieren Sie den aktuellen DeckLink Treiber von Blackmagic.");
        }
    
        if (deckLinkIterator->Next(&deckLink) != S_OK) {
            std::cout << "No DeckLink device detected." << std::endl;
            QMessageBox::warning(nullptr, "Kein Gerät erkannt", "Bitte verbinden Sie Ihren PC mit geeigneter Blackmagic Hardware (z.B. UltraStudio Recorder).");
        }
        return deckLink;
    
    }
    

Anmelden zum Antworten