A311D芯片支持4K@60fps VP9,H265,H264视频解码或者最多4路1080P@25fps的多格式视频解码(H265,H264,MPEG-1/2/4,VP9,WMV)。
xHiveAI-A311D实现了基于gstreamer的媒体处理平台,方便客户快速定制和开发自己的应用程序,而不必关心底层硬件的实现逻辑。
第一节:快速体验视频解码
1)将开发板与具有HDMI接口的显示器通过HDMI线连接
2)上电后启动板子,登陆到shell
3)执行下面命令
gst-launch-1.0 filesrc location=/var/<h264编码的视频文件> ! parsebin ! v4l2h264dec capture-io-mode=dmabuf ! waylandsink
命令执行后应该可以在显示器上看到播放出来的视频内容。
Known Issues Debug:
a) 显示器视频显示不正常
cat /sys/class/display/mode
invalid OR 1080p60hz
检查你的显示器配置是否匹配。如不匹配,需要echo "<new config>" > /sys/class/display/mode
b) 显示器上没有视频显示
首先检查命令执行的时候,gstreamer是否有错误报告,导致无法正常解码
其次拔插一下hdmi线,看串口是否有正确识别LCD显示器的打印信息,例子如下:
[ 338.355821@0] vout: vmode set to 1080p60hz
[ 338.356741@0] vlock: event MODE_CHANGE_PRE 0
[ 338.362161@0] hdmitx: hdmitx_set_current_vmode[4852]
[ 338.366092@0] hdmitx: system: recalc before 1080p60hz 2997 50
[ 338.371614@0] hdmitx: system: recalc after 1080p60hz 2997 50
[ 338.377312@0] hdmitx: system: get current mode: 1080p60hz
[ 338.382589@0] hdmitx: system: update physcial size: 16 9
[ 338.387910@2] hdmitx: system: [set_disp_mode_auto] ALREADY init VIC = 16
[ 338.394543@2] hdmitx: system: update rx hdr info 0
[ 338.399296@2] vout: new mode 1080p60hz set ok
[ 338.403628@2] DOLBY: vout_notify_callback: VOUT_EVENT_MODE_CHANGE
[ 338.409688@2] vlock: event MODE_CHANGE
第二节:编写获取解码后视频图片的程序
在搭建一个针对输入视频的AI处理程序的时候,首先就会需要获得一帧一帧解码后的视频图片数据,然后对该视频图片进行color space的转换(YUV到RGB 等),对图片进行resize的操作(1080p转换为720p大小的图片),这些实现的具体内容请参看文章:图片color space的转换和resize操作。最后处理后的数据送给AI模块进行处理。
1)请参考文章:开发环境准备
2)在代码树的目录video_decode/vframes/src下,有例子程序如下:
#include "libxhiveplayer.h"
#include "callback.h"
ST_InputDataInfo_t data_info;
/*当一帧视频数据解码后,该callback函数被调用返回解码后的视频数据和相关的信息*/
static int vframes_callback(void *p_pOwner, void *cb_data) {
ST_EPCallbackData *data_info = (ST_EPCallbackData *)cb_data;
data_info->stCallbackFrameInfo[0].stVideoFrame.pszFrameData:解码出的原始视频数据,格式为data_info.format定义的
data_info->stCallbackFrameInfo[0].stVideoFrame.uFrameSize: 解码出的原始视频数据大小
data_info->stCallbackFrameInfo[1].stVideoFrame.pszFrameData:resize后的视频数据,格式为data_info.format定义的
data_info->stCallbackFrameInfo[1].stVideoFrame.uFrameSize: resize后的视频数据大小
}
/*对于多路解码的应用,用户可能需要传入标识该路解码的数据结构指针。
该指针不会做处理,直接由callback函数vframes_callback()中的*p_pOwner返回
*/
data_info.cb_priv = (void *)<private data pointer>;
/*自定义的callback函数来处理返回的视频图片*/
data_info.cb_aifncb = (void *)vframes_callback;
data_info.rsz_width = <如果图片需要同时返回resize之后的图片,在这里输入resize的宽度>;
data_info.rsz_height = <如果图片需要同时返回resize之后的图片,在这里输入resize的高度>;
data_info.format = <硬件解码后的视频数据格式是GST_VIDEO_DATA_FORMAT_NV12,
如果需要直接返回其他格式的数据,需要在这里定义>;
/*播放视频流,一直到播放完成*/
xhiveplayer_vcb(<播放视频的URL,可以为http, rtsp, file etc>,
<解码路数的id>,
<多线程处理多路解码:0; 多进程处理解码:1>,
(void *)&data_info);
3)修改Makefile.example后,编译代码,scp到板子侧执行。