123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864 |
- /*
- * The contents of this file are subject to the Mozilla Public
- * License Version 1.1 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS
- * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
- * implied. See the License for the specific language governing
- * rights and limitations under the License.
- *
- * The Original Code is MPEG4IP.
- *
- * The Initial Developer of the Original Code is Cisco Systems Inc.
- * Portions created by Cisco Systems Inc. are
- * Copyright (C) Cisco Systems Inc. 2001 - 2005. All Rights Reserved.
- *
- * 3GPP features implementation is based on 3GPP's TS26.234-v5.60,
- * and was contributed by Ximpo Group Ltd.
- *
- * Portions created by Ximpo Group Ltd. are
- * Copyright (C) Ximpo Group Ltd. 2003, 2004. All Rights Reserved.
- *
- * Contributor(s):
- * Dave Mackie [email protected]
- * Alix Marchandise-Franquet [email protected]
- * Ximpo Group Ltd. [email protected]
- */
- #ifndef __MP4_FILE_INCLUDED__
- #define __MP4_FILE_INCLUDED__
- // forward declarations
- class MP4Atom;
- class MP4Property;
- class MP4Float32Property;
- class MP4StringProperty;
- class MP4BytesProperty;
- class MP4Descriptor;
- class MP4DescriptorProperty;
- struct Virtual_IO;
- class MP4File {
- public: /* equivalent to MP4 library API */
- MP4File(u_int32_t verbosity = 0);
- ~MP4File();
- /* file operations */
- void Read(const MP4_FILENAME_CHAR *fileName);
- void ReadEx(const MP4_FILENAME_CHAR *fileName, void *user, Virtual_IO *virtual_IO); //benski>
- void Create(const MP4_FILENAME_CHAR *fileName, u_int32_t flags,
- int add_ftyp = 1, int add_iods = 1,
- char* majorBrand = NULL,
- u_int32_t minorVersion = 0, char** supportedBrands = NULL,
- u_int32_t supportedBrandsCount = 0);
- void Modify(const MP4_FILENAME_CHAR *fileName);
- void Optimize(const MP4_FILENAME_CHAR *orgFileName,
- const MP4_FILENAME_CHAR *newFileName = NULL);
- void Close();
- /* library property per file */
- u_int32_t GetVerbosity() {
- return m_verbosity;
- }
- void SetVerbosity(u_int32_t verbosity) {
- m_verbosity = verbosity;
- }
- bool Use64Bits(const char *atomName);
- void Check64BitStatus(const char *atomName);
- /* file properties */
- u_int64_t GetIntegerProperty(const char* name);
- float GetFloatProperty(const char* name);
- const char* GetStringProperty(const char* name);
- void GetBytesProperty(const char* name,
- u_int8_t** ppValue, u_int32_t* pValueSize);
- void SetIntegerProperty(const char* name, u_int64_t value);
- void SetFloatProperty(const char* name, float value);
- void SetStringProperty(const char* name, const char* value);
- void SetBytesProperty(const char* name,
- const u_int8_t* pValue, u_int32_t valueSize);
- // file level convenience functions
- MP4Duration GetDuration();
- void SetDuration(MP4Duration value);
- u_int32_t GetTimeScale();
- void SetTimeScale(u_int32_t value);
- u_int8_t GetODProfileLevel();
- void SetODProfileLevel(u_int8_t value);
- u_int8_t GetSceneProfileLevel();
- void SetSceneProfileLevel(u_int8_t value);
- u_int8_t GetVideoProfileLevel();
- void SetVideoProfileLevel(u_int8_t value);
- u_int8_t GetAudioProfileLevel();
- void SetAudioProfileLevel(u_int8_t value);
- u_int8_t GetGraphicsProfileLevel();
- void SetGraphicsProfileLevel(u_int8_t value);
- const char* GetSessionSdp();
- void SetSessionSdp(const char* sdpString);
- void AppendSessionSdp(const char* sdpString);
- /* track operations */
- MP4TrackId AddTrack(const char* type, u_int32_t timeScale = 1000);
- void DeleteTrack(MP4TrackId trackId);
- u_int32_t GetNumberOfTracks(const char* type = NULL, u_int8_t subType = 0);
- MP4TrackId AllocTrackId();
- MP4TrackId FindTrackId(u_int16_t trackIndex,
- const char* type = NULL, u_int8_t subType = 0);
- u_int16_t FindTrackIndex(MP4TrackId trackId);
- u_int16_t FindTrakAtomIndex(MP4TrackId trackId);
- /* track properties */
- MP4Atom *FindTrackAtom(MP4TrackId trackId, const char *name);
- u_int64_t GetTrackIntegerProperty(
- MP4TrackId trackId, const char* name);
- float GetTrackFloatProperty(
- MP4TrackId trackId, const char* name);
- const char* GetTrackStringProperty(
- MP4TrackId trackId, const char* name);
- void GetTrackBytesProperty(
- MP4TrackId trackId, const char* name,
- u_int8_t** ppValue, u_int32_t* pValueSize);
- void SetTrackIntegerProperty(
- MP4TrackId trackId, const char* name, int64_t value);
- void SetTrackFloatProperty(
- MP4TrackId trackId, const char* name, float value);
- void SetTrackStringProperty(
- MP4TrackId trackId, const char* name, const char* value);
- void SetTrackBytesProperty(
- MP4TrackId trackId, const char* name,
- const u_int8_t* pValue, u_int32_t valueSize);
- /* sample operations */
- u_int32_t GetSampleSize(MP4TrackId trackId, MP4SampleId sampleId);
- u_int32_t GetTrackMaxSampleSize(MP4TrackId trackId);
- MP4SampleId GetSampleIdFromTime(MP4TrackId trackId,
- MP4Timestamp when, bool wantSyncSample = false, bool rewind = false);
- MP4ChunkId GetChunkIdFromTime(MP4TrackId trackId, MP4Timestamp when);
- MP4Timestamp GetSampleTime(
- MP4TrackId trackId, MP4SampleId sampleId);
- MP4Duration GetSampleDuration(
- MP4TrackId trackId, MP4SampleId sampleId);
- MP4Duration GetSampleRenderingOffset(
- MP4TrackId trackId, MP4SampleId sampleId);
- bool GetSampleSync(
- MP4TrackId trackId, MP4SampleId sampleId);
- void ReadSample(
- // input parameters
- MP4TrackId trackId,
- MP4SampleId sampleId,
- // output parameters
- u_int8_t** ppBytes,
- u_int32_t* pNumBytes,
- MP4Timestamp* pStartTime = NULL,
- MP4Duration* pDuration = NULL,
- MP4Duration* pRenderingOffset = NULL,
- bool* pIsSyncSample = NULL);
- void ReadChunk(
- // input parameters
- MP4TrackId trackId,
- MP4ChunkId sampleId,
- // output parameters
- u_int8_t** ppBytes,
- u_int32_t* pNumBytes,
- MP4Timestamp* pStartTime = NULL,
- MP4Duration* pDuration = NULL);
- void WriteSample(
- MP4TrackId trackId,
- const u_int8_t* pBytes,
- u_int32_t numBytes,
- MP4Duration duration = 0,
- MP4Duration renderingOffset = 0,
- bool isSyncSample = true);
- void SetSampleRenderingOffset(
- MP4TrackId trackId,
- MP4SampleId sampleId,
- MP4Duration renderingOffset);
- /* track level convenience functions */
- MP4TrackId AddSystemsTrack(const char* type);
- MP4TrackId AddODTrack();
- MP4TrackId AddSceneTrack();
- MP4TrackId AddAudioTrack(
- u_int32_t timeScale,
- MP4Duration sampleDuration,
- u_int8_t audioType);
- MP4TrackId AddEncAudioTrack( // ismacryp
- u_int32_t timeScale,
- MP4Duration sampleDuration,
- u_int8_t audioType,
- u_int32_t scheme_type,
- u_int16_t scheme_version,
- u_int8_t key_ind_len,
- u_int8_t iv_len,
- bool selective_enc,
- const char *kms_uri,
- bool use_ismacryp);
- void SetAmrVendor(
- MP4TrackId trackId,
- u_int32_t vendor);
-
- void SetAmrDecoderVersion(
- MP4TrackId trackId,
- u_int8_t decoderVersion);
-
- void SetAmrModeSet(
- MP4TrackId trackId,
- u_int16_t modeSet);
- uint16_t GetAmrModeSet(MP4TrackId trackId);
- MP4TrackId AddAmrAudioTrack(
- u_int32_t timeScale,
- u_int16_t modeSet,
- u_int8_t modeChangePeriod,
- u_int8_t framesPerSample,
- bool isAmrWB);
- MP4TrackId AddHrefTrack(uint32_t timeScale,
- MP4Duration sampleDuration,
- const char *base_url);
- MP4TrackId AddMP4VideoTrack(
- u_int32_t timeScale,
- MP4Duration sampleDuration,
- u_int16_t width,
- u_int16_t height,
- u_int8_t videoType);
- MP4TrackId AddEncVideoTrack( // ismacryp
- u_int32_t timeScale,
- MP4Duration sampleDuration,
- u_int16_t width,
- u_int16_t height,
- u_int8_t videoType,
- mp4v2_ismacrypParams *icPp,
- const char *oFormat);
- void SetH263Vendor(
- MP4TrackId trackId,
- u_int32_t vendor);
-
- void SetH263DecoderVersion(
- MP4TrackId trackId,
- u_int8_t decoderVersion);
-
- void SetH263Bitrates(
- MP4TrackId,
- u_int32_t avgBitrate,
- u_int32_t maxBitrate);
-
- MP4TrackId AddH263VideoTrack(
- u_int32_t timeScale,
- MP4Duration sampleDuration,
- u_int16_t width,
- u_int16_t height,
- u_int8_t h263Level,
- u_int8_t h263Profile,
- u_int32_t avgBitrate,
- u_int32_t maxBitrate);
- MP4TrackId AddH264VideoTrack(
- u_int32_t timeScale,
- MP4Duration sampleDuration,
- u_int16_t width,
- u_int16_t height,
- uint8_t AVCProfileIndication,
- uint8_t profile_compat,
- uint8_t AVCLevelIndication,
- uint8_t sampleLenFieldSizeMinusOne);
- MP4TrackId AddEncH264VideoTrack(
- u_int32_t timeScale,
- MP4Duration sampleDuration,
- u_int16_t width,
- u_int16_t height,
- MP4Atom *srcAtom,
- mp4v2_ismacrypParams *icPp);
- void AddH264SequenceParameterSet(MP4TrackId trackId,
- const uint8_t *pSequence,
- uint16_t sequenceLen);
- void AddH264PictureParameterSet(MP4TrackId trackId,
- const uint8_t *pPicture,
- uint16_t pictureLen);
- MP4TrackId AddHintTrack(MP4TrackId refTrackId);
- MP4TrackId AddTextTrack(MP4TrackId refTrackId);
- MP4TrackId AddChapterTextTrack(MP4TrackId refTrackId, u_int32_t timescale = 0);
- void AddChapter(MP4TrackId chapterTrackId,
- MP4Duration chapterDuration,
- u_int32_t chapterNr,
- const char * chapterTitle = 0);
- void AddChapter(MP4Timestamp chapterStart,
- const char * chapterTitle = 0);
- void ConvertChapters(boolean toQT = true);
- void DeleteChapters(MP4TrackId chapterTrackId = 0, boolean deleteQT = true);
- void GetChaptersList(MP4Chapters_t ** chapterList,
- u_int32_t * chapterCount,
- boolean getQT = true);
- MP4TrackId FindChapterTrack(char * trackName = 0, int trackNameSize = 0);
- MP4TrackId FindChapterReferenceTrack(MP4TrackId chapterTrackId, char * trackName = 0, size_t trackNameSize = 0);
-
- MP4SampleId GetTrackNumberOfSamples(MP4TrackId trackId);
- MP4ChunkId GetTrackNumberOfChunks(MP4TrackId trackId);
- const char* GetTrackType(MP4TrackId trackId);
- const char *GetTrackMediaDataName(MP4TrackId trackId);
- bool GetTrackMediaDataOriginalFormat(MP4TrackId trackId,
- char *originalFormat, u_int32_t buflen);
- MP4Duration GetTrackDuration(MP4TrackId trackId);
- u_int32_t GetTrackTimeScale(MP4TrackId trackId);
- void SetTrackTimeScale(MP4TrackId trackId, u_int32_t value);
- // replacement to GetTrackAudioType and GetTrackVideoType
- u_int8_t GetTrackEsdsObjectTypeId(MP4TrackId trackId);
- u_int8_t GetTrackAudioMpeg4Type(MP4TrackId trackId);
- MP4Duration GetTrackFixedSampleDuration(MP4TrackId trackId);
- double GetTrackVideoFrameRate(MP4TrackId trackId);
-
- int GetTrackAudioChannels(MP4TrackId trackId);
- void GetTrackESConfiguration(MP4TrackId trackId,
- u_int8_t** ppConfig, u_int32_t* pConfigSize);
- void SetTrackESConfiguration(MP4TrackId trackId,
- const u_int8_t* pConfig, u_int32_t configSize);
- void GetTrackVideoMetadata(MP4TrackId trackId,
- u_int8_t** ppConfig, u_int32_t* pConfigSize);
- void GetTrackH264SeqPictHeaders(MP4TrackId trackId,
- uint8_t ***pSeqHeader,
- uint32_t **pSeqHeaderSize,
- uint8_t ***pPictHeader,
- uint32_t **pPictHeaderSize);
- const char* GetHintTrackSdp(MP4TrackId hintTrackId);
- void SetHintTrackSdp(MP4TrackId hintTrackId, const char* sdpString);
- void AppendHintTrackSdp(MP4TrackId hintTrackId, const char* sdpString);
- // 3GPP specific functions
- void MakeFtypAtom(char* majorBrand,
- u_int32_t minorVersion,
- char** supportedBrands,
- u_int32_t supportedBrandsCount);
- void Make3GPCompliant(const MP4_FILENAME_CHAR* fileName,
- char* majorBrand,
- u_int32_t minorVersion,
- char** supportedBrands,
- u_int32_t supportedBrandsCount,
- bool deleteIodsAtom);
- // ISMA specific functions
- // true if media track encrypted according to ismacryp
- bool IsIsmaCrypMediaTrack(MP4TrackId trackId);
-
- void MakeIsmaCompliant(bool addIsmaComplianceSdp = true);
- void CreateIsmaIodFromParams(
- u_int8_t videoProfile,
- u_int32_t videoBitrate,
- u_int8_t* videoConfig,
- u_int32_t videoConfigLength,
- u_int8_t audioProfile,
- u_int32_t audioBitrate,
- u_int8_t* audioConfig,
- u_int32_t audioConfigLength,
- u_int8_t** ppBytes,
- u_int64_t* pNumBytes);
- // time convenience functions
- u_int64_t ConvertFromMovieDuration(
- MP4Duration duration,
- u_int32_t timeScale);
- u_int64_t ConvertFromTrackTimestamp(
- MP4TrackId trackId,
- MP4Timestamp timeStamp,
- u_int32_t timeScale);
- MP4Timestamp ConvertToTrackTimestamp(
- MP4TrackId trackId,
- u_int64_t timeStamp,
- u_int32_t timeScale);
- u_int64_t ConvertFromTrackDuration(
- MP4TrackId trackId,
- MP4Duration duration,
- u_int32_t timeScale);
- MP4Duration ConvertToTrackDuration(
- MP4TrackId trackId,
- u_int64_t duration,
- u_int32_t timeScale);
- // specialized operations
- void GetHintTrackRtpPayload(
- MP4TrackId hintTrackId,
- char** ppPayloadName = NULL,
- u_int8_t* pPayloadNumber = NULL,
- u_int16_t* pMaxPayloadSize = NULL,
- char **ppEncodingParams = NULL);
- void SetHintTrackRtpPayload(
- MP4TrackId hintTrackId,
- const char* payloadName,
- u_int8_t* pPayloadNumber,
- u_int16_t maxPayloadSize,
- const char *encoding_params,
- bool include_rtp_map,
- bool include_mpeg4_esid);
- MP4TrackId GetHintTrackReferenceTrackId(
- MP4TrackId hintTrackId);
- void ReadRtpHint(
- MP4TrackId hintTrackId,
- MP4SampleId hintSampleId,
- u_int16_t* pNumPackets = NULL);
- u_int16_t GetRtpHintNumberOfPackets(
- MP4TrackId hintTrackId);
- int8_t GetRtpPacketBFrame(
- MP4TrackId hintTrackId,
- u_int16_t packetIndex);
- int32_t GetRtpPacketTransmitOffset(
- MP4TrackId hintTrackId,
- u_int16_t packetIndex);
- void ReadRtpPacket(
- MP4TrackId hintTrackId,
- u_int16_t packetIndex,
- u_int8_t** ppBytes,
- u_int32_t* pNumBytes,
- u_int32_t ssrc = 0,
- bool includeHeader = true,
- bool includePayload = true);
- MP4Timestamp GetRtpTimestampStart(
- MP4TrackId hintTrackId);
- void SetRtpTimestampStart(
- MP4TrackId hintTrackId,
- MP4Timestamp rtpStart);
- void AddRtpHint(
- MP4TrackId hintTrackId,
- bool isBframe,
- u_int32_t timestampOffset);
- void AddRtpPacket(
- MP4TrackId hintTrackId,
- bool setMbit,
- int32_t transmitOffset);
- void AddRtpImmediateData(
- MP4TrackId hintTrackId,
- const u_int8_t* pBytes,
- u_int32_t numBytes);
- void AddRtpSampleData(
- MP4TrackId hintTrackId,
- MP4SampleId sampleId,
- u_int32_t dataOffset,
- u_int32_t dataLength);
- void AddRtpESConfigurationPacket(
- MP4TrackId hintTrackId);
- void WriteRtpHint(
- MP4TrackId hintTrackId,
- MP4Duration duration,
- bool isSyncSample);
- u_int8_t AllocRtpPayloadNumber();
- // edit list related
- char* MakeTrackEditName(
- MP4TrackId trackId,
- MP4EditId editId,
- const char* name);
- MP4EditId AddTrackEdit(
- MP4TrackId trackId,
- MP4EditId editId = MP4_INVALID_EDIT_ID);
- void DeleteTrackEdit(
- MP4TrackId trackId,
- MP4EditId editId);
- u_int32_t GetTrackNumberOfEdits(
- MP4TrackId trackId);
- MP4Timestamp GetTrackEditStart(
- MP4TrackId trackId,
- MP4EditId editId);
- MP4Duration GetTrackEditTotalDuration(
- MP4TrackId trackId,
- MP4EditId editId);
- MP4Timestamp GetTrackEditMediaStart(
- MP4TrackId trackId,
- MP4EditId editId);
- void SetTrackEditMediaStart(
- MP4TrackId trackId,
- MP4EditId editId,
- MP4Timestamp startTime);
- MP4Duration GetTrackEditDuration(
- MP4TrackId trackId,
- MP4EditId editId);
- void SetTrackEditDuration(
- MP4TrackId trackId,
- MP4EditId editId,
- MP4Duration duration);
- bool GetTrackEditDwell(
- MP4TrackId trackId,
- MP4EditId editId);
- void SetTrackEditDwell(
- MP4TrackId trackId,
- MP4EditId editId,
- bool dwell);
- MP4SampleId GetSampleIdFromEditTime(
- MP4TrackId trackId,
- MP4Timestamp when,
- MP4Timestamp* pStartTime = NULL,
- MP4Duration* pDuration = NULL);
- /* iTunes metadata handling */
- protected:
- bool CreateMetadataAtom(const char* name);
- public:
- // these are public to remove a lot of unnecessary routines
- bool DeleteMetadataAtom(const char* name, bool try_udta = false);
- bool GetMetadataString(const char *atom, char **value, bool try_udta = false);
- bool SetMetadataString(const char *atom, const char *value);
- bool MetadataDelete(void);
- bool SetMetadataUint8(const char *atom, u_int8_t compilation);
- bool GetMetadataUint8(const char *atom, u_int8_t* compilation);
-
- /* set metadata */
- bool SetMetadataTrack(u_int16_t track, u_int16_t totalTracks);
- bool SetMetadataDisk(u_int16_t disk, u_int16_t totalDisks);
- bool SetMetadataGenre(const char *value);
- bool SetMetadataTempo(u_int16_t tempo);
- bool SetMetadataCoverArt(u_int8_t *coverArt, u_int32_t size, int flags);
- bool SetMetadataFreeForm(const char *name,
- const u_int8_t* pValue,
- u_int32_t valueSize,
- const char *owner = NULL);
-
- /* get metadata */
- bool GetMetadataByIndex(u_int32_t index,
- char** ppName, // free memory when done
- u_int8_t** ppValue, // free memory when done
- u_int32_t* pValueSize);
- bool GetMetadataTrack(u_int16_t* track, u_int16_t* totalTracks);
- bool GetMetadataDisk(u_int16_t* disk, u_int16_t* totalDisks);
- bool GetMetadataGenre(char **value);
- bool GetMetadataTempo(u_int16_t* tempo);
- bool GetMetadataCoverArt(u_int8_t **coverArt, u_int32_t* size,
- uint32_t index = 0);
- u_int32_t GetMetadataCoverArtCount(void);
- bool GetMetadataFreeForm(const char *name,
- u_int8_t** pValue,
- u_int32_t* valueSize,
- const char *owner = NULL);
- /* delete metadata */
- bool DeleteMetadataGenre();
- bool DeleteMetadataFreeForm(const char *name, const char *owner = NULL);
- /* 3GP metadata */
- bool Get3GPMetadataString(const char *atom, uint16_t **value);
- bool Set3GPMetadataString(const char *atom, const uint16_t *value);
- bool Get3GPMetadataInteger(const char *atom, uint64_t *value);
- bool Set3GPMetadataInteger(const char *atom, uint64_t value);
- bool Delete3GPMetadataAtom(const char* name);
- /* end of MP4 API */
- /* "protected" interface to be used only by friends in library */
- u_int64_t GetPosition(FILE* pFile = NULL);
- void SetPosition(u_int64_t pos, FILE* pFile = NULL);
- u_int64_t GetSize();
- void ReadBytes(
- u_int8_t* pBytes, u_int32_t numBytes, FILE* pFile = NULL);
- u_int64_t ReadUInt(u_int8_t size);
- u_int8_t ReadUInt8();
- u_int16_t ReadUInt16();
- u_int32_t ReadUInt24();
- u_int32_t ReadUInt32();
- u_int64_t ReadUInt64();
- float ReadFixed16();
- float ReadFixed32();
- float ReadFloat();
- char* ReadString();
- uint16_t *ReadUnicodeString();
- char* ReadCountedString(
- u_int8_t charSize = 1, bool allowExpandedCount = false);
- u_int64_t ReadBits(u_int8_t numBits);
- void FlushReadBits();
- u_int32_t ReadMpegLength();
- void PeekBytes(
- u_int8_t* pBytes, u_int32_t numBytes, FILE* pFile = NULL);
- void WriteBytes(u_int8_t* pBytes, u_int32_t numBytes, FILE* pFile = NULL);
- void WriteUInt(u_int64_t value, u_int8_t bytes);
- void WriteUInt8(u_int8_t value);
- void WriteUInt16(u_int16_t value);
- void WriteUInt24(u_int32_t value);
- void WriteUInt32(u_int32_t value);
- void WriteUInt64(u_int64_t value);
- void WriteFixed16(float value);
- void WriteFixed32(float value);
- void WriteFloat(float value);
- void WriteString(char* string);
- void WriteUnicodeString(const uint16_t *string);
- void WriteCountedString(char* string,
- u_int8_t charSize = 1, bool allowExpandedCount = false);
- void WriteBits(u_int64_t bits, u_int8_t numBits);
- void PadWriteBits(u_int8_t pad = 0);
- void FlushWriteBits();
- void WriteMpegLength(u_int32_t value, bool compact = false);
- void EnableMemoryBuffer(
- u_int8_t* pBytes = NULL, u_int64_t numBytes = 0);
- void DisableMemoryBuffer(
- u_int8_t** ppBytes = NULL, u_int64_t* pNumBytes = NULL);
- char GetMode() {
- return m_mode;
- }
- MP4Track* GetTrack(MP4TrackId trackId);
- void UpdateDuration(MP4Duration duration);
- MP4Atom* FindAtomMP4File(const char* name);
- MP4Atom* AddChildAtom(
- const char* parentName,
- const char* childName);
- MP4Atom* AddChildAtom(
- MP4Atom* pParentAtom,
- const char* childName);
- MP4Atom* InsertChildAtom(
- const char* parentName,
- const char* childName,
- u_int32_t index);
- MP4Atom* InsertChildAtom(
- MP4Atom* pParentAtom,
- const char* childName,
- u_int32_t index);
- MP4Atom* AddDescendantAtoms(
- const char* ancestorName,
- const char* childName);
- MP4Atom* AddDescendantAtoms(
- MP4Atom* pAncestorAtom,
- const char* childName);
- protected:
- void Open(const MP4_FILENAME_CHAR* fmode);
- void ReadFromFile();
- void GenerateTracks();
- void BeginWrite();
- void FinishWrite();
- void CacheProperties();
- void RewriteMdat(void* pReadFile, void* pWriteFile,
- Virtual_IO *readIO, Virtual_IO *writeIO);
- bool ShallHaveIods();
- const wchar_t *TempFileName();
- void Rename(const MP4_FILENAME_CHAR* existingFileName, const MP4_FILENAME_CHAR* newFileName);
- void ProtectWriteOperation(char* where);
- void FindIntegerProperty(const char* name,
- MP4Property** ppProperty, u_int32_t* pIndex = NULL);
- void FindFloatProperty(const char* name,
- MP4Property** ppProperty, u_int32_t* pIndex = NULL);
- void FindStringProperty(const char* name,
- MP4Property** ppProperty, u_int32_t* pIndex = NULL);
- void FindBytesProperty(const char* name,
- MP4Property** ppProperty, u_int32_t* pIndex = NULL);
- bool FindProperty(const char* name,
- MP4Property** ppProperty, u_int32_t* pIndex = NULL);
- MP4TrackId AddVideoTrackDefault(
- u_int32_t timeScale,
- MP4Duration sampleDuration,
- u_int16_t width,
- u_int16_t height,
- const char *videoType);
- MP4TrackId AddCntlTrackDefault(
- u_int32_t timeScale,
- MP4Duration sampleDuration,
- const char *videoType);
- void AddTrackToIod(MP4TrackId trackId);
- void RemoveTrackFromIod(MP4TrackId trackId, bool shallHaveIods = true);
- void AddTrackToOd(MP4TrackId trackId);
- void RemoveTrackFromOd(MP4TrackId trackId);
- void GetTrackReferenceProperties(const char* trefName,
- MP4Property** ppCountProperty, MP4Property** ppTrackIdProperty);
- void AddTrackReference(const char* trefName, MP4TrackId refTrackId);
- u_int32_t FindTrackReference(const char* trefName, MP4TrackId refTrackId);
- void RemoveTrackReference(const char* trefName, MP4TrackId refTrackId);
- void AddDataReference(MP4TrackId trackId, const char* url);
- char* MakeTrackName(MP4TrackId trackId, const char* name);
- u_int8_t ConvertTrackTypeToStreamType(const char* trackType);
- void CreateIsmaIodFromFile(
- MP4TrackId odTrackId,
- MP4TrackId sceneTrackId,
- MP4TrackId audioTrackId,
- MP4TrackId videoTrackId,
- u_int8_t** ppBytes,
- u_int64_t* pNumBytes);
- void CreateESD(
- MP4DescriptorProperty* pEsProperty,
- u_int32_t esid,
- u_int8_t objectType,
- u_int8_t streamType,
- u_int32_t bufferSize,
- u_int32_t bitrate,
- const u_int8_t* pConfig,
- u_int32_t configLength,
- char* url);
- void CreateIsmaODUpdateCommandFromFileForFile(
- MP4TrackId odTrackId,
- MP4TrackId audioTrackId,
- MP4TrackId videoTrackId,
- u_int8_t** ppBytes,
- u_int64_t* pNumBytes);
- void CreateIsmaODUpdateCommandFromFileForStream(
- MP4TrackId audioTrackId,
- MP4TrackId videoTrackId,
- u_int8_t** ppBytes,
- u_int64_t* pNumBytes);
- void CreateIsmaODUpdateCommandForStream(
- MP4DescriptorProperty* pAudioEsdProperty,
- MP4DescriptorProperty* pVideoEsdProperty,
- u_int8_t** ppBytes,
- u_int64_t* pNumBytes);
- void CreateIsmaSceneCommand(
- bool hasAudio,
- bool hasVideo,
- u_int8_t** ppBytes,
- u_int64_t* pNumBytes);
- protected:
- MP4_FILENAME_CHAR *m_fileName;
- void* m_pFile;
- Virtual_IO *m_virtual_IO;
- u_int64_t m_orgFileSize;
- u_int64_t m_fileSize;
- MP4Atom* m_pRootAtom;
- MP4Integer32Array m_trakIds;
- MP4TrackArray m_pTracks;
- MP4TrackId m_odTrackId;
- u_int32_t m_verbosity;
- char m_mode;
- u_int32_t m_createFlags;
- bool m_useIsma;
- // cached properties
- MP4IntegerProperty* m_pModificationProperty;
- MP4Integer32Property* m_pTimeScaleProperty;
- MP4IntegerProperty* m_pDurationProperty;
- // read/write in memory
- u_int8_t* m_memoryBuffer;
- u_int64_t m_memoryBufferPosition;
- u_int64_t m_memoryBufferSize;
- // bit read/write buffering
- u_int8_t m_numReadBits;
- u_int8_t m_bufReadBits;
- u_int8_t m_numWriteBits;
- u_int8_t m_bufWriteBits;
- #ifndef _WIN32
- char m_tempFileName[64];
- #else
- wchar_t m_tempFileName[MAX_PATH];
- #endif
- char m_trakName[1024];
- char *m_editName;
- };
- #endif /* __MP4_FILE_INCLUDED__ */
|