*************************************************************** *************************************************************** **** **** **** Aufbau von MPEGplus-Dateien (Streamversion 7) **** **** **** *************************************************************** *************************************************************** Der Datenstrom ist als Strom von 32-Bit-Worten zu sehen, der dann allerdings von MSB her dekodiert werden. Betrachtet man das ganze als Oktet-Strom, dann ist die Reihenfolge der Bits die folgende (Zählung ab 1 beginnend, MSB links): v-----------------------v-----------------------v-----------------------v-----------------------v-----------------------v--- |25|26|27|28|29|30|31|32|17|18|19|20|21|22|23|24| 9|10|11|12|13|14|15|16| 1| 2| 3| 4| 5| 6| 7| 8|57|58|59|60|61|62|63|64|49| ^-----------------------^-----------------------^-----------------------^-----------------------^-----------------------^--- Auf Grund unterschiedlicher Zugriffsmechanismen muß man die Streamversion über einen anderen Machanismus bestimmen, da durch diese Struktur man zu spät auf die Magic Number zugreifen kann. Da weiterhin kaum Streamversionen unterhalb von Version 7 im Feld zu finden sind, und selbst wenn sie zu finden wären, deren Klangqualität zu wünschen übrig läßt, wird im folgenden nur Streamversion 7 beschrieben. Diese Bitstruktur macht vor allem auch Probleme auf 16 bit und 64 bit CPUs, da immer mit 32 bit-Worten dekodiert werden muß. =============================== GROBSTRUKTUR ============================ Header ~~~~~~ -0------------------------------------------------------------------------- StreamMinorVersion 4 bit 0...1 Currently 0 (PNS not used) or 1 (PNS used) StreamMajorVersion 4 bit 7 Streamversion 7 Signatur 24 bit 0x2B504D Signatur "MP+" -1------------------------------------------------------------------------ FrameCount 32 bit 0...0xFFFFFFFF Anzahl der Frames, jeder Frame beinhaltet 1152 Samples pro Kanal, der letzte Frame beinhaltet 1 bis 1152 Samples pro Kanal. Man beachte weiterhin die Latenz der Analyse und Synthesefilterbank von 481 Samples. Siehe Bemerkung 2. -2------------------------------------------------------------------------- IntensityStereo 1 bit 0...1 normalerweise 0, bei Intensitätsstereokodierung (IS) 1. Derzeitig von keinem Encoder benutzt. Siehe Bemerkung 3. MidSideStereo 1 bit 0...1 Wenn MidSideStereo verwendet wird, ist dieses Bit 1, sonst 0. MaxBand 6 bit 0...32 letztes in der gesamten Datei verwendetes Subband. Typische Werte sind 23 bis 29. Profile 4 bit 0, 7...13 Verwendetes Profile 0: kein Profile 1: Unstable/Experimental 2: ungenutzt 3: ungenutzt 4: ungenutzt 5: below Telephone (q= 0.0) 6: below Telephone (q= 1.0) 7: Telephone (q= 2.0) 8: Thumb (q= 3.0) 9: Radio (q= 4.0) 10: Standard (q= 5.0) 11: Xtreme (q= 6.0) 12: Insane (q= 7.0) 13: BrainDead (q= 8.0) 14: above BrainDead (q= 9.0) 15: above BrainDead (q=10.0) Link 2 bit 00: Titel startet und endet mit sehr niedrigem Pegel (keine Live- oder Klassiktitel) 01: Titel hört laut auf 10: Titel fängt laut an 11: Titel fängt laut an und hört laut auf SampleFreq 2 bit 00: 44100 Hz CD 01: 48000 Hz DAT, DVC, ADR 10: 37800 Hz CD-ROM/XA 11: 32000 Hz DSR, DAT-LP, DVC-LP MaxLevel 16 bit 0...32768 Maximaler Pegel des kodieren PCM-Inputsignals Siehe Bemerkung 4 -3------------------------------------------------------------------------- TitleGain 16 bit -32768...+32767 Veränderung des Wiedergabepegels. Wert wird als vorzeichenbehafteter 16-bit-Wert betrachtet und der Pegel wird um so viele mB (Millibel) verändert. Somit sind Pegeländerungen von -327.68 dB bis +327.67 dB möglich. TitlePeak 16 bit 0...65535 Maximaler Pegel des dekodierten Titels 16422: -6 dB 32767: 0 dB 65379: +6 dB -4------------------------------------------------------------------------- AlbumGain 16 bit -32768...32767 Veränderung des Wiedergabepegels, wenn die ganze CD mit gleicher Pegelveränderung abgespielt werden soll. Wert wird als vorzeichenbehafteter 16-bit-Wert betrachtet und der Pegel wird um so viele mB (Millibel) verändert. Somit sind Pegeländerungen von -327.68 dB bis +327.67 dB möglich. AlbumPeak 16 bit 0...65535 Maximaler Pegel der gesamten dekodierten CD 16422: -6 dB 32767: 0 dB 65379: +6 dB -5------------------------------------------------------------------------- TrueGapless 1 bit Wird True Gapless verwendet? 0: nein 1: ja LastFrameLength 11 bit 0, 1...1152 Used Samples of the Last Frame. TrueGapless = 0: always 0 TrueGapless = 1: 1...1152 Unused2 20 bit -6------------------------------------------------------------------------- EncoderVersion 8 bit Encoder version * 100 (106 = 1.06) EncoderVersion % 10 == 0 Release (1.0) EncoderVersion % 2 == 0 Beta (1.06) EncoderVersion % 2 == 1 Alpha (1.05a...z) AudioDaten (insgesamt FrameCount mal) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ LengthOfFrame 20 bit FrameData ? bit Ende ~~~~ LastFrameUsedSamples 11 bit Siehe weiterhin Bemerkung 2 LengthOfFrame 20 bit FrameData ? bit FillBits 0...31 bit Das letzte Datenwort muß aufgefüllt werden, auch wenn nur 1 bit davon genutzt wird, da dieses Bit in diesem Fall im letzten Byte des Wortes liegt. V v-----------------------v-----------------------v-----------------------v-----------------------v | X| X| X| X| X| X| X| X| X| X| X| X| X| X| X| X| X| X| X| X| X| X| X| X| 1| X| X| X| X| X| X| X| ^-----------------------^-----------------------^-----------------------^-----------------------^ Skurile Verschachtungen mit dem ID3-Tag, falls bitmäßig möglich, sind nicht zu empfehlen. ID3 Version 1.1 Tag (die letzten 1024 bit der Datei) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Die Betrachtung erfolgt als normaler Oktetstrom (0-1-2-3-4-5-6-7-), nicht als MPEGplus-Bitstrom mit der etwas hoppelnden Oktetreihenfolge (3-2-1-0-7-6-5-4-). ID3Marker 3 byte 'ID3' ID3-Marker ID3Title 30 byte ? Titel, bis maximal 30 Zeichen (nullterminiert bei weniger als 30 Zeichen) ID3Artist 30 byte ? Artist, bis maximal 30 Zeichen (nullterminiert bei weniger als 30 Zeichen) ID3Album 30 byte ? Album, bis maximal 30 Zeichen (nullterminiert bei weniger als 30 Zeichen) ID3Year 4 byte ? Jahr der Aufnahme oder der Compilation, 4 Zeichen (Jahrhundert/Jahr) ID3CommentV10 30 byte ? Bemerkungen, bis maximal 30 Zeichen (nullterminiert bei weniger als 30 Zeichen) oder ID3CommentV11 28 byte ? Bemerkungen, bis maximal 28 Zeichen (nullterminiert bei weniger als 28 Zeichen) 1 byte 0x00 Marker 1 byte 1...255 Tracknummer (1...99 für CDs) ID3Genre 1 Byte 0...147 Genre, kodiert als 8 bit-Wert 0 = "Blues" 74 = "Acid Jazz" 1 = "Classic Rock" 75 = "Polka" 2 = "Country" 76 = "Retro" 3 = "Dance" 77 = "Musical" 4 = "Disco" 78 = "Rock & Roll" 5 = "Funk" 79 = "Hard Rock" 6 = "Grunge" 80 = "Folk" 7 = "Hip-Hop" 81 = "Folk/Rock" 8 = "Jazz" 82 = "National Folk" 9 = "Metal" 83 = "Swing" 10 = "New Age" 84 = "Fast-Fusion" 11 = "Oldies" 85 = "Bebob" 12 = "Other" 86 = "Latin" 13 = "Pop" 87 = "Revival" 14 = "R&B" 88 = "Celtic" 15 = "Rap" 89 = "Bluegrass" 16 = "Reggae" 90 = "Avantgarde" 17 = "Rock" 91 = "Gothic Rock" 18 = "Techno" 92 = "Progressive Rock" 19 = "Industrial" 93 = "Psychedelic Rock" 20 = "Alternative" 94 = "Symphonic Rock" 21 = "Ska" 95 = "Slow Rock" 22 = "Death Metal" 96 = "Big Band" 23 = "Pranks" 97 = "Chorus" 24 = "Soundtrack" 98 = "Easy Listening" 25 = "Euro-Techno" 99 = "Acoustic" 26 = "Ambient" 100 = "Humour" 27 = "Trip-Hop" 101 = "Speech" 28 = "Vocal" 102 = "Chanson" 29 = "Jazz+Funk" 103 = "Opera" 30 = "Fusion" 104 = "Chamber Music" 31 = "Trance" 105 = "Sonata" 32 = "Classical" 106 = "Symphony" 33 = "Instrumental" 107 = "Booty Bass" 34 = "Acid" 108 = "Primus" 35 = "House" 109 = "Porn Groove" 36 = "Game" 110 = "Satire" 37 = "Sound Clip" 111 = "Slow Jam" 38 = "Gospel" 112 = "Club" 39 = "Noise" 113 = "Tango" 40 = "AlternRock" 114 = "Samba" 41 = "Bass" 115 = "Folklore" 42 = "Soul" 116 = "Ballad" 43 = "Punk" 117 = "Power Ballad" 44 = "Space" 118 = "Rhythmic Soul" 45 = "Meditative" 119 = "Freestyle" 46 = "Instrumental Pop" 120 = "Duet" 47 = "Instrumental Rock" 121 = "Punk Rock" 48 = "Ethnic" 122 = "Drum Solo" 49 = "Gothic" 123 = "A capella" 50 = "Darkwave" 124 = "Euro-House" 51 = "Techno-Industrial" 125 = "Dance Hall" 52 = "Electronic" 126 = "Goa" 53 = "Pop-Folk" 127 = "Drum & Bass" 54 = "Eurodance" 128 = "Club House" 55 = "Dream" 129 = "Hardcore" 56 = "Southern Rock" 130 = "Terror" 57 = "Comedy" 131 = "Indie" 58 = "Cult" 132 = "BritPop" 59 = "Gangsta" 133 = "NegerPunk" 60 = "Top 40" 134 = "Polsk Punk" 61 = "Christian Rap" 135 = "Beat" 62 = "Pop/Funk" 136 = "Christian Gangsta" 63 = "Jungle" 137 = "Heavy Metal" 64 = "Native American" 138 = "Black Metal" 65 = "Cabaret" 139 = "Crossover" 66 = "New Wave" 140 = "Contemporary C" 67 = "Psychadelic" 141 = "Christian Rock" 68 = "Rave" 142 = "Merengue" 69 = "Showtunes" 143 = "Salsa" 70 = "Trailer" 144 = "Thrash Metal" 71 = "Lo-Fi" 145 = "Anime" 72 = "Tribal" 146 = "JPop" 73 = "Acid Punk" 147 = "SynthPop" Bemerkung 1 (Bitanordnung) ~~~~~~~~~~~~~~~~~~~~~~~~~~ Die Bitanordnung läßt sich schlecht auf 16 oder 64 bit-CPU dekodieren. Bemerkung 2 (Effekte durch Filterbankdelay) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 Bemerkung 3 (Intensity Stereo) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Intensity Stereo muß, falls verwendet, ab 2.75 verwendet werden. In jedem Frame. Bei SV4-6 konnte man noch zwischen 2,75, 5.5, 8.25 oder 11 kHz wählen, wenn auch für die ganze Datei. Was schon hinreichend unflexibel war. Weiterhin besteht bei hohen Datenrate die Möglichkeit, daß der Decoder undefinierte Zustände annimmt, weil Variablen dann nicht initialisiert werden, von denen aber das Ergebnis der Dekodierung empfinlich abhängt. Bemerkung 4 (Clipping) ~~~~~~~~~~~~~~~~~~~~~~ Clipping Prevention funktioniert derzeitig, daß der größte Sample des PCM-Inputs mit in der MPEGplus-Datei abgespeichert wird und bei der Wiedergabe davon ausgegangen wird, daß der Spitzenpegel durch zugefügtes Rauschen und durch Fluktationen des Pegels durch Kodierungsfehler maximal 18 Prozent über der des PCM-Inputs liegt. Diese ist allerdings nur eine ziemlich grobe Schätzung, die manchmal zuviel und manchmal zuwenig den Pegel absenkt. Den exakten maximalen Pegel beim Abspielen kann man nur durch einen Dekodiervorgang bestimmen. Weiterhin beachte man das "FS+>0 dB"-Problem: Es sind übersteuerungen von DA-Wandlern um bis zu 3 dB durch nichtgeclippte Samples möglich, wenn zwischen den Samples interpolierte Sample zu groß werden: 32000 32000 -32000 -32000 erzeugt nach einem 2fach-Oversampling: 32000 45255 32000 0 -32000 -45255 -32000 0 Ein zweites Problem sind Pegeländerungen bei Livealben zwischen den Titeln, wenn diese unterschiedliche Maximalpegel haben. In diesen Fällen sollte das gesamte Album um den notwendigen Pegel angesenkt werden. ========================== STRUKTUR EINES FRAMES ============================== Codierung der Auflösung+MidsideKodierung für Band 0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ResBand0L 4 bit Falls Band kein IS-Band: ResBand0R 4 bit Falls MidSideStereo und mindestens ein Bänder hat eine Auflösung größer als 0 MS0 1 bit Differentielle Codierung der Auflösung+MidsideKodierung für die Bänder 1...MaxBand ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ResBandL ? bit Falls Band kein IS-Band: ResBandR ? bit Falls MidSideStereo und mindestens ein Bänder hat eine Auflösung größer als 0 MS 1 bit Bemerkung: Es wird dabei das höchste Band mit einer Auflösung != 0 bestimmt, was kleiner als MaxBand sein kann. Es wird im folgenden als MaxCurrBand bezeichnet. Scaleband-Splitting ~~~~~~~~~~~~~~~~~~~ Lauflängenbegrenzung auf 32. Scalebänder ~~~~~~~~~~~ Quantisierte Samples ~~~~~~~~~~~~~~~~~~~~ ============================ VERWENDETE HUFFMAN-TABELLEN =========================== Erster Wert: abzuspeichernde Bits Zweiter Wert: Anzahl der abzuspeichernden Bits HuffSCFI_src [4] 2, 3 1, 1 3, 3 0, 2 HuffDSCF_src [16] 32, 6 4, 5 17, 5 30, 5 13, 4 0, 3 3, 3 9, 4 5, 3 2, 3 14, 4 3, 4 31, 5 5, 5 33, 6 12, 4 HuffHdr_src [10] 92, 8 47, 7 10, 5 4, 4 0, 2 1, 1 3, 3 22, 6 187, 9 186, 9 HuffQ1_src [2] [3*3*3] 54, 6 103, 8 9, 5 62, 7 32, 6 225, 9 5, 5 55, 7 10, 4 3, 4 7, 5 52, 7 52, 6 101, 8 0, 5 60, 7 35, 6 227, 9 10, 5 24, 6 6, 4 0, 4 4, 5 61, 7 11, 4 4, 4 7, 3 1, 1 12, 4 5, 4 3, 5 63, 7 7, 4 1, 4 11, 5 59, 7 34, 6 226, 9 1, 5 57, 7 53, 6 100, 8 6, 5 53, 7 9, 4 2, 4 2, 5 54, 7 33, 6 224, 9 8, 5 58, 7 55, 6 102, 8 HuffQ2_src [2] [5*5] 89, 7 921, 10 47, 6 113, 7 15, 5 51, 6 0, 5 231, 8 91, 7 922, 10 4, 5 104, 7 6, 4 30, 5 13, 4 0, 3 4, 4 29, 5 5, 5 105, 7 20, 5 50, 6 12, 4 1, 3 4, 3 2, 2 15, 4 3, 3 14, 5 49, 6 3, 5 107, 7 3, 4 27, 5 14, 4 2, 3 5, 4 31, 5 1, 5 112, 7 90, 7 920, 10 2, 5 106, 7 21, 5 48, 6 46, 6 114, 7 88, 7 923, 10 HuffQ3_src [2] [ 7] 12, 4 4, 5 4, 3 3, 4 0, 2 2, 2 1, 2 3, 2 7, 3 1, 2 5, 3 0, 3 13, 4 5, 5 HuffQ4_src [2] [ 9] 5, 4 9, 5 0, 3 12, 4 4, 3 3, 3 6, 3 0, 2 7, 3 2, 2 5, 3 7, 3 3, 3 13, 4 1, 3 5, 4 4, 4 8, 5 HuffQ5_src [2] [15] 57, 6 229, 8 23, 5 56, 6 8, 4 7, 5 10, 4 2, 4 13, 4 0, 3 0, 3 3, 3 2, 3 5, 3 3, 3 6, 3 1, 3 4, 3 15, 4 2, 3 12, 4 15, 4 9, 4 29, 5 29, 5 6, 5 22, 5 115, 7 56, 6 228, 8 HuffQ6_src [2] [31] 65, 7 6472, 13 6, 6 6474, 13 44, 6 808, 10 45, 6 405, 9 59, 6 203, 8 13, 5 102, 7 17, 5 49, 6 19, 5 9, 5 23, 5 15, 5 21, 5 31, 5 26, 5 2, 4 30, 5 6, 4 0, 4 8, 4 2, 4 11, 4 5, 4 13, 4 7, 4 0, 3 3, 4 14, 4 4, 4 10, 4 31, 5 9, 4 28, 5 5, 4 25, 5 3, 4 27, 5 30, 5 24, 5 14, 5 20, 5 8, 5 18, 5 48, 6 12, 5 103, 7 2, 5 201, 8 58, 6 200, 8 33, 6 1619, 11 7, 6 6473, 13 64, 7 6475, 13 HuffQ7_src [2] [63] 103, 8 14244, 14 153, 8 14253, 14 181, 8 14246, 14 233, 8 14254, 14 64, 7 3562, 12 65, 7 752, 10 77, 7 753, 10 81, 7 160, 9 91, 7 162, 9 113, 7 444, 9 112, 7 122, 8 24, 6 223, 8 29, 6 60, 7 35, 6 73, 7 37, 6 110, 7 41, 6 14, 6 44, 6 24, 6 46, 6 25, 6 51, 6 34, 6 49, 6 37, 6 54, 6 54, 6 55, 6 3, 5 57, 6 9, 5 60, 6 11, 5 0, 5 16, 5 2, 5 19, 5 10, 5 21, 5 5, 5 24, 5 9, 5 26, 5 6, 5 29, 5 13, 5 31, 5 7, 5 2, 4 11, 5 0, 4 15, 5 30, 5 8, 5 28, 5 4, 5 25, 5 3, 5 22, 5 1, 5 20, 5 63, 6 14, 5 62, 6 13, 5 61, 6 8, 5 53, 6 6, 5 59, 6 2, 5 52, 6 46, 6 48, 6 35, 6 47, 6 31, 6 43, 6 21, 6 42, 6 15, 6 39, 6 95, 7 36, 6 72, 7 33, 6 41, 7 28, 6 189, 8 117, 7 123, 8 101, 7 377, 9 100, 7 161, 9 80, 7 891, 10 69, 7 327, 10 68, 7 326, 10 50, 7 3560, 12 232, 8 14255, 14 180, 8 14247, 14 152, 8 14252, 14 102, 8 14245, 14