AR# 73274

2019.1 Zynq UltraScale+ MPSoC VCU - vcu_omx_decoder アプリケーションを使用してファイルからビデオ データを小さいかたまりで読み出そうとすると VCU デコーダーがクラッシュする

説明

ファイルからビデオ データを小さいかたまりで読み出そうとすると VCU デコーダーがクラッシュする理由を教えてください。

デコーダーでデータをかたまりごと (たとえば 10240 バイトずつ) に読み出そうとするとクラッシュします。

Process 286759 (vcu_omx_decoder) terminated SIGSEGV code=1 fltno=11 ip=0000000001079358(/usr/lib/ldqnx-64.so.2@__memcpy_isr+0x0000000000000198) mapaddr=0000000000079358. ref=0000000028000000
Memory fault (core dumped) 

ソリューション

通常 VCU デコーダーでは、infile.read API の frame.data() 引数を使用した大きいバッファーが可能です。

infile.read API は、main.cpp の一部です。

データを小さいかたまりで読み出すには、コードに次の変更を加える必要があります。

static bool readFrame(OMX_BUFFERHEADERTYPE* pInputBuf, Application& app)
{
  assert(pInputBuf->nAllocLen != 0);
  vector<uint8_t> frame(pInputBuf->nAllocLen);
 
  printf("readFrame, pInputBuf->nAllocLen: %d, pInputBuf->nOffset: %d, frame.size: %d\n", pInputBuf->nAllocLen, pInputBuf->nOffset, frame.size());

  infile.read((char*)frame.data(), 10240);
  auto data = (char*)(pInputBuf->pBuffer + pInputBuf->nOffset);
  memcpy(data, frame.data(), 10240);

  pInputBuf->nFilledLen = infile.gcount();
  printf("readFrame, pInputBuf->nFilledLen: %d\n", pInputBuf->nFilledLen);
  if(infile.peek() == EOF)


{    printf("EXIT readFrame, true\n");     return true;   }
  printf("EXIT readFrame, false\n");
  return false;
}


vcu_omx_decoder アプリケーションでは既知の問題があり、ファイル ソースから 10240 バイトのかたまりを読み出すために変更すると発生します。

最初のデータ バイトは、入力バッファーによって読み出されると、バッファー処理操作によって削除され、新しいデータを読み出すために開放されます。

この操作の結果、「Memory fault」というエラー メッセージが表示されます。

デコーダーを効果的に動作させるためには、完全なフレーム データを保持し、メモリを破棄せずにバッファーを開放する必要があります。

  • 2019.1 - (Xilinx Answer 72324) から PetaLinux レシピおよびパッチをダウンロードして適用すると、この問題を回避できます。
  • 2019.2 - この問題は、2019.2 以降のバージョンで修正される予定です。

アンサー レコード リファレンス

マスター アンサー レコード

AR# 73274
日付 01/25/2020
ステータス アクティブ
種類 既知の問題
デバイス
ツール
IP
Boards & Kits