微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果在dxva2渲染中更改视频大小应该怎么办

如何解决如果在dxva2渲染中更改视频大小应该怎么办

我用intel qsv解码视频,用dxva2渲染。代码是intel的owt native windows sdk:

void WebrtcVideoRendererD3D9Impl::OnFrame(
    const webrtc::VideoFrame& video_frame) {
  // Do we need to Lock the renderframe call? since we have the device lock here
  // it seems no neccessary.
  if (video_frame.video_frame_buffer()->type() ==
      webrtc::VideoFrameBuffer::Type::kNative) {  // We're handling DXVA buffer
    NativeD3DSurfaceHandle* nativeHandle =
        reinterpret_cast<NativeD3DSurfaceHandle*>(
            reinterpret_cast<owt::base::NativeHandleBuffer*>(video_frame.video_frame_buffer().get())->native_handle());

    IDirect3DDeviceManager9* dev_manager = nativeHandle->dev_manager_;
    if(dev_manager == nullptr){
        RTC_LOG(LS_ERROR) << "dev_manager is nullptr";
        return;
    }
    IDirect3DSurface9* surface = nativeHandle->surface_;

    IDirect3DDevice9* pDevice;
    HANDLE hDevice = 0;
    HRESULT hr = dev_manager->OpenDeviceHandle(&hDevice);
    if (Failed(hr)) {
      RTC_LOG(LS_ERROR) << "Failed to open the d3d device handle";
      return;
    }

    // Our renderer does not need to lock the device.
    hr = dev_manager->LockDevice(hDevice,&pDevice,FALSE);
    if (Failed(hr)) {
      RTC_LOG(LS_ERROR) << "Failed to lock device";
      dev_manager->CloseDeviceHandle(hDevice);
      return;
    }    
    
    CComPtr<IDirect3DSurface9> back_buffer;
    hr = pDevice->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&back_buffer);
    if (Failed(hr)) {
      RTC_LOG(LS_ERROR) << "Failed to get back buffer";
      return;
    }

    D3DSURFACE_DESC desc;
    back_buffer->GetDesc(&desc);
    RTC_LOG(LS_ERROR) << "111111111111 desc width is "<<desc.Width<<",height is "<<desc.Height;
    if (surface != nullptr) {
      hr = pDevice->StretchRect(surface,nullptr,back_buffer,D3DTEXF_NONE);
      if (Failed(hr)) {
        RTC_LOG(LS_ERROR) << "Failed to stretch the rectangle";
        return;
      }
    }

    hr = pDevice->Present(nullptr,wnd_,nullptr);

    if (hr == D3DERR_DEVICELOST) {
      RTC_LOG(LS_WARNING) << "Device lost for present.";
    }
    dev_manager->UnlockDevice(hDevice,FALSE);
    dev_manager->CloseDeviceHandle(hDevice);

    // Done with the native handle.
    delete nativeHandle;
    nativeHandle = nullptr;
  } 

改变视频图像的尺寸后,渲染的图像结果不正确,例如渲染窗口是1920*1080,但只有左上角,大约1/4的窗口是填充图像。 我猜 StretchRect 即使返回正常也不会做任何事情。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。