« MPEG2のライセンス | メイン | 目的のMPEG2フィルタつながらず »
2005年10月14日
動画エンコーダー開発:: MPEG1とMPEG2の見分け方
Tweet @jin1016をフォロー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