Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3960 | Serge | 1 | /* |
2 | mpeghead: the bits of an MPEG frame header |
||
3 | |||
4 | copyright ?-2011 by the mpg123 project - free software under the terms of the LGPL 2.1 |
||
5 | see COPYING and AUTHORS files in distribution or http://mpg123.org |
||
6 | initially written by Michael Hipp & Thomas Orgis (from parse.c) |
||
7 | */ |
||
8 | #ifndef MPG123_MPEGHEAD_H |
||
9 | #define MPG123_MPEGHEAD_H |
||
10 | |||
11 | /* |
||
12 | Avoid human error, let perl do the work of dissecting an MPEG header into parts. |
||
13 | To be clear: Never edit the following definitions by hand, modify the code block inside this comment and run it through perl instead! |
||
14 | |||
15 | $head = "AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM"; |
||
16 | %parts = qw(A sync B version C layer D crc E bitrate F samplerate G padding H private I channel J chanex K copyright L original M emphasis); |
||
17 | for(sort keys %parts) |
||
18 | { |
||
19 | $name = uc($parts{$_}); |
||
20 | $bits = $head; |
||
21 | $bits =~ s/$_/1/g; |
||
22 | $bits =~ s/[^1 ]/0/g; |
||
23 | print "\/\* $bits \*\/\n"; |
||
24 | $bits =~ s/\s//g; |
||
25 | print "#define HDR_$name".(" " x (18-length($name))).sprintf("0x%08x", eval("0b$bits"))."\n"; |
||
26 | $bits =~ m/(0*)$/; |
||
27 | print "#define HDR_${name}_VAL(h)".(" " x (11-length($name)))."(((h)\&HDR_$name) >> ".length($1).")\n"; |
||
28 | } |
||
29 | */ |
||
30 | |||
31 | /* 11111111 11100000 00000000 00000000 */ |
||
32 | #define HDR_SYNC 0xffe00000 |
||
33 | #define HDR_SYNC_VAL(h) (((h)&HDR_SYNC) >> 21) |
||
34 | /* 00000000 00011000 00000000 00000000 */ |
||
35 | #define HDR_VERSION 0x00180000 |
||
36 | #define HDR_VERSION_VAL(h) (((h)&HDR_VERSION) >> 19) |
||
37 | /* 00000000 00000110 00000000 00000000 */ |
||
38 | #define HDR_LAYER 0x00060000 |
||
39 | #define HDR_LAYER_VAL(h) (((h)&HDR_LAYER) >> 17) |
||
40 | /* 00000000 00000001 00000000 00000000 */ |
||
41 | #define HDR_CRC 0x00010000 |
||
42 | #define HDR_CRC_VAL(h) (((h)&HDR_CRC) >> 16) |
||
43 | /* 00000000 00000000 11110000 00000000 */ |
||
44 | #define HDR_BITRATE 0x0000f000 |
||
45 | #define HDR_BITRATE_VAL(h) (((h)&HDR_BITRATE) >> 12) |
||
46 | /* 00000000 00000000 00001100 00000000 */ |
||
47 | #define HDR_SAMPLERATE 0x00000c00 |
||
48 | #define HDR_SAMPLERATE_VAL(h) (((h)&HDR_SAMPLERATE) >> 10) |
||
49 | /* 00000000 00000000 00000010 00000000 */ |
||
50 | #define HDR_PADDING 0x00000200 |
||
51 | #define HDR_PADDING_VAL(h) (((h)&HDR_PADDING) >> 9) |
||
52 | /* 00000000 00000000 00000001 00000000 */ |
||
53 | #define HDR_PRIVATE 0x00000100 |
||
54 | #define HDR_PRIVATE_VAL(h) (((h)&HDR_PRIVATE) >> 8) |
||
55 | /* 00000000 00000000 00000000 11000000 */ |
||
56 | #define HDR_CHANNEL 0x000000c0 |
||
57 | #define HDR_CHANNEL_VAL(h) (((h)&HDR_CHANNEL) >> 6) |
||
58 | /* 00000000 00000000 00000000 00110000 */ |
||
59 | #define HDR_CHANEX 0x00000030 |
||
60 | #define HDR_CHANEX_VAL(h) (((h)&HDR_CHANEX) >> 4) |
||
61 | /* 00000000 00000000 00000000 00001000 */ |
||
62 | #define HDR_COPYRIGHT 0x00000008 |
||
63 | #define HDR_COPYRIGHT_VAL(h) (((h)&HDR_COPYRIGHT) >> 3) |
||
64 | /* 00000000 00000000 00000000 00000100 */ |
||
65 | #define HDR_ORIGINAL 0x00000004 |
||
66 | #define HDR_ORIGINAL_VAL(h) (((h)&HDR_ORIGINAL) >> 2) |
||
67 | /* 00000000 00000000 00000000 00000011 */ |
||
68 | #define HDR_EMPHASIS 0x00000003 |
||
69 | #define HDR_EMPHASIS_VAL(h) (((h)&HDR_EMPHASIS) >> 0) |
||
70 | |||
71 | /* |
||
72 | A generic mask for telling if a header is somewhat valid for the current stream. |
||
73 | Meaning: Most basic info is not allowed to change. |
||
74 | Checking of channel count needs to be done, too, though. So, |
||
75 | if channel count matches, frames are decoded the same way: frame buffers and decoding |
||
76 | routines can stay the same, especially frame buffers (think spf * channels!). |
||
77 | */ |
||
78 | #define HDR_CMPMASK (HDR_SYNC|HDR_VERSION|HDR_LAYER|HDR_SAMPLERATE) |
||
79 | |||
80 | /* A stricter mask, for matching free format headers. */ |
||
81 | #define HDR_SAMEMASK (HDR_SYNC|HDR_VERSION|HDR_LAYER|HDR_BITRATE|HDR_SAMPLERATE|HDR_CHANNEL|HDR_CHANEX) |
||
82 | |||
83 | /* Free format headers have zero bitrate value. */ |
||
84 | #define HDR_FREE_FORMAT(head) (!(head & HDR_BITRATE)) |
||
85 | |||
86 | /* A mask for changed sampling rate (version or rate bits). */ |
||
87 | #define HDR_SAMPMASK (HDR_VERSION|HDR_SAMPLERATE) |
||
88 | |||
89 | #endif |