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__ |