xHiveAI-A311D:视频解码的实现

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到板子侧执行。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值