| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // 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. |
| // |
| // Contributors: |
| // Dave Mackie, dmackie@cisco.com |
| // Alix Marchandise-Franquet, alix@cisco.com |
| // Ximpo Group Ltd., mp4v2@ximpo.com |
| // Kona Blend, kona8lend@@gmail.com |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| #ifndef MP4V2_IMPL_MP4FILE_H |
| #define MP4V2_IMPL_MP4FILE_H |
| |
| namespace mp4v2 { namespace impl { |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| class MP4Atom; |
| class MP4Property; |
| class MP4Float32Property; |
| class MP4StringProperty; |
| class MP4BytesProperty; |
| class MP4Descriptor; |
| class MP4DescriptorProperty; |
| |
| class MP4File |
| { |
| public: |
| static void CopySample( |
| MP4File* srcFile, |
| MP4TrackId srcTrackId, |
| MP4SampleId srcSampleId, |
| MP4File* dstFile, |
| MP4TrackId dstTrackId, |
| MP4Duration dstSampleDuration ); |
| |
| static void EncAndCopySample( |
| MP4File* srcFile, |
| MP4TrackId srcTrackId, |
| MP4SampleId srcSampleId, |
| encryptFunc_t encfcnp, |
| uint32_t encfcnparam1, |
| MP4File* dstFile, |
| MP4TrackId dstTrackId, |
| MP4Duration dstSampleDuration ); |
| |
| public: |
| MP4File(); |
| ~MP4File(); |
| |
| /////////////////////////////////////////////////////////////////////////// |
| // file ops |
| /////////////////////////////////////////////////////////////////////////// |
| |
| void Create( const char* fileName, |
| uint32_t flags, |
| const MP4FileProvider* provider = NULL, |
| int add_ftyp = 1, |
| int add_iods = 1, |
| char* majorBrand = NULL, |
| uint32_t minorVersion = 0, |
| char** supportedBrands = NULL, |
| uint32_t supportedBrandsCount = 0 ); |
| |
| const std::string &GetFilename() const; |
| void Read( const char* name, const MP4FileProvider* provider ); |
| bool Modify( const char* fileName ); |
| void Optimize( const char* srcFileName, const char* dstFileName = NULL ); |
| bool CopyClose( const string& copyFileName ); |
| void Dump( bool dumpImplicits = false ); |
| void Close(uint32_t flags = 0); |
| |
| bool Use64Bits(const char *atomName); |
| void Check64BitStatus(const char *atomName); |
| /* file properties */ |
| |
| uint64_t GetIntegerProperty(const char* name); |
| float GetFloatProperty(const char* name); |
| const char* GetStringProperty(const char* name); |
| void GetBytesProperty(const char* name, |
| uint8_t** ppValue, uint32_t* pValueSize); |
| |
| void SetIntegerProperty(const char* name, uint64_t value); |
| void SetFloatProperty(const char* name, float value); |
| void SetStringProperty(const char* name, const char* value); |
| void SetBytesProperty(const char* name, |
| const uint8_t* pValue, uint32_t valueSize); |
| |
| // file level convenience functions |
| |
| MP4Duration GetDuration(); |
| void SetDuration(MP4Duration value); |
| |
| uint32_t GetTimeScale(); |
| void SetTimeScale(uint32_t value); |
| |
| uint8_t GetODProfileLevel(); |
| void SetODProfileLevel(uint8_t value); |
| |
| uint8_t GetSceneProfileLevel(); |
| void SetSceneProfileLevel(uint8_t value); |
| |
| uint8_t GetVideoProfileLevel(); |
| void SetVideoProfileLevel(uint8_t value); |
| |
| uint8_t GetAudioProfileLevel(); |
| void SetAudioProfileLevel(uint8_t value); |
| |
| uint8_t GetGraphicsProfileLevel(); |
| void SetGraphicsProfileLevel(uint8_t value); |
| |
| const char* GetSessionSdp(); |
| void SetSessionSdp(const char* sdpString); |
| void AppendSessionSdp(const char* sdpString); |
| |
| /* track operations */ |
| |
| MP4TrackId AddTrack(const char* type, uint32_t timeScale = 1000); |
| void DeleteTrack(MP4TrackId trackId); |
| |
| uint32_t GetNumberOfTracks(const char* type = NULL, uint8_t subType = 0); |
| |
| MP4TrackId AllocTrackId(); |
| MP4TrackId FindTrackId(uint16_t trackIndex, |
| const char* type = NULL, uint8_t subType = 0); |
| uint16_t FindTrackIndex(MP4TrackId trackId); |
| uint16_t FindTrakAtomIndex(MP4TrackId trackId); |
| |
| /* track properties */ |
| MP4Atom *FindTrackAtom(MP4TrackId trackId, const char *name); |
| uint64_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, |
| uint8_t** ppValue, uint32_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 uint8_t* pValue, uint32_t valueSize); |
| |
| bool GetTrackLanguage( MP4TrackId, char* ); |
| bool SetTrackLanguage( MP4TrackId, const char* ); |
| bool GetTrackName( MP4TrackId trackId, char** name ); |
| bool SetTrackName( MP4TrackId trackId, const char* name); |
| |
| /* sample operations */ |
| |
| uint32_t GetSampleSize(MP4TrackId trackId, MP4SampleId sampleId); |
| |
| uint32_t GetTrackMaxSampleSize(MP4TrackId trackId); |
| |
| MP4SampleId GetSampleIdFromTime(MP4TrackId trackId, |
| MP4Timestamp when, bool wantSyncSample = false); |
| |
| 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 |
| uint8_t** ppBytes, |
| uint32_t* pNumBytes, |
| MP4Timestamp* pStartTime = NULL, |
| MP4Duration* pDuration = NULL, |
| MP4Duration* pRenderingOffset = NULL, |
| bool* pIsSyncSample = NULL, |
| bool* hasDependencyFlags = NULL, |
| uint32_t* dependencyFlags = NULL ); |
| |
| void WriteSample( |
| MP4TrackId trackId, |
| const uint8_t* pBytes, |
| uint32_t numBytes, |
| MP4Duration duration = 0, |
| MP4Duration renderingOffset = 0, |
| bool isSyncSample = true ); |
| |
| void WriteSampleDependency( |
| MP4TrackId trackId, |
| const uint8_t* pBytes, |
| uint32_t numBytes, |
| MP4Duration duration, |
| MP4Duration renderingOffset, |
| bool isSyncSample, |
| uint32_t dependencyFlags ); |
| |
| void SetSampleRenderingOffset( |
| MP4TrackId trackId, |
| MP4SampleId sampleId, |
| MP4Duration renderingOffset ); |
| |
| MP4Duration GetTrackDurationPerChunk( MP4TrackId ); |
| void SetTrackDurationPerChunk( MP4TrackId, MP4Duration ); |
| |
| /* track level convenience functions */ |
| |
| MP4TrackId AddSystemsTrack(const char* type, uint32_t timeScale = 1000 ); |
| |
| MP4TrackId AddODTrack(); |
| |
| MP4TrackId AddSceneTrack(); |
| |
| MP4TrackId AddAudioTrack( |
| uint32_t timeScale, |
| MP4Duration sampleDuration, |
| uint8_t audioType); |
| |
| MP4TrackId AddULawAudioTrack( |
| uint32_t timeScale); |
| |
| MP4TrackId AddALawAudioTrack( |
| uint32_t timeScale); |
| |
| MP4TrackId AddAC3AudioTrack( |
| uint32_t samplingRate, |
| uint8_t fscod, |
| uint8_t bsid, |
| uint8_t bsmod, |
| uint8_t acmod, |
| uint8_t lfeon, |
| uint8_t bit_rate_code); |
| |
| MP4TrackId AddEncAudioTrack( // ismacryp |
| uint32_t timeScale, |
| MP4Duration sampleDuration, |
| uint8_t audioType, |
| uint32_t scheme_type, |
| uint16_t scheme_version, |
| uint8_t key_ind_len, |
| uint8_t iv_len, |
| bool selective_enc, |
| const char *kms_uri, |
| bool use_ismacryp); |
| |
| void SetAmrVendor( |
| MP4TrackId trackId, |
| uint32_t vendor); |
| |
| void SetAmrDecoderVersion( |
| MP4TrackId trackId, |
| uint8_t decoderVersion); |
| |
| void SetAmrModeSet( |
| MP4TrackId trackId, |
| uint16_t modeSet); |
| uint16_t GetAmrModeSet(MP4TrackId trackId); |
| |
| MP4TrackId AddAmrAudioTrack( |
| uint32_t timeScale, |
| uint16_t modeSet, |
| uint8_t modeChangePeriod, |
| uint8_t framesPerSample, |
| bool isAmrWB); |
| |
| MP4TrackId AddHrefTrack(uint32_t timeScale, |
| MP4Duration sampleDuration, |
| const char *base_url); |
| |
| MP4TrackId AddMP4VideoTrack( |
| uint32_t timeScale, |
| MP4Duration sampleDuration, |
| uint16_t width, |
| uint16_t height, |
| uint8_t videoType); |
| |
| MP4TrackId AddEncVideoTrack( // ismacryp |
| uint32_t timeScale, |
| MP4Duration sampleDuration, |
| uint16_t width, |
| uint16_t height, |
| uint8_t videoType, |
| mp4v2_ismacrypParams *icPp, |
| const char *oFormat); |
| |
| void SetH263Vendor( |
| MP4TrackId trackId, |
| uint32_t vendor); |
| |
| void SetH263DecoderVersion( |
| MP4TrackId trackId, |
| uint8_t decoderVersion); |
| |
| void SetH263Bitrates( |
| MP4TrackId, |
| uint32_t avgBitrate, |
| uint32_t maxBitrate); |
| |
| MP4TrackId AddH263VideoTrack( |
| uint32_t timeScale, |
| MP4Duration sampleDuration, |
| uint16_t width, |
| uint16_t height, |
| uint8_t h263Level, |
| uint8_t h263Profile, |
| uint32_t avgBitrate, |
| uint32_t maxBitrate); |
| |
| MP4TrackId AddH264VideoTrack( |
| uint32_t timeScale, |
| MP4Duration sampleDuration, |
| uint16_t width, |
| uint16_t height, |
| uint8_t AVCProfileIndication, |
| uint8_t profile_compat, |
| uint8_t AVCLevelIndication, |
| uint8_t sampleLenFieldSizeMinusOne); |
| |
| MP4TrackId AddEncH264VideoTrack( |
| uint32_t timeScale, |
| MP4Duration sampleDuration, |
| uint16_t width, |
| uint16_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); |
| |
| /** Add a QuickTime chapter track. |
| * |
| * This function adds a chapter (text) track. |
| * The optional parameter <b>timescale</b> may be supplied to give the new |
| * chapter a specific timescale. Otherwise the chapter track will have |
| * the same timescale as the reference track defined in parameter refTrackId. |
| * |
| * @param refTrackId ID of the track that will reference the chapter track. |
| * @param timescale the timescale of the chapter track or 0 to use the |
| * timescale of track specified by <b>refTrackId</b>. |
| * |
| * @return ID of the created chapter track. |
| */ |
| MP4TrackId AddChapterTextTrack( |
| MP4TrackId refTrackId, |
| uint32_t timescale = 0 ); |
| |
| MP4TrackId AddSubtitleTrack(uint32_t timescale, |
| uint16_t width, |
| uint16_t height); |
| |
| MP4TrackId AddSubpicTrack(uint32_t timescale, |
| uint16_t width, |
| uint16_t height); |
| |
| MP4TrackId AddPixelAspectRatio(MP4TrackId trackId, uint32_t hSpacing, uint32_t vSpacing); |
| MP4TrackId AddColr(MP4TrackId trackId, uint16_t pri, uint16_t tran, uint16_t mat); |
| |
| /** Add a QuickTime chapter. |
| * |
| * @param chapterTrackId ID of chapter track or #MP4_INVALID_TRACK_ID |
| * if unknown. |
| * @param chapterDuration duration (in the timescale of the chapter track). |
| * @param chapterTitle title text for the chapter or NULL to use default |
| * title format ("Chapter %03d", n) where n is the chapter number. |
| */ |
| void AddChapter( |
| MP4TrackId chapterTrackId, |
| MP4Duration chapterDuration, |
| const char* chapterTitle = 0 ); |
| |
| /** Add a Nero chapter. |
| * |
| * @param chapterStart the start time of the chapter in 100 nanosecond units |
| * @param chapterTitle title text for the chapter or NULL to use default |
| * title format ("Chapter %03d", n) where n is the chapter number. |
| */ |
| void AddNeroChapter( |
| MP4Timestamp chapterStart, |
| const char* chapterTitle = 0 ); |
| |
| /*! Returns the ID of the track referencing the chapter track chapterTrackId. |
| * This function searches for a track of type MP4_AUDIO_TRACK_TYPE that references |
| * the track chapterTrackId through the atom "tref.chap". |
| * |
| * @param chapterTrackId the ID of the chapter track |
| * @param trackName receives the name of the referencing track if not null |
| * @param trackNameSize the size of the memory pointed to by trackName |
| * @return the ID if the track referencing the chapter track or MP4_INVALID_TRACK_ID |
| */ |
| MP4TrackId FindChapterReferenceTrack(MP4TrackId chapterTrackId, |
| char *trackName = 0, |
| int trackNameSize = 0); |
| |
| /*! Find the QuickTime chapter track in the current file. |
| * This function searches for a track of type text. |
| * |
| * @param trackName receives the name of the chapter track if not null |
| * @param trackNameSize the size of the memory pointed to by trackName |
| * @return the ID of the chapter track or MP4_INVALID_TRACK_ID |
| */ |
| MP4TrackId FindChapterTrack(char *trackName = 0, int trackNameSize = 0); |
| |
| /** Delete chapters. |
| * |
| * @param chapterType the type of chapters to delete: |
| * @li #MP4ChapterTypeAny (delete all known chapter types) |
| * @li #MP4ChapterTypeQt |
| * @li #MP4ChapterTypeNero |
| * @param chapterTrackId ID of the chapter track if known, |
| * or #MP4_INVALID_TRACK_ID. |
| * Only applies when <b>chapterType</b>=#MP4ChapterTypeQt. |
| * |
| * @return the type of deleted chapters |
| */ |
| MP4ChapterType DeleteChapters( |
| MP4ChapterType chapterType = MP4ChapterTypeQt, |
| MP4TrackId chapterTrackId = 0 ); |
| |
| /** Get list of chapters. |
| * |
| * @param chapterList address receiving array of chapter items. |
| * If a non-NULL is received the caller is responsible for freeing the |
| * memory with MP4Free(). |
| * @param chapterCount address receiving count of items in array. |
| * @param chapterType the type of chapters to read: |
| * @li #MP4ChapterTypeAny (any chapters, searched in order of Qt, Nero) |
| * @li #MP4ChapterTypeQt |
| * @li #MP4ChapterTypeNero |
| * |
| * @result the first type of chapters found. |
| */ |
| |
| MP4ChapterType GetChapters( |
| MP4Chapter_t** chapterList, |
| uint32_t* chapterCount, |
| MP4ChapterType fromChapterType = MP4ChapterTypeQt ); |
| |
| /** Set list of chapters. |
| * |
| * This functions sets the complete chapter list. |
| * If any chapters of the same type already exist they will first |
| * be deleted. |
| * |
| * @param chapterList array of chapters items. |
| * @param chapterCount count of items in array. |
| * @param chapterType type of chapters to write: |
| * @li #MP4ChapterTypeAny (chapters of all types are written) |
| * @li #MP4ChapterTypeQt |
| * @li #MP4ChapterTypeNero |
| * |
| * @return the type of chapters written. |
| */ |
| MP4ChapterType SetChapters( |
| MP4Chapter_t* chapterList, |
| uint32_t chapterCount, |
| MP4ChapterType toChapterType = MP4ChapterTypeQt ); |
| |
| /** Convert chapters to another type. |
| * |
| * This function converts existing chapters |
| * from one type to another type. |
| * Conversion from Nero to QuickTime or QuickTime to Nero is supported. |
| * |
| * @param toChapterType the chapter type to convert to: |
| * @li #MP4ChapterTypeQt (convert from Nero to Qt) |
| * @li #MP4ChapterTypeNero (convert from Qt to Nero) |
| * |
| * @return the chapter type before conversion or #MP4ChapterTypeNone |
| * if the source chapters do not exist |
| * or invalid <b>toChapterType</b> was specified. |
| */ |
| MP4ChapterType ConvertChapters(MP4ChapterType toChapterType = MP4ChapterTypeQt); |
| |
| /** Change the general timescale. |
| * |
| * This function changes the general timescale to the new timescale |
| * <b>value</b> by recalculating all values that depend on the timescale |
| * in "moov.mvhd". |
| * |
| * If the timescale is already equal to value nothing is done. |
| * |
| * @param value the new timescale. |
| */ |
| void ChangeMovieTimeScale(uint32_t timescale); |
| |
| MP4SampleId GetTrackNumberOfSamples(MP4TrackId trackId); |
| |
| const char* GetTrackType(MP4TrackId trackId); |
| |
| const char *GetTrackMediaDataName(MP4TrackId trackId); |
| bool GetTrackMediaDataOriginalFormat(MP4TrackId trackId, |
| char *originalFormat, uint32_t buflen); |
| MP4Duration GetTrackDuration(MP4TrackId trackId); |
| |
| uint32_t GetTrackTimeScale(MP4TrackId trackId); |
| void SetTrackTimeScale(MP4TrackId trackId, uint32_t value); |
| |
| // replacement to GetTrackAudioType and GetTrackVideoType |
| uint8_t GetTrackEsdsObjectTypeId(MP4TrackId trackId); |
| |
| uint8_t GetTrackAudioMpeg4Type(MP4TrackId trackId); |
| |
| MP4Duration GetTrackFixedSampleDuration(MP4TrackId trackId); |
| |
| double GetTrackVideoFrameRate(MP4TrackId trackId); |
| |
| int GetTrackAudioChannels(MP4TrackId trackId); |
| void GetTrackESConfiguration(MP4TrackId trackId, |
| uint8_t** ppConfig, uint32_t* pConfigSize); |
| void SetTrackESConfiguration(MP4TrackId trackId, |
| const uint8_t* pConfig, uint32_t configSize); |
| |
| void GetTrackVideoMetadata(MP4TrackId trackId, |
| uint8_t** ppConfig, uint32_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); |
| |
| void MakeFtypAtom( |
| char* majorBrand, |
| uint32_t minorVersion, |
| char** compatibleBrands, |
| uint32_t compatibleBrandsCount ); |
| |
| // 3GPP specific functions |
| void Make3GPCompliant(const char* fileName, |
| char* majorBrand, |
| uint32_t minorVersion, |
| char** supportedBrands, |
| uint32_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( |
| uint8_t videoProfile, |
| uint32_t videoBitrate, |
| uint8_t* videoConfig, |
| uint32_t videoConfigLength, |
| uint8_t audioProfile, |
| uint32_t audioBitrate, |
| uint8_t* audioConfig, |
| uint32_t audioConfigLength, |
| uint8_t** ppBytes, |
| uint64_t* pNumBytes); |
| |
| // time convenience functions |
| |
| uint64_t ConvertFromMovieDuration( |
| MP4Duration duration, |
| uint32_t timeScale); |
| |
| uint64_t ConvertFromTrackTimestamp( |
| MP4TrackId trackId, |
| MP4Timestamp timeStamp, |
| uint32_t timeScale); |
| |
| MP4Timestamp ConvertToTrackTimestamp( |
| MP4TrackId trackId, |
| uint64_t timeStamp, |
| uint32_t timeScale); |
| |
| uint64_t ConvertFromTrackDuration( |
| MP4TrackId trackId, |
| MP4Duration duration, |
| uint32_t timeScale); |
| |
| MP4Duration ConvertToTrackDuration( |
| MP4TrackId trackId, |
| uint64_t duration, |
| uint32_t timeScale); |
| |
| // specialized operations |
| |
| void GetHintTrackRtpPayload( |
| MP4TrackId hintTrackId, |
| char** ppPayloadName = NULL, |
| uint8_t* pPayloadNumber = NULL, |
| uint16_t* pMaxPayloadSize = NULL, |
| char **ppEncodingParams = NULL); |
| |
| void SetHintTrackRtpPayload( |
| MP4TrackId hintTrackId, |
| const char* payloadName, |
| uint8_t* pPayloadNumber, |
| uint16_t maxPayloadSize, |
| const char *encoding_params, |
| bool include_rtp_map, |
| bool include_mpeg4_esid); |
| |
| MP4TrackId GetHintTrackReferenceTrackId( |
| MP4TrackId hintTrackId); |
| |
| void ReadRtpHint( |
| MP4TrackId hintTrackId, |
| MP4SampleId hintSampleId, |
| uint16_t* pNumPackets = NULL); |
| |
| uint16_t GetRtpHintNumberOfPackets( |
| MP4TrackId hintTrackId); |
| |
| int8_t GetRtpPacketBFrame( |
| MP4TrackId hintTrackId, |
| uint16_t packetIndex); |
| |
| int32_t GetRtpPacketTransmitOffset( |
| MP4TrackId hintTrackId, |
| uint16_t packetIndex); |
| |
| void ReadRtpPacket( |
| MP4TrackId hintTrackId, |
| uint16_t packetIndex, |
| uint8_t** ppBytes, |
| uint32_t* pNumBytes, |
| uint32_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, |
| uint32_t timestampOffset); |
| |
| void AddRtpPacket( |
| MP4TrackId hintTrackId, |
| bool setMbit, |
| int32_t transmitOffset); |
| |
| void AddRtpImmediateData( |
| MP4TrackId hintTrackId, |
| const uint8_t* pBytes, |
| uint32_t numBytes); |
| |
| void AddRtpSampleData( |
| MP4TrackId hintTrackId, |
| MP4SampleId sampleId, |
| uint32_t dataOffset, |
| uint32_t dataLength); |
| |
| void AddRtpESConfigurationPacket( |
| MP4TrackId hintTrackId); |
| |
| void WriteRtpHint( |
| MP4TrackId hintTrackId, |
| MP4Duration duration, |
| bool isSyncSample); |
| |
| uint8_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); |
| |
| uint32_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); |
| |
| /* "protected" interface to be used only by friends in library */ |
| |
| uint64_t GetPosition( File* file = NULL ); |
| void SetPosition( uint64_t pos, File* file = NULL ); |
| uint64_t GetSize( File* file = NULL ); |
| |
| void ReadBytes( uint8_t* buf, uint32_t bufsiz, File* file = NULL ); |
| void PeekBytes( uint8_t* buf, uint32_t bufsiz, File* file = NULL ); |
| |
| uint64_t ReadUInt(uint8_t size); |
| uint8_t ReadUInt8(); |
| uint16_t ReadUInt16(); |
| uint32_t ReadUInt24(); |
| uint32_t ReadUInt32(); |
| uint64_t ReadUInt64(); |
| float ReadFixed16(); |
| float ReadFixed32(); |
| float ReadFloat(); |
| char* ReadString(); |
| char* ReadCountedString( |
| uint8_t charSize = 1, bool allowExpandedCount = false, uint8_t fixedLength = 0); |
| uint64_t ReadBits(uint8_t numBits); |
| void FlushReadBits(); |
| uint32_t ReadMpegLength(); |
| |
| |
| void WriteBytes( uint8_t* buf, uint32_t bufsiz, File* file = NULL ); |
| void WriteUInt8(uint8_t value); |
| void WriteUInt16(uint16_t value); |
| void WriteUInt24(uint32_t value); |
| void WriteUInt32(uint32_t value); |
| void WriteUInt64(uint64_t value); |
| void WriteFixed16(float value); |
| void WriteFixed32(float value); |
| void WriteFloat(float value); |
| void WriteString(char* string); |
| void WriteCountedString(char* string, |
| uint8_t charSize = 1, |
| bool allowExpandedCount = false, |
| uint32_t fixedLength = 0); |
| void WriteBits(uint64_t bits, uint8_t numBits); |
| void PadWriteBits(uint8_t pad = 0); |
| void FlushWriteBits(); |
| void WriteMpegLength(uint32_t value, bool compact = false); |
| |
| void EnableMemoryBuffer( |
| uint8_t* pBytes = NULL, uint64_t numBytes = 0); |
| void DisableMemoryBuffer( |
| uint8_t** ppBytes = NULL, uint64_t* pNumBytes = NULL); |
| |
| bool IsWriteMode(); |
| |
| MP4Track* GetTrack(MP4TrackId trackId); |
| |
| void UpdateDuration(MP4Duration duration); |
| |
| MP4Atom* FindAtom(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, |
| uint32_t index); |
| |
| MP4Atom* InsertChildAtom( |
| MP4Atom* pParentAtom, |
| const char* childName, |
| uint32_t index); |
| |
| MP4Atom* AddDescendantAtoms( |
| const char* ancestorName, |
| const char* childName); |
| |
| MP4Atom* AddDescendantAtoms( |
| MP4Atom* pAncestorAtom, |
| const char* childName); |
| |
| protected: |
| void Init(); |
| void Open( const char* name, File::Mode mode, const MP4FileProvider* provider ); |
| void ReadFromFile(); |
| void GenerateTracks(); |
| void BeginWrite(); |
| void FinishWrite(uint32_t options); |
| void CacheProperties(); |
| void RewriteMdat( File& src, File& dst ); |
| bool ShallHaveIods(); |
| |
| void Rename(const char* existingFileName, const char* newFileName); |
| |
| void ProtectWriteOperation(const char* file, int line, const char *func); |
| |
| void FindIntegerProperty(const char* name, |
| MP4Property** ppProperty, uint32_t* pIndex = NULL); |
| void FindFloatProperty(const char* name, |
| MP4Property** ppProperty, uint32_t* pIndex = NULL); |
| void FindStringProperty(const char* name, |
| MP4Property** ppProperty, uint32_t* pIndex = NULL); |
| void FindBytesProperty(const char* name, |
| MP4Property** ppProperty, uint32_t* pIndex = NULL); |
| |
| bool FindProperty(const char* name, |
| MP4Property** ppProperty, uint32_t* pIndex = NULL); |
| |
| MP4TrackId AddVideoTrackDefault( |
| uint32_t timeScale, |
| MP4Duration sampleDuration, |
| uint16_t width, |
| uint16_t height, |
| const char *videoType); |
| MP4TrackId AddCntlTrackDefault( |
| uint32_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); |
| |
| uint32_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); |
| |
| uint8_t ConvertTrackTypeToStreamType(const char* trackType); |
| |
| void CreateIsmaIodFromFile( |
| MP4TrackId odTrackId, |
| MP4TrackId sceneTrackId, |
| MP4TrackId audioTrackId, |
| MP4TrackId videoTrackId, |
| uint8_t** ppBytes, |
| uint64_t* pNumBytes); |
| |
| void CreateESD( |
| MP4DescriptorProperty* pEsProperty, |
| uint32_t esid, |
| uint8_t objectType, |
| uint8_t streamType, |
| uint32_t bufferSize, |
| uint32_t bitrate, |
| const uint8_t* pConfig, |
| uint32_t configLength, |
| char* url); |
| |
| void CreateIsmaODUpdateCommandFromFileForFile( |
| MP4TrackId odTrackId, |
| MP4TrackId audioTrackId, |
| MP4TrackId videoTrackId, |
| uint8_t** ppBytes, |
| uint64_t* pNumBytes); |
| |
| void CreateIsmaODUpdateCommandFromFileForStream( |
| MP4TrackId audioTrackId, |
| MP4TrackId videoTrackId, |
| uint8_t** ppBytes, |
| uint64_t* pNumBytes); |
| |
| void CreateIsmaODUpdateCommandForStream( |
| MP4DescriptorProperty* pAudioEsdProperty, |
| MP4DescriptorProperty* pVideoEsdProperty, |
| uint8_t** ppBytes, |
| uint64_t* pNumBytes); |
| |
| void CreateIsmaSceneCommand( |
| bool hasAudio, |
| bool hasVideo, |
| uint8_t** ppBytes, |
| uint64_t* pNumBytes); |
| |
| protected: |
| File* m_file; |
| uint64_t m_fileOriginalSize; |
| uint32_t m_createFlags; |
| |
| MP4Atom* m_pRootAtom; |
| MP4Integer32Array m_trakIds; |
| MP4TrackArray m_pTracks; |
| MP4TrackId m_odTrackId; |
| bool m_useIsma; |
| |
| // cached properties |
| MP4IntegerProperty* m_pModificationProperty; |
| MP4Integer32Property* m_pTimeScaleProperty; |
| MP4IntegerProperty* m_pDurationProperty; |
| |
| // read/write in memory |
| uint8_t* m_memoryBuffer; |
| uint64_t m_memoryBufferPosition; |
| uint64_t m_memoryBufferSize; |
| |
| // bit read/write buffering |
| uint8_t m_numReadBits; |
| uint8_t m_bufReadBits; |
| uint8_t m_numWriteBits; |
| uint8_t m_bufWriteBits; |
| |
| char m_trakName[1024]; |
| char *m_editName; |
| |
| private: |
| MP4File ( const MP4File &src ); |
| MP4File &operator= ( const MP4File &src ); |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| }} // namespace mp4v2::impl |
| |
| #endif // MP4V2_IMPL_MP4FILE_H |