基于FFmpeg的Dxva2硬解码及Direct3D显示(四)

显示及资源清理

  1. 显示

    关于D3D显示的大概步骤是解码数据放在缓冲区,也就是这里离屏的概念,然后将离屏数据拷贝到后台缓冲表面,后台表面和前台表面不停的交替实现显示。

    // 离屏
    LPDIRECT3DSURFACE9 surface = (LPDIRECT3DSURFACE9)pFrame->data[3];
    
    // D3DCLEAR_TARGET       清除要渲染目标(帧缓存)的颜色为D3DCOLOR_XRGB(0, 0, 0)的值
    // D3DCLEAR_ZBUFFER      清除深度缓冲(确定像素遮挡关系)的值为1.0f
    // D3DCLEAR_STENCIL     清除模板缓冲区(用于特效)为0
    // 此时1.0f和0均会被忽略
    m_pD3d9Dev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    m_pD3d9Dev->BeginScene();
    
    IDirect3DSurface9 *  pBackBuffer = nullptr;
    if (pBackBuffer)
    {
        pBackBuffer->Release();
        pBackBuffer = NULL;
    }
    
    // 获取第1个交换链上的第一个后台缓冲表面
    m_pD3d9Dev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
    m_pD3d9Dev->StretchRect(surface, NULL, pBackBuffer, &m_renderRect, D3DTEXF_LINEAR);
    m_pD3d9Dev->EndScene();
    m_pD3d9Dev->Present(NULL, NULL, NULL, NULL);
    
    #if !CAMERA
    Sleep(1000 / m_frameRate);
    #endif
  2. 资源清理
    if (m_hD3dDll)
    {
        FreeLibrary(m_hD3dDll);
        m_hD3dDll = nullptr;
    }
    
    if (m_hDxva2Dll)
    {
        FreeLibrary(m_hDxva2Dll);
        m_hDxva2Dll = nullptr;
    }
    
    if (m_pD3d9Dev)
    {
        m_pD3d9Dev->Release();
    }
    
    if (m_pD3d9DevMgr && m_hDev != INVALID_HANDLE_VALUE)
    {
        m_pD3d9DevMgr->CloseDeviceHandle(m_hDev);
    }
    
    if (m_pDecoderService)
    {
        m_pDecoderService->Release();
    }
    
    if (m_pD3d9DevMgr)
    {
        m_pD3d9DevMgr->Release();
    }
    
    // 释放缓冲区
    if (m_pSurface)
    {
        for (uint32_t i = 0; i < m_surfaceNums; i++)
        {
            if (m_pSurface[i])
                m_pSurface[i]->Release();
        }
    }
    
    // 释放DirectX解码器
    if (m_pDecoder)
    {
        m_pDecoder->Release();
        m_pDecoder = nullptr;
    }
    
    av_freep(&pCodecCtx->hwaccel_context);

原文地址:https://www.cnblogs.com/huluwa508/p/10304451.html

时间: 2024-10-31 00:12:48

基于FFmpeg的Dxva2硬解码及Direct3D显示(四)的相关文章

基于FFmpeg的Dxva2硬解码及Direct3D显示(三)

配置FFmpeg硬解码 设置解码输出格式回调 static AVPixelFormat GetHwFormat(AVCodecContext * pCodecCtx, const AVPixelFormat * pPixFmt) { // 因为采用的是DXVA2,所以这里直接写死了 return AV_PIX_FMT_DXVA2_VLD; } m_pDecoderCtx->get_format = GetHwFormat; 设置解码数据回调 // 个人理解就是将LPDIRECT3DSURFACE

[原]ffmpeg编译android 硬解码支持库 libstagefright

最近花了一天时间将ffmpeg/tools/build_stagefright执行成功,主要是交叉编译所需要的各种动态库的支持没链接上,导致各种报错,基本上网络上问到的问题我都碰到了,特此记录下来. 编译环境:Ubuntu 14.04 + Android NDK + FFmpeg源码. 第一步:将ffmpeg/tools/build_stagefright移动到ffmpeg下面,修改执行权限. chmod u+x build_stagefright 第二步:打开build_stagefright

最简单的基于FFmpeg的封装格式转换器(无编解码)

本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件).需要注意的是,本程序并不进行视音频的编码和解码工作.而是直接将视音频压缩码流从一种封装格式文件中获取出来然后打包成另外一种封装格式的文件.传统的转码程序工作原理如下图所示: 上图例举了一个举例:FLV(视频:H.264,音频:AAC)转码为AVI(视频:MPEG2,音频MP3)的例子.可见视频转码的过程通俗地讲相当于把视频和音频

【GPU编解码】GPU硬解码---DXVA

[GPU编解码]GPU硬解码---DXVA 前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream:IDCT,反余弦变换:Mocomp,运动补偿,Pixel Prediction:PostProc,显示后处理.其中,VLD加速等级最高,所以其包含IDCT.MoCoopm和PostProc:IDCT加速次之,包含

【GPU编解码】GPU硬解码---DXVA (转)

前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream:IDCT,反余弦变换:Mocomp,运动补偿,Pixel Prediction:PostProc,显示后处理.其中,VLD加速等级最高,所以其包含IDCT.MoCoopm和PostProc:IDCT加速次之,包含MoCoopm和PostProc:最后MoC

最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器

本文补充记录<最简单的基于FFMPEG+SDL的视频播放器>中的两个例子:FFmpeg视频解码器和SDL像素数据播放器.这两个部分是从视频播放器中拆分出来的两个例子.FFmpeg视频解码器实现了视频数据到YUV数据的解码,而SDL像素数据播放器实现了YUV数据的显示.简而言之,原先的FFmpeg+SDL视频播放器实现了: 视频数据->YUV->显示器 FFmpeg视频解码器实现了: 视频数据->YUV SDL像素数据播放器实现了: YUV->显示器 FFmpeg视频解码

【GPU编解码】GPU硬解码---CUVID

问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解码过程. 一.OpenCV中的硬解码 OpenCV2.4.6中,已实现利用GPU进行读取视频,由cv::gpu::VideoReader_GPU完成,其示例程序如下. 1 int main(int argc, const char* argv[]) 2 { 3 if (argc != 2) 4 re

基于 ffmpeg 的跨平台播放器实现

https://www.qcloud.com/community/article/309889001486708756 背景: 随着游戏娱乐等直播业务的增长,在移动端观看直播的需求也日益迫切.但是移动端原生的播放器对各种直播流的支持却不是很好.Android 原生的 MediaPlayer 不支持 flv.hls 直播流,iOS 只支持标准的 HLS 流.本文介绍一种基于 ffplay 框架下的跨平台播放器的实现,且兼顾硬解码的实现. 播放器原理: 直观的讲,我们播放一个媒体文件一般需要5个基本

最简单的基于FFMPEG+SDL的音频播放器:拆分-解码器和播放器

本文补充记录<最简单的基于FFMPEG+SDL的音频播放器>中的两个例子:FFmpeg音频解码器和SDL音频采样数据播放器.这两个部分是从音频播放器中拆分出来的两个例子.FFmpeg音频解码器实现了视频数据到PCM采样数据的解码,而SDL音频采样数据播放器实现了PCM数据到音频设备的播放.简而言之,原先的FFmpeg+SDL音频播放器实现了: 音频数据->PCM->音频设备 FFmpeg音频解码器实现了: 音频数据->PCM SDL音频采样数据播放器实现了: PCM->