00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "MP3ADUTranscoder.hh"
00022 #include "MP3Internals.hh"
00023 #include <string.h>
00024
00025 MP3ADUTranscoder::MP3ADUTranscoder(UsageEnvironment& env,
00026 unsigned outBitrate ,
00027 FramedSource* inputSource)
00028 : FramedFilter(env, inputSource),
00029 fOutBitrate(outBitrate),
00030 fAvailableBytesForBackpointer(0),
00031 fOrigADU(new unsigned char[MAX_MP3_FRAME_SIZE]) {
00032 }
00033
00034 MP3ADUTranscoder::~MP3ADUTranscoder() {
00035 delete[] fOrigADU;
00036 }
00037
00038 MP3ADUTranscoder* MP3ADUTranscoder::createNew(UsageEnvironment& env,
00039 unsigned outBitrate ,
00040 FramedSource* inputSource) {
00041
00042 if (strcmp(inputSource->MIMEtype(), "audio/MPA-ROBUST") != 0) {
00043 env.setResultMsg(inputSource->name(), " is not an MP3 ADU source");
00044 return NULL;
00045 }
00046
00047 return new MP3ADUTranscoder(env, outBitrate, inputSource);
00048 }
00049
00050 void MP3ADUTranscoder::getAttributes() const {
00051
00052 fInputSource->getAttributes();
00053
00054
00055 char buffer[30];
00056 sprintf(buffer, " bandwidth %d", outBitrate());
00057 envir().appendToResultMsg(buffer);
00058 }
00059
00060 void MP3ADUTranscoder::doGetNextFrame() {
00061 fInputSource->getNextFrame(fOrigADU, MAX_MP3_FRAME_SIZE,
00062 afterGettingFrame, this, handleClosure, this);
00063 }
00064
00065 void MP3ADUTranscoder::afterGettingFrame(void* clientData,
00066 unsigned numBytesRead,
00067 unsigned numTruncatedBytes,
00068 struct timeval presentationTime,
00069 unsigned durationInMicroseconds) {
00070 MP3ADUTranscoder* transcoder = (MP3ADUTranscoder*)clientData;
00071 transcoder->afterGettingFrame1(numBytesRead, numTruncatedBytes,
00072 presentationTime, durationInMicroseconds);
00073 }
00074
00075 void MP3ADUTranscoder::afterGettingFrame1(unsigned numBytesRead,
00076 unsigned numTruncatedBytes,
00077 struct timeval presentationTime,
00078 unsigned durationInMicroseconds) {
00079 fNumTruncatedBytes = numTruncatedBytes;
00080 fPresentationTime = presentationTime;
00081 fDurationInMicroseconds = durationInMicroseconds;
00082 fFrameSize = TranscodeMP3ADU(fOrigADU, numBytesRead, fOutBitrate,
00083 fTo, fMaxSize, fAvailableBytesForBackpointer);
00084 if (fFrameSize == 0) {
00085 handleClosure(this);
00086 return;
00087 }
00088
00089
00090
00091 afterGetting(this);
00092 }