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

faststream faststream     2023-04-04     478

关键词:

基于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

rk3399系统移植|基于rk-linux-sdk移植kernel(4.4.194)(代码片段)

一、使用已有配置测试1.编译配置查看已有配置:编译配置:exportARCH=arm64exportCROSS_COMPILE=aarch64-linux-gnu-makerockchip_linux_defconfig2.编译make-j83.测试使用rk3399-evb开发板的设备树生成img镜像:makerk3399-evb-ind-lpddr4-linux.img 查看详情

rk3399系统移植|基于rk-linux-sdk移植kernel(4.4.194)(代码片段)

一、使用已有配置测试1.编译配置查看已有配置:编译配置:exportARCH=arm64exportCROSS_COMPILE=aarch64-linux-gnu-makerockchip_linux_defconfig2.编译make-j83.测试使用rk3399-evb开发板的设备树生成img镜像:makerk3399-evb-ind-lpddr4-linux.img 查看详情

rk3399驱动开发|11-rk3399以太网调试(基于linux5.4.32内核)

一、问题描述二、问题定位初步判断是驱动没有加载起来,进menuconfig查一下(DeviceDrivers>Networkdevicesupport>Ethernetdriversupport),果然都是模块:三、问题解决将驱动直接选择编译进内核:四、测试查看网... 查看详情

rk3399驱动开发|11-rk3399以太网调试(基于linux5.4.32内核)

一、问题描述二、问题定位初步判断是驱动没有加载起来,进menuconfig查一下(DeviceDrivers>Networkdevicesupport>Ethernetdriversupport),果然都是模块:三、问题解决将驱动直接选择编译进内核:四、测试查看网... 查看详情

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

查看详情

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

查看详情

基于rk3399的mpp库实现的视频编码(代码片段)

        本项目实现主要是通过对采集的摄像头或相机输入的视频数据,经过RKMPP的MPP库接口实现视频编码,输出H264的编码数据。代码实现如下:camerareader.h#ifndefCAMERAREADER_H#defineCAMERAREADER_H#include<stdint.h>classCame... 查看详情

rk3399平台开发系列讲解(设备管理篇)linux设备管理机制-视频介绍

查看详情

rk3399平台开发系列讲解(内核调试篇)常用linux内核调试手段介绍-视频介绍

查看详情

rk3399平台开发系列讲解(内核调试篇)常用linux内核调试手段介绍-视频介绍

查看详情

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

查看详情

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

查看详情

rk3399平台开发系列讲解(外设篇)3.35gmacrgmiidelaylineguide窗口配置

平台内核版本安卓版本RK3399Linux4.4Android7.1 查看详情

rk3399平台开发系列讲解(外设篇)3.35gmacrgmiidelaylineguide窗口配置

平台内核版本安卓版本RK3399Linux4.4Android7.1 查看详情

rk3399驱动开发|08-rk3399显示系统详解(基于rksdklinux4.4.194内核)

一、RK3399的显示系统RK3399有两个视频显示控制器(VOP,VideoOutputProcessor),支持不同的分辨率,分别为VOPB和VOPL。在多媒体接口框图中可以看到,RK3399支持以下显示接口:支持双通道MIPI-DSI(4线)支持双通道MIPI-CSI(4线)支持eDP1.... 查看详情

rk3399驱动开发|08-rk3399显示系统详解(基于rksdklinux4.4.194内核)

一、RK3399的显示系统RK3399有两个视频显示控制器(VOP,VideoOutputProcessor),支持不同的分辨率,分别为VOPB和VOPL。在多媒体接口框图中可以看到,RK3399支持以下显示接口:支持双通道MIPI-DSI(4线)支持双通道MIPI-CSI(4线)支持eDP1.... 查看详情

rk3399平台开发系列讲解(设备管理篇)linux设备管理机制-视频介绍

🚀返回专栏总目录文章目录一、视频介绍二、PPT分享沉淀、分享、成长,让自己和他人都能有所收获!😄一、视频介绍二、PPT分享 查看详情

技术案例firefly-rk3399多路视频编解码

...U),能够流畅的实现H.264编解码功能,可以同时进行两路视频编码和五路视频解码。在应用方面,多路编解码功能可以更优秀地应用于同时录像和播放多个视频的场景。一、多路视频编解码演示需要准备:(1)一台Firefly-RK3399开... 查看详情