« MPEG2のライセンス | メイン | 目的のMPEG2フィルタつながらず »

2005年10月14日

動画エンコーダー開発:: MPEG1とMPEG2の見分け方

    

MPEG1とMPEG2で使われている拡張子は両方mpgが多いので、拡張子だけではこの二つを識別するのは難しい。
DirectShowでは、ファイルの特定位置の値で見分けている。
MPEG2の場合、次のようになっている。
offset : 0
length : 5
mask : FFFFFFFFC0
value : 000001BA40
offsetはファイル先頭からの位置で、lengthはバイト長、maskはマスク、valueはマスク適用後の値になる。
つまり、ソースとしては次のような感じ。

int offset = 0;
int length = 5;
unsigned char mask[5] = {0xFF,0xFF,0xFF,0xFF,0xC0};
unsigned char value[5] = {0x00,0x00,0x01,0xBA,0x40};
unsigned char checkByteBuff[5]; // ここにファイルから読み込む
bool isMPEG2 = true;
for( int i = 0; i < 5; i++ )
{
  if( (checkByteBuff[i] & mask[i]) != value[i] )
  {
    isMPEG2 = false;
    break;
  }
}

これで、isMPEG2がtrueなら、そのファイルはMPEG2と言うこと。
MPEG1 Systemの場合は、次の通り。
offset : 0
length : 16
mask : FFFFFFFFF100010001800001FFFFFFFF
value : 000001BA2100010001800001000001BB


DirectShowでは、まず拡張子で判断し、なければ上述のチェックバイトによる方法で識別しているようだ。(詳しくはカスタム ファイル タイプの登録に書かれている)
それはともかく、チェックバイトを使えばMPEG2かどうか判別できるので、MPEG2用のグラフを構築したり、サポートしていませんって出して終了できる。



投稿者 Takenori : 2005年10月14日 09:25




comments powered by Disqus
Total : Today : Yesterday : なかのひと