Получение статуса декодирования видео D3D12 - PullRequest
1 голос
/ 27 апреля 2020

Я внедряю видеодекодер H264 через Direct3D 12 API - хотя я очень новичок в Direct3D, у меня есть опыт работы с другими графическими API и H264. Я изо всех сил пытался найти достойные примеры декодирования видео D3D12, но, похоже, дошел до того, что, казалось бы, успешно отправил свою работу в декодер.

Однако я не знаю, как запросить статус декодирования. После объединения документации и некоторого другого кода, который я нашел, я думаю, что это что-то вроде этого - отображение результата в структуру статуса - но я получаю ошибку недопустимого аргумента. Может ли кто-нибудь указать мне верное направление, и любые хорошие примеры декодирования видео D3D12 будут отличным ресурсом.

    // decode_commands is a ID3D12VideoDecodeCommandList
    // query_heap is a ID3D12QueryHeap
    // device is a ID3D12Device

    // Make query for decode stats.
    decode_commands->EndQuery(query_heap.Get(), D3D12_QUERY_TYPE::D3D12_QUERY_TYPE_VIDEO_DECODE_STATISTICS, 0);

    // Create buffer for query result.
    ComPtr<ID3D12Resource> query_result;
    D3D12_RESOURCE_DESC query_result_description = CD3DX12_RESOURCE_DESC::Buffer(sizeof(D3D12_QUERY_DATA_VIDEO_DECODE_STATISTICS));
    HRESULT create_query_result = device->CreateCommittedResource(
        &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE::D3D12_HEAP_TYPE_DEFAULT),
        D3D12_HEAP_FLAGS::D3D12_HEAP_FLAG_NONE,
        &query_result_description,
        D3D12_RESOURCE_STATES::D3D12_RESOURCE_STATE_COPY_DEST,
        nullptr,
        IID_PPV_ARGS(&query_result));
    if (FAILED(create_query_result)) {
        log("Failed to create query result");
        return false;
    }

    // Resolve query.
    decode_commands->ResolveQueryData(query_heap.Get(), D3D12_QUERY_TYPE::D3D12_QUERY_TYPE_VIDEO_DECODE_STATISTICS, 0, 1, query_result.Get(), 0);

    // Get stats from query result.
    D3D12_RANGE range;
    range.Begin = 0;
    range.End = sizeof(D3D12_QUERY_DATA_VIDEO_DECODE_STATISTICS);
    D3D12_QUERY_DATA_VIDEO_DECODE_STATISTICS stats;
    HRESULT map = query_result->Map(0, &range, reinterpret_cast<void**>(&stats));
    if (FAILED(map)) {
        log("Failed to map query result");
        return false;
    }

1 Ответ

0 голосов
/ 28 апреля 2020

Возможно, вам следует начать с рабочего примера из D3D9 API:

H264Dxva2Decoder

Чем вы напишите декодер D3D12, это то, что я бы сделал.

...