« MikuMikuDanceの背景AVI読み込みについて(関連:VFW入力とDirectShow入力) | トップページ | x264の初期ディレイカット機能の概要(あってるか自信なし) »

2010年2月 1日 (月)

可逆圧縮コーデック「Lagarith」の設定や仕様、使い方等について

普段は可逆圧縮したい時はUtVideoHuffyuvを使っているのですが、
DTV板の可逆圧縮スレで、可逆圧縮コーデック「Lagarith」の
話題が出ていたので、ちょっと使ってみました。
試してみたLagarithのバージョンは、1.3.20です。
(インストールはしていたものの、1度も使ったことがなかった・・・。)

UtVideoでは、
  ULRA (内部形式はRGBA)
  ULRG (内部形式はRGB)
  ULY2 (内部形式はYUV422)
  ULY0 (内部形式はYUV420)
といった具合に、内部保持形式ごとにコーデック自体が分かれていますが、
Lagarithは色々な内部保持形式があるものの、それらがまとめて1つになっています。
Huffyuvも RGBA・RGB・YUY2(YUV422) が1つになったコーデックですが、
こういったRGB系とYUV系が一緒になったコーデックでは、
受け渡し形式等について、より注意する必要があるでしょう。

とりあえず、可逆圧縮コーデックとして使う分には、
  1.エンコーダからLagarithへ渡す際の入力形式 (エンコード時)
  2.Lagarithの設定の「Mode」の指定 (エンコード時)
  3.Lagarithから編集ソフトウェア等に渡す際の出力形式 (デコード時)
の3つを一致させて使えばいいのですが、これらを一致させずに使った場合の
動作などが気になったので、そのあたりを含めて、Lagatirhの設定の意味や仕様、
注意点等について調査・実験の上、まとめてみました。

例によって間違いなどありましたら指摘をお願いします。


(2010.2.2追記)
 ●Changelogを見たら1.3.10からUYVY入力をサポートしているとあったので追記。

 
■Lagarithの主な特徴

 ●映像データを劣化させずに保存できる可逆圧縮コーデックである。

 ●圧縮(エンコード)/展開(デコード)はHuffyuvやUtVideoに比べると遅いが、
   データの圧縮率はHuffyuvやUtVideoよりも高い。
   そのため、リアルタイムキャプチャのような用途には向かないが、
   ファイルサイズを小さくできるので、可逆データの保存用としては優れている。

   ※各種コーデックのベンチマーク性能は以下を参照

     あまラボ ビデオコーデック・ベンチマーク2009

     或るプログラマの一生 > コーデックベンチマーク結果

     或るプログラマの一生 > コーデックベンチマーク(HD実写編)

 ●解像度を半分にして低解像度映像を作れるモード(Reduced Resolution)がある。

 ●マルチスレッドに対応している。

 ●32bit版だけでなく、64bit版もある。

 
■Lagarithの主な仕様

 ●仕様1
   入力と出力の形式は
     RGBA・RGB32・RGB24・YUY2・UYVY(入力のみ)・YV12
   に対応している。
   UYVYは入力のみサポートされており、デコードはYUY2形式となる。

 ●仕様
   内部保持形式は
     RGBA・RGB32・RGB24・YUY2・YV12・Reduced Resolution
   のいずれかとなる。

 ●仕様3
   内部保持形式は「入力形式」と、設定で指定する「Mode」の組み合わせで決まる。

 ●仕様4
   エンコード時に、必要に応じて入力形式よりも下位の色空間への
   ダウンサンプリング処理が行なわれる。

 ●仕様5
   デコード時は、必要に応じて内部保持形式よりも上位の色空間への
   アップサンプリング出力が行なわれる。
   内部保持形式よりも下位の色空間へのダウンサンプリング出力は行なわない。

 
■Lagarithを使う場合の注意点

 ●設定画面の「Mode」で色空間を指定しても、その色空間で保存されるとは限らない。
   これは上記の仕様3によるもの。
   例えばAviutlの場合、Lagarithの設定でModeにRGBを指定したとしても、
   「コーデックの設定」のLagarithのところで「YUY2圧縮する」にチェックが入っていると、
   Lagarithへの入力形式はYUY2になるので、Modeの設定は無効になり、内部形式はYUY2になる。
   詳細は下記の「Mode」についての記述を参照。

 ●そのため、使い方を間違えると、可逆圧縮したつもりでも
   途中で劣化が発生していることがある。
   (これは別にLagarithのせいでもなんでもなく、
    どんな可逆圧縮コーデックにも言えることです。)

 
■Lagarithの設定画面

    Lagarithconfig

 
■Lagarithの設定項目について

□Enable Null Frames
ヘルプ原文 When a frame is identical to the preceding frame, it can be replaced with a nullframe.
This indicates that the program reading the video should simply reuse the previous frame.
Nullframes can increase compression and speed, but there may be a few editing programs
that do no handle them well; disable nullframes if you notice the wrong frame
being displayed during still sections of a video.
意味 Nullフレーム(ヌルフレーム)を有効にする。
説明 Null(ヌル)というのは「カラッポの」という意味。
このオプションにチェックを入れると、圧縮するフレームの映像が
1つ前のフレームの映像と完全に同一だった場合、Nullフレームに置き換える。
この場合、映像を読み込んだアプリケーションでは、1つ前のフレームを単純に
再利用することになる。
このNullフレームを使った仕組みは、圧縮率や速度を上げることができるが、
アプリケーションによっては、Nullフレームをうまく扱えない場合がある。
映像の静止部分でおかしなフレームが表示されてしまうような場合は、
このチェックを外したほうがよい。

□Always suggest RGB for Output
ヘルプ原文 If this enabled, Lagarith will always attempt to decode video to RGB,
unless explicitly asked otherwise.
If a program will not accept video compressed with Lagarith, this may fix the problems.
意味 デコード時のデフォルトの出力形式をRGB形式にする。
説明 アプリケーションから形式指定無しでのデコード要求が来た場合、
通常は内部保持形式と同じ形式(YUY2ならYUY2)でデコードして渡すことになるが、
このオプションにチェックを入れた場合は、RGBでデコードして渡すようになる。
ただしアプリケーション側から明示的にデコード形式が指定された場合は、
その形式での出力を試みる。
アプリケーションがLagarithで圧縮された映像を正しく読み込めないような場合、
これにチェックを入れてみると読み込めるようになる場合がある。

最近のバージョンではどうなのかわからないが、Adobe Premiereなどでは
これにチェックを入れないとうまく動作しないことがあったらしい?
ちなみにHuffyuvにも同様のオプションがある。

□Use Multithreading
ヘルプ原文 Use multiple threads to compress/decompress video;
this can improve speed on systems that have multiple processors.
Single processor systems should leave this disabled.
意味 マルチスレッドを使用する。
説明 映像の圧縮(エンコード)/展開(デコード)で複数のスレッドを使用するので、
マルチコアのCPUを使っている場合は圧縮/展開の速度が向上する。
シングルコアのCPUの場合はチェックを外しておく。

□Prevent Upsampling When Decoding
ヘルプ原文 This will force the codec to decode video as the same colorspace it is stored as internally.
This can improve performance and prevent rounding errors,
but may not be compatible with certain programs.
意味 デコード時のアップサンプリング処理を行なわないようにする。
説明 通常は、デコード時は必要に応じて内部保持形式より上位の色空間への
アップサンプリング処理を行なうようになっているが、
このオプションにチェックを入れておくと、データの内部保持形式と
同じ色空間でしかデコードできないようになる。
これによりパフォーマンスが改善され、丸め誤差の発生を防ぐことができるが、
アプリケーションによってはうまく動作しないケースもある。

ただし、内部保持形式が"Reduced Resolution"の場合は、
このオプションに関係なくアップサンプリング処理が行なわれる。

□Mode
ヘルプ原文 This allows user to downsample video before it is compressed.
Selecting a colorspace will force all colorspaces above it to be downsampled;
lower colorspaces will not be affected.
Downsampling is somewhat lossy.
意味 圧縮データの内部保持形式の指定

※ただし内部保持形式は入力形式にも依存するので、
  必ず指定した形式になるとは限らない。
選択項目  
RGBA アルファチャンネル付きのRGB形式。
RGB[Default] RGB32、またはRGB24
YUY2 YUV422形式の1つ。輝度は各ピクセルで持つが、
色差情報は幅2×高さ1の2ピクセルで共有する。
YV12 YUV420形式の1つ。輝度は各ピクセルで持つが、
色差情報は幅2×高さ2の4ピクセルで共有する。
Reduced Resolution 解像度を半分にしたうえでYV12形式で保持するモード。
エンコード時にはLagarith内部で半分にリサイズしたデータを
YV12形式で圧縮し、デコード時にはLagarith内部で展開した上で
2倍にリサイズして出力している感じ。
映像の幅や高さは変わらないが、解像度が下がるので
当然ながら映像は大きく劣化する。
そのかわり通常のYV12に比べて圧縮/展開は速くなり、
データ量もかなり少なくなる。
想定している用途は、いわゆる「"bait and switch" editing」。
「すりかえ編集」とでも訳せばいいのかな?
映像編集時に、高解像度の映像素材をそのまま使って
編集を行なうと処理が重くなってしまうので、編集段階では
このモードで圧縮した低解像度映像を使って編集処理を軽くし、
最終出力する時に元の高解像度の素材に差し替えて
出力を行なうといった用途を想定している。
 
※表で上にあるほうが上位の色空間、下にあるほうが下位の色空間となる。
 
説明 指定したモードよりも上位の色空間で映像が入力された場合、
圧縮前に、このモードで指定した色空間へのダウンサンプリングが行なわれ、
その後、ダウンサンプリングした結果を圧縮して内部保持することになる。
当然ながら、ダウンサンプリングが行なわれた場合は、劣化が発生する。

ただし、指定したモードよりも下位の色空間で映像が入力された場合は、
この指定は無効となり、圧縮データは入力した色空間のまま内部保持される。

つまり、圧縮データが可逆になるのは、色空間の上位・下位の関係が
   入力形式の色空間 ≦ Modeで指定した色空間
という条件を満たす場合のみ。


  例1:
    モードをYUY2にしておき、RGBで入力すると、
    RGBはYUY2よりも上位の色空間なので、モードの指定が有効になり、
    圧縮前にLagarithがRGBからYUY2への変換(ダウンサンプリング)を行い、
    その後そのYUY2データを圧縮して内部保持することになる。
    つまりYUY2形式で内部保持されることになる。
    RGB→YUY2変換が行なわれるため、劣化が発生する。

  例2:
    モードをRGBにしておき、YUY2で入力すると、
    YUY2はRGBよりも下位の色空間なので、モードの指定は無効になり、
    データはYUY2のまま圧縮される。つまりYUY2形式で内部保持されることになる。
    渡されたYUY2データをそのまま使うので劣化は発生しない。(可逆になる)

■デコード時の処理について

 Lagarithでは、デコード時に必要に応じて、内部形式よりも上位の色空間への
 アップサンプリング処理を行なって出力する。
 例えば、YUY2で保持しているデータに対して、アプリケーション側から
 RGBでのデコード要求が来た場合は、LagarithがYUY2→RGB変換を行い、アプリケーションに渡す。
 ただし、オプションの「Prevent Upsampling When Decoding」にチェックが入っていた場合は、
 このアップサンプリング処理は行なわれない。
 
 また、内部形式よりも下位の色空間へのダウンサンプリング処理は行なわない。
 例えば、RGBで保持しているデータに対して、アプリケーション側から
 YUY2でのデコード要求が来た場合は、デコードエラーとなる。

 
■入力形式・内部保持形式・出力形式と可逆性についてのまとめ

Lagarithでは、エンコード時の入力形式と
Mode設定の2つから内部保持形式が決まる
入力形式Mode設定内部保持形式可逆性
RGBA    RGBA RGBA
RGB RGB ×
YUY2 YUY2 ×
YV12 YV12 ×
Reduced Resolution Reduced Resolution ×
RGB32    RGBA RGB32
RGB RGB32
YUY2 YUY2 ×
YV12 YV12 ×
Reduced Resolution Reduced Resolution ×
RGB24    RGBA RGB24
RGB RGB24
YUY2 YUY2 ×
YV12 YV12 ×
Reduced Resolution Reduced Resolution ×
YUY2
(又はUYVY)   
RGBA YUY2
RGB YUY2
YUY2 YUY2
YV12 YV12 ×
Reduced Resolution Reduced Resolution ×
YV12    RGBA YV12
RGB YV12
YUY2 YV12
YV12 YV12
Reduced Resolution Reduced Resolution ×

※背景が灰色の部分は、組み合わせ的に無効なMode設定。

デコード時は、アプリケーションからのデコード要求に応じて
必要ならアップサンプリング処理を行い出力する

ダウンサンプリング出力は行なわない。
内部保持形式アプリケーションからの
デコード要求
出力色空間可逆性
RGBA    RGBA RGBA
RGB32 RGB32
RGB24 出力不可
YUY2 出力不可
YV12 出力不可
RGB32    RGBA RGBA
RGB32 RGB32
RGB24 出力不可
YUY2 出力不可
YV12 出力不可
RGB24    RGBA RGBA
RGB32 RGB32
RGB24 RGB24
YUY2 出力不可
YV12 出力不可
YUY2    RGBA RGBA ×
RGB32 RGB32 ×
RGB24 RGB24 ×
YUY2 YUY2
YV12 出力不可
YV12    RGBA RGBA ×
RGB32 RGB32 ×
RGB24 RGB24 ×
YUY2 YUY2 ×
YV12 YV12
Reduced Resolution    RGBA RGBA ×
RGB32 RGB32 ×
RGB24 RGB24 ×
YUY2 YUY2 ×
YV12 YV12 ×

※背景が灰色の部分は出力がエラーになる。
  (出力時はダウンサンプリングは行なわないため。)
※設定の「Prevent Upsampling When Decoding」にチェックが入っている場合は、
  内部保持形式と同じ形式でしか出力できなくなる。

|

« MikuMikuDanceの背景AVI読み込みについて(関連:VFW入力とDirectShow入力) | トップページ | x264の初期ディレイカット機能の概要(あってるか自信なし) »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1278146/33213176

この記事へのトラックバック一覧です: 可逆圧縮コーデック「Lagarith」の設定や仕様、使い方等について:

« MikuMikuDanceの背景AVI読み込みについて(関連:VFW入力とDirectShow入力) | トップページ | x264の初期ディレイカット機能の概要(あってるか自信なし) »