liveMedia/QuickTimeFileSink.cpp File Reference

#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)
MediaSubsessionsubsession
 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
ChunkDescriptorchunk = fCurrentIOState->fHeadChunk
 trackDurationOfEdit = (double)chunkDuration/fCurrentIOState->fQTTimeScale
 addAtomEnd
 size = addAtom_hint()
 addAtomEnd
SubsessionIOStatehintedTrack = 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 Documentation

#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:

setWord(initFilePosn, size); \
  return size; \
}

Definition at line 1208 of file QuickTimeFileSink.cpp.

Referenced by QuickTimeFileSink::addAtom_hdlr2().

#define addEdit ( duration   )     addEdit1((duration),editTrackPosition)

Definition at line 1357 of file QuickTimeFileSink.cpp.

Referenced by while().

#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 addEmptyEdit ( duration   )     addEdit1((duration),(~0))

Definition at line 1358 of file QuickTimeFileSink.cpp.

Referenced by while().

#define fourChar ( x,
y,
z,
 )     ( ((x)<<24)|((y)<<16)|((z)<<8)|(w) )

Definition at line 32 of file QuickTimeFileSink.cpp.


Function Documentation

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   }


Variable Documentation

addAtomEnd

Definition at line 1521 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1512 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1508 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1502 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1498 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1489 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1477 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1463 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1457 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1451 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1447 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1345 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1311 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1292 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1285 of file QuickTimeFileSink.cpp.

addAtomEnd

Definition at line 1260 of file QuickTimeFileSink.cpp.

addAtomEnd

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.

size = addWord(duration)

Definition at line 1474 of file QuickTimeFileSink.cpp.

size = addWord(timeScale)

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.