基于rk3399 (Linux)的多视频窗口播放器

基于rk3399 (Linux)的多视频窗口播放器

问题背景,海思芯片被制裁,用作监控安防的芯片市场价不短攀升,甚至出现花钱无法采购到的窘境,比如之前hisi3531、3559 、3536等等芯片。我们发现了另外一款性价比比较高的国产芯片——rk3399,只是他不想海思芯片那样拥有完整的生态,提供用户各种需要的api,让用户很容易实现解码播放、多窗口的叠加,移动,缩放等效果。怎么办呢?我们基于rk3399完成了一套完整的项目解码播放方案,完全可以做到多窗口叠加,移动,缩放效果。

  • 解码。
  1. 硬件解码。

解码rk提供的有rk-mpi可以实现硬件的解码。官方也提供了demo,Mpp的API思路其实跟目前绝大多数的编解码库是一致的,都是queue/dequeue的队列操作方式,先设置好编解码状态,然后不停的queue/dequeue input/output buffer就可以实现编解码控制了。如果大家熟悉FFMPEG,那学习MPP会非常容易,MPP和FFMPEG的api非常相像。

解码后得道MppFrame.

    width    = mpp_frame_get_width(frame);

    height   = mpp_frame_get_height(frame);

    h_stride = mpp_frame_get_hor_stride(frame);

    v_stride = mpp_frame_get_ver_stride(frame);

    //fmt      = mpp_frame_get_fmt(frame);

    buffer   = mpp_frame_get_buffer(frame);

    dmaFd = mpp_buffer_get_fd(buffer);

    //printf("dmaFd %x\n",dmaFd);

    //base = (RK_U8 *)mpp_buffer_get_ptr(buffer);

    int stride = mpp_frame_get_hor_stride(frame);

这里有一句关键的dmaFd = mpp_buffer_get_fd(frame);获取一个dmaFd,是一个int类型。表示一块缓存id.

这个id就是dma buffer。解码器,显示单元都能直接访问缓存内容。

  • 渲染。

 1,drm渲染。

  DRM是Linux目前主流的图形显示框架,相比FB架构,DRM更能适应当前日益更新的显示硬件。比如FB原生不支持多层合成,不支持VSYNC,不支持DMA-BUF,不支持异步更新,不支持fence机制等等,而这些功能DRM原生都支持。同时DRM可以统一管理GPU和Display驱动,使得软件架构更为统一,方便管理和维护

我们可以通过用libdrm 把dma buf 直接输出到显示器。

但是这种办法无法无法对图像缩放。于是,我想到利用opengl缩放。面临第一个问题是怎么把dmaFd 转成opengl的纹理?

 2,openggl渲染。

   

如图,利用egl的eglCreateImageKHR把解码图像dmafd转成纹理,通过opengl缩放后脚给egl,egl 通过gbm接口跟drm交互,实现图像的显示。

qq交流群:643201623

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值