jerrylipeng

jerrylipeng

1个粉丝

11

问答

0

专栏

0

资料

jerrylipeng  发布于  2016-07-13 16:16:57
采纳率 0%
11个问答
5273

【已解决】如何创建一个空白帧

 
本帖最后由 jerrylipeng 于 2016-7-14 08:38 编辑

MPI的很多API都用到了VIDEO_FRAME_INFO_S结构体
通常可以用xxx_GetFrame来获得一帧图像,用xxx_SendFrame来发送一帧图像到设备(venc,vo等)
但是我在文档中没有看到能直接创建一个空白帧的API
比如我想往一个空白的帧里绘制一些自定义内容,然后在输出到VO,应该怎么做呢?
我来回答
回答8个
时间排序
认可量排序

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-13 16:23:24
认可0
在windows里面,用画板弄个黑屏,然后保存为jpg或者bmp,例如尺寸720*576,通过工具转换为YUV,再到VENC里面,搞成264
就得到编码数据了。

如果想加入文字信息,做图的时候,提前加上。主要就是bmp转YUV工具,当然也可以直接用源码直接转。只要得到YUV420格式,只要符合VENC输入要求,接下来就好办了。

jerrylipeng

1个粉丝

11

问答

0

专栏

0

资料

jerrylipeng 2016-07-13 16:29:29
认可0
多谢,明白你的意思了

我之前的想法是创建一个虚拟VO,每次从虚拟VO去get一个,用完了再release掉

jerrylipeng

1个粉丝

11

问答

0

专栏

0

资料

jerrylipeng 2016-07-13 16:37:34
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=33904&ptid=11935]ngswfx 发表于 2016-7-13 16:23[/url]
在windows里面,用画板弄个黑屏,然后保存为jpg或者bmp,例如尺寸720*576,通过工具转换为YUV,再到VENC里 ...[/quote]


多谢,明白你的意思了

我之前的想法是创建一个虚拟VO,每次从虚拟VO去get一个,用完了再release掉

goodman

4个粉丝

30

问答

18

专栏

17

资料

goodman 2016-07-13 18:12:29
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=33907&ptid=11935]jerrylipeng 发表于 2016-7-13 16:37[/url]
多谢,明白你的意思了

我之前的想法是创建一个虚拟VO,每次从虚拟VO去get一个,用完了再release掉[/quote]

申请一个这个结构体的内存就可以了,我以前写过,这里便宜你了直接给你吧:lol
[code]static int create_frame(int width, int height, int stride, VIDEO_FRAME_INFO_S *pstVFrameInfo)
{
        HI_U32     u32LStride,u32CStride, u32LumaSize;
    HI_U32     u32ChrmSize,u32PhyAddr;
    HI_U32     u32Size;
    VB_BLK VbBlk;

    u32LStride  = stride;
    u32CStride  = stride;

    u32LumaSize = (u32LStride * height);
    u32ChrmSize = (u32CStride * height) >> 2;/* YUV 420 */
    u32Size = u32LumaSize + (u32ChrmSize << 1);

    /* alloc video buffer block ---------------------------------------------------------- */
    VbBlk = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, u32Size, "ddr1");
    if (VB_INVALID_HANDLE == VbBlk) {
        err_msg("HI_MPI_VB_GetBlock err! size:%d\n",u32Size);
        return -1;
    }

    u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(VbBlk);
    if (0 == u32PhyAddr) {
        return -1;
    }

    pstVFrameInfo->u32PoolId = HI_MPI_VB_Handle2PoolId(VbBlk);
    if (VB_INVALID_POOLID == pstVFrameInfo->u32PoolId) {
        return -1;
    }

        pstVFrameInfo->stVFrame.u32PhyAddr[0] = u32PhyAddr;
    pstVFrameInfo->stVFrame.u32PhyAddr[1] = pstVFrameInfo->stVFrame.u32PhyAddr[0] + u32LumaSize;
    pstVFrameInfo->stVFrame.u32PhyAddr[2] = pstVFrameInfo->stVFrame.u32PhyAddr[1] + u32ChrmSize;

    pstVFrameInfo->stVFrame.u32Width  = width;
    pstVFrameInfo->stVFrame.u32Height = height;
    pstVFrameInfo->stVFrame.u32Stride[0] = u32LStride;
    pstVFrameInfo->stVFrame.u32Stride[1] = u32CStride;
    pstVFrameInfo->stVFrame.u32Stride[2] = u32CStride;
    pstVFrameInfo->stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
    pstVFrameInfo->stVFrame.u32Field = VIDEO_FIELD_INTERLACED; /* Intelaced D1,otherwise VIDEO_FIELD_FRAME */

    return 0;
}
[/code]

jerrylipeng

1个粉丝

11

问答

0

专栏

0

资料

jerrylipeng 2016-07-14 08:38:21
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=33920&ptid=11935]goodman 发表于 2016-7-13 18:12[/url]
申请一个这个结构体的内存就可以了,我以前写过,这里便宜你了直接给你吧[/quote]

请收下我的膝盖Orz!!!

jerrylipeng

1个粉丝

11

问答

0

专栏

0

资料

jerrylipeng 2016-07-14 09:02:57
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=33920&ptid=11935]goodman 发表于 2016-7-13 18:12[/url]
申请一个这个结构体的内存就可以了,我以前写过,这里便宜你了直接给你吧[/quote]

还有个问题想请教一下,下面是我从vpss中得到的一帧图像的信息
[code]-- u32Width = 1920
-- u32Height = 1080
-- u32Field = 4
-- enPixelFormat = 19
-- u32PhyAddr[0] = 0x8fb6a000
-- u32PhyAddr[1] = 0x8fd64400
-- u32PhyAddr[2] = 0x8fd64400
-- pVirAddr[0] = 0xd6bf6000
-- pVirAddr[1] = 0xd6bf7e00
-- pVirAddr[2] = 0xd6bf7e00
-- u32Stride[0] = 1920
-- u32Stride[1] = 1920
-- u32Stride[2] = 1920
-- u16OffsetTop = 0
-- u16OffsetBottom = 0
-- u16OffsetLeft = 0
-- u16OffsetRight = 0
-- u64pts = 0
-- u32TimeRef = 42
-- u32PrivateData = 0[/code]

看上去u32PhyAddr[1]和u32PhyAddr[2]是一样的
按我的理解,SP420只需要stride*height*1.5个byte就行了
u32Size = u32LumaSize + (u32ChrmSize << 1);
这里<<1是不是就不需要了?

qn1554107965

0个粉丝

3

问答

1

专栏

0

资料

qn1554107965 2019-11-20 22:41:12
认可0
你好  我按照上面的函数创建一帧空白帧发送到解码通道HI_MPI_VENC_SendFrame failed, s32Ret=0xA0088003

画个圈圈诅咒你

0个粉丝

4

问答

0

专栏

0

资料

画个圈圈诅咒你 2017-04-19 22:10:15
认可0
很有用棒棒哒啦谢谢谢谢
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区