00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "AMRAudioFileSink.hh"
00022 #include "AMRAudioSource.hh"
00023 #include "OutputFile.hh"
00024
00026
00027 AMRAudioFileSink
00028 ::AMRAudioFileSink(UsageEnvironment& env, FILE* fid, unsigned bufferSize,
00029 char const* perFrameFileNamePrefix)
00030 : FileSink(env, fid, bufferSize, perFrameFileNamePrefix),
00031 fHaveWrittenHeader(False) {
00032 }
00033
00034 AMRAudioFileSink::~AMRAudioFileSink() {
00035 }
00036
00037 AMRAudioFileSink*
00038 AMRAudioFileSink::createNew(UsageEnvironment& env, char const* fileName,
00039 unsigned bufferSize, Boolean oneFilePerFrame) {
00040 do {
00041 FILE* fid;
00042 char const* perFrameFileNamePrefix;
00043 if (oneFilePerFrame) {
00044
00045 fid = NULL;
00046 perFrameFileNamePrefix = fileName;
00047 } else {
00048
00049 fid = OpenOutputFile(env, fileName);
00050 if (fid == NULL) break;
00051 perFrameFileNamePrefix = NULL;
00052 }
00053
00054 return new AMRAudioFileSink(env, fid, bufferSize, perFrameFileNamePrefix);
00055 } while (0);
00056
00057 return NULL;
00058 }
00059
00060 Boolean AMRAudioFileSink::sourceIsCompatibleWithUs(MediaSource& source) {
00061
00062 return source.isAMRAudioSource();
00063 }
00064
00065 void AMRAudioFileSink::afterGettingFrame1(unsigned frameSize,
00066 struct timeval presentationTime) {
00067 AMRAudioSource* source = (AMRAudioSource*)fSource;
00068
00069 if (!fHaveWrittenHeader && fPerFrameFileNameBuffer == NULL) {
00070
00071
00072
00073 char headerBuffer[100];
00074 sprintf(headerBuffer, "#!AMR%s%s\n",
00075 source->isWideband() ? "-WB" : "",
00076 source->numChannels() > 1 ? "_MC1.0" : "");
00077 unsigned headerLength = strlen(headerBuffer);
00078 if (source->numChannels() > 1) {
00079
00080 headerBuffer[headerLength++] = 0;
00081 headerBuffer[headerLength++] = 0;
00082 headerBuffer[headerLength++] = 0;
00083 headerBuffer[headerLength++] = source->numChannels();
00084 }
00085
00086 addData((unsigned char*)headerBuffer, headerLength, presentationTime);
00087 }
00088 fHaveWrittenHeader = True;
00089
00090
00091
00092 if (fPerFrameFileNameBuffer == NULL) {
00093 u_int8_t frameHeader = source->lastFrameHeader();
00094 addData(&frameHeader, 1, presentationTime);
00095 }
00096
00097
00098 FileSink::afterGettingFrame1(frameSize, presentationTime);
00099 }