キーワードから探す

※スペースで区切って複数検索が可能です。

カテゴリで絞り込む

よく検索されるキーワード

ID:315
作成日: 2022/05/23

内部バッファと外部バッファについて教えてください。

カテゴリ SDK-AcapLib2  
対象製品 APX-3302シリーズ APX-3323シリーズ APX-3324シリーズ APX-3326シリーズ

AcapLib2は、内部バッファと外部バッファが使用可能です。
以下は内部バッファと外部バッファの比較表となります。

内部バッファ 外部バッファ
登録・確保 ライブラリでメモリ確保・バッファ登録

ユーザアプリケーションでメモリ確保後、
AcapSetBufferAddress(画像バッファ設定)でバッファ登録

登録解除・解放 ライブラリでバッファ解除・メモリ解放

AcapSetBufferAddress(画像バッファ設定)でバッファ登録解除後、アプリケーションでメモリを解放(※1)

制限 - ・16Byteアラメント(※2)
・DMA転送するサイズ以上を指定

※1 登録中のバッファを解放するとシステムクラッシュの原因になります。
※2 アライメントの調整方法については、[外部バッファの設定]をご参照ください。

<外部バッファの扱いについて>
  • ドライバ側でメモリロックを行いますので、ガベージコレクションやメモリスワップなどのアドレス再配置の対象外となります。
  • 外部バッファの登録を行う際は、事前に0フィル等で物理アドレスが確定している状態で、バッファ登録を行ってください。
  • 外部バッファの登録を行った後に、取り込みに関するサイズやビット幅の変更を行った場合は、再度、バッファ登録を行ってください。
<外部バッファの使用例>
こちらのFAQ「どのような場合に外部バッファを使用しますか?」をご覧ください。

各バッファは以下のように設定します。
[内部バッファの設定]
[外部バッファの設定]

[内部バッファの設定]

以下はiniファイル使用時と未使用時の設定例となります。

・iniファイル使用
    // 指定したiniファイルの設定値を読み込み内部バッファを確保
    AcapSelectFile( hDev, 1, "C:\\AVALDATA\\AcapLib2\\Camera.ini", 0 );
・iniファイル未使用
    // 内部バッファ確保に必要なパラメータを設定(Xサイズ,Yサイズ,bit深度,メモリ面数)
    AcapSetInfo( hDev, 1, ACL_X_SIZE, -1, 1024 );
    AcapSetInfo( hDev, 1, ACL_Y_SIZE, -1, 512 );
    AcapSetInfo( hDev, 1, ACL_CAM_BIT, -1, 8 );
    AcapSetInfo( hDev, 1, ACL_MEM_NUM, -1, 4 );
    
    // 設定の反映を行い、内部バッファを登録・確保する
    AcapReflectParam( hDev, 1 );

※本コードは簡略化のため、エラー処理を省略しています。
 コードを実装される際は、必ずエラー処理、戻り値の確認を行ってください。

[外部バッファの設定]

外部バッファを登録、解放を設定する例となります。
以下例では4面分のメモリを登録しています。

    // メモリの確保に必要なパラメータを取得(Xサイズ,Yサイズ,bit深度,メモリ面数)
    PUCHAR pBuffer[4];
    int nXSize, nYSize, nBitDepth, nBitByte, nMemnum;
    AcapGetInfo( hDev, 1, ACL_X_SIZE, 0, &nXSize );
    AcapGetInfo( hDev, 1, ACL_Y_SIZE, 0, &nYSize );
    AcapGetInfo( hDev, 1, ACL_CAM_BIT, 0, &nBitDepth );
    AcapGetInfo( hDev, 1, ACL_MEM_NUM, 0, &nMemnum );
    
    for(int i = 0; i < nMemnum; i++) {
        // bitをByteに変更
        if(nBitDepth == 8){
            nBitByte = 1;
        }else if(nBitDepth == 10 || nBitDepth == 12 || nBitDepth == 14){
            nBitByte = 2;
        }else{
            nBitByte = 4;
        }
        // メモリの確保
        pBuffer[i] = (PUCHAR)_aligned_malloc( nXSize * nYSize * nBitByte, 16 );
// メモリの初期化 ZeroMemory(pBitmap[i], nXSize * nYSize * nBitByte); // 確保したメモリを仮登録 AcapSetBufferAddress( hDev, 1, ACL_IMAGE_PTR, -(i+1), &pBuffer ); } // バッファ登録をライブラリに反映 AcapReflectParame( hDev, 1 ); //: //:キャプチャ等処理 //: // アプリケーション終了 // 登録したメモリの解除 AcapSetBufferAddress( hDev, 1, ACL_IMAGE_PTR, 0, 0 ) // メモリの開放 for(int i = 0; i < nMemnum; i++) { _aligned_free(&pBuffer[i])
}

※本コードは簡略化のため、エラー処理を省略しています。
 コードを実装される際は、必ずエラー処理、戻り値の確認を行ってください。
この内容は参考になりましたか?
ご回答いただきまして、ありがとうございます。
今後の参考にさせていただきます。
ご意見・ご感想、ありがとうございます。

関連するご質問

Now Loading...

Now Loading...