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 void MP3AudioFileServerMediaSubsession
00051 ::seekStreamSource(FramedSource* inputSource, float seekNPT) {
00052 MP3FileSource* mp3Source;
00053 if (fGenerateADUs) {
00054
00055 ADUFromMP3Source* filter;
00056 if (fInterleaving != NULL) {
00057
00058 filter = (ADUFromMP3Source*)(((FramedFilter*)inputSource)->inputSource());
00059 } else {
00060 filter = (ADUFromMP3Source*)inputSource;
00061 }
00062 filter->resetInput();
00063 mp3Source = (MP3FileSource*)(filter->inputSource());
00064 } else if (fFileDuration > 0.0) {
00065
00066
00067 MP3FromADUSource* filter2 = (MP3FromADUSource*)inputSource;
00068 ADUFromMP3Source* filter1 = (ADUFromMP3Source*)(filter2->inputSource());
00069 filter1->resetInput();
00070 mp3Source = (MP3FileSource*)(filter1->inputSource());
00071 } else {
00072
00073 mp3Source = (MP3FileSource*)inputSource;
00074 }
00075
00076 mp3Source->seekWithinFile(seekNPT);
00077 }
00078
00079 void MP3AudioFileServerMediaSubsession
00080 ::setStreamSourceScale(FramedSource* inputSource, float scale) {
00081 int iScale = (int)scale;
00082 MP3FileSource* mp3Source;
00083 ADUFromMP3Source* aduSource = NULL;
00084 if (fGenerateADUs) {
00085 if (fInterleaving != NULL) {
00086
00087 aduSource = (ADUFromMP3Source*)(((FramedFilter*)inputSource)->inputSource());
00088 } else {
00089 aduSource = (ADUFromMP3Source*)inputSource;
00090 }
00091 mp3Source = (MP3FileSource*)(aduSource->inputSource());
00092 } else if (fFileDuration > 0.0) {
00093
00094
00095 aduSource = (ADUFromMP3Source*)(((FramedFilter*)inputSource)->inputSource());
00096
00097
00098 mp3Source = (MP3FileSource*)(aduSource->inputSource());
00099 } else return;
00100
00101 aduSource->setScaleFactor(iScale);
00102 mp3Source->setPresentationTimeScale(iScale);
00103 }
00104
00105 FramedSource* MP3AudioFileServerMediaSubsession
00106 ::createNewStreamSource(unsigned , unsigned& estBitrate) {
00107 estBitrate = 128;
00108
00109 FramedSource* streamSource;
00110 do {
00111 MP3FileSource* mp3Source;
00112 streamSource = mp3Source = MP3FileSource::createNew(envir(), fFileName);
00113 if (streamSource == NULL) break;
00114 fFileDuration = mp3Source->filePlayTime();
00115
00116 if (fGenerateADUs) {
00117
00118 streamSource = ADUFromMP3Source::createNew(envir(), streamSource);
00119 if (streamSource == NULL) break;
00120
00121 if (fInterleaving != NULL) {
00122
00123 streamSource = MP3ADUinterleaver::createNew(envir(), *fInterleaving,
00124 streamSource);
00125 if (streamSource == NULL) break;
00126 }
00127 } else if (fFileDuration > 0.0) {
00128
00129
00130
00131
00132 streamSource = ADUFromMP3Source::createNew(envir(), streamSource);
00133 if (streamSource == NULL) break;
00134
00135 streamSource = MP3FromADUSource::createNew(envir(), streamSource);
00136 if (streamSource == NULL) break;
00137 }
00138 } while (0);
00139
00140 return streamSource;
00141 }
00142
00143 RTPSink* MP3AudioFileServerMediaSubsession
00144 ::createNewRTPSink(Groupsock* rtpGroupsock,
00145 unsigned char rtpPayloadTypeIfDynamic,
00146 FramedSource* ) {
00147 if (fGenerateADUs) {
00148 return MP3ADURTPSink::createNew(envir(), rtpGroupsock,
00149 rtpPayloadTypeIfDynamic);
00150 } else {
00151 return MPEG1or2AudioRTPSink::createNew(envir(), rtpGroupsock);
00152 }
00153 }
00154
00155 void MP3AudioFileServerMediaSubsession::testScaleFactor(float& scale) {
00156 if (fFileDuration <= 0.0) {
00157
00158
00159 scale = 1;
00160 } else {
00161
00162 int iScale = (int)(scale + 0.5);
00163 if (iScale < 1) iScale = 1;
00164 scale = (float)iScale;
00165 }
00166 }
00167
00168 float MP3AudioFileServerMediaSubsession::duration() const {
00169 return fFileDuration;
00170 }