龙紫藤

龙紫藤

0个粉丝

1

问答

0

专栏

0

资料

龙紫藤  发布于  2025-02-06 10:32:33
采纳率 0%
1个问答
296

请教下:海思3519DV500 VDEC后,获取解码后数据要怎么处理才能拿到正确的YUV数据?

 

看/dev/logmpp日志,送进去的数据解码没有出错,但是取出来的数据写YUV,看到数据不正确。

    td_s32 milli_sec = -1;// -1堵塞; 0 非堵塞;正值:超时值,无上限。单位ms.
    ot_video_frame_info frame_info;
    ot_vdec_supplement_info supplement;

    td_s32 ret = ss_mpi_vdec_get_frame(m_vdecChn, &frame_info, &supplement, milli_sec);

    if (TD_SUCCESS == ret)
    {
        printf("mod_id = %d, pool_id = %d.\n", frame_info.mod_id, frame_info.pool_id);
        printfPixelFormat((int)frame_info.video_frame.pixel_format);

        printf("pixel_format=%d compress_mode=%d.\n",
            frame_info.video_frame.pixel_format, frame_info.video_frame.compress_mode);

        td_s32 length = frame_info.video_frame.stride[0] * frame_info.video_frame.height * 3 / 2;
        td_s32 u32YLength = frame_info.video_frame.stride[0] * frame_info.video_frame.height;
        td_s32 u32UVLength = frame_info.video_frame.stride[1] * frame_info.video_frame.height / 2;
        // ss_mpi_sys_mmap_cached
        td_char* pYFrame = (td_char*)ss_mpi_sys_mmap(frame_info.video_frame.phys_addr[0], u32YLength);
        td_char* pVUFrame = (td_char*)ss_mpi_sys_mmap(frame_info.video_frame.phys_addr[1], u32UVLength);

        if ( !pYFrame)
        {
            printf("ss_mpi_sys_mmap_cached for pY_map fail!!\n");
            return 0;
        }
        if (!pVUFrame)
        {
            printf("ss_mpi_sys_mmap_cached for pVU_map fail!!\n");
            ss_mpi_sys_munmap(pYFrame, u32YLength);
            return 0;
        }
        printf("yuv frame w-h:{%d-%d} length=%d %d.\n", 
            frame_info.video_frame.stride[0], frame_info.video_frame.height,
            length, pYFrame[0]);

        //writeYUV(pYFrame, u32YLength);
        //writeYUV(pVUFrame, u32UVLength);
        td_char* pYUV = new td_char[u32YLength + u32UVLength];
        memcpy(pYUV, pYFrame, u32YLength);
        memcpy(pYUV + u32YLength, pVUFrame, u32UVLength);
        writeYUV(pYUV, u32UVLength + u32YLength);
        delete[]pYUV;

        ss_mpi_sys_munmap(pYFrame, u32YLength);
        ss_mpi_sys_munmap(pVUFrame, u32UVLength);
        //freeFrame(pYuvFrame, length);
        ret = ss_mpi_vdec_release_frame(m_vdecChn, &frame_info);
        //printf("ss_mpi_vdec_release_frame %#x. \n", ret);
    }
我来回答
回答8个
时间排序
认可量排序

FAAKER

0个粉丝

3

问答

0

专栏

0

资料

FAAKER 2025-02-07 09:19:33
认可0

可以联系代理FAE向原厂提问

龙紫藤
龙紫藤   回复   FAAKER  2025-02-08 14:40:58
1

一言难尽,目前是开发,试产阶段,没啥采购量。代理那边都是爱理不理的。。。。。。响应已经是不能用慢来形容了。

洪欣
洪欣   回复   龙紫藤  2025-02-11 14:14:22
0

深有同感,代理的技术支持约等于0,无奈之下来到社区提问

UncleRoderick

44个粉丝

16

问答

3

专栏

16

资料

UncleRoderick 2025-02-07 15:33:48
认可0

不正确是怎么个不正确法?数据发出来看看?

龙紫藤
龙紫藤   回复   UncleRoderick  2025-02-08 14:43:53
0


写出来的文件里面就类似这样的数据。论坛里面不知道怎么上传文件,一帧yuv数据2.97M,不大,但是不懂怎么上传。:)

UncleRoderick
UncleRoderick   回复   龙紫藤  2025-02-09 10:07:49
0

直接添加附件就可以了,你的源数据是怎么获取的?编码是有损的,数据肯定会变化的,解码后的数据不一定会跟源数据完全一样

龙紫藤

0个粉丝

1

问答

0

专栏

0

资料

龙紫藤 2025-02-08 14:52:39
认可0

结合网络上面找到的资料,和海思文档,应该是VDEC模块输出的数据是OT_VIDEO_FORMAT_TILE_64x16格式的,不是纯粹的YUV数据;
目前能找到的办法就是把VDEC解码后的输出,绑定到VPSS,经由VPSS再次处理后,才能拿到纯粹的YUV数据。

不知道有没有办法能直接把OT_VIDEO_FORMAT_TILE_64x16的数据直接转成YUV数据;目前的方案,系统资源不足,不能再为解码开VPSS了。

UncleRoderick
UncleRoderick   回复   龙紫藤  2025-02-09 10:10:28
1

看了MPP文档确实是解码输出的OT_VIDEO_FORMAT_TILE_64x16,VPSS不够用的话可以考虑用VGS转

或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区