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::afterGettingFrame(unsigned frameSize,
00066 unsigned numTruncatedBytes,
00067 struct timeval presentationTime) {
00068 AMRAudioSource* source = (AMRAudioSource*)fSource;
00069 if (source == NULL) return;
00070
00071 if (!fHaveWrittenHeader && fPerFrameFileNameBuffer == NULL) {
00072
00073
00074
00075 char headerBuffer[100];
00076 sprintf(headerBuffer, "#!AMR%s%s\n",
00077 source->isWideband() ? "-WB" : "",
00078 source->numChannels() > 1 ? "_MC1.0" : "");
00079 unsigned headerLength = strlen(headerBuffer);
00080 if (source->numChannels() > 1) {
00081
00082 headerBuffer[headerLength++] = 0;
00083 headerBuffer[headerLength++] = 0;
00084 headerBuffer[headerLength++] = 0;
00085 headerBuffer[headerLength++] = source->numChannels();
00086 }
00087
00088 addData((unsigned char*)headerBuffer, headerLength, presentationTime);
00089 }
00090 fHaveWrittenHeader = True;
00091
00092
00093
00094 if (fPerFrameFileNameBuffer == NULL) {
00095 u_int8_t frameHeader = source->lastFrameHeader();
00096 addData(&frameHeader, 1, presentationTime);
00097 }
00098
00099
00100 FileSink::afterGettingFrame(frameSize, numTruncatedBytes, presentationTime);
00101 }