00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "H264VideoFileSink.hh"
00022 #include "OutputFile.hh"
00023 #include "H264VideoRTPSource.hh"
00024
00026
00027 H264VideoFileSink
00028 ::H264VideoFileSink(UsageEnvironment& env, FILE* fid,
00029 char const* sPropParameterSetsStr,
00030 unsigned bufferSize, char const* perFrameFileNamePrefix)
00031 : FileSink(env, fid, bufferSize, perFrameFileNamePrefix),
00032 fSPropParameterSetsStr(sPropParameterSetsStr), fHaveWrittenFirstFrame(False) {
00033 }
00034
00035 H264VideoFileSink::~H264VideoFileSink() {
00036 }
00037
00038 H264VideoFileSink*
00039 H264VideoFileSink::createNew(UsageEnvironment& env, char const* fileName,
00040 char const* sPropParameterSetsStr,
00041 unsigned bufferSize, Boolean oneFilePerFrame) {
00042 do {
00043 FILE* fid;
00044 char const* perFrameFileNamePrefix;
00045 if (oneFilePerFrame) {
00046
00047 fid = NULL;
00048 perFrameFileNamePrefix = fileName;
00049 } else {
00050
00051 fid = OpenOutputFile(env, fileName);
00052 if (fid == NULL) break;
00053 perFrameFileNamePrefix = NULL;
00054 }
00055
00056 return new H264VideoFileSink(env, fid, sPropParameterSetsStr, bufferSize, perFrameFileNamePrefix);
00057 } while (0);
00058
00059 return NULL;
00060 }
00061
00062 void H264VideoFileSink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime) {
00063 unsigned char const start_code[4] = {0x00, 0x00, 0x00, 0x01};
00064
00065 if (!fHaveWrittenFirstFrame) {
00066
00067 unsigned numSPropRecords;
00068 SPropRecord* sPropRecords = parseSPropParameterSets(fSPropParameterSetsStr, numSPropRecords);
00069 for (unsigned i = 0; i < numSPropRecords; ++i) {
00070 addData(start_code, 4, presentationTime);
00071 addData(sPropRecords[i].sPropBytes, sPropRecords[i].sPropLength, presentationTime);
00072 }
00073 delete[] sPropRecords;
00074 fHaveWrittenFirstFrame = True;
00075 }
00076
00077
00078 addData(start_code, 4, presentationTime);
00079
00080
00081 FileSink::afterGettingFrame(frameSize, numTruncatedBytes, presentationTime);
00082 }