ইন্টেল গ্রাফিক্স হার্ডওয়্যার H264 এমএফটি প্রসেস ইনপুট কল কিছু ইনপুট নমুনাগুলি খাওয়ানোর পরে ব্যর্থ হয়, এনভিডিয়া হার্ডওয়্যার এমএফটি-তে একই কাজ করে


9

আমি ডেস্কটপ ডুপ্লিকেশন এপিআই ব্যবহার করে ডেস্কটপ ক্যাপচার করছি এবং জিপিইউতে আরজিবিএ থেকে এনভি 12-তে নমুনাগুলি রূপান্তর করছি এবং মিডিয়াফাউন্ডেশন হার্ডওয়্যার এইচ 264 এমএফটি তে একই খাবার সরবরাহ করছি। এটি এনভিডিয়া গ্রাফিক্সের সাথে এবং সফ্টওয়্যার এনকোডারগুলির সাথেও দুর্দান্ত কাজ করে তবে ব্যর্থ হয় যখন কেবল ইন্টেল গ্রাফিক্স হার্ডওয়্যার এমএফটি উপলব্ধ থাকে। আমি যদি সফ্টওয়্যার এমএফটিতে পড়েছি তবে কোডটি একই ইনটেল গ্রাফিক্স মেশিনে সূক্ষ্মভাবে কাজ করে। এনভিডিয়া গ্রাফিক্স মেশিনে হার্ডওয়্যারে এনকোডিংটি আসলেই করা হয়েছে তা আমি নিশ্চিত করেছি।

ইন্টেল গ্রাফিক্সে, এমএফটি এমআরআর ( " অনির্ধারিত ত্রুটি" ) প্রদান করে, যা প্রথম নমুনা খাওয়ানোর ঠিক পরে ঘটে এবং প্রসেসইনপুটকে পরবর্তী কলগুলি (যখন ইভেন্ট জেনারেটর এমটিআরএসফর্মনিডইনপুট ট্রিগার করে) ফিরে আসে " কলি বর্তমানে আরও ইনপুট গ্রহণ করছে না" । এটি বিরল যে এমএফটি এই ত্রুটিগুলি ফিরিয়ে দেওয়ার আগে আরও কয়েকটি নমুনা গ্রহণ করে। এই আচরণটি বিভ্রান্তিকর, আমি কেবল তখনই কোনও নমুনা খাওয়াতাম যখন ইভেন্ট জেনারেটর এমএফএএসসিএনক্যালব্যাকের মাধ্যমে এমিট ট্রান্সফর্মনিডইনপুটকে অবিচ্ছিন্নভাবে ট্রিগার করে এবং নমুনা দেওয়ার সাথে সাথেই এমইটি ট্রান্সফর্মহ্যাভআউটপুট ট্রিগার হয় কিনা তাও সঠিকভাবে পরীক্ষা করে দেখছি। এনভিডিয়া হার্ডওয়্যার এমএফটি এবং মাইক্রোসফ্ট সফ্টওয়্যার এনকোডারগুলির সাথে একই অ্যাসিনক্রোনাস যুক্তিটি সূক্ষ্মভাবে কাজ করে তখন এটি আমাকে সত্যিই বিস্মিত করে।

ইন্টেল ফোরামে নিজেই একই রকম অমীমাংসিত প্রশ্ন রয়েছে। আমার কোডটি নীচের মতো এনকোডারটিতে d3d ডিভাইস ম্যানেজারকেও সেট করে দিচ্ছি তা বাদ দিয়ে ইন্টেল থ্রেডে উল্লিখিত একটির মতো।

এবং, সেখানে তিনটি স্ট্যাক ওভারফ্লো থ্রেড দেওয়া কোন সমাধান সঙ্গে একটি অনুরূপ সমস্যা প্রতিবেদন করার হয় ( MFTransform encoder-> ProcessInput ফেরৎ E_FAIL & যেভাবে ইন্টেল MFT এনকোডার জন্য D11 জমিন থেকে IMFSample তৈরি করতে & অ্যাসিঙ্ক্রোনাস MFT MFTransformHaveOutput ইভেন্ট (ইন্টেল হার্ডওয়্যারের MJPEG সঙ্কেতমোচক পাঠানোর নয় এমএফটি) )। আমি এর কোনও উন্নতি না করে প্রতিটি সম্ভাব্য বিকল্প চেষ্টা করেছি।

রঙ রূপান্তরকারী কোডটি ইন্টেল মিডিয়া এসডিকে নমুনা থেকে নেওয়া হয়। আমি এখানে আমার সম্পূর্ণ কোড আপলোড করেছি ।

ডি 3 ডি ম্যানেজার সেট করার পদ্ধতি:

void SetD3dManager() {

    HRESULT hr = S_OK;

    if (!deviceManager) {

        // Create device manager
        hr = MFCreateDXGIDeviceManager(&resetToken, &deviceManager);
    }

    if (SUCCEEDED(hr)) 
    {
        if (!pD3dDevice) {

            pD3dDevice = GetDeviceDirect3D(0);
        }
    }

    if (pD3dDevice) {

        // NOTE: Getting ready for multi-threaded operation
        const CComQIPtr<ID3D10Multithread> pMultithread = pD3dDevice;
        pMultithread->SetMultithreadProtected(TRUE);

        hr = deviceManager->ResetDevice(pD3dDevice, resetToken);
        CHECK_HR(_pTransform->ProcessMessage(MFT_MESSAGE_SET_D3D_MANAGER, reinterpret_cast<ULONG_PTR>(deviceManager.p)), "Failed to set device manager.");
    }
    else {
        cout << "Failed to get d3d device";
    }
}

Getd3ddevice:

CComPtr<ID3D11Device> GetDeviceDirect3D(UINT idxVideoAdapter)
{
    // Create DXGI factory:
    CComPtr<IDXGIFactory1> dxgiFactory;
    DXGI_ADAPTER_DESC1 dxgiAdapterDesc;

    // Direct3D feature level codes and names:

    struct KeyValPair { int code; const char* name; };

    const KeyValPair d3dFLevelNames[] =
    {
        KeyValPair{ D3D_FEATURE_LEVEL_9_1, "Direct3D 9.1" },
        KeyValPair{ D3D_FEATURE_LEVEL_9_2, "Direct3D 9.2" },
        KeyValPair{ D3D_FEATURE_LEVEL_9_3, "Direct3D 9.3" },
        KeyValPair{ D3D_FEATURE_LEVEL_10_0, "Direct3D 10.0" },
        KeyValPair{ D3D_FEATURE_LEVEL_10_1, "Direct3D 10.1" },
        KeyValPair{ D3D_FEATURE_LEVEL_11_0, "Direct3D 11.0" },
        KeyValPair{ D3D_FEATURE_LEVEL_11_1, "Direct3D 11.1" },
    };

    // Feature levels for Direct3D support
    const D3D_FEATURE_LEVEL d3dFeatureLevels[] =
    {
        D3D_FEATURE_LEVEL_11_1,
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
        D3D_FEATURE_LEVEL_9_3,
        D3D_FEATURE_LEVEL_9_2,
        D3D_FEATURE_LEVEL_9_1,
    };

    constexpr auto nFeatLevels = static_cast<UINT> ((sizeof d3dFeatureLevels) / sizeof(D3D_FEATURE_LEVEL));

    CComPtr<IDXGIAdapter1> dxgiAdapter;
    D3D_FEATURE_LEVEL featLevelCodeSuccess;
    CComPtr<ID3D11Device> d3dDx11Device;

    std::wstring_convert<std::codecvt_utf8<wchar_t>> transcoder;

    HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory));
    CHECK_HR(hr, "Failed to create DXGI factory");

    // Get a video adapter:
    dxgiFactory->EnumAdapters1(idxVideoAdapter, &dxgiAdapter);

    // Get video adapter description:
    dxgiAdapter->GetDesc1(&dxgiAdapterDesc);

    CHECK_HR(hr, "Failed to retrieve DXGI video adapter description");

    std::cout << "Selected DXGI video adapter is \'"
        << transcoder.to_bytes(dxgiAdapterDesc.Description) << '\'' << std::endl;

    // Create Direct3D device:
    hr = D3D11CreateDevice(
        dxgiAdapter,
        D3D_DRIVER_TYPE_UNKNOWN,
        nullptr,
        (0 * D3D11_CREATE_DEVICE_SINGLETHREADED) | D3D11_CREATE_DEVICE_VIDEO_SUPPORT,
        d3dFeatureLevels,
        nFeatLevels,
        D3D11_SDK_VERSION,
        &d3dDx11Device,
        &featLevelCodeSuccess,
        nullptr
    );

    // Might have failed for lack of Direct3D 11.1 runtime:
    if (hr == E_INVALIDARG)
    {
        // Try again without Direct3D 11.1:
        hr = D3D11CreateDevice(
            dxgiAdapter,
            D3D_DRIVER_TYPE_UNKNOWN,
            nullptr,
            (0 * D3D11_CREATE_DEVICE_SINGLETHREADED) | D3D11_CREATE_DEVICE_VIDEO_SUPPORT,
            d3dFeatureLevels + 1,
            nFeatLevels - 1,
            D3D11_SDK_VERSION,
            &d3dDx11Device,
            &featLevelCodeSuccess,
            nullptr
        );
    }

    // Get name of Direct3D feature level that succeeded upon device creation:
    std::cout << "Hardware device supports " << std::find_if(
        d3dFLevelNames,
        d3dFLevelNames + nFeatLevels,
        [featLevelCodeSuccess](const KeyValPair& entry)
        {
            return entry.code == featLevelCodeSuccess;
        }
    )->name << std::endl;

done:

    return d3dDx11Device;
}

অ্যাসিঙ্ক কলব্যাক বাস্তবায়ন:

struct EncoderCallbacks : IMFAsyncCallback
{
    EncoderCallbacks(IMFTransform* encoder)
    {
        TickEvent = CreateEvent(0, FALSE, FALSE, 0);
        _pEncoder = encoder;
    }

    ~EncoderCallbacks()
    {
        eventGen = nullptr;
        CloseHandle(TickEvent);
    }

    bool Initialize() {

        _pEncoder->QueryInterface(IID_PPV_ARGS(&eventGen));

        if (eventGen) {

            eventGen->BeginGetEvent(this, 0);
            return true;
        }

        return false;
    }

    // dummy IUnknown impl
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) override { return E_NOTIMPL; }
    virtual ULONG STDMETHODCALLTYPE AddRef(void) override { return 1; }
    virtual ULONG STDMETHODCALLTYPE Release(void) override { return 1; }

    virtual HRESULT STDMETHODCALLTYPE GetParameters(DWORD* pdwFlags, DWORD* pdwQueue) override
    {
        // we return immediately and don't do anything except signaling another thread
        *pdwFlags = MFASYNC_SIGNAL_CALLBACK;
        *pdwQueue = MFASYNC_CALLBACK_QUEUE_IO;
        return S_OK;
    }

    virtual HRESULT STDMETHODCALLTYPE Invoke(IMFAsyncResult* pAsyncResult) override
    {
        IMFMediaEvent* event = 0;
        eventGen->EndGetEvent(pAsyncResult, &event);
        if (event)
        {
            MediaEventType type;
            event->GetType(&type);
            switch (type)
            {
            case METransformNeedInput: InterlockedIncrement(&NeedsInput); break;
            case METransformHaveOutput: InterlockedIncrement(&HasOutput); break;
            }
            event->Release();
            SetEvent(TickEvent);
        }

        eventGen->BeginGetEvent(this, 0);
        return S_OK;
    }

    CComQIPtr<IMFMediaEventGenerator> eventGen = nullptr;
    HANDLE TickEvent;
    IMFTransform* _pEncoder = nullptr;

    unsigned int NeedsInput = 0;
    unsigned int HasOutput = 0;
};

নমুনা পদ্ধতি উত্পন্ন করুন:

bool GenerateSampleAsync() {

    DWORD processOutputStatus = 0;
    HRESULT mftProcessOutput = S_OK;
    bool frameSent = false;

    // Create sample
    CComPtr<IMFSample> currentVideoSample = nullptr;

    MFT_OUTPUT_STREAM_INFO StreamInfo;

    // wait for any callback to come in
    WaitForSingleObject(_pEventCallback->TickEvent, INFINITE);

    while (_pEventCallback->NeedsInput) {

        if (!currentVideoSample) {

            (pDesktopDuplication)->releaseBuffer();
            (pDesktopDuplication)->cleanUpCurrentFrameObjects();

            bool bTimeout = false;

            if (pDesktopDuplication->GetCurrentFrameAsVideoSample((void**)& currentVideoSample, waitTime, bTimeout, deviceRect, deviceRect.Width(), deviceRect.Height())) {

                prevVideoSample = currentVideoSample;
            }
            // Feed the previous sample to the encoder in case of no update in display
            else {
                currentVideoSample = prevVideoSample;
            }
        }

        if (currentVideoSample)
        {
            InterlockedDecrement(&_pEventCallback->NeedsInput);
            _frameCount++;

            CHECK_HR(currentVideoSample->SetSampleTime(mTimeStamp), "Error setting the video sample time.");
            CHECK_HR(currentVideoSample->SetSampleDuration(VIDEO_FRAME_DURATION), "Error getting video sample duration.");

            CHECK_HR(_pTransform->ProcessInput(inputStreamID, currentVideoSample, 0), "The resampler H264 ProcessInput call failed.");

            mTimeStamp += VIDEO_FRAME_DURATION;
        }
    }

    while (_pEventCallback->HasOutput) {

        CComPtr<IMFSample> mftOutSample = nullptr;
        CComPtr<IMFMediaBuffer> pOutMediaBuffer = nullptr;

        InterlockedDecrement(&_pEventCallback->HasOutput);

        CHECK_HR(_pTransform->GetOutputStreamInfo(outputStreamID, &StreamInfo), "Failed to get output stream info from H264 MFT.");

        CHECK_HR(MFCreateSample(&mftOutSample), "Failed to create MF sample.");
        CHECK_HR(MFCreateMemoryBuffer(StreamInfo.cbSize, &pOutMediaBuffer), "Failed to create memory buffer.");
        CHECK_HR(mftOutSample->AddBuffer(pOutMediaBuffer), "Failed to add sample to buffer.");

        MFT_OUTPUT_DATA_BUFFER _outputDataBuffer;
        memset(&_outputDataBuffer, 0, sizeof _outputDataBuffer);
        _outputDataBuffer.dwStreamID = outputStreamID;
        _outputDataBuffer.dwStatus = 0;
        _outputDataBuffer.pEvents = nullptr;
        _outputDataBuffer.pSample = mftOutSample;

        mftProcessOutput = _pTransform->ProcessOutput(0, 1, &_outputDataBuffer, &processOutputStatus);

        if (mftProcessOutput != MF_E_TRANSFORM_NEED_MORE_INPUT)
        {
            if (_outputDataBuffer.pSample) {

                CComPtr<IMFMediaBuffer> buf = NULL;
                DWORD bufLength;
                CHECK_HR(_outputDataBuffer.pSample->ConvertToContiguousBuffer(&buf), "ConvertToContiguousBuffer failed.");

                if (buf) {

                    CHECK_HR(buf->GetCurrentLength(&bufLength), "Get buffer length failed.");
                    BYTE* rawBuffer = NULL;

                    fFrameSize = bufLength;
                    fDurationInMicroseconds = 0;
                    gettimeofday(&fPresentationTime, NULL);

                    buf->Lock(&rawBuffer, NULL, NULL);
                    memmove(fTo, rawBuffer, fFrameSize > fMaxSize ? fMaxSize : fFrameSize);

                    bytesTransfered += bufLength;

                    FramedSource::afterGetting(this);

                    buf->Unlock();

                    frameSent = true;
                }
            }

            if (_outputDataBuffer.pEvents)
                _outputDataBuffer.pEvents->Release();
        }
        else if (MF_E_TRANSFORM_STREAM_CHANGE == mftProcessOutput) {

            // some encoders want to renegotiate the output format. 
            if (_outputDataBuffer.dwStatus & MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE)
            {
                CComPtr<IMFMediaType> pNewOutputMediaType = nullptr;
                HRESULT res = _pTransform->GetOutputAvailableType(outputStreamID, 1, &pNewOutputMediaType);

                res = _pTransform->SetOutputType(0, pNewOutputMediaType, 0);//setting the type again
                CHECK_HR(res, "Failed to set output type during stream change");
            }
        }
        else {
            HandleFailure();
        }
    }

    return frameSent;
}

ভিডিও নমুনা এবং রঙ রূপান্তর তৈরি করুন:

bool GetCurrentFrameAsVideoSample(void **videoSample, int waitTime, bool &isTimeout, CRect &deviceRect, int surfaceWidth, int surfaceHeight)
{

FRAME_DATA currentFrameData;

m_LastErrorCode = m_DuplicationManager.GetFrame(&currentFrameData, waitTime, &isTimeout);

if (!isTimeout && SUCCEEDED(m_LastErrorCode)) {

    m_CurrentFrameTexture = currentFrameData.Frame;

    if (!pDstTexture) {

        D3D11_TEXTURE2D_DESC desc;
        ZeroMemory(&desc, sizeof(D3D11_TEXTURE2D_DESC));

        desc.Format = DXGI_FORMAT_NV12;
        desc.Width = surfaceWidth;
        desc.Height = surfaceHeight;
        desc.MipLevels = 1;
        desc.ArraySize = 1;
        desc.SampleDesc.Count = 1;
        desc.CPUAccessFlags = 0;
        desc.Usage = D3D11_USAGE_DEFAULT;
        desc.BindFlags = D3D11_BIND_RENDER_TARGET;

        m_LastErrorCode = m_Id3d11Device->CreateTexture2D(&desc, NULL, &pDstTexture);
    }

    if (m_CurrentFrameTexture && pDstTexture) {

        // Copy diff area texels to new temp texture
        //m_Id3d11DeviceContext->CopySubresourceRegion(pNewTexture, D3D11CalcSubresource(0, 0, 1), 0, 0, 0, m_CurrentFrameTexture, 0, NULL);

        HRESULT hr = pColorConv->Convert(m_CurrentFrameTexture, pDstTexture);

        if (SUCCEEDED(hr)) { 

            CComPtr<IMFMediaBuffer> pMediaBuffer = nullptr;

            MFCreateDXGISurfaceBuffer(__uuidof(ID3D11Texture2D), pDstTexture, 0, FALSE, (IMFMediaBuffer**)&pMediaBuffer);

            if (pMediaBuffer) {

                CComPtr<IMF2DBuffer> p2DBuffer = NULL;
                DWORD length = 0;
                (((IMFMediaBuffer*)pMediaBuffer))->QueryInterface(__uuidof(IMF2DBuffer), reinterpret_cast<void**>(&p2DBuffer));
                p2DBuffer->GetContiguousLength(&length);
                (((IMFMediaBuffer*)pMediaBuffer))->SetCurrentLength(length);

                //MFCreateVideoSampleFromSurface(NULL, (IMFSample**)videoSample);
                MFCreateSample((IMFSample * *)videoSample);

                if (videoSample) {

                    (*((IMFSample **)videoSample))->AddBuffer((((IMFMediaBuffer*)pMediaBuffer)));
                }

                return true;
            }
        }
    }
}

return false;
}

মেশিনের ইন্টেল গ্রাফিক্স ড্রাইভার ইতিমধ্যে আপ টু ডেট।

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

কেবলমাত্র ট্রান্সফর্মনিডইনপুট ইভেন্টটি সর্বদা ট্রিগার হয়ে উঠছে তবুও এনকোডার অভিযোগ করে যে এটি আর কোনও ইনপুট গ্রহণ করতে পারে না। ট্রান্সফর্মহেভআউটপুট ইভেন্টটি কখনই ট্রিগার হয়নি।

এখানে চিত্র বর্ণনা লিখুন

ইন্টেল এবং এমএসডিএন ফোরামে অনুরূপ ইস্যুগুলি প্রতিবেদন করা হয়েছে: 1) https://software.intel.com/en-us/forums/intel-media-sdk/topic/607189 2) https://social.msdn.microsoft.com/ ফোরাম / নিরাপত্তা / en-মার্কিন / fe051dd5-b522-4e4b-9cbb-2c06a5450e40 / imfsinkwriter-মেধার-বৈধতা-ব্যর্থ-জন্য-mft-ইন্টেল-দ্রুত-সিঙ্ক-ভিডিও-H264-এনকোডার-mft? ফোরাম = mediafoundationdevelopment

আপডেট: আমি কেবলমাত্র ইনপুট উত্সকে উপহাস করার চেষ্টা করেছি (প্রোগ্রামগতভাবে একটি অ্যানিমেটিং আয়তক্ষেত্র এনভি 12 নমুনা তৈরি করে) অন্য সমস্ত কিছু ছেড়ে না রেখে। এবার, ইন্টেল এনকোডার কোনও অভিযোগ করবে না, আমি এমনকি আউটপুট নমুনা পেয়েছি। ইন্টেল এনকোডারটির আউটপুট ভিডিওটি বিকৃত করা হয়েছে এমনদিকে এনভিডিয়া এনকোডার পুরোপুরি সূক্ষ্মভাবে কাজ করে cept

তদুপরি, আমি এখনও ইন্টেল এনকোডার সহ আমার মূল এনভি 12 উত্সের জন্য প্রক্রিয়া ইনপুট ত্রুটিটি পাচ্ছি। এনভিডিয়া এমএফটি এবং সফ্টওয়্যার এনকোডারগুলির সাথে আমার কোনও সমস্যা নেই।

ইন্টেল হার্ডওয়্যার এমএফটির আউটপুট: (দয়া করে এনভিডিয়া এনকোডারটির আউটপুটটি দেখুন) এখানে চিত্র বর্ণনা লিখুন

এনভিডিয়া হার্ডওয়্যার এমএফটি আউটপুট: এখানে চিত্র বর্ণনা লিখুন

এনভিডিয়া গ্রাফিক্স ব্যবহারের পরিসংখ্যান: এখানে চিত্র বর্ণনা লিখুন

ইন্টেল গ্রাফিক্স ব্যবহারের পরিসংখ্যান (কেন জিপিইউ ইঞ্জিনটি ভিডিও ডিকোড হিসাবে প্রদর্শিত হয়) তা আমি বুঝতে পারি না: এখানে চিত্র বর্ণনা লিখুন


কোনও প্রাসঙ্গিক কোড দেখানো হয়নি। এটা সম্ভবত যে কিছু ভুল ঠিক কাছাকাছি "প্রয়োজন ইনপুট" গ্রহণ এবং সঙ্গে এটি প্রদানের যায় ProcessInput
রোমান আর।

@RomanR। যদি এটি হয় তবে এটি সফ্টওয়্যার ও এনভিডিয়া হার্ডওয়্যার এমএফটিগুলির জন্যও ব্যর্থ হতে পারে, তাই না? আমি এমএফটি এবং ইনপুট এবং আউটপুট কনফিগারেশনগুলি গণনা সম্পর্কিত কোনও কোড দেখায়নি কারণ এটি একটি অপ্রয়োজনীয়, অপ্রয়োজনীয় এবং একটি থ্রেডের জন্য অনেক দীর্ঘ হবে কারণ আমি উল্লেখ করেছি যে আমি ইন্টেল ফোরামে প্রদত্ত ঠিক একই কোডটি অনুসরণ করেছি ( সফটওয়্যার। / এন-ইউএস / ফোরাম / ইন্টেল-মিডিয়া-এসডিকে / বিষয় / 681571 )। আমি প্রয়োজনীয় কোড ব্লক সহ এই থ্রেডটি আপডেট করার চেষ্টা করব।
রাম

না এটা না. এএমডি, ইন্টেল এবং এনভিআইডিআইএর হার্ডওয়্যার এমএফটিগুলি একইভাবে প্রয়োগ করে তবে একই সময়ে কিছুটা ভিন্ন আচরণ করে। তিনটিই বেশিরভাগই অ্যাসিঙ্ক এমএফটি হিসাবে কাজ করে তাই আপনার প্রশ্নটি একটি আপাত ইঙ্গিত যা আপনি কিছু ভুল করছেন। কোনও কোড সহ এটি ঠিক কী অনুমান করা যায়। মাইক্রোসফ্টের সফ্টওয়্যার এনকোডারটি এমএফটি আফায়ার সিঙ্ক হয়, তাই সম্ভবত এটি অসম্পূর্ণ এমএফটি এর সাথে যোগাযোগের অংশ যেখানে কিছু ঠিক নেই।
রোমান আর।

বিটিডাব্লু that ইন্টেল ফোরামের কোডটি আমার জন্য কাজ করে এবং ভিডিও তৈরি করে produces
রোমান আর।

@RomanR। আমি আমার আইএমএফসিএনসিএলক্যালব্যাক, নমুনা তৈরি এবং রঙ রূপান্তর, প্রক্রিয়া ইনপুট এবং প্রসেসআউটপুট প্রয়োগ করে থ্রেড আপডেট করেছি। রঙ রূপান্তরকারীটি সহজেই এখান থেকে নেওয়া হয়েছে ( github.com/NVIDIA/video-sdk-sams/blob/master/… )।
রাম

উত্তর:


2

আমি আপনার কোড তাকান।

আপনার পোস্ট অনুসারে, আমি একটি ইন্টেল ভিডিও প্রসেসরের সমস্যা সন্দেহ করি।

আমার ওএসটি উইন 7, সুতরাং আমি আমার এনভিডিয়া কার্ডে একটি ডি 3 ডি 9 ডিভাইস এবং তারপরে একটি ইন্টেল এইচডি গ্রাফিক্স 4000 এ ভিডিও প্রসেসরের আচরণটি পরীক্ষা করার সিদ্ধান্ত নিয়েছি।

আমি মনে করি ভিডিও প্রসেসরের ক্ষমতাগুলি D3D9 ডিভাইসগুলির জন্য D3D11 ডিভাইসের মতো একই আচরণ করবে। অবশ্যই এটি চেক করা প্রয়োজন হবে।

সুতরাং আমি এই প্রোগ্রামটি যাচাই করার জন্য তৈরি করেছি: https://github.com/mofo7777/DirectXVideoScreen (দেখুন D3D9VideoProcessor সাব-প্রকল্প)

দেখে মনে হচ্ছে আপনি ভিডিও প্রসেসরের ক্ষমতা সম্পর্কে পর্যাপ্ত জিনিস পরীক্ষা করেন না do

আইডিএক্সএইভিএইচডি_ ডিভাইস :: গেটভিডিওপ্রসেসর ডিভাইসক্যাপস সহ, আমি যা যা পরীক্ষা করি তা এখানে:

ডিএক্সভিএইচডি_ভিপিডিইভিসিএপিএস.ম্যাক্স ইনপুট স্ট্রিমস> 0

ডিএক্সভিএইচডি_ভিপিডিইভিসিএপিএস.ভিডিওপ্রসেসর অ্যাকাউন্ট> 0

ডিএক্সভিএইচডি_ভিপিডিইভিসিএপিএস.আউটপুট ফরম্যাটকাউন্ট> 0

DXVAHD_VPDEVCAPS. ইনপুট ফর্ম্যাট অ্যাকাউন্ট> 0

DXVAHD_VPDEVCAPS. ইনপুটপুল == D3DPOOL_DEFAULT

আমি আইডিএক্সএইভিএইচডিডিডিভিসেস :: গেটভিডিওপ্রসেসর আউটপুট ফর্ম্যাট এবং আইডিএক্সএইভিএইচডিডি ডিভাইস :: গেটভিডিওপ্রসেসরআইপুট ফর্ম্যাটগুলির সাথে সমর্থিত ইনপুট এবং আউটপুট ফর্ম্যাটটিও যাচাই করি।

এইখানেই আমি এনভিডিয়া জিপিইউ এবং ইন্টেল জিপিইউয়ের মধ্যে পার্থক্য পেয়েছি।

এনভিআইডিএ: 4 আউটপুট ফর্ম্যাট

  • D3DFMT_A8R8G8B8
  • D3DFMT_X8R8G8B8
  • D3DFMT_YUY2
  • D3DFMT_NV12

ইনটেল: 3 আউটপুট ফর্ম্যাট

  • D3DFMT_A8R8G8B8
  • D3DFMT_X8R8G8B8
  • D3DFMT_YUY2

ইন্টেল এইচডি গ্রাফিকস 4000 এ, এনভি 12 আউটপুট ফর্ম্যাটটির জন্য কোনও সমর্থন নেই।

এছাড়াও প্রোগ্রামটি সঠিকভাবে কাজ করার জন্য, আমাকে ভিডিওপ্রসেসব্লটএইচডি ব্যবহার করার আগে স্ট্রিমের স্থিতি সেটআপ করতে হবে:

  • DXVAHD_STREAM_STATE_D3DFORMAT
  • DXVAHD_STREAM_STATE_FRAME_FORMAT
  • DXVAHD_STREAM_STATE_INPUT_COLOR_SPACE
  • DXVAHD_STREAM_STATE_SOURCE_RECT
  • DXVAHD_STREAM_STATE_DESTINATION_RECT

ডি 3 ডি 11 এর জন্য:

ID3D11VideoProcessorEnumerator :: গেটভিডিওপ্রসেসর ক্যাপস == আইডিএক্সএইভিএইচডি_ ডিভাইস :: গেটভিডিওপ্রসেসর ডিভাইসক্যাপস

(D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_OUTPUT) ID3D11VideoProcessorEnumerator :: চেকভিডিওপ্রসেসর ফর্ম্যাট == আইডিএক্সএইচএইচডি_ ডিভাইস :: গেটভিডিওপ্রসেসর আউটপুট ফর্ম্যাট

(D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT_INPUT) ID3D11VideoProcessorEnumerator :: চেকভিডিওপ্রসেসর ফর্ম্যাট == আইডিএক্সএইভিএইচডি_ডভাইস :: গেটভিডিওপ্রসেসর ইনপুট ফর্ম্যাট

ID3D11VideoContext :: (...) == আইডিএক্সভিএইচডি_ভিডিওপ্রসেসর :: সেটভিডিওপ্রসেস স্ট্রিম স্টেট

আপনি প্রথমে আপনার জিপিইউর ভিডিও প্রসেসরের ক্ষমতা যাচাই করতে পারবেন। আমি যেমন দেখছি তেমন পার্থক্যও দেখছ?

এটি আমাদের প্রথম জানা দরকার এবং আপনার গিথুব প্রকল্পে আমি যা দেখেছি তা থেকে আপনার প্রোগ্রাম এটি পরীক্ষা করে না বলে মনে হয়।


তুমি ঠিক. ইন্টেল গ্রাফিক্সে গেটভিডিওপ্রসেসরআউটপুট ফর্ম্যাটগুলি কেবল আরজিবি ভেরিয়েন্ট এবং YUY2 পেয়েছিল।
রাম

আমি সহজেই আরজিবিএ টেক্সচারটিকে ইন্টেল প্রসেসরের YUY2 তে রূপান্তর করতে সক্ষম। তবে ধরা পড়েছে, মনে হচ্ছে ইন্টেল গ্রাফিক্স কেবল এনভি 12 ইনপুট ফর্ম্যাটকে সমর্থন করে। এখন রঙ রূপান্তরকারী এবং ভিডিও এনকোডারটি বেমানান। আমি এখনও ভাবছি কেন কেন ইন্টেল এটিকে এভাবে তৈরি করার সিদ্ধান্ত নিয়েছে। আরবিজি থেকে এনভি 12 রূপান্তরকরণের দক্ষতার সাথে আর কি উপায় আছে? আমি ইতিমধ্যে এমন সফ্টওয়্যার পদ্ধতির চেষ্টা করেছি যা পর্যাপ্ত পারফরম্যান্স দেয় না।
রাম

আপনার শেডার বা গণনা শেডার রয়েছে।
mofo77

1
আমি একটি ছায়াময় পদ্ধতির উপর কাজ করছি। আপডেটের জন্য github.com/mofo7777/ DirectXVideoScreen দেখুন ।
mofo77

গ্রেট! ভাগ করে নেওয়ার জন্য ধন্যবাদ, এটি সত্যিই সহায়ক।
রাম

1

পোস্টে উল্লিখিত হিসাবে, ত্রুটি MEError ("অনির্ধারিত ত্রুটি") ট্রান্সফর্মের ইভেন্ট জেনারেটর দ্বারা ইন্টেল হার্ডওয়ারে প্রথম ইনপুট নমুনা খাওয়ানোর সাথে সাথেই ফিরে এসেছিল এবং আরও কলগুলি "ট্রান্সফর্ম আরও বেশি ইনপুট দরকার" ফিরিয়েছিল, তবে কোনও আউটপুট উত্পাদিত হয়নি । একই কোড এনভিডিয়া মেশিনে সূক্ষ্মভাবে কাজ করেছে। অনেকগুলি পরীক্ষা-নিরীক্ষা ও গবেষণা করার পরে আমি বুঝতে পেরেছিলাম যে আমি ডি 3 ডি 11 ডিভাইসটির অনেকগুলি উদাহরণ তৈরি করছি, আমার ক্ষেত্রে, আমি যথাক্রমে ক্যাপচারিং, রঙ রূপান্তরকরণ এবং হার্ডওয়্যার এনকোডার জন্য 2 থেকে 3 টি ডিভাইস তৈরি করেছি। তবে, আমি কেবল একটি একক ডি 3 ডিভাইস উদাহরণটি পুনরায় ব্যবহার করতে পারতাম। একাধিক ডি 3 ডি 11 ডিভাইস উদাহরণ তৈরি করা উচ্চ-মেশিনে যদিও কাজ করতে পারে work এটি কোথাও নথিভুক্ত করা হয় না। "MEError" ত্রুটির কারণগুলির জন্য আমি কোনও সন্ধানও খুঁজে পাইনি। এটি কোথাও উল্লেখ করা হয়নি।

D3D11 ডিভাইস পুনরায় ব্যবহার করা সমস্যার সমাধান করেছে। এই সমাধানটি পোস্ট করা লোকেদের পক্ষে সহায়ক হিসাবে যেমন আমার হিসাবে একই সমস্যার মুখোমুখি হয়।


আমি আপনার পোস্টে দেখতে পাচ্ছি না যেখানে E_UNEXPECTED ত্রুটির উল্লেখ করা হয়েছে ...
mofo77

@ মোফো 7777, দুঃখিত, পোস্টে উল্লিখিত হিসাবে এটি এমআরর = ১ ("অনির্দিষ্ট ত্রুটি") ছিল। আমি একধরনের মন হারিয়ে ফেলেছি। আমার উত্তর সংশোধন করেছেন। নির্দেশ করার জন্য ধন্যবাদ।
রাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.