00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "MP3AudioFileServerMediaSubsession.hh"
00024 #include "MPEG1or2AudioRTPSink.hh"
00025 #include "MP3ADURTPSink.hh"
00026 #include "MP3FileSource.hh"
00027 #include "MP3ADU.hh"
00028
00029 MP3AudioFileServerMediaSubsession* MP3AudioFileServerMediaSubsession
00030 ::createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource,
00031 Boolean generateADUs, Interleaving* interleaving) {
00032 return new MP3AudioFileServerMediaSubsession(env, fileName, reuseFirstSource,
00033 generateADUs, interleaving);
00034 }
00035
00036 MP3AudioFileServerMediaSubsession
00037 ::MP3AudioFileServerMediaSubsession(UsageEnvironment& env,
00038 char const* fileName, Boolean reuseFirstSource,
00039 Boolean generateADUs,
00040 Interleaving* interleaving)
00041 : FileServerMediaSubsession(env, fileName, reuseFirstSource),
00042 fGenerateADUs(generateADUs), fInterleaving(interleaving), fFileDuration(0.0) {
00043 }
00044
00045 MP3AudioFileServerMediaSubsession
00046 ::~MP3AudioFileServerMediaSubsession() {
00047 delete fInterleaving;
00048 }
00049
00050 FramedSource* MP3AudioFileServerMediaSubsession
00051 ::createNewStreamSourceCommon(FramedSource* baseMP3Source, unsigned mp3NumBytes, unsigned& estBitrate) {
00052 FramedSource* streamSource;
00053 do {
00054 streamSource = baseMP3Source;
00055 if (streamSource == NULL) break;
00056
00057
00058 if (mp3NumBytes > 0 && fFileDuration > 0.0) {
00059 estBitrate = (unsigned)(mp3NumBytes/(125*fFileDuration) + 0.5);
00060 } else {
00061 estBitrate = 128;
00062 }
00063
00064 if (fGenerateADUs) {
00065
00066 streamSource = ADUFromMP3Source::createNew(envir(), streamSource);
00067 if (streamSource == NULL) break;
00068
00069 if (fInterleaving != NULL) {
00070
00071 streamSource = MP3ADUinterleaver::createNew(envir(), *fInterleaving,
00072 streamSource);
00073 if (streamSource == NULL) break;
00074 }
00075 } else if (fFileDuration > 0.0) {
00076
00077
00078
00079
00080 streamSource = ADUFromMP3Source::createNew(envir(), streamSource);
00081 if (streamSource == NULL) break;
00082
00083 streamSource = MP3FromADUSource::createNew(envir(), streamSource);
00084 if (streamSource == NULL) break;
00085 }
00086 } while (0);
00087
00088 return streamSource;
00089 }
00090
00091 void MP3AudioFileServerMediaSubsession::getBaseStreams(FramedSource* frontStream,
00092 FramedSource*& sourceMP3Stream, ADUFromMP3Source*& aduStream) {
00093 if (fGenerateADUs) {
00094
00095 if (fInterleaving != NULL) {
00096
00097 aduStream = (ADUFromMP3Source*)(((FramedFilter*)frontStream)->inputSource());
00098 } else {
00099 aduStream = (ADUFromMP3Source*)frontStream;
00100 }
00101
00102
00103 sourceMP3Stream = (MP3FileSource*)(aduStream->inputSource());
00104 } else if (fFileDuration > 0.0) {
00105
00106
00107 aduStream = (ADUFromMP3Source*)(((FramedFilter*)frontStream)->inputSource());
00108
00109
00110 sourceMP3Stream = (MP3FileSource*)(aduStream->inputSource());
00111 } else {
00112
00113 aduStream = NULL;
00114 sourceMP3Stream = frontStream;
00115 }
00116 }
00117
00118
00119 void MP3AudioFileServerMediaSubsession
00120 ::seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& ) {
00121 FramedSource* sourceMP3Stream;
00122 ADUFromMP3Source* aduStream;
00123 getBaseStreams(inputSource, sourceMP3Stream, aduStream);
00124
00125 if (aduStream != NULL) aduStream->resetInput();
00126 ((MP3FileSource*)sourceMP3Stream)->seekWithinFile(seekNPT, streamDuration);
00127 }
00128
00129 void MP3AudioFileServerMediaSubsession
00130 ::setStreamSourceScale(FramedSource* inputSource, float scale) {
00131
00132 FramedSource* sourceMP3Stream;
00133 ADUFromMP3Source* aduStream;
00134 getBaseStreams(inputSource, sourceMP3Stream, aduStream);
00135
00136 if (aduStream == NULL) return;
00137
00138 int iScale = (int)scale;
00139 aduStream->setScaleFactor(iScale);
00140 ((MP3FileSource*)sourceMP3Stream)->setPresentationTimeScale(iScale);
00141 }
00142
00143 FramedSource* MP3AudioFileServerMediaSubsession
00144 ::createNewStreamSource(unsigned , unsigned& estBitrate) {
00145 MP3FileSource* mp3Source = MP3FileSource::createNew(envir(), fFileName);
00146 if (mp3Source == NULL) return NULL;
00147 fFileDuration = mp3Source->filePlayTime();
00148
00149 return createNewStreamSourceCommon(mp3Source, mp3Source->fileSize(), estBitrate);
00150 }
00151
00152 RTPSink* MP3AudioFileServerMediaSubsession
00153 ::createNewRTPSink(Groupsock* rtpGroupsock,
00154 unsigned char rtpPayloadTypeIfDynamic,
00155 FramedSource* ) {
00156 if (fGenerateADUs) {
00157 return MP3ADURTPSink::createNew(envir(), rtpGroupsock,
00158 rtpPayloadTypeIfDynamic);
00159 } else {
00160 return MPEG1or2AudioRTPSink::createNew(envir(), rtpGroupsock);
00161 }
00162 }
00163
00164 void MP3AudioFileServerMediaSubsession::testScaleFactor(float& scale) {
00165 if (fFileDuration <= 0.0) {
00166
00167
00168 scale = 1;
00169 } else {
00170
00171 int iScale = (int)(scale + 0.5);
00172 if (iScale < 1) iScale = 1;
00173 scale = (float)iScale;
00174 }
00175 }
00176
00177 float MP3AudioFileServerMediaSubsession::duration() const {
00178 return fFileDuration;
00179 }