[はじめに]
DV規格のデータには「タイムコード」という
編集する際にとても重要なデータが格納されています。
そこで今回は、「タイムコード」がどのように格納されているかを、
規格書を見ながら実際に確認してみました。
[用意するもの]
DV規格のサンプルデータ (DV形式のAVIファイル等)
バイナリエディター (検索機能があるもの)
SMPTE 314M (大学図書館等で入手可能, Web上に落ちているのは見たことないです.)
[DIFblock]
DV規格では「DIFblock」という80bytesのブロック単位でデータを扱かいます.
80byteのうち最初の3bytesはID, 残りの77bytesにデータが格納されていす.
DIFblockの種類は、
Header, Subcode, VAUX, Audio, Video
の5種があり、タイムコードは「Subcode」に格納されています.
[DIFblock ID]
3bytesのDIFblock IDの内容は、以下の通り。
(一番左(MSB)の1ビットを1, 順に1ビットずつ2, 3, ...とする)
第1バイト
1-3: DIFblockの種類
000:Header, 001:Subcode, 010:VAUX, 011:Audio, 100:Video
4: デフォルト1
5-8: 任意(1,0どちらでもよい)
第2バイト
1-4: DIF sequance番号 0-9の2進表示
5: 0: 25Mpps ,1:50Mbps
6-8: デフォルト1
第3バイト
1-8: DIF block番号 0-134の2進表示
|
そうしますと、「Subcode」(DIF block番号 0)のDIFblock IDは 「3F0700」となります。
あるサンプルデータを「3F0700」でサーチしてみると0x0858番地に見つかりました。
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0x0850 FF FF FF FF FF FF FF FF 3F 07 00 81 10 00 13 E2
0x0860 D5 A8 C0 FE 01 00 FF FF FF FF FF F0 F2 00 13 E2
0x0870 D5 A8 C0 F1 13 00 13 E2 D5 A8 C0 FE 04 00 FF FF
0x0880 FF FF FF F0 F5 00 13 E2 D5 A8 C0 FF FF FF FF FF
0x0890 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x08A0 FF FF FF FF FF FF FF FF 3F 07 01 81 16 00 13 E2
0x08B0 D5 A8 C0 FE 07 00 FF FF FF FF FF F0 F8 00 13 E2
0x08C0 D5 A8 C0 F1 19 00 13 E2 D5 A8 C0 FE 0A 00 FF FF
0x08D0 FF FF FF 80 FB 00 13 E2 D5 A8 C0 FF FF FF FF FF
0x08E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0x08F0 FF FF FF FF FF FF FF FF 5F 07 00 FF FF FF FF FF
|
0x0858から0x08A7番地までの80bytesが、ひとつのDIFblockとなっています.
( 5行下の0x08A8番地を見ますと1bitだけ違うパターン「3F0701」が
あるのが分かります。 これが次のDIFblock ID(「Subcode」DIF block番号 1)です。
さらに5行下のパターン「5F0700」が、 「VAUX」 DIF block番号 0 のIDです。)
[タイムコード]
このDIFblock中に青で示した5bytes(パックと呼ぶ)がタイムコードのデータです。
「13 E2 D5 A8 C0」
これを、1バイトずつ見てみます
第一バイトはパックIDです。
「13」はタイムコードを示すパックIDです。
第2バイトの内容は以下の通り。
1: Colofr fame(CF)
2: Drop frame flag (DF) , 0:Nondrop frame time code, 1:Drop frame time code
3-4: フレーム(10の位)
5-8: フレーム(1の位)
|
「E2」を2進表示すると 「1100 0010」となり、デコードすると「2フレーム」
第3バイトの内容は以下の通り。
1: Binary group flag 0
2-4: 秒(10の位)
5-8: 秒(1の位)
|
「D5」を2進表示すると 「1101 0101」となり、デコードすると「55秒」
第4バイトの内容は以下の通り。
1: Binary group flag 1
2-4: 分(10の位)
5-8: 分(1の位)
|
「A8」を2進表示すると 「1010 1000」となり、デコードすると「28分」
第5バイトの内容は以下の通り。
1: Bipphase mark polarity correction
2: Binary group flag 2
3-4: 時間(10の位)
5-8: 時間(1の位)
|
「C0」を2進表示すると 「1100 0000」となり、デコードすると「0時間」
したがって、このデータのタイムコードは、「00:28:55:02」であるということが分かりました。
[付録]
DVストリームに含まれるタイムコードを表示するプログラム
#!/usr/local/bin/perl
#
# decode TIME CODE from DV stream.
#
# (c) eggman 2001.3.3
open (DVIN ,"test.dv");
binmode DVIN;
# search "3F 07 00"
while(read(DVIN, $buf, 1)){
if($buf eq pack("H2", "3F")){
read(DVIN, $buf, 1);
if($buf eq pack("H2", "07")){
read(DVIN, $buf, 1);
if($buf eq pack("H2", "00")){
read(DVIN, $buf, 77);
# print unpack("H144", $buf) . "\n";
&decode_tc($buf);
}
}
}
}
close (DVIN);
sub decode_tc(){
# WV-D700でエンコードしたデータだとここのパックがタイムコードになる。
$PC = substr($_[0], 3 ,5);
print unpack("H10", $PC) . "\n";
$pc4 = chop($PC);
$pc3 = chop($PC);
$pc2 = chop($PC);
$pc1 = chop($PC);
$pc0 = chop($PC);
print "Header : ". unpack("H2", $pc0) . "\n";
print "Frames : ". unpack("H2", ($pc1&pack("H2","3F"))) . "\n";
print "Seconds: ". unpack("H2", ($pc2&pack("H2","7F"))) . "\n";
print "Minutes: ". unpack("H2", ($pc3&pack("H2","7F"))) . "\n";
print "Hours : ". unpack("H2", ($pc4&pack("H2","3F"))) . "\n";
}
|
実行例
> ./timecode.pl
13e2d5a8c0
Header : 13
Frames : 22
Seconds: 55
Minutes: 28
Hours : 00
13e3d5a8c0
Header : 13
Frames : 23
Seconds: 55
Minutes: 28
Hours : 00
13e4d5a8c0
Header : 13
Frames : 24
Seconds: 55
Minutes: 28
Hours : 00
|
[参考文献]
"SMPTE 314M", SMPTE Journal May,1999.
[あとがき]
◆パックはどこから始まるの?
◆同じタイムコードのパックがたくさんあるがどうして?
などの疑問はSMPTE 314Mを読んで各自解決してください。
タイムコードよりも、データコード(録画日時分秒)の方について知りたいんですが、
手持ちの資料(SMPTE306M 314M等)には載っていません。
解析しても分からなかったら、日本規格協会ライブラリーへ行って IEC 61834を閲覧する予定です。
(c) eggman ,2001
|