VPU: failed fill VPU input buffer

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

VPU: failed fill VPU input buffer

1,406件の閲覧回数
BrilliantovKiri
Senior Contributor I

Hello!

I try write application with imx-lib without GStremamer (VPU firmware version: 1.4.41, VPU library version: 5.3.2), follow my code configure VPU input buffer:

static vpu_mem_desc in_frame_desc;

static FrameBuffer in_frame;

in_frame_desc.size = encop.picWidth * encop.picHeight * 3 / 2;

if (IOGetPhyMem(&in_frame_desc)) {

      daemon_error("Failed obtain physical memory for input buffer");

      return -1;

}

if (!in_frame_desc.phy_addr) {

    daemon_error("Incorrect physical memory address for input buffer");

    return -1;

}

in_frame_desc.virt_uaddr = IOGetVirtMem(&in_frame_desc);

if (in_frame_desc.virt_uaddr <= 0) {

    daemon_error("Failed obtain virtual memory for input buffer");

    return -1;

}

in_frame.bufY = in_frame_desc.phy_addr;

in_frame.bufCb = in_frame.bufY + encop.picWidth * encop.picHeight;

in_frame.bufCr = in_frame.bufCb + encop.picWidth * encop.picHeight / 4;

in_frame.strideY = encop.picWidth * encop.picHeight;

in_frame.strideC = encop.picWidth / 2;

And code for fill it:

//debug output

daemon_info("%s: %p (%u) -> %p (%u, phys %p)",

            __func__,in, in_len, in_frame_desc.virt_uaddr, in_frame_desc.size, in_frame_desc.phy_addr);

if (in_len > in_frame_desc.size) {

    daemon_error("Input buffer too big, buffer %u, available %u",

                 in_len, in_frame_desc.size);

    return -1;

}

//copy buffer after CSC IPU to VPU

memcpy(&in_frame_desc.virt_uaddr, in, in_len);

Unfortunally programm exit in this point with message *** buffer overflow detected ***: encoderd terminated

I add debug output and not see any reason for this error:  vpu_encode: 0x2c711008 (1382400) -> 0x2c9f3000 (1382400, phys 0x75000000)

Because my matrix send data in YUV422 I have to convert it to YUV420 on ColorSpaceConvertion IPU, after this copy to VPU input buffer.

How should  configure and fill VPU input buffer?

Thank you and excuse my bad english.

Update:

Because vpu_mem_desc.virt_uaddr is a address, I modify memcpy((void *)in_frame_desc.virt_uaddr, in, in_len)

Сообщение отредактировано: Kirill Brilliantov

ラベル(1)
タグ(1)
0 件の賞賛
返信
1 返信

912件の閲覧回数
BrilliantovKiri
Senior Contributor I

Very strange, I increase VPU buffer size, but I get same error:

vpu_encode: 0x2c711008 (1382400) -> 0x2c9f3000 (2764800, phys 0x75000..

*** buffer overflow detected ***

0 件の賞賛
返信