#include "Boolean.hh"#include "BitVector.hh"Include dependency graph for MP3Internals.hh:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.
Data Structures | |
| struct | MP3SideInfo |
| struct | MP3SideInfo::gr_info_s |
| class | MP3FrameParams |
Defines | |
| #define | SBLIMIT 32 |
| #define | MAX_MP3_FRAME_SIZE 2500 |
Typedefs | |
| typedef MP3SideInfo | MP3SideInfo_t |
Functions | |
| unsigned | ComputeFrameSize (unsigned bitrate, unsigned samplingFreq, Boolean usePadding, Boolean isMPEG2, unsigned char layer) |
| Boolean | GetADUInfoFromMP3Frame (unsigned char const *framePtr, unsigned totFrameSize, unsigned &hdr, unsigned &frameSize, MP3SideInfo &sideInfo, unsigned &sideInfoSize, unsigned &backpointer, unsigned &aduSize) |
| Boolean | ZeroOutMP3SideInfo (unsigned char *framePtr, unsigned totFrameSize, unsigned newBackpointer) |
| unsigned | TranscodeMP3ADU (unsigned char const *fromPtr, unsigned fromSize, unsigned toBitrate, unsigned char *toPtr, unsigned toMaxSize, unsigned &availableBytesForBackpointer) |
| #define MAX_MP3_FRAME_SIZE 2500 |
| #define SBLIMIT 32 |
Definition at line 63 of file MP3Internals.hh.
Referenced by MP3HuffmanEncodingInfo::MP3HuffmanEncodingInfo().
| typedef struct MP3SideInfo MP3SideInfo_t |
| unsigned ComputeFrameSize | ( | unsigned | bitrate, | |
| unsigned | samplingFreq, | |||
| Boolean | usePadding, | |||
| Boolean | isMPEG2, | |||
| unsigned char | layer | |||
| ) |
Definition at line 219 of file MP3Internals.cpp.
Referenced by MP3FrameParams::setParamsFromHeader().
00221 { 00222 if (samplingFreq == 0) return 0; 00223 unsigned const bitrateMultiplier = (layer == 1) ? 12000*4 : 144000; 00224 unsigned framesize; 00225 00226 framesize = bitrate*bitrateMultiplier; 00227 framesize /= samplingFreq<<isMPEG2; 00228 framesize = framesize + usePadding - 4; 00229 00230 return framesize; 00231 }
| Boolean GetADUInfoFromMP3Frame | ( | unsigned char const * | framePtr, | |
| unsigned | totFrameSize, | |||
| unsigned & | hdr, | |||
| unsigned & | frameSize, | |||
| MP3SideInfo & | sideInfo, | |||
| unsigned & | sideInfoSize, | |||
| unsigned & | backpointer, | |||
| unsigned & | aduSize | |||
| ) |
Definition at line 303 of file MP3Internals.cpp.
References MP3SideInfo::ch, False, MP3FrameParams::frameSize, MP3FrameParams::getSideInfo(), MP3SideInfo::gr, MP3FrameParams::hdr, MP3FrameParams::layer, MP3SideInfo::main_data_begin, MP3FrameParams::setBytePointer(), MP3FrameParams::setParamsFromHeader(), MP3FrameParams::sideInfoSize, and True.
Referenced by SegmentQueue::sqAfterGettingCommon(), and TranscodeMP3ADU().
00307 { 00308 if (totFrameSize < 4) return False; // there's not enough data 00309 00310 MP3FrameParams fr; 00311 fr.hdr = ((unsigned)framePtr[0] << 24) | ((unsigned)framePtr[1] << 16) 00312 | ((unsigned)framePtr[2] << 8) | (unsigned)framePtr[3]; 00313 fr.setParamsFromHeader(); 00314 fr.setBytePointer(framePtr + 4, totFrameSize - 4); // skip hdr 00315 00316 frameSize = 4 + fr.frameSize; 00317 00318 if (fr.layer != 3) { 00319 // Special case for non-layer III frames 00320 backpointer = 0; 00321 sideInfoSize = 0; 00322 aduSize = fr.frameSize; 00323 return True; 00324 } 00325 00326 sideInfoSize = fr.sideInfoSize; 00327 if (totFrameSize < 4 + sideInfoSize) return False; // not enough data 00328 00329 fr.getSideInfo(sideInfo); 00330 00331 hdr = fr.hdr; 00332 backpointer = sideInfo.main_data_begin; 00333 unsigned numBits = sideInfo.ch[0].gr[0].part2_3_length; 00334 numBits += sideInfo.ch[0].gr[1].part2_3_length; 00335 numBits += sideInfo.ch[1].gr[0].part2_3_length; 00336 numBits += sideInfo.ch[1].gr[1].part2_3_length; 00337 aduSize = (numBits+7)/8; 00338 #ifdef DEBUG 00339 fprintf(stderr, "mp3GetADUInfoFromFrame: hdr: %08x, frameSize: %d, part2_3_lengths: %d,%d,%d,%d, aduSize: %d, backpointer: %d\n", hdr, frameSize, sideInfo.ch[0].gr[0].part2_3_length, sideInfo.ch[0].gr[1].part2_3_length, sideInfo.ch[1].gr[0].part2_3_length, sideInfo.ch[1].gr[1].part2_3_length, aduSize, backpointer); 00340 #endif 00341 00342 return True; 00343 }
| unsigned TranscodeMP3ADU | ( | unsigned char const * | fromPtr, | |
| unsigned | fromSize, | |||
| unsigned | toBitrate, | |||
| unsigned char * | toPtr, | |||
| unsigned | toMaxSize, | |||
| unsigned & | availableBytesForBackpointer | |||
| ) |
Definition at line 707 of file MP3Internals.cpp.
References assignADUBackpointer(), MP3FrameParams::frameSize, GetADUInfoFromMP3Frame(), MP3FrameParams::hdr, MP3FrameParams::isMPEG2, MP3BitrateToBitrateIndex(), outputHeader(), PutMP3SideInfoIntoFrame(), MP3FrameParams::setParamsFromHeader(), shiftBits(), MP3FrameParams::sideInfoSize, and updateSideInfoSizes().
Referenced by MP3ADUTranscoder::afterGettingFrame1().
00710 { 00711 // Begin by parsing the input ADU's parameters: 00712 unsigned hdr, inFrameSize, inSideInfoSize, backpointer, inAduSize; 00713 MP3SideInfo sideInfo; 00714 if (!GetADUInfoFromMP3Frame(fromPtr, fromSize, 00715 hdr, inFrameSize, sideInfo, inSideInfoSize, 00716 backpointer, inAduSize)) { 00717 return 0; 00718 } 00719 fromPtr += (4+inSideInfoSize); // skip to 'main data' 00720 00721 // Alter the 4-byte MPEG header to reflect the output ADU: 00722 // (different bitrate; mono; no CRC) 00723 Boolean isMPEG2 = ((hdr&0x00080000) == 0); 00724 unsigned toBitrateIndex = MP3BitrateToBitrateIndex(toBitrate, isMPEG2); 00725 hdr &=~ 0xF000; hdr |= (toBitrateIndex<<12); // set bitrate index 00726 hdr |= 0x10200; // turn on !error-prot and padding bits 00727 hdr &=~ 0xC0; hdr |= 0xC0; // set mode to 3 (mono) 00728 00729 // Set up the rest of the parameters of the new ADU: 00730 MP3FrameParams outFr; 00731 outFr.hdr = hdr; 00732 outFr.setParamsFromHeader(); 00733 00734 // Figure out how big to make the output ADU: 00735 unsigned inAveAduSize = inFrameSize - inSideInfoSize; 00736 unsigned outAveAduSize = outFr.frameSize - outFr.sideInfoSize; 00737 unsigned desiredOutAduSize /*=inAduSize*outAveAduSize/inAveAduSize*/ 00738 = (2*inAduSize*outAveAduSize + inAveAduSize)/(2*inAveAduSize); 00739 // this rounds to the nearest integer 00740 00741 if (toMaxSize < (4 + outFr.sideInfoSize)) return 0; 00742 unsigned maxOutAduSize = toMaxSize - (4 + outFr.sideInfoSize); 00743 if (desiredOutAduSize > maxOutAduSize) { 00744 desiredOutAduSize = maxOutAduSize; 00745 } 00746 00747 // Figure out the new sizes of the various 'part23 lengths', 00748 // and how much they are truncated: 00749 unsigned part23Length0a, part23Length0aTruncation; 00750 unsigned part23Length0b, part23Length0bTruncation; 00751 unsigned part23Length1a, part23Length1aTruncation; 00752 unsigned part23Length1b, part23Length1bTruncation; 00753 unsigned numAduBits 00754 = updateSideInfoSizes(sideInfo, outFr.isMPEG2, 00755 fromPtr, 8*desiredOutAduSize, 00756 part23Length0a, part23Length0aTruncation, 00757 part23Length0b, part23Length0bTruncation, 00758 part23Length1a, part23Length1aTruncation, 00759 part23Length1b, part23Length1bTruncation); 00760 #ifdef DEBUG 00761 fprintf(stderr, "shrinkage %d->%d [(%d,%d),(%d,%d)] (trunc: [(%d,%d),(%d,%d)]) {%d}\n", inAduSize, (numAduBits+7)/8, 00762 part23Length0a, part23Length0b, part23Length1a, part23Length1b, 00763 part23Length0aTruncation, part23Length0bTruncation, 00764 part23Length1aTruncation, part23Length1bTruncation, 00765 maxOutAduSize); 00766 #endif 00767 unsigned actualOutAduSize = (numAduBits+7)/8; 00768 00769 // Give the new ADU an appropriate 'backpointer': 00770 assignADUBackpointer(outFr, actualOutAduSize, sideInfo, availableBytesForBackpointer); 00771 00773 00774 // 4-byte header 00775 outputHeader(toPtr, hdr); toPtr += 4; 00776 00777 // side info 00778 PutMP3SideInfoIntoFrame(sideInfo, outFr, toPtr); toPtr += outFr.sideInfoSize; 00779 00780 // 'main data', using the new lengths 00781 unsigned toBitOffset = 0; 00782 unsigned fromBitOffset = 0; 00783 00784 /* rebuild portion 0a: */ 00785 memmove(toPtr, fromPtr, (part23Length0a+7)/8); 00786 toBitOffset += part23Length0a; 00787 fromBitOffset += part23Length0a + part23Length0aTruncation; 00788 00789 /* rebuild portion 0b: */ 00790 shiftBits(toPtr, toBitOffset, fromPtr, fromBitOffset, part23Length0b); 00791 toBitOffset += part23Length0b; 00792 fromBitOffset += part23Length0b + part23Length0bTruncation; 00793 00794 /* rebuild portion 1a: */ 00795 shiftBits(toPtr, toBitOffset, fromPtr, fromBitOffset, part23Length1a); 00796 toBitOffset += part23Length1a; 00797 fromBitOffset += part23Length1a + part23Length1aTruncation; 00798 00799 /* rebuild portion 1b: */ 00800 shiftBits(toPtr, toBitOffset, fromPtr, fromBitOffset, part23Length1b); 00801 toBitOffset += part23Length1b; 00802 00803 /* zero out any remaining bits (probably unnecessary, but...) */ 00804 unsigned char const zero = '\0'; 00805 shiftBits(toPtr, toBitOffset, &zero, 0, 00806 actualOutAduSize*8 - numAduBits); 00807 00808 return 4 + outFr.sideInfoSize + actualOutAduSize; 00809 }
| Boolean ZeroOutMP3SideInfo | ( | unsigned char * | framePtr, | |
| unsigned | totFrameSize, | |||
| unsigned | newBackpointer | |||
| ) |
Definition at line 636 of file MP3Internals.cpp.
References MP3SideInfo::ch, False, MP3FrameParams::getSideInfo(), MP3SideInfo::gr, MP3FrameParams::hdr, MP3SideInfo::main_data_begin, PutMP3SideInfoIntoFrame(), MP3FrameParams::setBytePointer(), MP3FrameParams::setParamsFromHeader(), MP3FrameParams::sideInfoSize, and True.
Referenced by SegmentQueue::insertDummyBeforeTail().
00637 { 00638 if (totFrameSize < 4) return False; // there's not enough data 00639 00640 MP3FrameParams fr; 00641 fr.hdr = ((unsigned)framePtr[0] << 24) | ((unsigned)framePtr[1] << 16) 00642 | ((unsigned)framePtr[2] << 8) | (unsigned)framePtr[3]; 00643 fr.setParamsFromHeader(); 00644 fr.setBytePointer(framePtr + 4, totFrameSize - 4); // skip hdr 00645 00646 if (totFrameSize < 4 + fr.sideInfoSize) return False; // not enough data 00647 00648 MP3SideInfo si; 00649 fr.getSideInfo(si); 00650 00651 si.main_data_begin = newBackpointer; /* backpointer */ 00652 /* set all four "part2_3_length" and "big_values" fields to zero: */ 00653 si.ch[0].gr[0].part2_3_length = si.ch[0].gr[0].big_values = 0; 00654 si.ch[1].gr[0].part2_3_length = si.ch[1].gr[0].big_values = 0; 00655 si.ch[0].gr[1].part2_3_length = si.ch[0].gr[1].big_values = 0; 00656 si.ch[1].gr[1].part2_3_length = si.ch[1].gr[1].big_values = 0; 00657 00658 PutMP3SideInfoIntoFrame(si, fr, framePtr + 4); 00659 00660 return True; 00661 }
1.5.2