| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
2
|
|
|
|
|
|
|
## Package: Video::Info::MPEG::Constants |
|
3
|
|
|
|
|
|
|
## Author: Benjamin R. Ginter |
|
4
|
|
|
|
|
|
|
## Notice: Copyright (c) 2001 Benjamin R. Ginter |
|
5
|
|
|
|
|
|
|
## Purpose: MPEG codes, blocks, constants... |
|
6
|
|
|
|
|
|
|
## Comments: None |
|
7
|
|
|
|
|
|
|
## CVS: $Header: /cvsroot/perlvideo/Info/MPEG/Constants.pm,v 1.3 2002/11/12 07:19:34 allenday Exp $ |
|
8
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
package Video::Info::MPEG::Constants; |
|
11
|
5
|
|
|
5
|
|
27
|
use strict; |
|
|
5
|
|
|
|
|
8
|
|
|
|
5
|
|
|
|
|
1861
|
|
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
require Exporter; |
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
our @ISA = qw( Exporter); |
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
18
|
|
|
|
|
|
|
## FRAME_RATE |
|
19
|
|
|
|
|
|
|
## |
|
20
|
|
|
|
|
|
|
## A lookup table of all the standard frame rates. Some rates adhere to |
|
21
|
|
|
|
|
|
|
## a particular profile that ensures compatibility with VLSI capabilities |
|
22
|
|
|
|
|
|
|
## of the early to mid 1990s. |
|
23
|
|
|
|
|
|
|
## |
|
24
|
|
|
|
|
|
|
## CPB |
|
25
|
|
|
|
|
|
|
## Constrained Parameters Bitstreams, an MPEG-1 set of sampling and |
|
26
|
|
|
|
|
|
|
## bitstream parameters designed to normalize decoder computational |
|
27
|
|
|
|
|
|
|
## complexity, buffer size, and memory bandwidth while still addressing |
|
28
|
|
|
|
|
|
|
## the widest possible range of applications. |
|
29
|
|
|
|
|
|
|
## |
|
30
|
|
|
|
|
|
|
## Main Level |
|
31
|
|
|
|
|
|
|
## MPEG-2 Video Main Profile and Main Level is analogous to MPEG-1's |
|
32
|
|
|
|
|
|
|
## CPB, with sampling limits at CCIR 601 parameters (720x480x30 Hz or |
|
33
|
|
|
|
|
|
|
## 720x576x24 Hz). |
|
34
|
|
|
|
|
|
|
## |
|
35
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
36
|
|
|
|
|
|
|
our $FRAME_RATE = |
|
37
|
|
|
|
|
|
|
[ 0, |
|
38
|
|
|
|
|
|
|
24000/1001, ## 3-2 pulldown NTSC (CPB/Main Level) |
|
39
|
|
|
|
|
|
|
24, ## Film (CPB/Main Level) |
|
40
|
|
|
|
|
|
|
25, ## PAL/SECAM or 625/60 video |
|
41
|
|
|
|
|
|
|
30000/1001, ## NTSC (CPB/Main Level) |
|
42
|
|
|
|
|
|
|
30, ## drop-frame NTSC or component 525/60 (CPB/Main Level) |
|
43
|
|
|
|
|
|
|
50, ## double-rate PAL |
|
44
|
|
|
|
|
|
|
60000/1001, ## double-rate NTSC |
|
45
|
|
|
|
|
|
|
60, ## double-rate, drop-frame NTSC/component 525/60 video |
|
46
|
|
|
|
|
|
|
]; |
|
47
|
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
49
|
|
|
|
|
|
|
## ASPECT_RATIO -- INCOMPLETE? |
|
50
|
|
|
|
|
|
|
## |
|
51
|
|
|
|
|
|
|
## This lookup table maps the header aspect ratio index to a common name. |
|
52
|
|
|
|
|
|
|
## These are just the defined ratios for CPB I believe. As I understand |
|
53
|
|
|
|
|
|
|
## it, a stream that doesn't adhere to one of these aspect ratios is |
|
54
|
|
|
|
|
|
|
## technically considered non-compliant. |
|
55
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
56
|
|
|
|
|
|
|
our $ASPECT_RATIO = [ 'Forbidden', |
|
57
|
|
|
|
|
|
|
'1/1 (VGA)', |
|
58
|
|
|
|
|
|
|
'4/3 (TV)', |
|
59
|
|
|
|
|
|
|
'16/9 (Large TV)', |
|
60
|
|
|
|
|
|
|
'2.21/1 (Cinema)', |
|
61
|
|
|
|
|
|
|
]; |
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
64
|
|
|
|
|
|
|
## The MPEG Audio Bit Rate Lookup Table |
|
65
|
|
|
|
|
|
|
## |
|
66
|
|
|
|
|
|
|
## MPEG Version [hashref] |
|
67
|
|
|
|
|
|
|
## | |
|
68
|
|
|
|
|
|
|
## +-- MPEG Layer [hashref] |
|
69
|
|
|
|
|
|
|
## | |
|
70
|
|
|
|
|
|
|
## +-- Bitrates [arrayref] |
|
71
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
72
|
|
|
|
|
|
|
our $AUDIO_BITRATE = { |
|
73
|
|
|
|
|
|
|
1 => { |
|
74
|
|
|
|
|
|
|
1 => [ 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 ], |
|
75
|
|
|
|
|
|
|
2 => [ 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 ], |
|
76
|
|
|
|
|
|
|
3 => [ 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 ], |
|
77
|
|
|
|
|
|
|
}, |
|
78
|
|
|
|
|
|
|
2 => { |
|
79
|
|
|
|
|
|
|
1 => [ 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 ], |
|
80
|
|
|
|
|
|
|
2 => [ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 ], |
|
81
|
|
|
|
|
|
|
3 => [ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 ], |
|
82
|
|
|
|
|
|
|
}, |
|
83
|
|
|
|
|
|
|
}; |
|
84
|
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
86
|
|
|
|
|
|
|
## The MPEG Audio Sampling Rate Lookup Table |
|
87
|
|
|
|
|
|
|
## |
|
88
|
|
|
|
|
|
|
## MPEG Layer [hashref] |
|
89
|
|
|
|
|
|
|
## | |
|
90
|
|
|
|
|
|
|
## +-- Sampling Rate [arrayref] |
|
91
|
|
|
|
|
|
|
## |
|
92
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
93
|
|
|
|
|
|
|
our $AUDIO_SAMPLING_RATE = { |
|
94
|
|
|
|
|
|
|
1 => [ 44100, 48000, 32000, 0 ], |
|
95
|
|
|
|
|
|
|
2 => [ 22050, 24000, 16000, 0 ], |
|
96
|
|
|
|
|
|
|
3 => [ 11025, 12000, 8000, 0 ], ## mpeg2.5 |
|
97
|
|
|
|
|
|
|
}; |
|
98
|
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
102
|
|
|
|
|
|
|
## START_CODE |
|
103
|
|
|
|
|
|
|
## |
|
104
|
|
|
|
|
|
|
## Start Codes, with 'slice' occupying 0x01..0xAF |
|
105
|
|
|
|
|
|
|
## No inlining here but easy lookups when codes are encountered. Only |
|
106
|
|
|
|
|
|
|
## really useful for debugging or dumping the bitstream structure. |
|
107
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
108
|
|
|
|
|
|
|
our $START_CODE = { |
|
109
|
|
|
|
|
|
|
0x00 => 'picture_start_code', |
|
110
|
|
|
|
|
|
|
( map { $_ => 'slice_start_code' } ( 0x01..0xAF ) ), |
|
111
|
|
|
|
|
|
|
0xB0 => 'reserved', |
|
112
|
|
|
|
|
|
|
0xB1 => 'reserved', |
|
113
|
|
|
|
|
|
|
0xB2 => 'user_data_start_code', |
|
114
|
|
|
|
|
|
|
0xB3 => 'sequence_header_code', |
|
115
|
|
|
|
|
|
|
0xB4 => 'sequence_error_code', |
|
116
|
|
|
|
|
|
|
0xB5 => 'extension_start_code', |
|
117
|
|
|
|
|
|
|
0xB6 => 'reserved', |
|
118
|
|
|
|
|
|
|
0xB7 => 'sequence end', |
|
119
|
|
|
|
|
|
|
0xB8 => 'group of pictures', |
|
120
|
|
|
|
|
|
|
}; |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
123
|
|
|
|
|
|
|
## INLINED START CODES |
|
124
|
|
|
|
|
|
|
## |
|
125
|
|
|
|
|
|
|
## These should get inlined for a big speed boost. We should only need |
|
126
|
|
|
|
|
|
|
## these codes. |
|
127
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
128
|
5
|
|
|
5
|
|
30
|
use constant PICTURE => 0x00; |
|
|
5
|
|
|
|
|
8
|
|
|
|
5
|
|
|
|
|
1115
|
|
|
129
|
5
|
|
|
5
|
|
156
|
use constant USERDATA => 0xB2; |
|
|
5
|
|
|
|
|
19
|
|
|
|
5
|
|
|
|
|
360
|
|
|
130
|
5
|
|
|
5
|
|
24
|
use constant SEQ_HEAD => 0xB3; |
|
|
5
|
|
|
|
|
9
|
|
|
|
5
|
|
|
|
|
393
|
|
|
131
|
5
|
|
|
5
|
|
32
|
use constant SEQ_ERR => 0xB4; |
|
|
5
|
|
|
|
|
9
|
|
|
|
5
|
|
|
|
|
266
|
|
|
132
|
5
|
|
|
5
|
|
25
|
use constant EXT_START => 0xB5; |
|
|
5
|
|
|
|
|
8
|
|
|
|
5
|
|
|
|
|
297
|
|
|
133
|
5
|
|
|
5
|
|
23
|
use constant SEQ_END => 0xB7; |
|
|
5
|
|
|
|
|
9
|
|
|
|
5
|
|
|
|
|
222
|
|
|
134
|
5
|
|
|
5
|
|
25
|
use constant GOP => 0xB8; |
|
|
5
|
|
|
|
|
90
|
|
|
|
5
|
|
|
|
|
316
|
|
|
135
|
|
|
|
|
|
|
|
|
136
|
5
|
|
|
5
|
|
27
|
use constant SEQ_START_CODE => 0xB3; |
|
|
5
|
|
|
|
|
7
|
|
|
|
5
|
|
|
|
|
279
|
|
|
137
|
5
|
|
|
5
|
|
25
|
use constant PACK_PKT => 0xBA; |
|
|
5
|
|
|
|
|
9
|
|
|
|
5
|
|
|
|
|
231
|
|
|
138
|
5
|
|
|
5
|
|
24
|
use constant SYS_PKT => 0xBB; |
|
|
5
|
|
|
|
|
8
|
|
|
|
5
|
|
|
|
|
226
|
|
|
139
|
5
|
|
|
5
|
|
24
|
use constant PADDING_PKT => 0xBE; |
|
|
5
|
|
|
|
|
8
|
|
|
|
5
|
|
|
|
|
228
|
|
|
140
|
|
|
|
|
|
|
|
|
141
|
5
|
|
|
5
|
|
31
|
use constant AUDIO_PKT => 0xC0; |
|
|
5
|
|
|
|
|
8
|
|
|
|
5
|
|
|
|
|
207
|
|
|
142
|
5
|
|
|
5
|
|
25
|
use constant VIDEO_PKT => 0xE0; |
|
|
5
|
|
|
|
|
7
|
|
|
|
5
|
|
|
|
|
2103
|
|
|
143
|
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
147
|
|
|
|
|
|
|
## FRAME TYPES |
|
148
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
149
|
|
|
|
|
|
|
our $FRAME_TYPES = [ qw( Bad I P B ) ]; |
|
150
|
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
152
|
|
|
|
|
|
|
## STREAM_ID |
|
153
|
|
|
|
|
|
|
## |
|
154
|
|
|
|
|
|
|
## Stream Identifiers |
|
155
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
156
|
|
|
|
|
|
|
our $STREAM_ID = { |
|
157
|
|
|
|
|
|
|
0x00 => 'Unknown', |
|
158
|
|
|
|
|
|
|
( map { $_ => 'slice_start_code' } ( 0x01..0xAF ) ), |
|
159
|
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
0xB3 => 'Sequence Start', |
|
161
|
|
|
|
|
|
|
0xB7 => 'Sequence End', |
|
162
|
|
|
|
|
|
|
0xB8 => 'Group of Pictures', |
|
163
|
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
0xB9 => 'Program End', |
|
165
|
|
|
|
|
|
|
0xBA => 'Pack Header', |
|
166
|
|
|
|
|
|
|
0xBB => 'System Header', |
|
167
|
|
|
|
|
|
|
0xBC => 'Program Stream Map', |
|
168
|
|
|
|
|
|
|
0xBD => 'Private Stream 1', |
|
169
|
|
|
|
|
|
|
0xBE => 'Padding Stream', |
|
170
|
|
|
|
|
|
|
0xBF => 'Private Stream 2', |
|
171
|
|
|
|
|
|
|
( map { $_ => 'MPEG-1 or MPEG-2 Audio Stream' } ( 0xC0..0xDF ) ), |
|
172
|
|
|
|
|
|
|
( map { $_ => 'MPEG-1 or MPEG-2 Video Stream' } ( 0xE0..0xEF ) ), |
|
173
|
|
|
|
|
|
|
0xF0 => 'ECM Stream', |
|
174
|
|
|
|
|
|
|
0xF1 => 'EMM Stream', |
|
175
|
|
|
|
|
|
|
0xF2 => 'ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Annex A or ISO/IEC 13818-6_DSMCC_stream', |
|
176
|
|
|
|
|
|
|
0xF3 => 'ISO/IEC_13522_stream', |
|
177
|
|
|
|
|
|
|
0xF4 => 'ITU-T Rec. H.222.1 type A', |
|
178
|
|
|
|
|
|
|
0xF5 => 'ITU-T Rec. H.222.1 type B', |
|
179
|
|
|
|
|
|
|
0xF6 => 'ITU-T Rec. H.222.1 type C', |
|
180
|
|
|
|
|
|
|
0xF7 => 'ITU-T Rec. H.222.1 type D', |
|
181
|
|
|
|
|
|
|
0xF8 => 'ITU-T Rec. H.222.1 type E', |
|
182
|
|
|
|
|
|
|
0xF9 => 'Ancillary Stream', |
|
183
|
|
|
|
|
|
|
( map { $_ => 'Reserved' } ( 0xFA..0xFE ) ), |
|
184
|
|
|
|
|
|
|
0xFF => 'Program Stream Directory', |
|
185
|
|
|
|
|
|
|
}; |
|
186
|
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
188
|
|
|
|
|
|
|
## EXTENSION_CODE |
|
189
|
|
|
|
|
|
|
## |
|
190
|
|
|
|
|
|
|
## |
|
191
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
192
|
|
|
|
|
|
|
our $EXTENSION_CODE = [ |
|
193
|
|
|
|
|
|
|
'Reserved', # 0000 |
|
194
|
|
|
|
|
|
|
'Sequence Extension ID', # 0001 |
|
195
|
|
|
|
|
|
|
'Sequence Display Extension ID', # 0010 |
|
196
|
|
|
|
|
|
|
'Quant Matrix Extension ID', # 0011 |
|
197
|
|
|
|
|
|
|
'Reserved', # 0100 |
|
198
|
|
|
|
|
|
|
'Sequence Scalable Extension ID', # 0101 |
|
199
|
|
|
|
|
|
|
'Reserved', # 0110 |
|
200
|
|
|
|
|
|
|
'Picture Display Extension ID', # 0111 |
|
201
|
|
|
|
|
|
|
'Picture Coding Extension ID', # 1000 |
|
202
|
|
|
|
|
|
|
'Picture Spatial Scalable Extension ID', # 1001 |
|
203
|
|
|
|
|
|
|
'Picture Temporal Scalable Extension ID', # 1010 |
|
204
|
|
|
|
|
|
|
'Reserved' x 5 # 1011, 1100, 1101, 1110, 1111 |
|
205
|
|
|
|
|
|
|
]; |
|
206
|
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
208
|
|
|
|
|
|
|
## IMAGE FORMATS |
|
209
|
|
|
|
|
|
|
## |
|
210
|
|
|
|
|
|
|
## Names of various image/video resolutions. |
|
211
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
212
|
|
|
|
|
|
|
our $IMAGE_FORMATS = { |
|
213
|
|
|
|
|
|
|
352 => { 240 => 'SIF. CD WhiteBook Movies, video games.', |
|
214
|
|
|
|
|
|
|
480 => 'HHR. VHS equivalent', }, |
|
215
|
|
|
|
|
|
|
480 => { 480 => 'Bandlimited (4.2 Mhz) broadcast NTSC.', }, |
|
216
|
|
|
|
|
|
|
544 => { 480 => 'Laserdisc, D-2, Bandlimited PAL/SECAM.', }, |
|
217
|
|
|
|
|
|
|
640 => { 480 => 'Square pixel NTSC', }, |
|
218
|
|
|
|
|
|
|
720 => { 480 => 'CCIR 601. Studio D-1. Upper limit of Main Level.' }, |
|
219
|
|
|
|
|
|
|
}; |
|
220
|
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
224
|
|
|
|
|
|
|
## Items to export into callers namespace by default. Note: do not export |
|
225
|
|
|
|
|
|
|
## names by default without a very good reason. Use EXPORT_OK instead. |
|
226
|
|
|
|
|
|
|
## Do not simply export all your public functions/methods/constants. |
|
227
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
228
|
|
|
|
|
|
|
## This allows declaration use Video::Info::MPEG::Constants ':all'; |
|
229
|
|
|
|
|
|
|
## If you do not need this, moving things directly into @EXPORT or |
|
230
|
|
|
|
|
|
|
## @EXPORT_OK will save memory. |
|
231
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
232
|
|
|
|
|
|
|
our %EXPORT_TAGS = ( 'all' => [ qw() ] ); |
|
233
|
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); |
|
235
|
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
our @EXPORT = qw( SEQ_START_CODE $FRAME_RATE $ASPECT_RATIO |
|
237
|
|
|
|
|
|
|
$START_CODE $STREAM_ID |
|
238
|
|
|
|
|
|
|
$AUDIO_BITRATE $AUDIO_SAMPLING_RATE |
|
239
|
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
PICTURE USERDATA SEQ_HEAD SEQ_ERR EXT_START SEQ_END GOP |
|
241
|
|
|
|
|
|
|
SEQ_START_CODE PACK_PKT SYS_PKT PADDING_PKT |
|
242
|
|
|
|
|
|
|
AUDIO_PKT VIDEO_PKT |
|
243
|
|
|
|
|
|
|
); |
|
244
|
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
246
|
|
|
|
|
|
|
## Preloaded methods go here. |
|
247
|
|
|
|
|
|
|
##------------------------------------------------------------------------ |
|
248
|
|
|
|
|
|
|
1; |
|
249
|
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
__END__ |