Passed
Branch master (f2d2e3)
by Michael
18:45
created

getid3_ac3::Analyze()   F

Complexity

Conditions 23
Paths > 20000

Size

Total Lines 222

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 23
c 1
b 0
f 0
nc 184323
dl 0
loc 222
rs 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
// +----------------------------------------------------------------------+
3
// | PHP version 5                                                        |
4
// +----------------------------------------------------------------------+
5
// | Copyright (c) 2002-2006 James Heinrich, Allan Hansen                 |
6
// +----------------------------------------------------------------------+
7
// | This source file is subject to version 2 of the GPL license,         |
8
// | that is bundled with this package in the file license.txt and is     |
9
// | available through the world-wide-web at the following url:           |
10
// | http://www.gnu.org/copyleft/gpl.html                                 |
11
// +----------------------------------------------------------------------+
12
// | getID3() - http://getid3.sourceforge.net or http://www.getid3.org    |
13
// +----------------------------------------------------------------------+
14
// | Authors: James Heinrich <info�getid3*org>                            |
15
// |          Allan Hansen <ah�artemis*dk>                                |
16
// +----------------------------------------------------------------------+
17
// | module.audio.ac3.php                                                 |
18
// | Module for analyzing AC-3 (aka Dolby Digital) audio files            |
19
// | dependencies: NONE                                                   |
20
// +----------------------------------------------------------------------+
21
//
22
// $Id: module.audio.ac3.php,v 1.3 2006/11/02 10:48:01 ah Exp $
23
24
        
25
        
26
class getid3_ac3 extends getid3_handler
27
{
28
29
    public function Analyze() {
30
31
        $getid3 = $this->getid3;
32
        
33
        // http://www.atsc.org/standards/a_52a.pdf
34
35
        $getid3->info['fileformat']            = 'ac3';
36
        $getid3->info['audio']['dataformat']   = 'ac3';
37
        $getid3->info['audio']['bitrate_mode'] = 'cbr';
38
        $getid3->info['audio']['lossless']     = false;
39
40
        $getid3->info['ac3']['raw']['bsi'] = array ();
41
        $info_ac3         = &$getid3->info['ac3'];
42
        $info_ac3_raw     = &$info_ac3['raw'];
43
        $info_ac3_raw_bsi = &$info_ac3_raw['bsi'];
44
45
46
        // An AC-3 serial coded audio bit stream is made up of a sequence of synchronization frames
47
        // Each synchronization frame contains 6 coded audio blocks (AB), each of which represent 256
48
        // new audio samples per channel. A synchronization information (SI) header at the beginning
49
        // of each frame contains information needed to acquire and maintain synchronization. A
50
        // bit stream information (BSI) header follows SI, and contains parameters describing the coded
51
        // audio service. The coded audio blocks may be followed by an auxiliary data (Aux) field. At the
52
        // end of each frame is an error check field that includes a CRC word for error detection. An
53
        // additional CRC word is located in the SI header, the use of which, by a decoder, is optional.
54
        //
55
        // syncinfo() | bsi() | AB0 | AB1 | AB2 | AB3 | AB4 | AB5 | Aux | CRC
56
57
        $this->fseek($getid3->info['avdataoffset'], SEEK_SET);
58
        $ac3_header['syncinfo'] = $this->fread(5);
0 ignored issues
show
Comprehensibility Best Practice introduced by
$ac3_header was never initialized. Although not strictly required by PHP, it is generally a good practice to add $ac3_header = array(); before regardless.
Loading history...
59
        $info_ac3_raw['synchinfo']['synchword'] = substr($ac3_header['syncinfo'], 0, 2);
60
61
        if ($info_ac3_raw['synchinfo']['synchword'] != "\x0B\x77") {
62
            throw new getid3_exception('Expecting "\x0B\x77" at offset '.$getid3->info['avdataoffset'].', found \x'.strtoupper(dechex($ac3_header['syncinfo']{0})).'\x'.strtoupper(dechex($ac3_header['syncinfo']{1})).' instead');
63
        } 
64
65
66
        // syncinfo() {
67
        //      syncword    16
68
        //      crc1        16
69
        //      fscod        2
70
        //      frmsizecod   6
71
        // } /* end of syncinfo */
72
73
        $info_ac3_raw['synchinfo']['crc1']       = getid3_lib::LittleEndian2Int(substr($ac3_header['syncinfo'], 2, 2));
74
        $ac3_synchinfo_fscod_frmsizecod          = getid3_lib::LittleEndian2Int(substr($ac3_header['syncinfo'], 4, 1));
75
        $info_ac3_raw['synchinfo']['fscod']      = ($ac3_synchinfo_fscod_frmsizecod & 0xC0) >> 6;
76
        $info_ac3_raw['synchinfo']['frmsizecod'] = ($ac3_synchinfo_fscod_frmsizecod & 0x3F);
77
78
        $info_ac3['sample_rate'] = getid3_ac3::AC3sampleRateCodeLookup($info_ac3_raw['synchinfo']['fscod']);
79
        if ($info_ac3_raw['synchinfo']['fscod'] <= 3) {
80
            $getid3->info['audio']['sample_rate'] = $info_ac3['sample_rate'];
81
        }
82
83
        $info_ac3['frame_length'] = getid3_ac3::AC3frameSizeLookup($info_ac3_raw['synchinfo']['frmsizecod'], $info_ac3_raw['synchinfo']['fscod']);
84
        $info_ac3['bitrate']      = getid3_ac3::AC3bitrateLookup($info_ac3_raw['synchinfo']['frmsizecod']);
85
        $getid3->info['audio']['bitrate'] = $info_ac3['bitrate'];
86
87
        $ac3_header['bsi'] = getid3_lib::BigEndian2Bin($this->fread(15));
88
89
        $info_ac3_raw_bsi['bsid'] = bindec(substr($ac3_header['bsi'], 0, 5));
90
        if ($info_ac3_raw_bsi['bsid'] > 8) {
91
            // Decoders which can decode version 8 will thus be able to decode version numbers less than 8.
92
            // If this standard is extended by the addition of additional elements or features, a value of bsid greater than 8 will be used.
93
            // Decoders built to this version of the standard will not be able to decode versions with bsid greater than 8.
94
            throw new getid3_exception('Bit stream identification is version '.$info_ac3_raw_bsi['bsid'].', but getID3() only understands up to version 8');
95
        }
96
97
        $info_ac3_raw_bsi['bsmod'] = bindec(substr($ac3_header['bsi'], 5, 3));
98
        $info_ac3_raw_bsi['acmod'] = bindec(substr($ac3_header['bsi'], 8, 3));
99
100
        $info_ac3['service_type'] = getid3_ac3::AC3serviceTypeLookup($info_ac3_raw_bsi['bsmod'], $info_ac3_raw_bsi['acmod']);
101
        $ac3_coding_mode = getid3_ac3::AC3audioCodingModeLookup($info_ac3_raw_bsi['acmod']);
102
        foreach($ac3_coding_mode as $key => $value) {
103
            $info_ac3[$key] = $value;
104
        }
105
        switch ($info_ac3_raw_bsi['acmod']) {
106
            case 0:
107
            case 1:
108
                $getid3->info['audio']['channelmode'] = 'mono';
109
                break;
110
            case 3:
111
            case 4:
112
                $getid3->info['audio']['channelmode'] = 'stereo';
113
                break;
114
            default:
115
                $getid3->info['audio']['channelmode'] = 'surround';
116
                break;
117
        }
118
        $getid3->info['audio']['channels'] = $info_ac3['num_channels'];
119
        
120
        $offset = 11;
121
122
        if ($info_ac3_raw_bsi['acmod'] & 0x01) {
123
            // If the lsb of acmod is a 1, center channel is in use and cmixlev follows in the bit stream.
124
            $info_ac3_raw_bsi['cmixlev'] = bindec(substr($ac3_header['bsi'], $offset, 2));
125
            $info_ac3['center_mix_level'] = getid3_ac3::AC3centerMixLevelLookup($info_ac3_raw_bsi['cmixlev']);
126
            $offset += 2;
127
        }
128
129
        if ($info_ac3_raw_bsi['acmod'] & 0x04) {
130
            // If the msb of acmod is a 1, surround channels are in use and surmixlev follows in the bit stream.
131
            $info_ac3_raw_bsi['surmixlev'] = bindec(substr($ac3_header['bsi'], $offset, 2));
132
            $info_ac3['surround_mix_level'] = getid3_ac3::AC3surroundMixLevelLookup($info_ac3_raw_bsi['surmixlev']);
133
            $offset += 2;
134
        }
135
136
        if ($info_ac3_raw_bsi['acmod'] == 0x02) {
137
            // When operating in the two channel mode, this 2-bit code indicates whether or not the program has been encoded in Dolby Surround.
138
            $info_ac3_raw_bsi['dsurmod'] = bindec(substr($ac3_header['bsi'], $offset, 2));
139
            $info_ac3['dolby_surround_mode'] = getid3_ac3::AC3dolbySurroundModeLookup($info_ac3_raw_bsi['dsurmod']);
140
            $offset += 2;
141
        }
142
143
        $info_ac3_raw_bsi['lfeon'] = $ac3_header['bsi']{$offset++} == '1';
144
        $info_ac3['lfe_enabled'] = $info_ac3_raw_bsi['lfeon'];
145
        if ($info_ac3_raw_bsi['lfeon']) {
146
            $getid3->info['audio']['channels'] .= '.1';
147
        }
148
149
        $info_ac3['channels_enabled'] = getid3_ac3::AC3channelsEnabledLookup($info_ac3_raw_bsi['acmod'], $info_ac3_raw_bsi['lfeon']);
150
151
        // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1�31.
152
        // The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent.
153
        $info_ac3_raw_bsi['dialnorm'] = bindec(substr($ac3_header['bsi'], $offset, 5));
154
        $offset += 5;
155
        $info_ac3['dialogue_normalization'] = '-'.$info_ac3_raw_bsi['dialnorm'].'dB';
156
157
        $info_ac3_raw_bsi['compre_flag'] = $ac3_header['bsi']{$offset++} == '1';
158
        if ($info_ac3_raw_bsi['compre_flag']) {
159
            $info_ac3_raw_bsi['compr'] = bindec(substr($ac3_header['bsi'], $offset, 8));
160
            $offset += 8;
161
            
162
            $info_ac3['heavy_compression'] = getid3_ac3::AC3heavyCompression($info_ac3_raw_bsi['compr']);
163
        }
164
165
        $info_ac3_raw_bsi['langcode_flag'] = $ac3_header['bsi']{$offset++} == '1';
166
        if ($info_ac3_raw_bsi['langcode_flag']) {
167
            $info_ac3_raw_bsi['langcod'] = bindec(substr($ac3_header['bsi'], $offset, 8));
168
            $offset += 8;
169
        }
170
171
        $info_ac3_raw_bsi['audprodie'] = $ac3_header['bsi']{$offset++} == '1';
172
        if ($info_ac3_raw_bsi['audprodie']) {
173
            $info_ac3_raw_bsi['mixlevel'] = bindec(substr($ac3_header['bsi'], $offset, 5));
174
            $offset += 5;
175
            
176
            $info_ac3_raw_bsi['roomtyp']  = bindec(substr($ac3_header['bsi'], $offset, 2));
177
            $offset += 2;
178
179
            $info_ac3['mixing_level'] = (80 + $info_ac3_raw_bsi['mixlevel']).'dB';
180
            $info_ac3['room_type']    = getid3_ac3::AC3roomTypeLookup($info_ac3_raw_bsi['roomtyp']);
181
        }
182
183
        if ($info_ac3_raw_bsi['acmod'] == 0x00) {
184
            // If acmod is 0, then two completely independent program channels (dual mono)
185
            // are encoded into the bit stream, and are referenced as Ch1, Ch2. In this case,
186
            // a number of additional items are present in BSI or audblk to fully describe Ch2.
187
188
189
            // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1�31.
190
            // The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent.
191
            $info_ac3_raw_bsi['dialnorm2'] = bindec(substr($ac3_header['bsi'], $offset, 5));
192
            $offset += 5;
193
            
194
            $info_ac3['dialogue_normalization2'] = '-'.$info_ac3_raw_bsi['dialnorm2'].'dB';
195
196
            $info_ac3_raw_bsi['compre_flag2'] = $ac3_header['bsi']{$offset++} == '1';
197
            if ($info_ac3_raw_bsi['compre_flag2']) {
198
                $info_ac3_raw_bsi['compr2'] = bindec(substr($ac3_header['bsi'], $offset, 8));
199
                $offset += 8;
200
                
201
                $info_ac3['heavy_compression2'] = getid3_ac3::AC3heavyCompression($info_ac3_raw_bsi['compr2']);
202
            }
203
204
            $info_ac3_raw_bsi['langcode_flag2'] = $ac3_header['bsi']{$offset++} == '1';
205
            if ($info_ac3_raw_bsi['langcode_flag2']) {
206
                $info_ac3_raw_bsi['langcod2'] = bindec(substr($ac3_header['bsi'], $offset, 8));
207
                $offset += 8;
208
            }
209
210
            $info_ac3_raw_bsi['audprodie2'] = $ac3_header['bsi']{$offset++} == '1';
211
            if ($info_ac3_raw_bsi['audprodie2']) {
212
                $info_ac3_raw_bsi['mixlevel2'] = bindec(substr($ac3_header['bsi'], $offset, 5));
213
                $offset += 5;
214
                
215
                $info_ac3_raw_bsi['roomtyp2']  = bindec(substr($ac3_header['bsi'], $offset, 2));
216
                $offset += 2;
217
218
                $info_ac3['mixing_level2'] = (80 + $info_ac3_raw_bsi['mixlevel2']).'dB';
219
                $info_ac3['room_type2']    = getid3_ac3::AC3roomTypeLookup($info_ac3_raw_bsi['roomtyp2']);
220
            }
221
222
        }
223
224
        $info_ac3_raw_bsi['copyright'] = $ac3_header['bsi']{$offset++} == '1';
225
226
        $info_ac3_raw_bsi['original']  = $ac3_header['bsi']{$offset++} == '1';
227
228
        $info_ac3_raw_bsi['timecode1_flag'] = $ac3_header['bsi']{$offset++} == '1';
229
        if ($info_ac3_raw_bsi['timecode1_flag']) {
230
            $info_ac3_raw_bsi['timecode1'] = bindec(substr($ac3_header['bsi'], $offset, 14));
231
            $offset += 14;
232
        }
233
234
        $info_ac3_raw_bsi['timecode2_flag'] = $ac3_header['bsi']{$offset++} == '1';
235
        if ($info_ac3_raw_bsi['timecode2_flag']) {
236
            $info_ac3_raw_bsi['timecode2'] = bindec(substr($ac3_header['bsi'], $offset, 14));
237
            $offset += 14;
238
        }
239
240
        $info_ac3_raw_bsi['addbsi_flag'] = $ac3_header['bsi']{$offset++} == '1';
241
        if ($info_ac3_raw_bsi['addbsi_flag']) {
242
            $info_ac3_raw_bsi['addbsi_length'] = bindec(substr($ac3_header['bsi'], $offset, 6));
243
            $offset += 6;
244
245
            $ac3_header['bsi'] .= getid3_lib::BigEndian2Bin($this->fread($info_ac3_raw_bsi['addbsi_length']));
246
247
            $info_ac3_raw_bsi['addbsi_data'] = substr($ac3_header['bsi'], 119, $info_ac3_raw_bsi['addbsi_length'] * 8);
248
        }
249
250
        return true;
251
    }
252
253
254
255
    public static function AC3sampleRateCodeLookup($fscod) {
256
257
        static $lookup = array (
258
            0 => 48000,
259
            1 => 44100,
260
            2 => 32000,
261
            3 => 'reserved' // If the reserved code is indicated, the decoder should not attempt to decode audio and should mute.
262
        );
263
        return (isset($lookup[$fscod]) ? $lookup[$fscod] : false);
264
    }
265
266
267
268
    public static function AC3serviceTypeLookup($bsmod, $acmod) {
269
270
        static $lookup = array (
271
            0 => 'main audio service: complete main (CM)',
272
            1 => 'main audio service: music and effects (ME)',
273
            2 => 'associated service: visually impaired (VI)',
274
            3 => 'associated service: hearing impaired (HI)',
275
            4 => 'associated service: dialogue (D)',
276
            5 => 'associated service: commentary (C)',
277
            6 => 'associated service: emergency (E)',
278
            7 => 'main audio service: karaoke'
279
        );
280
        
281
        if ($bsmod == 7  &&  $acmod == 1) {
282
            return 'associated service: voice over (VO)';
283
        }
284
        
285
        return (isset($lookup[$bsmod]) ? $lookup[$bsmod] : false);
286
    }
287
288
289
290
    public static function AC3audioCodingModeLookup($acmod) {
291
292
        // array (channel configuration, # channels (not incl LFE), channel order)
293
        static $lookup = array (
294
            0 => array ('channel_config'=>'1+1', 'num_channels'=>2, 'channel_order'=>'Ch1,Ch2'),
295
            1 => array ('channel_config'=>'1/0', 'num_channels'=>1, 'channel_order'=>'C'),
296
            2 => array ('channel_config'=>'2/0', 'num_channels'=>2, 'channel_order'=>'L,R'),
297
            3 => array ('channel_config'=>'3/0', 'num_channels'=>3, 'channel_order'=>'L,C,R'),
298
            4 => array ('channel_config'=>'2/1', 'num_channels'=>3, 'channel_order'=>'L,R,S'),
299
            5 => array ('channel_config'=>'3/1', 'num_channels'=>4, 'channel_order'=>'L,C,R,S'),
300
            6 => array ('channel_config'=>'2/2', 'num_channels'=>4, 'channel_order'=>'L,R,SL,SR'),
301
            7 => array ('channel_config'=>'3/2', 'num_channels'=>5, 'channel_order'=>'L,C,R,SL,SR')
302
        );
303
        return (isset($lookup[$acmod]) ? $lookup[$acmod] : false);
304
    }
305
306
307
308
    public static function AC3centerMixLevelLookup($cmixlev) {
309
        
310
        static $lookup;
311
        if (!@$lookup) {
312
            $lookup = array (
313
                0 => pow(2, -3.0 / 6), // 0.707 (�3.0 dB)
314
                1 => pow(2, -4.5 / 6), // 0.595 (�4.5 dB)
315
                2 => pow(2, -6.0 / 6), // 0.500 (�6.0 dB)
316
                3 => 'reserved'
317
            );
318
        }
319
        return (isset($lookup[$cmixlev]) ? $lookup[$cmixlev] : false);
320
    }
321
322
323
324
    public static function AC3surroundMixLevelLookup($surmixlev) {
325
        
326
        static $lookup;
327
        if (!@$lookup) {
328
            $lookup = array (
329
                0 => pow(2, -3.0 / 6),
330
                1 => pow(2, -6.0 / 6),
331
                2 => 0,
332
                3 => 'reserved'
333
            );
334
        }
335
        return (isset($lookup[$surmixlev]) ? $lookup[$surmixlev] : false);
336
    }
337
338
339
340
    public static function AC3dolbySurroundModeLookup($dsurmod) {
341
342
        static $lookup = array (
343
            0 => 'not indicated',
344
            1 => 'Not Dolby Surround encoded',
345
            2 => 'Dolby Surround encoded',
346
            3 => 'reserved'
347
        );
348
        return (isset($lookup[$dsurmod]) ? $lookup[$dsurmod] : false);
349
    }
350
    
351
    
352
353
    public static function AC3channelsEnabledLookup($acmod, $lfeon) {
354
        
355
        return array (
356
            'ch1'            => $acmod == 0,
357
            'ch2'            => $acmod == 0,
358
            'left'           => $acmod > 1,
359
            'right'          => $acmod > 1,
360
            'center'         => (bool)($acmod & 0x01),
361
            'surround_mono'  => $acmod == 4 || $acmod == 5,
362
            'surround_left'  => $acmod == 6 || $acmod == 7,
363
            'surround_right' => $acmod == 6 || $acmod == 7,
364
            'lfe'            => $lfeon
365
        );
366
    }
367
368
369
370
    public static function AC3heavyCompression($compre) {
371
372
        // The first four bits indicate gain changes in 6.02dB increments which can be
373
        // implemented with an arithmetic shift operation. The following four bits
374
        // indicate linear gain changes, and require a 5-bit multiply.
375
        // We will represent the two 4-bit fields of compr as follows:
376
        //   X0 X1 X2 X3 . Y4 Y5 Y6 Y7
377
        // The meaning of the X values is most simply described by considering X to represent a 4-bit
378
        // signed integer with values from �8 to +7. The gain indicated by X is then (X + 1) * 6.02 dB. The
379
        // following table shows this in detail.
380
381
        // Meaning of 4 msb of compr
382
        //  7    +48.16 dB
383
        //  6    +42.14 dB
384
        //  5    +36.12 dB
385
        //  4    +30.10 dB
386
        //  3    +24.08 dB
387
        //  2    +18.06 dB
388
        //  1    +12.04 dB
389
        //  0     +6.02 dB
390
        // -1         0 dB
391
        // -2     �6.02 dB
392
        // -3    �12.04 dB
393
        // -4    �18.06 dB
394
        // -5    �24.08 dB
395
        // -6    �30.10 dB
396
        // -7    �36.12 dB
397
        // -8    �42.14 dB
398
399
        $fourbit = str_pad(decbin(($compre & 0xF0) >> 4), 4, '0', STR_PAD_LEFT);
400
        if ($fourbit{0} == '1') {
401
            $log_gain = -8 + bindec(substr($fourbit, 1));
402
        } else {
403
            $log_gain = bindec(substr($fourbit, 1));
404
        }
405
        $log_gain = ($log_gain + 1) * (20 * log10(2));
406
407
        // The value of Y is a linear representation of a gain change of up to �6 dB. Y is considered to
408
        // be an unsigned fractional integer, with a leading value of 1, or: 0.1 Y4 Y5 Y6 Y7 (base 2). Y can
409
        // represent values between 0.111112 (or 31/32) and 0.100002 (or 1/2). Thus, Y can represent gain
410
        // changes from �0.28 dB to �6.02 dB.
411
412
        $lin_gain = (16 + ($compre & 0x0F)) / 32;
413
414
        // The combination of X and Y values allows compr to indicate gain changes from
415
        //  48.16 � 0.28 = +47.89 dB, to
416
        // �42.14 � 6.02 = �48.16 dB.
417
418
        return $log_gain - $lin_gain;
419
    }
420
421
422
423
    public static function AC3roomTypeLookup($roomtyp) {
424
        
425
        static $lookup = array (
426
            0 => 'not indicated',
427
            1 => 'large room, X curve monitor',
428
            2 => 'small room, flat monitor',
429
            3 => 'reserved'
430
        );
431
        return (isset($lookup[$roomtyp]) ? $lookup[$roomtyp] : false);
432
    }
433
434
435
436
    public static function AC3frameSizeLookup($frmsizecod, $fscod) {
437
        
438
        $padding     = (bool)($frmsizecod % 2);
439
        $frame_size_id =   floor($frmsizecod / 2);
440
441
        static $lookup = array (
442
            0  => array (128, 138, 192),
443
            1  => array (40, 160, 174, 240),
444
            2  => array (48, 192, 208, 288),
445
            3  => array (56, 224, 242, 336),
446
            4  => array (64, 256, 278, 384),
447
            5  => array (80, 320, 348, 480),
448
            6  => array (96, 384, 416, 576),
449
            7  => array (112, 448, 486, 672),
450
            8  => array (128, 512, 556, 768),
451
            9  => array (160, 640, 696, 960),
452
            10 => array (192, 768, 834, 1152),
453
            11 => array (224, 896, 974, 1344),
454
            12 => array (256, 1024, 1114, 1536),
455
            13 => array (320, 1280, 1392, 1920),
456
            14 => array (384, 1536, 1670, 2304),
457
            15 => array (448, 1792, 1950, 2688),
458
            16 => array (512, 2048, 2228, 3072),
459
            17 => array (576, 2304, 2506, 3456),
460
            18 => array (640, 2560, 2786, 3840)
461
        );
462
        if (($fscod == 1) && $padding) {
463
            // frame lengths are padded by 1 word (16 bits) at 44100
464
            $lookup[$frmsizecod] += 2;
465
        }
466
        return (isset($lookup[$frame_size_id][$fscod]) ? $lookup[$frame_size_id][$fscod] : false);
467
    }
468
469
470
471
    public static function AC3bitrateLookup($frmsizecod) {
472
        
473
        static $lookup = array (
474
            0  => 32000,
475
            1  => 40000,
476
            2  => 48000,
477
            3  => 56000,
478
            4  => 64000,
479
            5  => 80000,
480
            6  => 96000,
481
            7  => 112000,
482
            8  => 128000,
483
            9  => 160000,
484
            10 => 192000,
485
            11 => 224000,
486
            12 => 256000,
487
            13 => 320000,
488
            14 => 384000,
489
            15 => 448000,
490
            16 => 512000,
491
            17 => 576000,
492
            18 => 640000
493
        );
494
        $frame_size_id = floor($frmsizecod / 2);
495
        return (isset($lookup[$frame_size_id]) ? $lookup[$frame_size_id] : false);
496
    }
497
498
}
499
500
?>
0 ignored issues
show
Best Practice introduced by
It is not recommended to use PHP's closing tag ?> in files other than templates.

Using a closing tag in PHP files that only contain PHP code is not recommended as you might accidentally add whitespace after the closing tag which would then be output by PHP. This can cause severe problems, for example headers cannot be sent anymore.

A simple precaution is to leave off the closing tag as it is not required, and it also has no negative effects whatsoever.

Loading history...