如何解决如果在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 举报,一经查实,本站将立刻删除。