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