主题 : linux下4418的硬件解码有人搞过没? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 99925
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2014-01-14
最后登录: 2019-03-17
楼主  发表于: 2018-03-31 14:27

 linux下4418的硬件解码有人搞过没?

linux下4418的硬件解码有人搞过没?
最近在做4418硬件解码H.264转yuv,代码运行不下去,请教一下各路大神
我的smart4418内核版本是Linux NanoPi2 3.4.39-s5p4418 就是友善官方的
按照网上的说法,linux3.0的硬解码设备节点是/dev/s3c-mfc
linux3.5的硬解码设备节点是/dev/videox 我一看/dev/下的文件,有video4/video5/video6/video7/video8/video9/video10
好家伙这么多,只能一个个试了。
我从安卓4.2.2的源码里找到了硬解码的相关api
SsbSipMfcDecAPI.c (android-4.2.2_r1\hardware\samsung_slsi\exynos4\multimedia\codecs\video\exynos4\mfc_v4l2\dec\src)
拷贝到我自己的代码中,这个文件中有很多的LOGA LOGI函数全部用printf代替
又从安卓源码中,找到硬件编解码的固件s5p-mfc.fw,把它放到/lib/firmware下
然后我又从这里(http://www.aiothome.net/read.php?tid-28822.html)找到
@kylezhou的代码,在此基础上修改。


kylezhou写的代码应该还是linux3.0的硬件解码api,因为他的驱动节点还是/dev/s3c-mfc
3.0与3.5的SsbSipMfcDecAPI.c代码差分较大,函数接口名字差别倒不是太大,就是SsbSipMfcDecOpen这个函数3.5版本没有入口参数了

附件是我的代码 input.h264是待解码的文件
gcc(arm-none-linux-gnueabi-gcc) mainDec.c color_space_convertor.c SsbSipMfcDecAPI.c -o mainDec
直接./mainDec就行了

SsbSipMfcDecAPI.c中开头有两个定义
static char *mfc_dev_name = SAMSUNG_MFC_DEV_NAME;   //"/dev/video"
static int mfc_dev_node = 9;
程序会把两个字符串连在一起,然后去打开设备
hMFCOpen = open(mfc_dev_name, O_RDWR|O_NONBLOCK, 0);
打开设备后会发送命令VIDIOC_QUERYCAP来获取设备的能力

    ret = ioctl(pCTX->hMFC, VIDIOC_QUERYCAP, &cap);     //获取设备的能力
    if (ret != 0) {
        printf("[%s] VIDIOC_QUERYCAP failed",__func__);
        goto error_case2;
    }

    if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE_MPLANE)) {
        printf("[%s] Device does not support capture",__func__);    //设备不支持捕获
        goto error_case2;
    }

    if (!(cap.capabilities & V4L2_CAP_VIDEO_OUTPUT_MPLANE)) {
        printf("[%s] Device does not support output",__func__);     //设备不支持输出
        goto error_case2;
    }

    if (!(cap.capabilities & V4L2_CAP_STREAMING)) {
        printf("[%s] Device does not support streaming",__func__);  //设备不支持流
        goto error_case2;
    }

结果我的系统上除了video6之外,其他的video4-video10 各种不支持,不知道是怎么回事

接着又会发送VIDIOC_S_FMT命令,然后我的代码就S_FMT failed了
    
    ret = ioctl(pCTX->hMFC, VIDIOC_S_FMT, &fmt);
    if (ret != 0) {
        printf("[%s] S_FMT failed\n",__func__);
        goto error_case2;
    }
百度了一下 VIDIOC_S_FMT意思是设置当前驱动的视频捕获格式 硬解码和视频捕获有关系吗?我运行程序的时候没有插摄像头,这个没关系的吧

我的猜测是不是要linux3.5的内核版本才可以,有3.5内核的不妨试一下,看看是不是可以运行的

接下来准备自己搞一个3.5版本的内核试一试,另外我还有一个疑问,就是看到其他板子的硬件编解码要用superboot,superboot是啥?是友善自己修改的bootloader吗?是的话4418的superboot哪里能找到啊?

以上