CRI Sofdec  Last Updated: 2024-04-17 11:21 p
ライブラリの初期化について
ここでは、Sofdec.PrimeコーデックについてのCRI Mana ライブラリの初期化/終了関数、デコード処理などについて記載します。

※VP9コーデックについてはVP9機能拡張用フォルダーにある以下のマニュアルをご参照ください。
cri/expansion/readme_cri_sofdec_codecs_vp9_expansion_pc_ja.html

PC専用の初期化/終了関数について

PC版CRI Mana ライブラリには、PC専用の初期化/終了関数が存在します。
この設定関数はオプション的なものであり、通常は汎用の初期化/終了関数を使うことが出来ます。

PC版CRI Mana ライブラリは、デフォルト設定でムービーのデコードにマルチコアを利用します。
通常はこのマルチコア設定を変える必要はありませんが、専用の初期化関数を使うことでマルチコアの設定を変更することが出来ます。

Sofdecのデコード処理

Sofdecでは、ビデオフレームのデコードを複数のCPUコアに分散するしくみを用意しています。

Sofdecのデコード処理は次の2か所で実行されます。

(1) デコードマスタースレッド
(2) ワーカースレッド

デコードマスタースレッドもワーカースレッドもライブラリ初期化時に自動的に生成されます。
デコードマスタースレッドは criManaPlayer_ExecuteVideoProcess() を呼び出して、
自分自身でビデオデコードを行いつつ、ワーカースレッドのタスク管理も行います。
ワーカースレッドは criManaPlayer_ExecuteVideoProcess() をきっかけに動作し、
分割されたビデオデコード処理を実行します。
動作できるワーカースレッドの最大数は機種によって違いますが、Windows環境の場合は7個になっています。
※CRI Sofdec Ver.1.70 でワーカースレッドの最大数が7個に増えました。以前のライブラリは3個です。


スレッドモデルとマルチコアの関係

Sofdecの初期化時にスレッドモデルを指定することが出来ます。詳細は「 スレッドについて 」を参照してください。
本章では「マルチスレッドフレームワーク」の場合について説明します。

なお「シングルスレッドフレームワーク」の場合はライブラリ初期化時にデコードマスタースレッドは作成されません。
ただし「ワーカースレッド」はスレッドモデルや初期化時に使用スレッド数指定に関係なく、7つのスレッドが作成されます。

マルチコアによるデコード設定

各デコード処理がどのCPUで動作するかは、通常はOSが適切に割り当てるためアプリケーションが管理する必要はありません。

もしアプリケーションがデコード処理のCPU割り当てを管理したい場合は、デコードマスタースレッドとワーカースレッドのそれぞれについてCPU設定を行う必要があります。


デコードマスタースレッドの設定

デコードマスタースレッドのプロセッサー設定は専用の関数を「ライブラリ初期化後」に呼び出すことで設定できます。
優先度の設定値の仕様は、Windowsの標準的なスレッドパラメーターに準拠します。

#include <windows.h>
CriSint32 master_thread_priority;
/* ライブラリ初期化 */
criMana_Initialize_PC(&lib_config, NULL, 0);
/* デコードマスタースレッドの設定 */
master_thread_priority = THREAD_PRIORITY_BELOW_NORMAL;
criMana_SetDecodeThreadPriority_PC(master_thread_priority);
#define criMana_SetDefaultLibConfig_PC(p_config)
ライブラリ初期化用コンフィグ構造体にデフォルト値をセット
Definition: cri_mana_pc.h:69
void criMana_SetDecodeThreadPriority_PC(int prio)
デコードマスタースレッドのプライオリティ変更
void criMana_Initialize_PC(const CriManaLibConfig_PC *config, void *work, CriSint32 work_size)
ライブラリ初期化関数 (PC固有機能つき)
Manaライブラリ初期化パラメーター
Definition: cri_mana_pc.h:137

ワーカースレッドの設定

ワーカースレッドのデコード設定は、PC固有のライブラリ初期化関数 CriMana_Inititalize_PC() のパラメーターで指定します。
PC固有のライブラリ初期化関数は、汎用の初期化関数の機能も包含していますので、汎用初期化の実行は行わないでください。
アフィニティマスクと優先度の設定値の仕様は、Windowsの標準的なスレッドパラメーターに準拠します。
アフィニティマスクの配列をNULL指定した場合は「全CPU許可」になります。

#include <windows.h>
#define AFFINITY_MASK_CPU00 (0x1)
#define AFFINITY_MASK_CPU01 (0x2)
#define AFFINITY_MASK_CPU02 (0x4)
#define AFFINITY_MASK_CPU03 (0x8)
#define AFFINITY_MASK_CPU04 (0x10)
#define AFFINITY_MASK_CPU05 (0x20)
#define AFFINITY_MASK_CPU06 (0x40)
#define AFFINITY_MASK_CPU07 (0x80)
#define AFFINITY_MASK_ALL (0xFF)
CriSint32 num_thread = 3;
CriUint32 affinity_masks[] = {
AFFINITY_MASK_CPU02,
AFFINITY_MASK_CPU03 | AFFINITY_MASK_CPU04,
AFFINITY_MASK_ALL,
}
/* [PC固有] ライブラリ初期化パラメーターの指定 */
lib_config.mana.max_decoder_handles = 4;
/* [PC固有] ワーカースレッドのプロセッサー指定 */
lib_config.processor.num_threads = num_thread;
lib_config.processor.affinity_masks = affinity_masks;
lib_config.processor.priority = THREAD_PRIORITY_BELOW_NORMAL;
/* [PC固有] Manaライブラリ初期化 */
lib_work_size = criMana_Calculate_PC(&lib_config);
lib_work = malloc(lib_work_size);
//criMana_Initialize(&lib_config, lib_work, lib_work_size);
criMana_Initialize_PC(&lib_config, lib_work, lib_work_size);
.....
/* [PC固有] Manaライブラリ終了 */
//criMana_Finalize();
criMana_Finalize_PC();
@ CRIMANA_THREAD_MODEL_MULTI
Definition: cri_mana.h:339
CriManaProcessorConfig_PC processor
Definition: cri_mana_pc.h:144
CriManaLibConfig mana
Definition: cri_mana_pc.h:140
CriUint32 max_decoder_handles
Definition: cri_mana.h:645
CriManaThreadModel thread_model
Definition: cri_mana.h:649
CriSint32 num_threads
Definition: cri_mana_pc.h:118
int priority
Definition: cri_mana_pc.h:126
const DWORD * affinity_masks
Definition: cri_mana_pc.h:122
補足
現状、PCで使用可能なプロセッサー数、PC版CRI Mana ライブラリのデコードマスタースレッド、
使用可能なワーカースレッドの関係は以下になります。

項目 備考
PC:使用可能なプロセッサー数 8
Mana:デコードマスタースレッド数 1 機種共通で常に1つ
Mana:使用可能なワーカースレッド数 7 PC:使用可能なプロセッサー数 - Mana:デコードマスタースレッド数

最も効果的に分散ムービーデコードを行うには上記デコードマスタースレッド、ワーカースレッドを
PCで使用可能なプロセッサーそれぞれに割り当てる必要があります。

逆にムービーデコードに使用するプロセッサー数を制限したい場合、デコードマスタースレッド:1つだけ、
ワーカースレッド数は0に設定するといった事も可能です。
ただし、デコード処理するプロセッサー数が少ないとムービーのコマ落ちなどが発生する
可能性があります。デバッグ用途やアプリの状況に応じて設定、調整して下さい。

また、同一プロセッサー上でデコードマスタースレッドとワーカースレッドを割り当てて動作させるのは
あまり意味がなく、コンテキストスイッチの負荷分だけ性能が落ちる可能性がありますので
ご注意下さい。これを防ぐには適切なアフィニティマスクを設定して下さい。