##------------------------------------------------------------------------
## Package: Video::Info::MPEG::Constants
## Author: Benjamin R. Ginter
## Notice: Copyright (c) 2001 Benjamin R. Ginter
## Purpose: MPEG codes, blocks, constants...
## Comments: None
## CVS: $Header: /cvsroot/perlvideo/Info/MPEG/Constants.pm,v 1.3 2002/11/12 07:19:34 allenday Exp $
##------------------------------------------------------------------------
package Video::Info::MPEG::Constants;
use strict;
require Exporter;
our @ISA = qw( Exporter);
##------------------------------------------------------------------------
## FRAME_RATE
##
## A lookup table of all the standard frame rates. Some rates adhere to
## a particular profile that ensures compatibility with VLSI capabilities
## of the early to mid 1990s.
##
## CPB
## Constrained Parameters Bitstreams, an MPEG-1 set of sampling and
## bitstream parameters designed to normalize decoder computational
## complexity, buffer size, and memory bandwidth while still addressing
## the widest possible range of applications.
##
## Main Level
## MPEG-2 Video Main Profile and Main Level is analogous to MPEG-1's
## CPB, with sampling limits at CCIR 601 parameters (720x480x30 Hz or
## 720x576x24 Hz).
##
##------------------------------------------------------------------------
our $FRAME_RATE =
[ 0,
24000/1001, ## 3-2 pulldown NTSC (CPB/Main Level)
24, ## Film (CPB/Main Level)
25, ## PAL/SECAM or 625/60 video
30000/1001, ## NTSC (CPB/Main Level)
30, ## drop-frame NTSC or component 525/60 (CPB/Main Level)
50, ## double-rate PAL
60000/1001, ## double-rate NTSC
60, ## double-rate, drop-frame NTSC/component 525/60 video
];
##------------------------------------------------------------------------
## ASPECT_RATIO -- INCOMPLETE?
##
## This lookup table maps the header aspect ratio index to a common name.
## These are just the defined ratios for CPB I believe. As I understand
## it, a stream that doesn't adhere to one of these aspect ratios is
## technically considered non-compliant.
##------------------------------------------------------------------------
our $ASPECT_RATIO = [ 'Forbidden',
'1/1 (VGA)',
'4/3 (TV)',
'16/9 (Large TV)',
'2.21/1 (Cinema)',
];
##------------------------------------------------------------------------
## The MPEG Audio Bit Rate Lookup Table
##
## MPEG Version [hashref]
## |
## +-- MPEG Layer [hashref]
## |
## +-- Bitrates [arrayref]
##------------------------------------------------------------------------
our $AUDIO_BITRATE = {
1 => {
1 => [ 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 ],
2 => [ 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 ],
3 => [ 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 ],
},
2 => {
1 => [ 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 ],
2 => [ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 ],
3 => [ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 ],
},
};
##------------------------------------------------------------------------
## The MPEG Audio Sampling Rate Lookup Table
##
## MPEG Layer [hashref]
## |
## +-- Sampling Rate [arrayref]
##
##------------------------------------------------------------------------
our $AUDIO_SAMPLING_RATE = {
1 => [ 44100, 48000, 32000, 0 ],
2 => [ 22050, 24000, 16000, 0 ],
3 => [ 11025, 12000, 8000, 0 ], ## mpeg2.5
};
##------------------------------------------------------------------------
## START_CODE
##
## Start Codes, with 'slice' occupying 0x01..0xAF
## No inlining here but easy lookups when codes are encountered. Only
## really useful for debugging or dumping the bitstream structure.
##------------------------------------------------------------------------
our $START_CODE = {
0x00 => 'picture_start_code',
( map { $_ => 'slice_start_code' } ( 0x01..0xAF ) ),
0xB0 => 'reserved',
0xB1 => 'reserved',
0xB2 => 'user_data_start_code',
0xB3 => 'sequence_header_code',
0xB4 => 'sequence_error_code',
0xB5 => 'extension_start_code',
0xB6 => 'reserved',
0xB7 => 'sequence end',
0xB8 => 'group of pictures',
};
##------------------------------------------------------------------------
## INLINED START CODES
##
## These should get inlined for a big speed boost. We should only need
## these codes.
##------------------------------------------------------------------------
use constant PICTURE => 0x00;
use constant USERDATA => 0xB2;
use constant SEQ_HEAD => 0xB3;
use constant SEQ_ERR => 0xB4;
use constant EXT_START => 0xB5;
use constant SEQ_END => 0xB7;
use constant GOP => 0xB8;
use constant SEQ_START_CODE => 0xB3;
use constant PACK_PKT => 0xBA;
use constant SYS_PKT => 0xBB;
use constant PADDING_PKT => 0xBE;
use constant AUDIO_PKT => 0xC0;
use constant VIDEO_PKT => 0xE0;
##------------------------------------------------------------------------
## FRAME TYPES
##------------------------------------------------------------------------
our $FRAME_TYPES = [ qw( Bad I P B ) ];
##------------------------------------------------------------------------
## STREAM_ID
##
## Stream Identifiers
##------------------------------------------------------------------------
our $STREAM_ID = {
0x00 => 'Unknown',
( map { $_ => 'slice_start_code' } ( 0x01..0xAF ) ),
0xB3 => 'Sequence Start',
0xB7 => 'Sequence End',
0xB8 => 'Group of Pictures',
0xB9 => 'Program End',
0xBA => 'Pack Header',
0xBB => 'System Header',
0xBC => 'Program Stream Map',
0xBD => 'Private Stream 1',
0xBE => 'Padding Stream',
0xBF => 'Private Stream 2',
( map { $_ => 'MPEG-1 or MPEG-2 Audio Stream' } ( 0xC0..0xDF ) ),
( map { $_ => 'MPEG-1 or MPEG-2 Video Stream' } ( 0xE0..0xEF ) ),
0xF0 => 'ECM Stream',
0xF1 => 'EMM Stream',
0xF2 => 'ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Annex A or ISO/IEC 13818-6_DSMCC_stream',
0xF3 => 'ISO/IEC_13522_stream',
0xF4 => 'ITU-T Rec. H.222.1 type A',
0xF5 => 'ITU-T Rec. H.222.1 type B',
0xF6 => 'ITU-T Rec. H.222.1 type C',
0xF7 => 'ITU-T Rec. H.222.1 type D',
0xF8 => 'ITU-T Rec. H.222.1 type E',
0xF9 => 'Ancillary Stream',
( map { $_ => 'Reserved' } ( 0xFA..0xFE ) ),
0xFF => 'Program Stream Directory',
};
##------------------------------------------------------------------------
## EXTENSION_CODE
##
##
##------------------------------------------------------------------------
our $EXTENSION_CODE = [
'Reserved', # 0000
'Sequence Extension ID', # 0001
'Sequence Display Extension ID', # 0010
'Quant Matrix Extension ID', # 0011
'Reserved', # 0100
'Sequence Scalable Extension ID', # 0101
'Reserved', # 0110
'Picture Display Extension ID', # 0111
'Picture Coding Extension ID', # 1000
'Picture Spatial Scalable Extension ID', # 1001
'Picture Temporal Scalable Extension ID', # 1010
'Reserved' x 5 # 1011, 1100, 1101, 1110, 1111
];
##------------------------------------------------------------------------
## IMAGE FORMATS
##
## Names of various image/video resolutions.
##------------------------------------------------------------------------
our $IMAGE_FORMATS = {
352 => { 240 => 'SIF. CD WhiteBook Movies, video games.',
480 => 'HHR. VHS equivalent', },
480 => { 480 => 'Bandlimited (4.2 Mhz) broadcast NTSC.', },
544 => { 480 => 'Laserdisc, D-2, Bandlimited PAL/SECAM.', },
640 => { 480 => 'Square pixel NTSC', },
720 => { 480 => 'CCIR 601. Studio D-1. Upper limit of Main Level.' },
};
##------------------------------------------------------------------------
## Items to export into callers namespace by default. Note: do not export
## names by default without a very good reason. Use EXPORT_OK instead.
## Do not simply export all your public functions/methods/constants.
##------------------------------------------------------------------------
## This allows declaration use Video::Info::MPEG::Constants ':all';
## If you do not need this, moving things directly into @EXPORT or
## @EXPORT_OK will save memory.
##------------------------------------------------------------------------
our %EXPORT_TAGS = ( 'all' => [ qw() ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw( SEQ_START_CODE $FRAME_RATE $ASPECT_RATIO
$START_CODE $STREAM_ID
$AUDIO_BITRATE $AUDIO_SAMPLING_RATE
PICTURE USERDATA SEQ_HEAD SEQ_ERR EXT_START SEQ_END GOP
SEQ_START_CODE PACK_PKT SYS_PKT PADDING_PKT
AUDIO_PKT VIDEO_PKT
);
##------------------------------------------------------------------------
## Preloaded methods go here.
##------------------------------------------------------------------------
1;
__END__
=head1 AUTHORS
Copyright (c) 2002
Aladdin Free Public License (see LICENSE for details)
Allen Day, <allenday@ucla.edu>
Benjamin R. Ginter <bginter@asicommunications.com>