How to decode DV stream vol. 3

AAUX SOURCE

MSB

LSB
PC0 0 1 0 1 0 0 0 0
PC1 LF 1 AF SIZE
PC2 SM CHN PA AUDIO MODE
PC3 1 ML 50/60 STYPE
PC4 EF TC SMP QU
LF
0: locked audio mode
1: unlocked audio mode

AF SIZE
48khz
000000 1580
000001 1581

101000 1620

SMP
0:48
1:44.1
2:32


AAUX SOURCE CODE

MSB

LSB
PC0 0 1 0 1 0 0 0 1
PC1 CGMS ISR CMP SS
PC2 REC ST REC END REC MODE INSET CH
PC3 DRF SPEED
PC4 1 GENRE CATEGORY
CGMS
00: OK
01: Not used
10: one time
11: not copy

AAUX REC DATE

MSB

LSB
PC0 0 1 0 1 0 0 1 0
PC1 DS TM TENS of TIME ZONE UNITS of TIME ZONE
PC2 1 1 TENS of DAY UNITS of DAY
PC3 WEEK TNMN UNITS of MONTH
PC4 TENS of YEAR UNITS of YEAR

AAUX REC TIME

MSB

LSB
PC0 0 1 0 1 0 0 1 1
PC1 1 1 TENS of FRAMES UNITS of FRAMES
PC2 1 TENS of SECONDS UNITS of SECONDS
PC3 1 TENS of MINUTES UNITS of MINUTES
PC4 1 1 TENS of HOURS UNITS of HOURS
VAUX SOURCE

MSB

LSB
PC0 0 1 1 0 0 0 0 0
PC1 TENS of CH UNITSS of CH
PC2 B/W EN CLF HOUNDREDS of CH
PC3 SOURCE CODE 50/60 STYPE
PC4 TUNER CATEGORY
SOURCE CODE
00 CAMERA
01 LINE
10 CATV
11 TV

VAUX SOURCE CODE

MSB

LSB
PC0 0 1 1 0 0 0 0 1
PC1 CGMS ISR CMP SS
PC2 REC ST 1 REC MODE 1 DISP
PC3 FF FS FC IL ST SC BSYS
PC4 1 GENRE CATEGORY
DISP
000:  4:3
001: 16:9
010: 16:9(スクイーズ)

FS
0: output Field 2 
1: output Field 1 

IL Interless

VAUX REC DATE

MSB

LSB
PC0 0 1 1 0 0 0 1 0
PC1 DS TM TENS of TIME ZONE UNITS of TIME ZONE
PC2 1 1 TENS of DAY UNITS of DAY
PC3 WEEK TNMN UNITS of MONTH
PC4 TENS of YEAR UNITS of YEAR

VAUX REC TIME

MSB
6 7
LSB
PC0 0 1 1 0 0 0 1 1
PC1 1 1 TENS of FRAMES UNITS of FRAMES
PC2 1 TENS of SECONDS UNITS of SECONDS
PC3 1 TENS of MINUTES UNITS of MINUTES
PC4 1 1 TENS of HOURS UNITS of HOURS
by IEC61834-4


[付録] DVストリームに含まれる録画日時と録画時刻を表示するプログラム

#!/usr/local/bin/perl
#
# decode REC DATE and REC TIME  from DV stream.
#
# eggman@ptie.org 2001.3.7


open (DVIN ,"test.dv");
binmode DVIN;

# search "5F 07 02"
	while(read(DVIN, $buf, 1)){
		if($buf eq pack("H2", "5F")){
			read(DVIN, $buf, 1);
			if($buf eq pack("H2", "07")){
				read(DVIN, $buf, 1);
				if($buf eq pack("H2", "02")){
					read(DVIN, $buf, 77);
#					print unpack("H144", $buf) . "\n";
					&decode_VAUX($buf);
				}
			}
		}
	}

close (DVIN);


sub decode_VAUX(){
	
	$PC = substr($_[0], 55,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 "Time Zone: ". unpack("H2", ($pc1&pack("H2","3F"))) . "\n";
	print "Day      : ". unpack("H2", ($pc2&pack("H2","3F"))) . "\n";
	print "Month    : ". unpack("H2", ($pc3&pack("H2","1F"))) . "\n";
	print "Week     : ". unpack("H1", $pc3>>5) . "\n";
	print "Year     : ". unpack("H2", ($pc4&pack("H2","3F"))) . "\n";


	$PC = substr($_[0], 60,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";

}

実行例
> ./recdate.pl 
62ffc68100
Header   : 62
Time Zone: 3f
Day      : 06
Month    : 01
Week     : 3
Year     : 00
63ffd4a7d8
Header   : 63
Frames   : 3f
Seconds  : 54
Minutes  : 27
Hours    : 18
62ffc68100
Header   : 62
Time Zone: 3f
Day      : 06
Month    : 01
Week     : 3
Year     : 00
63ffd4a7d8
Header   : 63
Frames   : 3f
Seconds  : 54
Minutes  : 27
Hours    : 18
DVストリームに含まれるオーディオフレームサイズ(48khzの場合のみ)を表示するプログラム

#!/usr/local/bin/perl
#
# decode Audio Frame Size  from DV stream.
#
# eggman@ptie.org 2001.3.7


open (DVIN ,"test.dv");
binmode DVIN;

# search "70 07 03"
	while(read(DVIN, $buf, 1)){
		if(7  eq unpack("H1", $buf)){
			read(DVIN, $buf, 1);
			if($buf eq pack("H2", "07")){
				read(DVIN, $buf, 1);

					read(DVIN, $buf, 77);
					$P0 = substr($buf, 0 ,1);
#					print unpack("H144", $buf) . "\n";
					&decode_AAUX($buf) if ($P0 eq pack("H2", "50"));
			}
		}
	}

close (DVIN);


sub decode_AAUX(){
	
	$PC = substr($_[0], 0 ,5);
	print unpack("H10", $PC) . "\n";

	$pc4 = chop($PC);
	$pc3 = chop($PC);
	$pc2 = chop($PC);
	$pc1 = chop($PC);
	$pc0 = chop($PC);

	return 0  unless($pc0 eq pack("H2", "50"));

        print "Header   : ". unpack("H2", $pc0) . "\n";
	$AF_SIZE = unpack("H2", ($pc1&pack("H2","3F"))) +1580;
        print "Audio Frame Size: ". $AF_SIZE . "\n";



}

実行例
> ./AAUX.pl
50d500c0c0
Header   : 50
Audio Frame Size: 1595
50d600c0c0
Header   : 50
Audio Frame Size: 1596
50d600c0c0
Header   : 50
Audio Frame Size: 1596
50d500c0c0
Header   : 50
Audio Frame Size: 1595
50d600c0c0
Header   : 50
Audio Frame Size: 1596
50d500c0c0
Header   : 50
Audio Frame Size: 1595
50d600c0c0
Header   : 50
Audio Frame Size: 1596
50d600c0c0
Header   : 50
Audio Frame Size: 1596
50d500c0c0
Header   : 50
Audio Frame Size: 1595