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

Posted faststream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于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

RK3588平台开发系列讲解(AUDIO篇)基于alsa api的音频播放/录制流程

平台 内核版本 安卓版本
RK3588 Linux 5.10 Android 12

文章目录

沉淀、分享、成长,让自己和他人都能有所收获!

以上是关于基于rk3399 (Linux)的多视频窗口播放器的主要内容,如果未能解决你的问题,请参考以下文章

RK3399驱动开发 | 08 - RK3399显示系统详解(基于RK SDK Linux 4.4.194内核)

技术案例Firefly-RK3399多路视频编解码

RK3399平台开发系列讲解(基础篇)Linux延迟工作机制 - 视频课

RK3399平台开发系列讲解(基础篇)Linux延迟工作机制 - 视频课

基于RK3399的MPP库实现的视频编码

RK3399平台开发系列讲解(同步与互斥篇)Linux内核锁机制详解 - 视频介绍