#include "QuickTimeFileSink.hh"#include "QuickTimeGenericRTPSource.hh"#include "GroupsockHelper.hh"#include "OutputFile.hh"#include "H263plusVideoRTPSource.hh"#include "MPEG4GenericRTPSource.hh"#include "MPEG4LATMAudioRTPSource.hh"#include "Base64.hh"#include <ctype.h>Include dependency graph for QuickTimeFileSink.cpp:

Go to the source code of this file.
Data Structures | |
| class | ChunkDescriptor |
| class | SubsessionBuffer |
| class | Count64 |
| class | SubsessionIOState |
| struct | SubsessionIOState::hinf |
Defines | |
| #define | fourChar(x, y, z, w) ( ((x)<<24)|((y)<<16)|((z)<<8)|(w) ) |
| #define | addAtom(name) |
| #define | addAtomEnd |
| #define | addEdit1(duration, trackPosition) |
| #define | addEdit(duration) addEdit1((duration),editTrackPosition) |
| #define | addEmptyEdit(duration) addEdit1((duration),(~0)) |
Functions | |
| static Boolean | timevalGE (struct timeval const &tv1, struct timeval const &tv2) |
| addAtom (ftyp) | |
| addAtom (moov) | |
| if (fGenerateMP4Format) | |
| while ((subsession=iter.next())!=NULL) | |
| iter | reset () |
| addAtom (mvhd) | |
| addAtom (iods) | |
| addAtom (trak) | |
| if (fCurrentIOState->fHeadChunk!=NULL &&(fSyncStreams||fCurrentIOState->isHintTrack())) | |
| if (fCurrentIOState->isHintTrack()) size+ = addAtom_udta() | |
| addAtom (tkhd) | |
| if (fCurrentIOState->fQTEnableTrack) | |
| if (strcmp(fCurrentIOState->fOurSubsession.mediumName(),"video")==0) | |
| addAtom (edts) | |
| addAtom (elst) | |
| while (chunk!=NULL) | |
| if (trackDurationOfEdit > 0.0) addEdit(trackDurationOfEdit) | |
| setWord (numEntriesPosition, numEdits) | |
| if (totalDurationOfEdits > fCurrentIOState->fQTDurationM) | |
| addAtom (tref) | |
| addAtom (hint) | |
| addAtom (mdia) | |
| addAtom (mdhd) | |
| addAtom (hdlr) | |
| addAtom (minf) | |
| addAtom (smhd) | |
| addAtom (vmhd) | |
| addAtom (gmhd) | |
| addAtom (gmin) | |
Variables | |
| size = add4ByteString("mp42") | |
| size = addWord(0x00000000) | |
| size = add4ByteString("mp42") | |
| size = add4ByteString("isom") | |
| addAtomEnd | |
| size = addAtom_mvhd() | |
| MediaSubsessionIterator | iter (fInputSession) |
| MediaSubsession * | subsession |
| addAtomEnd | |
| size = addWord(0x00000000) | |
| size = addWord(fAppleCreationTime) | |
| size = addWord(fAppleCreationTime) | |
| size = addWord(movieTimeScale()) | |
| unsigned const | duration = fMaxTrackDurationM |
| fMVHD_durationPosn = ftell(fOutFid) | |
| size = addWord(duration) | |
| size = addWord(0x00010000) | |
| size = addWord(0x01000000) | |
| size = addZeroWords(2) | |
| size = addWord(0x00010000) | |
| size = addZeroWords(3) | |
| size = addWord(0x00010000) | |
| size = addZeroWords(3) | |
| size = addWord(0x40000000) | |
| size = addZeroWords(6) | |
| size = addWord(SubsessionIOState::fCurrentTrackNumber+1) | |
| addAtomEnd | |
| size = addWord(0x00000000) | |
| size = addWord(0x10808080) | |
| size = addWord(0x07004FFF) | |
| size = addWord(0xFF0FFFFF) | |
| addAtomEnd | |
| size = addAtom_tkhd() | |
| size = addAtom_mdia() | |
| addAtomEnd | |
| size = addWord(fAppleCreationTime) | |
| size = addWord(fCurrentIOState->fTrackID) | |
| size = addWord(0x00000000) | |
| unsigned const | duration = fCurrentIOState->fQTDurationM |
| fCurrentIOState | fTKHD_durationPosn = ftell(fOutFid) |
| size = addWord(duration) | |
| size = addZeroWords(3) | |
| size = addWord(0x01000000) | |
| size = addWord(0x00010000) | |
| size = addZeroWords(3) | |
| size = addWord(0x00010000) | |
| size = addZeroWords(3) | |
| size = addWord(0x40000000) | |
| size = addAtom_elst() | |
| addAtomEnd | |
| size = addWord(0x00000000) | |
| unsigned | numEntriesPosition = ftell(fOutFid) |
| size = addWord(0) | |
| unsigned | numEdits = 0 |
| unsigned | totalDurationOfEdits = 0 |
| double const | syncThreshold = 0.1 |
| timeval | editStartTime = fFirstDataTime |
| unsigned | editTrackPosition = 0 |
| unsigned | currentTrackPosition = 0 |
| double | trackDurationOfEdit = 0.0 |
| unsigned | chunkDuration = 0 |
| ChunkDescriptor * | chunk = fCurrentIOState->fHeadChunk |
| trackDurationOfEdit = (double)chunkDuration/fCurrentIOState->fQTTimeScale | |
| addAtomEnd | |
| size = addAtom_hint() | |
| addAtomEnd | |
| SubsessionIOState * | hintedTrack = fCurrentIOState->fTrackHintedByUs |
| size = addWord(hintedTrack->fTrackID) | |
| addAtomEnd | |
| size = addAtom_mdhd() | |
| size = addAtom_hdlr() | |
| size = addAtom_minf() | |
| addAtomEnd | |
| size = addWord(0x00000000) | |
| size = addWord(fAppleCreationTime) | |
| size = addWord(fAppleCreationTime) | |
| unsigned const | timeScale = fCurrentIOState->fQTTimeScale |
| size = addWord(timeScale) | |
| unsigned const | duration = fCurrentIOState->fQTDurationT |
| size = addWord(duration) | |
| size = addWord(0x00000000) | |
| addAtomEnd | |
| size = addWord(0x00000000) | |
| size = add4ByteString("mhlr") | |
| size = addWord(fCurrentIOState->fQTcomponentSubtype) | |
| size = add4ByteString("appl") | |
| size = addWord(0x00000000) | |
| size = addWord(0x00000000) | |
| size = addArbitraryString(fCurrentIOState->fQTcomponentName) | |
| addAtomEnd | |
| SubsessionIOState::atomCreationFunc | mediaInformationAtomCreator = fCurrentIOState->fQTMediaInformationAtomCreator |
| size = (this->*mediaInformationAtomCreator)() | |
| size = addAtom_hdlr2() | |
| size = addAtom_dinf() | |
| size = addAtom_stbl() | |
| addAtomEnd | |
| size = addZeroWords(2) | |
| addAtomEnd | |
| size = addWord(0x00000001) | |
| size = addWord(0x00408000) | |
| size = addWord(0x80008000) | |
| addAtomEnd | |
| size = addAtom_gmin() | |
| addAtomEnd | |
| size = addWord(0x00000000) | |
| size = addWord(0x00408000) | |
| size = addWord(0x80008000) | |
| size = addWord(0x00000000) | |
| addAtomEnd | |
| #define addAtom | ( | name | ) |
Value:
unsigned QuickTimeFileSink::addAtom_##name() { \ unsigned initFilePosn = ftell(fOutFid); \ unsigned size = addAtomHeader("" #name "")
Definition at line 1203 of file QuickTimeFileSink.cpp.
Referenced by QuickTimeFileSink::addAtom_hdlr2().
| #define addAtomEnd |
Value:
Definition at line 1208 of file QuickTimeFileSink.cpp.
Referenced by QuickTimeFileSink::addAtom_hdlr2().
| #define addEdit | ( | duration | ) | addEdit1((duration),editTrackPosition) |
| #define addEdit1 | ( | duration, | |||
| trackPosition | ) |
Value:
do { \ unsigned trackDuration \ = (unsigned) ((2*(duration)*movieTimeScale()+1)/2); \ /* in movie time units */ \ size += addWord(trackDuration); /* Track duration */ \ totalDurationOfEdits += trackDuration; \ size += addWord(trackPosition); /* Media time */ \ size += addWord(0x00010000); /* Media rate (1x) */ \ ++numEdits; \ } while (0)
Definition at line 1347 of file QuickTimeFileSink.cpp.
| #define fourChar | ( | x, | |||
| y, | |||||
| z, | |||||
| w | ) | ( ((x)<<24)|((y)<<16)|((z)<<8)|(w) ) |
Definition at line 32 of file QuickTimeFileSink.cpp.
| addAtom | ( | gmin | ) |
| addAtom | ( | gmhd | ) |
| addAtom | ( | vmhd | ) |
| addAtom | ( | smhd | ) |
| addAtom | ( | minf | ) |
| addAtom | ( | hdlr | ) |
| addAtom | ( | mdhd | ) |
| addAtom | ( | mdia | ) |
| addAtom | ( | hint | ) |
| addAtom | ( | tref | ) |
| addAtom | ( | elst | ) |
| addAtom | ( | edts | ) |
| addAtom | ( | tkhd | ) |
| addAtom | ( | trak | ) |
| addAtom | ( | iods | ) |
| addAtom | ( | mvhd | ) |
| addAtom | ( | moov | ) |
| addAtom | ( | ftyp | ) |
| if | ( | totalDurationOfEdits | , | |
| fCurrentIOState-> | fQTDurationM | |||
| ) |
Definition at line 1431 of file QuickTimeFileSink.cpp.
References QuickTimeFileSink::fCurrentIOState, QuickTimeFileSink::fMaxTrackDurationM, QuickTimeFileSink::fMVHD_durationPosn, SubsessionIOState::fQTDurationM, SubsessionIOState::fQTDurationT, SubsessionIOState::fQTTimeScale, SubsessionIOState::fTKHD_durationPosn, QuickTimeFileSink::movieTimeScale(), and QuickTimeFileSink::setWord().
01431 { 01432 fCurrentIOState->fQTDurationM = totalDurationOfEdits; 01433 setWord(fCurrentIOState->fTKHD_durationPosn, totalDurationOfEdits); 01434 01435 // Also, check whether the overall movie duration needs to change: 01436 if (totalDurationOfEdits > fMaxTrackDurationM) { 01437 fMaxTrackDurationM = totalDurationOfEdits; 01438 setWord(fMVHD_durationPosn, totalDurationOfEdits); 01439 } 01440 01441 // Also, convert to track time scale: 01442 double scaleFactor 01443 = fCurrentIOState->fQTTimeScale/(double)movieTimeScale(); 01444 fCurrentIOState->fQTDurationT 01445 = (unsigned)(totalDurationOfEdits*scaleFactor); 01446 }
| if | ( | trackDurationOfEdit | , | |
| 0. | 0 | |||
| ) |
| if | ( | strcmp(fCurrentIOState->fOurSubsession.mediumName(),"video") | = = 0 |
) |
Definition at line 1335 of file QuickTimeFileSink.cpp.
References QuickTimeFileSink::addWord(), QuickTimeFileSink::fMovieHeight, QuickTimeFileSink::fMovieWidth, and size.
01335 { 01336 size += addWord(fMovieWidth<<16); // Track width 01337 size += addWord(fMovieHeight<<16); // Track height 01338 } else {
| if | ( | fCurrentIOState-> | fQTEnableTrack | ) |
Definition at line 1314 of file QuickTimeFileSink.cpp.
References QuickTimeFileSink::addWord(), and size.
01314 { 01315 size += addWord(0x0000000F); // Version + Flags 01316 } else {
| if | ( | fCurrentIOState-> | isHintTrack() | ) | = addAtom_udta() |
| if | ( | fCurrentIOState->fHeadChunk! | = NULL && (fSyncStreams || fCurrentIOState->isHintTrack()) |
) |
Definition at line 1299 of file QuickTimeFileSink.cpp.
References size.
01300 { 01301 size += addAtom_edts(); 01302 }
| if | ( | fGenerateMP4Format | ) |
Definition at line 1223 of file QuickTimeFileSink.cpp.
References size.
01223 { 01224 size += addAtom_iods(); 01225 }
| iter reset | ( | ) |
| setWord | ( | numEntriesPosition | , | |
| numEdits | ||||
| ) |
| static Boolean timevalGE | ( | struct timeval const & | tv1, | |
| struct timeval const & | tv2 | |||
| ) | [static] |
Definition at line 442 of file QuickTimeFileSink.cpp.
Referenced by QuickTimeFileSink::completeOutputFile(), and SubsessionIOState::syncOK().
00443 { 00444 return (unsigned)tv1.tv_sec > (unsigned)tv2.tv_sec 00445 || (tv1.tv_sec == tv2.tv_sec 00446 && (unsigned)tv1.tv_usec >= (unsigned)tv2.tv_usec); 00447 }
| while | ( | chunk! | = NULL |
) |
Definition at line 1384 of file QuickTimeFileSink.cpp.
References addEdit, addEmptyEdit, chunk, QuickTimeFileSink::fCurrentIOState, ChunkDescriptor::fFrameDuration, ChunkDescriptor::fNextChunk, ChunkDescriptor::fNumFrames, SubsessionIOState::fOurSubsession, ChunkDescriptor::fPresentationTime, SubsessionIOState::fQTTimeScale, and MediaSubsession::numChannels().
01384 { 01385 struct timeval const& chunkStartTime = chunk->fPresentationTime; 01386 double movieDurationOfEdit 01387 = (chunkStartTime.tv_sec - editStartTime.tv_sec) 01388 + (chunkStartTime.tv_usec - editStartTime.tv_usec)/1000000.0; 01389 trackDurationOfEdit = (currentTrackPosition-editTrackPosition) 01390 / (double)(fCurrentIOState->fQTTimeScale); 01391 01392 double outOfSync = movieDurationOfEdit - trackDurationOfEdit; 01393 01394 if (outOfSync > syncThreshold) { 01395 // The track's data is too short, so end this edit, add a new 01396 // 'empty' edit after it, and start a new edit 01397 // (at the current track posn.): 01398 if (trackDurationOfEdit > 0.0) addEdit(trackDurationOfEdit); 01399 addEmptyEdit(outOfSync); 01400 01401 editStartTime = chunkStartTime; 01402 editTrackPosition = currentTrackPosition; 01403 } else if (outOfSync < -syncThreshold) { 01404 // The track's data is too long, so end this edit, and start 01405 // a new edit (pointing at the current track posn.): 01406 if (movieDurationOfEdit > 0.0) addEdit(movieDurationOfEdit); 01407 01408 editStartTime = chunkStartTime; 01409 editTrackPosition = currentTrackPosition; 01410 } 01411 01412 // Note the duration of this chunk: 01413 unsigned numChannels = fCurrentIOState->fOurSubsession.numChannels(); 01414 chunkDuration = chunk->fNumFrames*chunk->fFrameDuration/numChannels; 01415 currentTrackPosition += chunkDuration; 01416 01417 chunk = chunk->fNextChunk; 01418 }
| while | ( | (subsession=iter.next())! | = NULL |
) |
Definition at line 1233 of file QuickTimeFileSink.cpp.
References QuickTimeFileSink::fCurrentIOState, SubsessionIOState::fHintTrackForUs, SubsessionIOState::hasHintTrack(), MediaSubsession::mediumName(), MediaSubsession::miscPtr, NULL, size, and subsession.
01233 { 01234 fCurrentIOState = (SubsessionIOState*)(subsession->miscPtr); 01235 if (fCurrentIOState == NULL) continue; 01236 if (strcmp(subsession->mediumName(), "audio") != 0) continue; 01237 01238 size += addAtom_trak(); 01239 01240 if (fCurrentIOState->hasHintTrack()) { 01241 // This track has a hint track; output it also: 01242 fCurrentIOState = fCurrentIOState->fHintTrackForUs; 01243 size += addAtom_trak(); 01244 } 01245 }
Definition at line 1521 of file QuickTimeFileSink.cpp.
Definition at line 1512 of file QuickTimeFileSink.cpp.
Definition at line 1508 of file QuickTimeFileSink.cpp.
Definition at line 1502 of file QuickTimeFileSink.cpp.
Definition at line 1498 of file QuickTimeFileSink.cpp.
Definition at line 1489 of file QuickTimeFileSink.cpp.
Definition at line 1477 of file QuickTimeFileSink.cpp.
Definition at line 1463 of file QuickTimeFileSink.cpp.
Definition at line 1457 of file QuickTimeFileSink.cpp.
Definition at line 1451 of file QuickTimeFileSink.cpp.
Definition at line 1447 of file QuickTimeFileSink.cpp.
Definition at line 1345 of file QuickTimeFileSink.cpp.
Definition at line 1311 of file QuickTimeFileSink.cpp.
Definition at line 1292 of file QuickTimeFileSink.cpp.
Definition at line 1285 of file QuickTimeFileSink.cpp.
Definition at line 1260 of file QuickTimeFileSink.cpp.
Definition at line 1218 of file QuickTimeFileSink.cpp.
| ChunkDescriptor* chunk = fCurrentIOState->fHeadChunk |
Definition at line 1383 of file QuickTimeFileSink.cpp.
Referenced by QuickTimeFileSink::addAtom_hdlr2(), SubsessionIOState::setFinalQTstate(), and while().
| unsigned chunkDuration = 0 |
Definition at line 1381 of file QuickTimeFileSink.cpp.
| unsigned currentTrackPosition = 0 |
Definition at line 1379 of file QuickTimeFileSink.cpp.
| unsigned const duration = fCurrentIOState->fQTDurationT |
Definition at line 1473 of file QuickTimeFileSink.cpp.
| unsigned const duration = fCurrentIOState->fQTDurationM |
Definition at line 1325 of file QuickTimeFileSink.cpp.
| unsigned const duration = fMaxTrackDurationM |
Definition at line 1271 of file QuickTimeFileSink.cpp.
Referenced by H263plusVideoStreamParser::CalculateDuration(), clientStartPlayingSession(), RTSPServer::RTSPClientSession::handleCmd_PLAY(), main(), MPEG1or2ProgramStreamFileDuration(), startPlayingStreams(), SubsessionIOState::useFrame(), and SubsessionIOState::useFrameForHinting().
| struct timeval editStartTime = fFirstDataTime |
Definition at line 1377 of file QuickTimeFileSink.cpp.
| unsigned editTrackPosition = 0 |
Definition at line 1378 of file QuickTimeFileSink.cpp.
| fMVHD_durationPosn = ftell(fOutFid) |
Definition at line 1272 of file QuickTimeFileSink.cpp.
| fCurrentIOState fTKHD_durationPosn = ftell(fOutFid) |
Definition at line 1326 of file QuickTimeFileSink.cpp.
| SubsessionIOState* hintedTrack = fCurrentIOState->fTrackHintedByUs |
Definition at line 1454 of file QuickTimeFileSink.cpp.
Referenced by SubsessionIOState::setHintTrack().
| MediaSubsessionIterator iter(fInputSession) |
| SubsessionIOState::atomCreationFunc mediaInformationAtomCreator = fCurrentIOState->fQTMediaInformationAtomCreator |
Definition at line 1493 of file QuickTimeFileSink.cpp.
| unsigned numEdits = 0 |
Definition at line 1367 of file QuickTimeFileSink.cpp.
| unsigned numEntriesPosition = ftell(fOutFid) |
Definition at line 1365 of file QuickTimeFileSink.cpp.
| size = addWord(0x00000000) |
Definition at line 1520 of file QuickTimeFileSink.cpp.
| size = addWord(0x80008000) |
Definition at line 1519 of file QuickTimeFileSink.cpp.
| size = addWord(0x00408000) |
Definition at line 1518 of file QuickTimeFileSink.cpp.
| size = addWord(0x00000000) |
Definition at line 1515 of file QuickTimeFileSink.cpp.
| size = addAtom_gmin() |
Definition at line 1511 of file QuickTimeFileSink.cpp.
| size = addWord(0x80008000) |
Definition at line 1507 of file QuickTimeFileSink.cpp.
| size = addWord(0x00408000) |
Definition at line 1506 of file QuickTimeFileSink.cpp.
| size = addWord(0x00000001) |
Definition at line 1505 of file QuickTimeFileSink.cpp.
| size = addZeroWords(2) |
Definition at line 1501 of file QuickTimeFileSink.cpp.
| size = addAtom_stbl() |
Definition at line 1497 of file QuickTimeFileSink.cpp.
| size = addAtom_dinf() |
Definition at line 1496 of file QuickTimeFileSink.cpp.
| size = addAtom_hdlr2() |
Definition at line 1495 of file QuickTimeFileSink.cpp.
| size = (this->*mediaInformationAtomCreator)() |
Definition at line 1494 of file QuickTimeFileSink.cpp.
| size = addArbitraryString(fCurrentIOState->fQTcomponentName) |
Definition at line 1487 of file QuickTimeFileSink.cpp.
| size = addWord(0x00000000) |
Definition at line 1486 of file QuickTimeFileSink.cpp.
| size = addWord(0x00000000) |
Definition at line 1485 of file QuickTimeFileSink.cpp.
| size = add4ByteString("appl") |
Definition at line 1484 of file QuickTimeFileSink.cpp.
| size = addWord(fCurrentIOState->fQTcomponentSubtype) |
Definition at line 1482 of file QuickTimeFileSink.cpp.
| size = add4ByteString("mhlr") |
Definition at line 1481 of file QuickTimeFileSink.cpp.
| size = addWord(0x00000000) |
Definition at line 1480 of file QuickTimeFileSink.cpp.
| size = addWord(0x00000000) |
Definition at line 1476 of file QuickTimeFileSink.cpp.
Definition at line 1474 of file QuickTimeFileSink.cpp.
Definition at line 1471 of file QuickTimeFileSink.cpp.
| size = addWord(fAppleCreationTime) |
Definition at line 1468 of file QuickTimeFileSink.cpp.
| size = addWord(fAppleCreationTime) |
Definition at line 1467 of file QuickTimeFileSink.cpp.
| size = addWord(0x00000000) |
Definition at line 1466 of file QuickTimeFileSink.cpp.
| size = addAtom_minf() |
Definition at line 1462 of file QuickTimeFileSink.cpp.