mp4库
This commit is contained in:
parent
e95d98f983
commit
df4e3317f4
198
third_party/include/mp4v2/chapter.h
vendored
Normal file
198
third_party/include/mp4v2/chapter.h
vendored
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dave Mackie, dmackie@cisco.com
|
||||||
|
* Alix Marchandise-Franquet, alix@cisco.com
|
||||||
|
* Bill May, wmay@cisco.com
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_CHAPTER_H
|
||||||
|
#define MP4V2_CHAPTER_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_chapter MP4v2 Chapter
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/** The maximum length of a QuickTime chapter title (in 8-bit chars)
|
||||||
|
*/
|
||||||
|
#define MP4V2_CHAPTER_TITLE_MAX 1023
|
||||||
|
|
||||||
|
/** Chapter item.
|
||||||
|
* This item defines various attributes for a chapter.
|
||||||
|
* @ingroup mp4_chapter
|
||||||
|
*/
|
||||||
|
typedef struct MP4Chapter_s {
|
||||||
|
MP4Duration duration; /**< duration of chapter in milliseconds */
|
||||||
|
char title[MP4V2_CHAPTER_TITLE_MAX+1]; /**< title of chapter */
|
||||||
|
} MP4Chapter_t;
|
||||||
|
|
||||||
|
/** Known chapter types.
|
||||||
|
* @ingroup mp4_chapter
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
MP4ChapterTypeNone = 0, /**< no chapters found return value */
|
||||||
|
MP4ChapterTypeAny = 1, /**< any or all known chapter types */
|
||||||
|
MP4ChapterTypeQt = 2, /**< QuickTime chapter type */
|
||||||
|
MP4ChapterTypeNero = 4 /**< Nero chapter type */
|
||||||
|
} MP4ChapterType;
|
||||||
|
|
||||||
|
/** Add a QuickTime chapter.
|
||||||
|
*
|
||||||
|
* This function adds a QuickTime chapter to file <b>hFile</b>.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file to add 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.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4AddChapter(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId chapterTrackId,
|
||||||
|
MP4Duration chapterDuration,
|
||||||
|
const char* chapterTitle DEFAULT(0));
|
||||||
|
|
||||||
|
/** Add a QuickTime chapter track.
|
||||||
|
*
|
||||||
|
* This function adds a chapter (text) track to file <b>hFile</b>.
|
||||||
|
* 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 hFile handle of file to add chapter track.
|
||||||
|
* @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.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddChapterTextTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId refTrackId,
|
||||||
|
uint32_t timescale DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Add a Nero chapter.
|
||||||
|
*
|
||||||
|
* This function adds a Nero chapter to file <b>hFile</b>.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file to add 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.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4AddNeroChapter(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4Timestamp chapterStart,
|
||||||
|
const char* chapterTitle DEFAULT(0));
|
||||||
|
|
||||||
|
/** Convert chapters to another type.
|
||||||
|
*
|
||||||
|
* This function converts existing chapters in file <b>hFile</b>
|
||||||
|
* from one type to another type.
|
||||||
|
* Conversion from Nero to QuickTime or QuickTime to Nero is supported.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file to convert.
|
||||||
|
* @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.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4ChapterType MP4ConvertChapters(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4ChapterType toChapterType DEFAULT(MP4ChapterTypeQt));
|
||||||
|
|
||||||
|
/** Delete chapters.
|
||||||
|
*
|
||||||
|
* This function deletes existing chapters in file <b>hFile</b>.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file to 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
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4ChapterType MP4DeleteChapters(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4ChapterType chapterType DEFAULT(MP4ChapterTypeQt),
|
||||||
|
MP4TrackId chapterTrackId DEFAULT(MP4_INVALID_TRACK_ID) );
|
||||||
|
|
||||||
|
/** Get list of chapters.
|
||||||
|
*
|
||||||
|
* This function gets a chpter list from file <b>hFile</b>.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file to read.
|
||||||
|
* @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.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4ChapterType MP4GetChapters(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4Chapter_t** chapterList,
|
||||||
|
uint32_t* chapterCount,
|
||||||
|
MP4ChapterType chapterType DEFAULT(MP4ChapterTypeQt));
|
||||||
|
|
||||||
|
/** Set list of chapters OKOK.
|
||||||
|
*
|
||||||
|
* This functions sets the complete chapter list in file <b>hFile</b>.
|
||||||
|
* If any chapters of the same type already exist they will first
|
||||||
|
* be deleted.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file to modify.
|
||||||
|
* @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.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4ChapterType MP4SetChapters(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4Chapter_t* chapterList,
|
||||||
|
uint32_t chapterCount,
|
||||||
|
MP4ChapterType chapterType DEFAULT(MP4ChapterTypeQt));
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_CHAPTER_H */
|
||||||
548
third_party/include/mp4v2/file.h
vendored
Normal file
548
third_party/include/mp4v2/file.h
vendored
Normal file
@ -0,0 +1,548 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dave Mackie, dmackie@cisco.com
|
||||||
|
* Alix Marchandise-Franquet, alix@cisco.com
|
||||||
|
* Bill May, wmay@cisco.com
|
||||||
|
* Kona Blend, kona8lend@gmail.com
|
||||||
|
* Robert Kausch, robert.kausch@freac.org
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_FILE_H
|
||||||
|
#define MP4V2_FILE_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_file MP4v2 File I/O
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/** Bit: enable 64-bit data-atoms. */
|
||||||
|
#define MP4_CREATE_64BIT_DATA 0x01
|
||||||
|
/** Bit: enable 64-bit time-atoms. @note Incompatible with QuickTime. */
|
||||||
|
#define MP4_CREATE_64BIT_TIME 0x02
|
||||||
|
/** Bit: do not recompute avg/max bitrates on file close. @note See http://code.google.com/p/mp4v2/issues/detail?id=66 */
|
||||||
|
#define MP4_CLOSE_DO_NOT_COMPUTE_BITRATE 0x01
|
||||||
|
|
||||||
|
/** Enumeration of file modes for custom file provider. */
|
||||||
|
typedef enum MP4FileMode_e
|
||||||
|
{
|
||||||
|
FILEMODE_UNDEFINED, /**< undefined */
|
||||||
|
FILEMODE_READ, /**< file may be read */
|
||||||
|
FILEMODE_MODIFY, /**< file may be read/written */
|
||||||
|
FILEMODE_CREATE /**< file will be created/truncated for read/write */
|
||||||
|
} MP4FileMode;
|
||||||
|
|
||||||
|
/** Structure of functions implementing custom file provider.
|
||||||
|
*
|
||||||
|
* @deprecated The file provider API is deprecated since MP4v2 2.1.0. Please
|
||||||
|
* use MP4IOCallbacks instead.
|
||||||
|
*
|
||||||
|
* Except for <b>open</b>, all the functions must return 0 upon success
|
||||||
|
* or a non-zero value to indicate failure. The open function must return
|
||||||
|
* a pointer or handle which represents the open file, otherwise NULL.
|
||||||
|
*
|
||||||
|
* The reserved argument is currently always 0 and should be ignored.
|
||||||
|
*
|
||||||
|
* @see MP4IOCallbacks
|
||||||
|
*/
|
||||||
|
typedef struct MP4FileProvider_s
|
||||||
|
{
|
||||||
|
void* ( *open )( const char* name, MP4FileMode mode );
|
||||||
|
int ( *seek )( void* handle, int64_t pos );
|
||||||
|
int ( *read )( void* handle, void* buffer, int64_t size, int64_t* nin, int64_t reserved );
|
||||||
|
int ( *write )( void* handle, const void* buffer, int64_t size, int64_t* nout, int64_t reserved );
|
||||||
|
int ( *close )( void* handle );
|
||||||
|
} MP4FileProvider;
|
||||||
|
|
||||||
|
/** Structure of functions implementing custom I/O callbacks.
|
||||||
|
*
|
||||||
|
* Except for <b>size</b>, all the functions must return 0 upon success
|
||||||
|
* or a non-zero value to indicate failure. The size function must return
|
||||||
|
* the size of the file/buffer or -1 in case of failure.
|
||||||
|
*
|
||||||
|
* @see MP4CreateCallbacks()
|
||||||
|
* @see MP4ModifyCallbacks()
|
||||||
|
* @see MP4ReadCallbacks()
|
||||||
|
*/
|
||||||
|
typedef struct MP4IOCallbacks_s
|
||||||
|
{
|
||||||
|
int64_t ( *size )( void* handle );
|
||||||
|
int ( *seek )( void* handle, int64_t pos );
|
||||||
|
int ( *read )( void* handle, void* buffer, int64_t size, int64_t* nin );
|
||||||
|
int ( *write )( void* handle, const void* buffer, int64_t size, int64_t* nout );
|
||||||
|
int ( *truncate )( void* handle, int64_t size );
|
||||||
|
} MP4IOCallbacks;
|
||||||
|
|
||||||
|
/** Close an mp4 file.
|
||||||
|
* MP4Close closes a previously opened mp4 file. If the file was opened
|
||||||
|
* writable with MP4Create() or MP4Modify(), then MP4Close() will write
|
||||||
|
* out all pending information to disk.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file to close.
|
||||||
|
* @param flags bitmask that allows the user to set extra options for the
|
||||||
|
* close commands. Valid options include:
|
||||||
|
* @li #MP4_CLOSE_DO_NOT_COMPUTE_BITRATE
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4Close(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t flags DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Create a new mp4 file.
|
||||||
|
*
|
||||||
|
* MP4Create is the first call that should be used when you want to create a
|
||||||
|
* new, empty mp4 file. It is equivalent to opening a file for writing, but is
|
||||||
|
* also involved with the creation of necessary mp4 framework structures. I.e.
|
||||||
|
* invoking MP4Create() followed by MP4Close() will result in a file with a
|
||||||
|
* non-zero size.
|
||||||
|
*
|
||||||
|
* @param fileName pathname of the file to be created.
|
||||||
|
* On Windows, this should be a UTF-8 encoded string.
|
||||||
|
* On other platforms, it should be an 8-bit encoding that is
|
||||||
|
* appropriate for the platform, locale, file system, etc.
|
||||||
|
* (prefer to use UTF-8 when possible).
|
||||||
|
* @param flags bitmask that allows the user to set 64-bit values for
|
||||||
|
* data or time atoms. Valid bits may be any combination of:
|
||||||
|
* @li #MP4_CREATE_64BIT_DATA
|
||||||
|
* @li #MP4_CREATE_64BIT_TIME
|
||||||
|
*
|
||||||
|
* @return On success a handle of the newly created file for use in subsequent
|
||||||
|
* calls to the library. On error, #MP4_INVALID_FILE_HANDLE.
|
||||||
|
*
|
||||||
|
* @see MP4CreateEx()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4FileHandle MP4Create(
|
||||||
|
const char* fileName,
|
||||||
|
uint32_t flags DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Create a new mp4 file with extended options.
|
||||||
|
*
|
||||||
|
* MP4CreateEx is an extended version of MP4Create().
|
||||||
|
*
|
||||||
|
* @param fileName pathname of the file to be created.
|
||||||
|
* On Windows, this should be a UTF-8 encoded string.
|
||||||
|
* On other platforms, it should be an 8-bit encoding that is
|
||||||
|
* appropriate for the platform, locale, file system, etc.
|
||||||
|
* (prefer to use UTF-8 when possible).
|
||||||
|
* @param flags bitmask that allows the user to set 64-bit values for
|
||||||
|
* data or time atoms. Valid bits may be any combination of:
|
||||||
|
* @li #MP4_CREATE_64BIT_DATA
|
||||||
|
* @li #MP4_CREATE_64BIT_TIME
|
||||||
|
* @param add_ftyp if true an <b>ftyp</b> atom is automatically created.
|
||||||
|
* @param add_iods if true an <b>iods</b> atom is automatically created.
|
||||||
|
* @param majorBrand <b>ftyp</b> brand identifier.
|
||||||
|
* @param minorVersion <b>ftyp</b> informative integer for the minor version
|
||||||
|
* of the major brand.
|
||||||
|
* @param compatibleBrands <b>ftyp</b> list of compatible brands.
|
||||||
|
* @param compatibleBrandsCount is the count of items specified in
|
||||||
|
* compatibleBrands.
|
||||||
|
*
|
||||||
|
* @return On success a handle of the newly created file for use in subsequent
|
||||||
|
* calls to the library. On error, #MP4_INVALID_FILE_HANDLE.
|
||||||
|
*
|
||||||
|
* @see MP4Create()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4FileHandle MP4CreateEx(
|
||||||
|
const char* fileName,
|
||||||
|
uint32_t flags DEFAULT(0),
|
||||||
|
int add_ftyp DEFAULT(1),
|
||||||
|
int add_iods DEFAULT(1),
|
||||||
|
char* majorBrand DEFAULT(0),
|
||||||
|
uint32_t minorVersion DEFAULT(0),
|
||||||
|
char** compatibleBrands DEFAULT(0),
|
||||||
|
uint32_t compatibleBrandsCount DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Create a new mp4 file using an I/O callbacks structure.
|
||||||
|
*
|
||||||
|
* MP4CreateCallbacks is the first call that should be used when you want to
|
||||||
|
* create a new, empty mp4 file using custom I/O functions provided in an
|
||||||
|
* MP4IOCallbacks structure.
|
||||||
|
*
|
||||||
|
* Using MP4CreateCallbacks is equivalent to opening a file for writing, but
|
||||||
|
* is also involved with the creation of necessary mp4 framework structures.
|
||||||
|
* I.e. invoking MP4CreateCallbacks() followed by MP4Close() will result in a
|
||||||
|
* file with a non-zero size.
|
||||||
|
*
|
||||||
|
* @param callbacks custom implementation of I/O operations.
|
||||||
|
* The size, seek and write callbacks must be implemented.
|
||||||
|
* The callbacks structure is immediately copied internally.
|
||||||
|
* @param handle a custom handle that will be passed as the first argument to
|
||||||
|
* any callback function call. This can be used to pass a handle to an
|
||||||
|
* application specific I/O object or an application defined struct
|
||||||
|
* containing a pointer to a buffer.
|
||||||
|
* @param flags bitmask that allows the user to set 64-bit values for
|
||||||
|
* data or time atoms. Valid bits may be any combination of:
|
||||||
|
* @li #MP4_CREATE_64BIT_DATA
|
||||||
|
* @li #MP4_CREATE_64BIT_TIME
|
||||||
|
*
|
||||||
|
* @return On success a handle of the newly created file for use in subsequent
|
||||||
|
* calls to the library. On error, #MP4_INVALID_FILE_HANDLE.
|
||||||
|
*
|
||||||
|
* @see MP4CreateCallbacksEx()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4FileHandle MP4CreateCallbacks(
|
||||||
|
const MP4IOCallbacks* callbacks,
|
||||||
|
void* handle DEFAULT(NULL),
|
||||||
|
uint32_t flags DEFAULT(0));
|
||||||
|
|
||||||
|
/** Create a new mp4 file with extended options using an I/O callbacks
|
||||||
|
* structure.
|
||||||
|
*
|
||||||
|
* MP4CreateCallbacksEx is an extended version of MP4CreateCallbacks().
|
||||||
|
*
|
||||||
|
* @param callbacks custom implementation of I/O operations.
|
||||||
|
* The size, seek and write callbacks must be implemented.
|
||||||
|
* The callbacks structure is immediately copied internally.
|
||||||
|
* @param handle a custom handle that will be passed as the first argument to
|
||||||
|
* any callback function call. This can be used to pass a handle to an
|
||||||
|
* application specific I/O object or an application defined struct
|
||||||
|
* containing a pointer to a buffer.
|
||||||
|
* @param flags bitmask that allows the user to set 64-bit values for
|
||||||
|
* data or time atoms. Valid bits may be any combination of:
|
||||||
|
* @li #MP4_CREATE_64BIT_DATA
|
||||||
|
* @li #MP4_CREATE_64BIT_TIME
|
||||||
|
* @param add_ftyp if true an <b>ftyp</b> atom is automatically created.
|
||||||
|
* @param add_iods if true an <b>iods</b> atom is automatically created.
|
||||||
|
* @param majorBrand <b>ftyp</b> brand identifier.
|
||||||
|
* @param minorVersion <b>ftyp</b> informative integer for the minor version
|
||||||
|
* of the major brand.
|
||||||
|
* @param compatibleBrands <b>ftyp</b> list of compatible brands.
|
||||||
|
* @param compatibleBrandsCount is the count of items specified in
|
||||||
|
* compatibleBrands.
|
||||||
|
*
|
||||||
|
* @return On success a handle of the newly created file for use in subsequent
|
||||||
|
* calls to the library. On error, #MP4_INVALID_FILE_HANDLE.
|
||||||
|
*
|
||||||
|
* @see MP4CreateCallbacks()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4FileHandle MP4CreateCallbacksEx(
|
||||||
|
const MP4IOCallbacks* callbacks,
|
||||||
|
void* handle DEFAULT(NULL),
|
||||||
|
uint32_t flags DEFAULT(0),
|
||||||
|
int add_ftyp DEFAULT(1),
|
||||||
|
int add_iods DEFAULT(1),
|
||||||
|
char* majorBrand DEFAULT(0),
|
||||||
|
uint32_t minorVersion DEFAULT(0),
|
||||||
|
char** compatibleBrands DEFAULT(0),
|
||||||
|
uint32_t compatibleBrandsCount DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Dump mp4 file contents as ASCII either to stdout or the
|
||||||
|
* log callback (see MP4SetLogCallback())
|
||||||
|
*
|
||||||
|
* Dump is an invaluable debugging tool in that in can reveal all the details
|
||||||
|
* of the mp4 control structures. However, the output will not make much sense
|
||||||
|
* until you familiarize yourself with the mp4 specification (or the Quicktime
|
||||||
|
* File Format specification).
|
||||||
|
*
|
||||||
|
* Note that MP4Dump() will not print the individual values of control tables,
|
||||||
|
* such as the size of each sample, unless the current log level is at least
|
||||||
|
* @b MP4_LOG_VERBOSE2. See MP4LogSetLevel() for how to set this.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file to dump.
|
||||||
|
* @param dumpImplicits prints properties which would not actually be written
|
||||||
|
* to the mp4 file, but still exist in mp4 control structures. I.e. they
|
||||||
|
* are implicit given the current values of other controlling properties.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4Dump(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
bool dumpImplicits DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Return a textual summary of an mp4 file.
|
||||||
|
*
|
||||||
|
* MP4FileInfo provides a string that contains a textual summary of the
|
||||||
|
* contents of an mp4 file. This includes the track id's, the track type, and
|
||||||
|
* track specific information. For example, for a video track, media encoding,
|
||||||
|
* image size, frame rate, and bitrate are summarized.
|
||||||
|
*
|
||||||
|
* Note that the returned string is allocated by the library, so it is the
|
||||||
|
* caller's responsibility to release the string with MP4Free(). Also note
|
||||||
|
* that the returned string contains newlines and tabs which may or may not be
|
||||||
|
* desirable.
|
||||||
|
*
|
||||||
|
* The following is an example of the output of MP4Info():
|
||||||
|
* @verbatim
|
||||||
|
Track Type Info
|
||||||
|
1 video MPEG-4 Simple @ L3, 119.625 secs, 1008 kbps, 352x288 @ 24.00 fps
|
||||||
|
2 audio MPEG-4, 119.327 secs, 128 kbps, 44100 Hz
|
||||||
|
3 hint Payload MP4V-ES for track 1
|
||||||
|
4 hint Payload mpeg4-generic for track 2
|
||||||
|
5 od Object Descriptors
|
||||||
|
6 scene BIFS
|
||||||
|
@endverbatim
|
||||||
|
*
|
||||||
|
* @param fileName pathname to mp4 file to summarize.
|
||||||
|
* On Windows, this should be a UTF-8 encoded string.
|
||||||
|
* On other platforms, it should be an 8-bit encoding that is
|
||||||
|
* appropriate for the platform, locale, file system, etc.
|
||||||
|
* (prefer to use UTF-8 when possible).
|
||||||
|
* @param trackId specifies track to summarize. If the value is
|
||||||
|
* #MP4_INVALID_TRACK_ID, the summary info is created for all
|
||||||
|
* tracks in the file.
|
||||||
|
*
|
||||||
|
* @return On success a newly allocated string containing summary information.
|
||||||
|
* On failure, <b>NULL</b>.
|
||||||
|
*
|
||||||
|
* @see MP4Info()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
char* MP4FileInfo(
|
||||||
|
const char* fileName,
|
||||||
|
MP4TrackId trackId DEFAULT(MP4_INVALID_TRACK_ID) );
|
||||||
|
|
||||||
|
/** Accessor for the filename associated with a file handle
|
||||||
|
*
|
||||||
|
* @param hFile a file handle
|
||||||
|
*
|
||||||
|
* @return the NUL-terminated, UTF-8 encoded filename associated with @p
|
||||||
|
* hFile.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
const char* MP4GetFilename(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Return a textual summary of an mp4 file.
|
||||||
|
*
|
||||||
|
* MP4FileInfo provides a string that contains a textual summary of the
|
||||||
|
* contents of an mp4 file. This includes the track id's, the track type, and
|
||||||
|
* track specific information. For example, for a video track, media encoding,
|
||||||
|
* image size, frame rate, and bitrate are summarized.
|
||||||
|
*
|
||||||
|
* Note that the returned string is allocated by the library, so it is the
|
||||||
|
* caller's responsibility to release the string with MP4Free(). Also note
|
||||||
|
* that the returned string contains newlines and tabs which may or may not be
|
||||||
|
* desirable.
|
||||||
|
*
|
||||||
|
* The following is an example of the output of MP4Info():
|
||||||
|
* @verbatim
|
||||||
|
Track Type Info
|
||||||
|
1 video MPEG-4 Simple @ L3, 119.625 secs, 1008 kbps, 352x288 @ 24.00 fps
|
||||||
|
2 audio MPEG-4, 119.327 secs, 128 kbps, 44100 Hz
|
||||||
|
3 hint Payload MP4V-ES for track 1
|
||||||
|
4 hint Payload mpeg4-generic for track 2
|
||||||
|
5 od Object Descriptors
|
||||||
|
6 scene BIFS
|
||||||
|
@endverbatim
|
||||||
|
*
|
||||||
|
* @param hFile handle of file to summarize.
|
||||||
|
* @param trackId specifies track to summarize. If the value is
|
||||||
|
* #MP4_INVALID_TRACK_ID, the summary info is created for all tracks in
|
||||||
|
* the file.
|
||||||
|
*
|
||||||
|
* @return On success a newly allocated string containing summary information.
|
||||||
|
* On failure, <b>NULL</b>.
|
||||||
|
*
|
||||||
|
* @see MP4FileInfo()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
char* MP4Info(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId DEFAULT(MP4_INVALID_TRACK_ID) );
|
||||||
|
|
||||||
|
/** Modify an existing mp4 file.
|
||||||
|
*
|
||||||
|
* MP4Modify is the first call that should be used when you want to modify
|
||||||
|
* an existing mp4 file. It is roughly equivalent to opening a file in
|
||||||
|
* read/write mode.
|
||||||
|
*
|
||||||
|
* Since modifications to an existing mp4 file can result in a sub-optimal
|
||||||
|
* file layout, you may want to use MP4Optimize() after you have modified
|
||||||
|
* and closed the mp4 file.
|
||||||
|
*
|
||||||
|
* @param fileName pathname of the file to be modified.
|
||||||
|
* On Windows, this should be a UTF-8 encoded string.
|
||||||
|
* On other platforms, it should be an 8-bit encoding that is
|
||||||
|
* appropriate for the platform, locale, file system, etc.
|
||||||
|
* (prefer to use UTF-8 when possible).
|
||||||
|
* @param flags currently ignored.
|
||||||
|
*
|
||||||
|
* @return On success a handle of the target file for use in subsequent calls
|
||||||
|
* to the library. On error, #MP4_INVALID_FILE_HANDLE.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4FileHandle MP4Modify(
|
||||||
|
const char* fileName,
|
||||||
|
uint32_t flags DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Modify an existing mp4 file using an I/O callbacks structure.
|
||||||
|
*
|
||||||
|
* MP4ModifyCallbacks is the first call that should be used when you want to
|
||||||
|
* modify an existing mp4 file using custom I/O functions provided in an
|
||||||
|
* MP4IOCallbacks structure.
|
||||||
|
|
||||||
|
* Using MP4ModifyCallbacks is roughly equivalent to opening a file in
|
||||||
|
* read/write mode.
|
||||||
|
*
|
||||||
|
* Since modifications to an existing mp4 file can result in a sub-optimal
|
||||||
|
* file layout, you may want to use MP4Optimize() after you have modified and
|
||||||
|
* closed the mp4 file.
|
||||||
|
*
|
||||||
|
* @param callbacks custom implementation of I/O operations. The size, seek,
|
||||||
|
* read and write callbacks must be implemented. Implementing the truncate
|
||||||
|
* callback is optional, but strongly recommended. If the truncate
|
||||||
|
* callback is not implemented, it must be set to NULL. The callbacks
|
||||||
|
* structure is immediately copied internally.
|
||||||
|
* @param handle a custom handle that will be passed as the first argument to
|
||||||
|
* any callback function call. This can be used to pass a handle to an
|
||||||
|
* application specific I/O object or an application defined struct
|
||||||
|
* containing a pointer to a buffer.
|
||||||
|
* @param flags currently ignored.
|
||||||
|
*
|
||||||
|
* @return On success a handle of the target file for use in subsequent calls
|
||||||
|
* to the library. On error, #MP4_INVALID_FILE_HANDLE.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4FileHandle MP4ModifyCallbacks(
|
||||||
|
const MP4IOCallbacks* callbacks,
|
||||||
|
void* handle DEFAULT(NULL),
|
||||||
|
uint32_t flags DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Optimize the layout of an mp4 file.
|
||||||
|
*
|
||||||
|
* MP4Optimize reads an existing mp4 file and writes a new version of the
|
||||||
|
* file with the two important changes:
|
||||||
|
*
|
||||||
|
* First, the mp4 control information is moved to the beginning of the file.
|
||||||
|
* (Frequenty it is at the end of the file due to it being constantly
|
||||||
|
* modified as track samples are added to an mp4 file). This optimization
|
||||||
|
* is useful in that in allows the mp4 file to be HTTP streamed.
|
||||||
|
*
|
||||||
|
* Second, the track samples are interleaved so that the samples for a
|
||||||
|
* particular instant in time are colocated within the file. This
|
||||||
|
* eliminates disk seeks during playback of the file which results in
|
||||||
|
* better performance.
|
||||||
|
*
|
||||||
|
* There are also two important side effects of MP4Optimize():
|
||||||
|
*
|
||||||
|
* First, any free blocks within the mp4 file are eliminated.
|
||||||
|
*
|
||||||
|
* Second, as a side effect of the sample interleaving process any media
|
||||||
|
* data chunks that are not actually referenced by the mp4 control
|
||||||
|
* structures are deleted. This is useful if you have called MP4DeleteTrack()
|
||||||
|
* which only deletes the control information for a track, and not the
|
||||||
|
* actual media data.
|
||||||
|
*
|
||||||
|
* @param fileName pathname of (existing) file to be optimized.
|
||||||
|
* On Windows, this should be a UTF-8 encoded string.
|
||||||
|
* On other platforms, it should be an 8-bit encoding that is
|
||||||
|
* appropriate for the platform, locale, file system, etc.
|
||||||
|
* (prefer to use UTF-8 when possible).
|
||||||
|
* @param newFileName pathname of the new optimized file.
|
||||||
|
* On Windows, this should be a UTF-8 encoded string.
|
||||||
|
* On other platforms, it should be an 8-bit encoding that is
|
||||||
|
* appropriate for the platform, locale, file system, etc.
|
||||||
|
* (prefer to use UTF-8 when possible).
|
||||||
|
* If NULL a temporary file in the same directory as the
|
||||||
|
* <b>fileName</b> will be used and <b>fileName</b>
|
||||||
|
* will be over-written upon successful completion.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4Optimize(
|
||||||
|
const char* fileName,
|
||||||
|
const char* newFileName DEFAULT(NULL) );
|
||||||
|
|
||||||
|
/** Read an existing mp4 file.
|
||||||
|
*
|
||||||
|
* MP4Read is the first call that should be used when you want to just
|
||||||
|
* read an existing mp4 file. It is equivalent to opening a file for
|
||||||
|
* reading, but in addition the mp4 file is parsed and the control
|
||||||
|
* information is loaded into memory. Note that actual track samples are not
|
||||||
|
* read into memory until MP4ReadSample() is called.
|
||||||
|
*
|
||||||
|
* @param fileName pathname of the file to be read.
|
||||||
|
* On Windows, this should be a UTF-8 encoded string.
|
||||||
|
* On other platforms, it should be an 8-bit encoding that is
|
||||||
|
* appropriate for the platform, locale, file system, etc.
|
||||||
|
* (prefer to use UTF-8 when possible).
|
||||||
|
*
|
||||||
|
* @return On success a handle of the file for use in subsequent calls to
|
||||||
|
* the library. On error, #MP4_INVALID_FILE_HANDLE.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4FileHandle MP4Read(
|
||||||
|
const char* fileName );
|
||||||
|
|
||||||
|
/** Read an existing mp4 file.
|
||||||
|
*
|
||||||
|
* @deprecated The file provider API is deprecated since MP4v2 2.1.0. Please
|
||||||
|
* use MP4ReadCallbacks() instead.
|
||||||
|
*
|
||||||
|
* MP4ReadProvider is the first call that should be used when you want to just
|
||||||
|
* read an existing mp4 file. It is equivalent to opening a file for reading,
|
||||||
|
* but in addition the mp4 file is parsed and the control information is
|
||||||
|
* loaded into memory. Note that actual track samples are not read into memory
|
||||||
|
* until MP4ReadSample() is called.
|
||||||
|
*
|
||||||
|
* @param fileName pathname of the file to be read.
|
||||||
|
* On Windows, this should be a UTF-8 encoded string.
|
||||||
|
* On other platforms, it should be an 8-bit encoding that is
|
||||||
|
* appropriate for the platform, locale, file system, etc.
|
||||||
|
* (prefer to use UTF-8 when possible).
|
||||||
|
* @param fileProvider custom implementation of file I/O operations.
|
||||||
|
* All functions in structure must be implemented.
|
||||||
|
* The structure is immediately copied internally.
|
||||||
|
*
|
||||||
|
* @return On success a handle of the file for use in subsequent calls to
|
||||||
|
* the library. On error, #MP4_INVALID_FILE_HANDLE.
|
||||||
|
*
|
||||||
|
* @see MP4ReadCallbacks()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4FileHandle MP4ReadProvider(
|
||||||
|
const char* fileName,
|
||||||
|
const MP4FileProvider* fileProvider DEFAULT(NULL) );
|
||||||
|
|
||||||
|
/** Read an existing mp4 file using an I/O callbacks structure.
|
||||||
|
*
|
||||||
|
* MP4ReadCallbacks is the first call that should be used when you want to
|
||||||
|
* read an existing mp4 file using custom I/O functions provided in an
|
||||||
|
* MP4IOCallbacks structure.
|
||||||
|
*
|
||||||
|
* Using MP4ReadCallbacks is equivalent to opening a file for reading, but in
|
||||||
|
* addition the mp4 file is parsed and the control information is loaded into
|
||||||
|
* memory. Note that actual track samples are not read into memory until
|
||||||
|
* MP4ReadSample() is called.
|
||||||
|
*
|
||||||
|
* @param callbacks custom implementation of I/O operations.
|
||||||
|
* The size, seek and read callbacks must be implemented.
|
||||||
|
* The callbacks structure is immediately copied internally.
|
||||||
|
* @param handle a custom handle that will be passed as the first argument to
|
||||||
|
* any callback function call. This can be used to pass a handle to an
|
||||||
|
* application specific I/O object or an application defined struct
|
||||||
|
* containing a pointer to a buffer.
|
||||||
|
*
|
||||||
|
* @return On success a handle of the file for use in subsequent calls to
|
||||||
|
* the library. On error, #MP4_INVALID_FILE_HANDLE.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4FileHandle MP4ReadCallbacks(
|
||||||
|
const MP4IOCallbacks* callbacks,
|
||||||
|
void* handle DEFAULT(NULL) );
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_FILE_H */
|
||||||
532
third_party/include/mp4v2/file_prop.h
vendored
Normal file
532
third_party/include/mp4v2/file_prop.h
vendored
Normal file
@ -0,0 +1,532 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dave Mackie, dmackie@cisco.com
|
||||||
|
* Alix Marchandise-Franquet, alix@cisco.com
|
||||||
|
* Bill May, wmay@cisco.com
|
||||||
|
* Kona Blend, kona8lend@gmail.com
|
||||||
|
* Robert Kausch, robert.kausch@freac.org
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_FILE_PROP_H
|
||||||
|
#define MP4V2_FILE_PROP_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_file_prop MP4v2 File Properties
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/* generic props */
|
||||||
|
|
||||||
|
/** Check for presence of an atom.
|
||||||
|
*
|
||||||
|
* MP4HaveAtom checks for the presence of the atom passed in @p atomName. @p
|
||||||
|
* atomName can specify an atom path to check for atoms that are not top level
|
||||||
|
* atoms, e.g. "moov.udta.meta.ilst".
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param atomName name of the atom to check for.
|
||||||
|
*
|
||||||
|
* @return true (1) if the atom is present, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4HaveAtom(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* atomName );
|
||||||
|
|
||||||
|
/** Get the value of an integer property.
|
||||||
|
*
|
||||||
|
* MP4GetIntegerProperty determines the value of the integer property
|
||||||
|
* identified by @p propName, e.g. "moov.iods.audioProfileLevelId". The value
|
||||||
|
* is stored in the variable pointed to by @p retVal.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param propName path to the property to get.
|
||||||
|
* @param retVal pointer to a variable to receive the return value.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetIntegerProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* propName,
|
||||||
|
uint64_t* retVal );
|
||||||
|
|
||||||
|
/** Get the value of a float property.
|
||||||
|
*
|
||||||
|
* MP4GetFloatProperty determines the value of the float property identified
|
||||||
|
* by @p propName, e.g. "moov.mvhd.rate". The value is stored in the variable
|
||||||
|
* pointed to by @p retVal.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param propName path to the property to get.
|
||||||
|
* @param retVal pointer to a variable to receive the return value.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetFloatProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* propName,
|
||||||
|
float* retVal );
|
||||||
|
|
||||||
|
/** Get the value of a string property.
|
||||||
|
*
|
||||||
|
* MP4GetStringProperty determines the value of the string property identified
|
||||||
|
* by @p propName, e.g. "ftyp.majorBrand". The value is stored in the variable
|
||||||
|
* pointed to by @p retVal.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param propName path to the property to get.
|
||||||
|
* @param retVal pointer to a variable to receive the return value.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetStringProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* propName,
|
||||||
|
const char** retVal );
|
||||||
|
|
||||||
|
/** Get the value of a bytes property.
|
||||||
|
*
|
||||||
|
* MP4GetBytesProperty determines the value of the bytes property identified
|
||||||
|
* by @p propName, e.g. "moov.udta.meta.metadata". The value is stored in a
|
||||||
|
* newly allocated buffer the location of which is assigned to the variable
|
||||||
|
* pointed to by ppValue. The caller is responsible for freeing the memory
|
||||||
|
* with MP4Free().
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param propName path to the property to get.
|
||||||
|
* @param ppValue pointer to a variable to receive the memory location
|
||||||
|
* containing the property bytes.
|
||||||
|
* @param pValueSize pointer to a variable to receive the length of the
|
||||||
|
* property bytes value.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetBytesProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* propName,
|
||||||
|
uint8_t** ppValue,
|
||||||
|
uint32_t* pValueSize );
|
||||||
|
|
||||||
|
/** Set the value of an integer property.
|
||||||
|
*
|
||||||
|
* MP4SetIntegerProperty sets the value of the integer property identified by
|
||||||
|
* @p propName, e.g. "moov.iods.audioProfileLevelId".
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param propName path to the property to set.
|
||||||
|
* @param value the new value of the property.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetIntegerProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* propName,
|
||||||
|
int64_t value );
|
||||||
|
|
||||||
|
/** Set the value of a float property.
|
||||||
|
*
|
||||||
|
* MP4SetFloatProperty sets the value of the float property identified by @p
|
||||||
|
* propName, e.g. "moov.mvhd.rate".
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param propName path to the property to set.
|
||||||
|
* @param value the new value of the property.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetFloatProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* propName,
|
||||||
|
float value );
|
||||||
|
|
||||||
|
/** Set the value of a string property.
|
||||||
|
*
|
||||||
|
* MP4SetStringProperty sets the value of the string property identified by @p
|
||||||
|
* propName, e.g. "ftyp.majorBrand".
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param propName path to the property to set.
|
||||||
|
* @param value the new value of the property.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetStringProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* propName,
|
||||||
|
const char* value );
|
||||||
|
|
||||||
|
/** Set the value of a bytes property.
|
||||||
|
*
|
||||||
|
* MP4SetBytesProperty sets the value of the bytes property identified by @p
|
||||||
|
* propName, e.g. "moov.udta.meta.metadata".
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param propName path to the property to set.
|
||||||
|
* @param pValue pointer the bytes representing the new value of the property.
|
||||||
|
* @param valueSize the size of the bytes value pointed to by <b>pValue</b>.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetBytesProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* propName,
|
||||||
|
const uint8_t* pValue,
|
||||||
|
uint32_t valueSize );
|
||||||
|
|
||||||
|
/* specific props */
|
||||||
|
|
||||||
|
/** Get the duration of the movie (file).
|
||||||
|
*
|
||||||
|
* MP4GetDuration returns the maximum duration of all the tracks in the
|
||||||
|
* specified mp4 file.
|
||||||
|
*
|
||||||
|
* Caveat: the duration is the movie (file) time scale units.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return The duration of the movie (file) in movie (file) time scale units.
|
||||||
|
*
|
||||||
|
* @see MP4GetTimeScale()
|
||||||
|
* @see MP4ConvertFromMovieDuration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Duration MP4GetDuration(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Get the time scale of the movie (file).
|
||||||
|
*
|
||||||
|
* MP4GetTimeScale returns the time scale in units of ticks per second for
|
||||||
|
* the mp4 file. Caveat: tracks may use the same time scale as the movie
|
||||||
|
* or may use their own time scale.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
*
|
||||||
|
* @return timescale (ticks per second) of the mp4 file.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint32_t MP4GetTimeScale(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Set the time scale of the movie (file).
|
||||||
|
*
|
||||||
|
* MP4SetTimeScale sets the time scale of the mp4 file. The time scale is
|
||||||
|
* in the number of clock ticks per second. Caveat: tracks may use the
|
||||||
|
* same time scale as the movie or may use their own time scale.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param value desired timescale for the movie.
|
||||||
|
*
|
||||||
|
* @return On success, true. On failure, false.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTimeScale(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t value );
|
||||||
|
|
||||||
|
/** Change the general timescale of file hFile.
|
||||||
|
*
|
||||||
|
* This function changes the general timescale of the file <b>hFile</b>
|
||||||
|
* 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 hFile handle of file to change.
|
||||||
|
* @param value the new timescale.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4ChangeMovieTimeScale(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t value );
|
||||||
|
|
||||||
|
/** Gets the minimum MPEG-4 object descriptor profile and level required to
|
||||||
|
* render the contents of the file.
|
||||||
|
*
|
||||||
|
* MP4GetODProfileLevel returns the minimum profile/level of MPEG-4 object
|
||||||
|
* descriptor support necessary to render the contents of the file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return The current object descriptor profile/level for the file. See
|
||||||
|
* MP4SetODProfileLevel() for known values.
|
||||||
|
*
|
||||||
|
* @see MP4SetODProfileLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint8_t MP4GetODProfileLevel(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Sets the minimum MPEG-4 object descriptor profile and level required to
|
||||||
|
* render the contents of the file.
|
||||||
|
*
|
||||||
|
* MP4SetODProfileLevel sets the minimum profile/level of MPEG-4 object
|
||||||
|
* descriptor support necessary to render the contents of the file.
|
||||||
|
*
|
||||||
|
* ISO/IEC 14496-1:2001 MPEG-4 Systems defines the following values:
|
||||||
|
*
|
||||||
|
* Value | Meaning
|
||||||
|
* ----------|-----------------------------
|
||||||
|
* 0x00 | Reserved
|
||||||
|
* 0x01-0x7F | Reserved
|
||||||
|
* 0x80-0xFD | User private
|
||||||
|
* 0xFE | No object descriptor profile specified
|
||||||
|
* 0xFF | No object descriptor required
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param value specifies the profile/level to set.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetODProfileLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetODProfileLevel(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint8_t value );
|
||||||
|
|
||||||
|
/** Gets the minimum MPEG-4 scene graph profile and level required to render
|
||||||
|
* the contents of the file.
|
||||||
|
*
|
||||||
|
* MP4GetSceneProfileLevel returns the minimum profile/level of MPEG-4 scene
|
||||||
|
* graph support necessary to render the contents of the file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return The current scene graph profile/level for the file. See
|
||||||
|
* MP4SetSceneProfileLevel() for known values.
|
||||||
|
*
|
||||||
|
* @see MP4SetSceneProfileLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint8_t MP4GetSceneProfileLevel(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Sets the minimum MPEG-4 scene graph profile and level required to render
|
||||||
|
* the contents of the file.
|
||||||
|
*
|
||||||
|
* MP4SetSceneProfileLevel sets the minimum profile/level of MPEG-4 scene
|
||||||
|
* graph support necessary to render the contents of the file.
|
||||||
|
*
|
||||||
|
* ISO/IEC 14496-1:2001 MPEG-4 Systems defines the following values:
|
||||||
|
*
|
||||||
|
* Value | Meaning
|
||||||
|
* ----------|-----------------------------
|
||||||
|
* 0x00 | Reserved
|
||||||
|
* 0x01 | Simple 2D Profile @@ Level 1
|
||||||
|
* 0x02-0x7F | Reserved
|
||||||
|
* 0x80-0xFD | User private
|
||||||
|
* 0xFE | No scene graph profile specified
|
||||||
|
* 0xFF | No scene graph required
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param value specifies the profile/level to set.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetSceneProfileLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetSceneProfileLevel(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint8_t value );
|
||||||
|
|
||||||
|
/** Gets the minimum MPEG-4 video profile and level required to render the
|
||||||
|
* contents of the file.
|
||||||
|
*
|
||||||
|
* MP4GetVideoProfileLevel returns the minimum profile/level of MPEG-4 video
|
||||||
|
* support necessary to render the contents of the file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the profile/level is
|
||||||
|
* requested.
|
||||||
|
*
|
||||||
|
* @return The current video profile/level for the file/track. See
|
||||||
|
* MP4SetVideoProfileLevel() for known values.
|
||||||
|
*
|
||||||
|
* @see MP4SetVideoProfileLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint8_t MP4GetVideoProfileLevel(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId DEFAULT(MP4_INVALID_TRACK_ID) );
|
||||||
|
|
||||||
|
/** Sets the minimum MPEG-4 video profile and level required to render the
|
||||||
|
* contents of the file.
|
||||||
|
*
|
||||||
|
* MP4SetVideoProfileLevel sets the minimum profile/level of MPEG-4 video
|
||||||
|
* support necessary to render the contents of the file.
|
||||||
|
*
|
||||||
|
* ISO/IEC 14496-1:2001 MPEG-4 Systems defines the following values:
|
||||||
|
*
|
||||||
|
* Value | Meaning
|
||||||
|
* ----------|-----------------------------------
|
||||||
|
* 0x00 | Reserved
|
||||||
|
* 0x01 | Simple Profile @@ Level 3
|
||||||
|
* 0x02 | Simple Profile @@ Level 2
|
||||||
|
* 0x03 | Simple Profile @@ Level 1
|
||||||
|
* 0x04 | Simple Scalable Profile @@ Level 2
|
||||||
|
* 0x05 | Simple Scalable Profile @@ Level 1
|
||||||
|
* 0x06 | Core Profile @@ Level 2
|
||||||
|
* 0x07 | Core Profile @@ Level 1
|
||||||
|
* 0x08 | Main Profile @@ Level 4
|
||||||
|
* 0x09 | Main Profile @@ Level 3
|
||||||
|
* 0x0A | Main Profile @@ Level 2
|
||||||
|
* 0x0B | N-Bit Profile @@ Level 2
|
||||||
|
* 0x0C | Hybrid Profile @@ Level 2
|
||||||
|
* 0x0D | Hybrid Profile @@ Level 1
|
||||||
|
* 0x0E | Basic Animated Texture @@ Level 2
|
||||||
|
* 0x0F | Basic Animated Texture @@ Level 1
|
||||||
|
* 0x10 | Scalable Texture @@ Level 3
|
||||||
|
* 0x11 | Scalable Texture @@ Level 2
|
||||||
|
* 0x12 | Scalable Texture @@ Level 1
|
||||||
|
* 0x13 | Simple Face Animation @@ Level 2
|
||||||
|
* 0x14 | Simple Face Animation @@ Level 1
|
||||||
|
* 0x15-0x7F | Reserved
|
||||||
|
* 0x80-0xFD | User private
|
||||||
|
* 0xFE | No video profile specified
|
||||||
|
* 0xFF | No video required
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param value specifies the profile/level to set.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetVideoProfileLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4SetVideoProfileLevel(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint8_t value );
|
||||||
|
|
||||||
|
/** Gets the minimum MPEG-4 audio profile and level required to render the
|
||||||
|
* contents of the file.
|
||||||
|
*
|
||||||
|
* MP4GetAudioProfileLevel returns the minimum profile/level of MPEG-4 audio
|
||||||
|
* support necessary to render the contents of the file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return The current audio profile/level for the file. See
|
||||||
|
* MP4SetAudioProfileLevel() for known values.
|
||||||
|
*
|
||||||
|
* @see MP4SetAudioProfileLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint8_t MP4GetAudioProfileLevel(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Sets the minimum MPEG-4 audio profile and level required to render the
|
||||||
|
* contents of the file.
|
||||||
|
*
|
||||||
|
* MP4SetAudioProfileLevel sets the minimum profile/level of MPEG-4 audio
|
||||||
|
* support necessary to render the contents of the file.
|
||||||
|
*
|
||||||
|
* ISO/IEC 14496-1:2001 MPEG-4 Systems defines the following values:
|
||||||
|
*
|
||||||
|
* Value | Meaning
|
||||||
|
* ----------|-----------------------------
|
||||||
|
* 0x00 | Reserved
|
||||||
|
* 0x01 | Main Profile @@ Level 1
|
||||||
|
* 0x02 | Main Profile @@ Level 2
|
||||||
|
* 0x03 | Main Profile @@ Level 3
|
||||||
|
* 0x04 | Main Profile @@ Level 4
|
||||||
|
* 0x05 | Scalable Profile @@ Level 1
|
||||||
|
* 0x06 | Scalable Profile @@ Level 2
|
||||||
|
* 0x07 | Scalable Profile @@ Level 3
|
||||||
|
* 0x08 | Scalable Profile @@ Level 4
|
||||||
|
* 0x09 | Speech Profile @@ Level 1
|
||||||
|
* 0x0A | Speech Profile @@ Level 2
|
||||||
|
* 0x0B | Synthesis Profile @@ Level 1
|
||||||
|
* 0x0C | Synthesis Profile @@ Level 2
|
||||||
|
* 0x0D | Synthesis Profile @@ Level 3
|
||||||
|
* 0x0E-0x7F | Reserved
|
||||||
|
* 0x80-0xFD | User private
|
||||||
|
* 0xFE | No audio profile specified
|
||||||
|
* 0xFF | No audio required
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param value specifies the profile/level to set.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetAudioProfileLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4SetAudioProfileLevel(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint8_t value );
|
||||||
|
|
||||||
|
/** Gets the minimum MPEG-4 graphics profile and level required to render the
|
||||||
|
* contents of the file.
|
||||||
|
*
|
||||||
|
* MP4GetGraphicsProfileLevel returns the minimum profile/level of MPEG-4
|
||||||
|
* graphics support necessary to render the contents of the file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return The current graphics profile/level for the file. See
|
||||||
|
* MP4SetGraphicsProfileLevel() for known values.
|
||||||
|
*
|
||||||
|
* @see MP4SetGraphicsProfileLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint8_t MP4GetGraphicsProfileLevel(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Sets the minimum MPEG-4 graphics profile and level required to render the
|
||||||
|
* contents of the file.
|
||||||
|
*
|
||||||
|
* MP4SetGraphicsProfileLevel sets the minimum profile/level of MPEG-4
|
||||||
|
* graphics support necessary to render the contents of the file.
|
||||||
|
*
|
||||||
|
* ISO/IEC 14496-1:2001 MPEG-4 Systems defines the following values:
|
||||||
|
*
|
||||||
|
* Value | Meaning
|
||||||
|
* ----------|-----------------------------
|
||||||
|
* 0x00 | Reserved
|
||||||
|
* 0x01 | Simple 2D Profile @@ Level 1
|
||||||
|
* 0x02-0x7F | Reserved
|
||||||
|
* 0x80-0xFD | User private
|
||||||
|
* 0xFE | No graphics profile specified
|
||||||
|
* 0xFF | No graphics required
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param value specifies the profile/level to set.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetGraphicsProfileLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetGraphicsProfileLevel(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint8_t value );
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_FILE_PROP_H */
|
||||||
973
third_party/include/mp4v2/general.h
vendored
Normal file
973
third_party/include/mp4v2/general.h
vendored
Normal file
@ -0,0 +1,973 @@
|
|||||||
|
/*
|
||||||
|
* 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, dmackie@cisco.com
|
||||||
|
* Alix Marchandise-Franquet, alix@cisco.com
|
||||||
|
* Ximpo Group Ltd., mp4v2@ximpo.com
|
||||||
|
* Bill May, wmay@cisco.com
|
||||||
|
* Kona Blend, kona8lend@gmail.com
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_GENERAL_H
|
||||||
|
#define MP4V2_GENERAL_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_general MP4v2 General
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/* MP4 API types */
|
||||||
|
typedef void* MP4FileHandle;
|
||||||
|
typedef uint32_t MP4TrackId;
|
||||||
|
typedef uint32_t MP4SampleId;
|
||||||
|
typedef uint64_t MP4Timestamp;
|
||||||
|
typedef uint64_t MP4Duration;
|
||||||
|
typedef uint32_t MP4EditId;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MP4_LOG_NONE = 0,
|
||||||
|
MP4_LOG_ERROR = 1,
|
||||||
|
MP4_LOG_WARNING = 2,
|
||||||
|
MP4_LOG_INFO = 3,
|
||||||
|
MP4_LOG_VERBOSE1 = 4,
|
||||||
|
MP4_LOG_VERBOSE2 = 5,
|
||||||
|
MP4_LOG_VERBOSE3 = 6,
|
||||||
|
MP4_LOG_VERBOSE4 = 7
|
||||||
|
} MP4LogLevel;
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
typedef void (*MP4LogCallback)(
|
||||||
|
MP4LogLevel loglevel,
|
||||||
|
const char* fmt,
|
||||||
|
va_list ap );
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/** Encryption function pointer.
|
||||||
|
*
|
||||||
|
* @see MP4EncAndCopySample()
|
||||||
|
* @see MP4EncAndCopyTrack()
|
||||||
|
*/
|
||||||
|
typedef uint32_t (*encryptFunc_t)( uint32_t, uint32_t, uint8_t*, uint32_t*, uint8_t** );
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define MP4_INVALID_FILE_HANDLE ((MP4FileHandle)NULL) /**< Constant: invalid MP4FileHandle. */
|
||||||
|
#define MP4_INVALID_TRACK_ID ((MP4TrackId)0) /**< Constant: invalid MP4TrackId. */
|
||||||
|
#define MP4_INVALID_SAMPLE_ID ((MP4SampleId)0) /**< Constant: invalid MP4SampleId. */
|
||||||
|
#define MP4_INVALID_TIMESTAMP ((MP4Timestamp)-1) /**< Constant: invalid MP4Timestamp. */
|
||||||
|
#define MP4_INVALID_DURATION ((MP4Duration)-1) /**< Constant: invalid MP4Duration. */
|
||||||
|
#define MP4_INVALID_EDIT_ID ((MP4EditId)0) /**< Constant: invalid MP4EditId. */
|
||||||
|
|
||||||
|
/* Macros to test for API type validity */
|
||||||
|
#define MP4_IS_VALID_FILE_HANDLE(x) ((x) != MP4_INVALID_FILE_HANDLE)
|
||||||
|
#define MP4_IS_VALID_TRACK_ID(x) ((x) != MP4_INVALID_TRACK_ID)
|
||||||
|
#define MP4_IS_VALID_SAMPLE_ID(x) ((x) != MP4_INVALID_SAMPLE_ID)
|
||||||
|
#define MP4_IS_VALID_TIMESTAMP(x) ((x) != MP4_INVALID_TIMESTAMP)
|
||||||
|
#define MP4_IS_VALID_DURATION(x) ((x) != MP4_INVALID_DURATION)
|
||||||
|
#define MP4_IS_VALID_EDIT_ID(x) ((x) != MP4_INVALID_EDIT_ID)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MP4 Known track type names - e.g. MP4GetNumberOfTracks(type)
|
||||||
|
*
|
||||||
|
* Note this first group of track types should be created
|
||||||
|
* via the MP4Add<Type>Track() functions, and not MP4AddTrack(type)
|
||||||
|
*/
|
||||||
|
#define MP4_OD_TRACK_TYPE "odsm" /**< Constant: OD track. */
|
||||||
|
#define MP4_SCENE_TRACK_TYPE "sdsm" /**< Constant: scene track. */
|
||||||
|
#define MP4_AUDIO_TRACK_TYPE "soun" /**< Constant: audio track. */
|
||||||
|
#define MP4_VIDEO_TRACK_TYPE "vide" /**< Constant: video track. */
|
||||||
|
#define MP4_HINT_TRACK_TYPE "hint" /**< Constant: hint track. */
|
||||||
|
#define MP4_CNTL_TRACK_TYPE "cntl" /**< Constant: control track. */
|
||||||
|
#define MP4_TEXT_TRACK_TYPE "text" /**< Constant: text track. */
|
||||||
|
#define MP4_SUBTITLE_TRACK_TYPE "sbtl" /**< Constant: subtitle track. */
|
||||||
|
#define MP4_SUBPIC_TRACK_TYPE "subp" /**< Constant: subpic track. */
|
||||||
|
/*
|
||||||
|
* This second set of track types should be created
|
||||||
|
* via MP4AddSystemsTrack(type)
|
||||||
|
*/
|
||||||
|
#define MP4_CLOCK_TRACK_TYPE "crsm" /**< Constant: clock track. */
|
||||||
|
#define MP4_MPEG7_TRACK_TYPE "m7sm" /**< Constant: mpeg7 track. */
|
||||||
|
#define MP4_OCI_TRACK_TYPE "ocsm" /**< Constant: OCI track. */
|
||||||
|
#define MP4_IPMP_TRACK_TYPE "ipsm" /**< Constant: IPMP track. */
|
||||||
|
#define MP4_MPEGJ_TRACK_TYPE "mjsm" /**< Constant: MPEGJ track. */
|
||||||
|
|
||||||
|
#define MP4_IS_VIDEO_TRACK_TYPE(type) \
|
||||||
|
(!strcasecmp(type, MP4_VIDEO_TRACK_TYPE))
|
||||||
|
|
||||||
|
#define MP4_IS_AUDIO_TRACK_TYPE(type) \
|
||||||
|
(!strcasecmp(type, MP4_AUDIO_TRACK_TYPE))
|
||||||
|
|
||||||
|
#define MP4_IS_CNTL_TRACK_TYPE(type) \
|
||||||
|
(!strcasecmp(type, MP4_CNTL_TRACK_TYPE))
|
||||||
|
|
||||||
|
#define MP4_IS_OD_TRACK_TYPE(type) \
|
||||||
|
(!strcasecmp(type, MP4_OD_TRACK_TYPE))
|
||||||
|
|
||||||
|
#define MP4_IS_SCENE_TRACK_TYPE(type) \
|
||||||
|
(!strcasecmp(type, MP4_SCENE_TRACK_TYPE))
|
||||||
|
|
||||||
|
#define MP4_IS_HINT_TRACK_TYPE(type) \
|
||||||
|
(!strcasecmp(type, MP4_HINT_TRACK_TYPE))
|
||||||
|
|
||||||
|
#define MP4_IS_SYSTEMS_TRACK_TYPE(type) \
|
||||||
|
(!strcasecmp(type, MP4_CLOCK_TRACK_TYPE) \
|
||||||
|
|| !strcasecmp(type, MP4_MPEG7_TRACK_TYPE) \
|
||||||
|
|| !strcasecmp(type, MP4_OCI_TRACK_TYPE) \
|
||||||
|
|| !strcasecmp(type, MP4_IPMP_TRACK_TYPE) \
|
||||||
|
|| !strcasecmp(type, MP4_MPEGJ_TRACK_TYPE))
|
||||||
|
|
||||||
|
/* MP4 Audio track types - see MP4AddAudioTrack()*/
|
||||||
|
#define MP4_INVALID_AUDIO_TYPE 0x00
|
||||||
|
#define MP4_MPEG1_AUDIO_TYPE 0x6B
|
||||||
|
#define MP4_MPEG2_AUDIO_TYPE 0x69
|
||||||
|
#define MP4_MP3_AUDIO_TYPE MP4_MPEG2_AUDIO_TYPE
|
||||||
|
#define MP4_MPEG2_AAC_MAIN_AUDIO_TYPE 0x66
|
||||||
|
#define MP4_MPEG2_AAC_LC_AUDIO_TYPE 0x67
|
||||||
|
#define MP4_MPEG2_AAC_SSR_AUDIO_TYPE 0x68
|
||||||
|
#define MP4_MPEG2_AAC_AUDIO_TYPE MP4_MPEG2_AAC_MAIN_AUDIO_TYPE
|
||||||
|
#define MP4_MPEG4_AUDIO_TYPE 0x40
|
||||||
|
#define MP4_PRIVATE_AUDIO_TYPE 0xC0
|
||||||
|
#define MP4_PCM16_LITTLE_ENDIAN_AUDIO_TYPE 0xE0 /* a private definition */
|
||||||
|
#define MP4_VORBIS_AUDIO_TYPE 0xE1 /* a private definition */
|
||||||
|
#define MP4_AC3_AUDIO_TYPE 0xE2 /* a private definition */
|
||||||
|
#define MP4_ALAW_AUDIO_TYPE 0xE3 /* a private definition */
|
||||||
|
#define MP4_ULAW_AUDIO_TYPE 0xE4 /* a private definition */
|
||||||
|
#define MP4_G723_AUDIO_TYPE 0xE5 /* a private definition */
|
||||||
|
#define MP4_PCM16_BIG_ENDIAN_AUDIO_TYPE 0xE6 /* a private definition */
|
||||||
|
|
||||||
|
/* MP4 MPEG-4 Audio types from 14496-3 Table 1.5.1 */
|
||||||
|
#define MP4_MPEG4_INVALID_AUDIO_TYPE 0
|
||||||
|
#define MP4_MPEG4_AAC_MAIN_AUDIO_TYPE 1
|
||||||
|
#define MP4_MPEG4_AAC_LC_AUDIO_TYPE 2
|
||||||
|
#define MP4_MPEG4_AAC_SSR_AUDIO_TYPE 3
|
||||||
|
#define MP4_MPEG4_AAC_LTP_AUDIO_TYPE 4
|
||||||
|
#define MP4_MPEG4_AAC_HE_AUDIO_TYPE 5
|
||||||
|
#define MP4_MPEG4_AAC_SCALABLE_AUDIO_TYPE 6
|
||||||
|
#define MP4_MPEG4_CELP_AUDIO_TYPE 8
|
||||||
|
#define MP4_MPEG4_HVXC_AUDIO_TYPE 9
|
||||||
|
#define MP4_MPEG4_TTSI_AUDIO_TYPE 12
|
||||||
|
#define MP4_MPEG4_MAIN_SYNTHETIC_AUDIO_TYPE 13
|
||||||
|
#define MP4_MPEG4_WAVETABLE_AUDIO_TYPE 14
|
||||||
|
#define MP4_MPEG4_MIDI_AUDIO_TYPE 15
|
||||||
|
#define MP4_MPEG4_ALGORITHMIC_FX_AUDIO_TYPE 16
|
||||||
|
#define MP4_MPEG4_ALS_AUDIO_TYPE 31
|
||||||
|
#define MP4_MPEG4_LAYER1_AUDIO_TYPE 32
|
||||||
|
#define MP4_MPEG4_LAYER2_AUDIO_TYPE 33
|
||||||
|
#define MP4_MPEG4_LAYER3_AUDIO_TYPE 34
|
||||||
|
#define MP4_MPEG4_SLS_AUDIO_TYPE 35
|
||||||
|
|
||||||
|
/* MP4 Audio type utilities following common usage */
|
||||||
|
#define MP4_IS_MP3_AUDIO_TYPE(type) \
|
||||||
|
((type) == MP4_MPEG1_AUDIO_TYPE || (type) == MP4_MPEG2_AUDIO_TYPE)
|
||||||
|
|
||||||
|
#define MP4_IS_MPEG2_AAC_AUDIO_TYPE(type) \
|
||||||
|
(((type) >= MP4_MPEG2_AAC_MAIN_AUDIO_TYPE \
|
||||||
|
&& (type) <= MP4_MPEG2_AAC_SSR_AUDIO_TYPE))
|
||||||
|
|
||||||
|
#define MP4_IS_MPEG4_AAC_AUDIO_TYPE(mpeg4Type) \
|
||||||
|
(((mpeg4Type) >= MP4_MPEG4_AAC_MAIN_AUDIO_TYPE \
|
||||||
|
&& (mpeg4Type) <= MP4_MPEG4_AAC_HE_AUDIO_TYPE) \
|
||||||
|
|| (mpeg4Type) == MP4_MPEG4_AAC_SCALABLE_AUDIO_TYPE \
|
||||||
|
|| (mpeg4Type) == 17)
|
||||||
|
|
||||||
|
#define MP4_IS_AAC_AUDIO_TYPE(type) \
|
||||||
|
(MP4_IS_MPEG2_AAC_AUDIO_TYPE(type) \
|
||||||
|
|| (type) == MP4_MPEG4_AUDIO_TYPE)
|
||||||
|
|
||||||
|
/* MP4 Video track types - see MP4AddVideoTrack() */
|
||||||
|
#define MP4_INVALID_VIDEO_TYPE 0x00
|
||||||
|
#define MP4_MPEG1_VIDEO_TYPE 0x6A
|
||||||
|
#define MP4_MPEG2_SIMPLE_VIDEO_TYPE 0x60
|
||||||
|
#define MP4_MPEG2_MAIN_VIDEO_TYPE 0x61
|
||||||
|
#define MP4_MPEG2_SNR_VIDEO_TYPE 0x62
|
||||||
|
#define MP4_MPEG2_SPATIAL_VIDEO_TYPE 0x63
|
||||||
|
#define MP4_MPEG2_HIGH_VIDEO_TYPE 0x64
|
||||||
|
#define MP4_MPEG2_442_VIDEO_TYPE 0x65
|
||||||
|
#define MP4_MPEG2_VIDEO_TYPE MP4_MPEG2_MAIN_VIDEO_TYPE
|
||||||
|
#define MP4_MPEG4_VIDEO_TYPE 0x20
|
||||||
|
#define MP4_JPEG_VIDEO_TYPE 0x6C
|
||||||
|
#define MP4_PRIVATE_VIDEO_TYPE 0xD0
|
||||||
|
#define MP4_YUV12_VIDEO_TYPE 0xF0 /* a private definition */
|
||||||
|
#define MP4_H263_VIDEO_TYPE 0xF2 /* a private definition */
|
||||||
|
#define MP4_H261_VIDEO_TYPE 0xF3 /* a private definition */
|
||||||
|
|
||||||
|
/* MP4 Video type utilities */
|
||||||
|
#define MP4_IS_MPEG1_VIDEO_TYPE(type) \
|
||||||
|
((type) == MP4_MPEG1_VIDEO_TYPE)
|
||||||
|
|
||||||
|
#define MP4_IS_MPEG2_VIDEO_TYPE(type) \
|
||||||
|
(((type) >= MP4_MPEG2_SIMPLE_VIDEO_TYPE \
|
||||||
|
&& (type) <= MP4_MPEG2_442_VIDEO_TYPE) \
|
||||||
|
|| MP4_IS_MPEG1_VIDEO_TYPE(type))
|
||||||
|
|
||||||
|
#define MP4_IS_MPEG4_VIDEO_TYPE(type) \
|
||||||
|
((type) == MP4_MPEG4_VIDEO_TYPE)
|
||||||
|
|
||||||
|
/* Mpeg4 Visual Profile Defines - ISO/IEC 14496-2:2001/Amd.2:2002(E) */
|
||||||
|
#define MPEG4_SP_L1 (0x1)
|
||||||
|
#define MPEG4_SP_L2 (0x2)
|
||||||
|
#define MPEG4_SP_L3 (0x3)
|
||||||
|
#define MPEG4_SP_L0 (0x8)
|
||||||
|
#define MPEG4_SSP_L1 (0x11)
|
||||||
|
#define MPEG4_SSP_L2 (0x12)
|
||||||
|
#define MPEG4_CP_L1 (0x21)
|
||||||
|
#define MPEG4_CP_L2 (0x22)
|
||||||
|
#define MPEG4_MP_L2 (0x32)
|
||||||
|
#define MPEG4_MP_L3 (0x33)
|
||||||
|
#define MPEG4_MP_L4 (0x34)
|
||||||
|
#define MPEG4_NBP_L2 (0x42)
|
||||||
|
#define MPEG4_STP_L1 (0x51)
|
||||||
|
#define MPEG4_SFAP_L1 (0x61)
|
||||||
|
#define MPEG4_SFAP_L2 (0x62)
|
||||||
|
#define MPEG4_SFBAP_L1 (0x63)
|
||||||
|
#define MPEG4_SFBAP_L2 (0x64)
|
||||||
|
#define MPEG4_BATP_L1 (0x71)
|
||||||
|
#define MPEG4_BATP_L2 (0x72)
|
||||||
|
#define MPEG4_HP_L1 (0x81)
|
||||||
|
#define MPEG4_HP_L2 (0x82)
|
||||||
|
#define MPEG4_ARTSP_L1 (0x91)
|
||||||
|
#define MPEG4_ARTSP_L2 (0x92)
|
||||||
|
#define MPEG4_ARTSP_L3 (0x93)
|
||||||
|
#define MPEG4_ARTSP_L4 (0x94)
|
||||||
|
#define MPEG4_CSP_L1 (0xa1)
|
||||||
|
#define MPEG4_CSP_L2 (0xa2)
|
||||||
|
#define MPEG4_CSP_L3 (0xa3)
|
||||||
|
#define MPEG4_ACEP_L1 (0xb1)
|
||||||
|
#define MPEG4_ACEP_L2 (0xb2)
|
||||||
|
#define MPEG4_ACEP_L3 (0xb3)
|
||||||
|
#define MPEG4_ACEP_L4 (0xb4)
|
||||||
|
#define MPEG4_ACP_L1 (0xc1)
|
||||||
|
#define MPEG4_ACP_L2 (0xc2)
|
||||||
|
#define MPEG4_AST_L1 (0xd1)
|
||||||
|
#define MPEG4_AST_L2 (0xd2)
|
||||||
|
#define MPEG4_AST_L3 (0xd3)
|
||||||
|
#define MPEG4_S_STUDIO_P_L1 (0xe1)
|
||||||
|
#define MPEG4_S_STUDIO_P_L2 (0xe2)
|
||||||
|
#define MPEG4_S_STUDIO_P_L3 (0xe3)
|
||||||
|
#define MPEG4_S_STUDIO_P_L4 (0xe4)
|
||||||
|
#define MPEG4_C_STUDIO_P_L1 (0xe5)
|
||||||
|
#define MPEG4_C_STUDIO_P_L2 (0xe6)
|
||||||
|
#define MPEG4_C_STUDIO_P_L3 (0xe7)
|
||||||
|
#define MPEG4_C_STUDIO_P_L4 (0xe8)
|
||||||
|
#define MPEG4_ASP_L0 (0xF0)
|
||||||
|
#define MPEG4_ASP_L1 (0xF1)
|
||||||
|
#define MPEG4_ASP_L2 (0xF2)
|
||||||
|
#define MPEG4_ASP_L3 (0xF3)
|
||||||
|
#define MPEG4_ASP_L4 (0xF4)
|
||||||
|
#define MPEG4_ASP_L5 (0xF5)
|
||||||
|
#define MPEG4_ASP_L3B (0xF7)
|
||||||
|
#define MPEG4_FGSP_L0 (0xf8)
|
||||||
|
#define MPEG4_FGSP_L1 (0xf9)
|
||||||
|
#define MPEG4_FGSP_L2 (0xfa)
|
||||||
|
#define MPEG4_FGSP_L3 (0xfb)
|
||||||
|
#define MPEG4_FGSP_L4 (0xfc)
|
||||||
|
#define MPEG4_FGSP_L5 (0xfd)
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/* 3GP specific utilities */
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4Make3GPCompliant(
|
||||||
|
const char* fileName,
|
||||||
|
char* majorBrand DEFAULT(0),
|
||||||
|
uint32_t minorVersion DEFAULT(0),
|
||||||
|
char** supportedBrands DEFAULT(NULL),
|
||||||
|
uint32_t supportedBrandsCount DEFAULT(0),
|
||||||
|
bool deleteIodsAtom DEFAULT(true) );
|
||||||
|
|
||||||
|
/* NOTE this section of functionality has not yet been fully tested */
|
||||||
|
|
||||||
|
/** Add an edit segment to a track.
|
||||||
|
*
|
||||||
|
* MP4AddTrackEdit adds an edit segment to the track edit list.
|
||||||
|
*
|
||||||
|
* The track edit list is a feature that allows creation of an alternate
|
||||||
|
* timeline for the track, typically cutting out segments of the full track to
|
||||||
|
* form a shortened, cleaned up version. The edit segments that form the edit
|
||||||
|
* list are a sequence of track start times and durations, they do not alter
|
||||||
|
* the track media in any way, i.e. no data can be lost via edit list
|
||||||
|
* operations.
|
||||||
|
*
|
||||||
|
* To read out the editted version of the track, use
|
||||||
|
* MP4ReadSampleFromEditTime() instead of MP4ReadSample().
|
||||||
|
*
|
||||||
|
* To export the editted version of the track to a new track, potentially in a
|
||||||
|
* new mp4 file, see MP4CopyTrack().
|
||||||
|
*
|
||||||
|
* Note with many media encodings such as MPEG-4, AAC and MP3, care must be
|
||||||
|
* taken when choosing the edit segment start times. E.g. for video tracks a
|
||||||
|
* reference or key frame should be selected as the starting sample of any
|
||||||
|
* edit segment. For audio tracks, an audio sample start time should be used.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param editId specifies the desired position in the edit list sequence for
|
||||||
|
* the new edit segment. If the value is MP4_INVALID_EDIT_ID, then the
|
||||||
|
* edit segment is added at the end of the existing edit list. Note
|
||||||
|
* editId's start with the value of 1, not 0.
|
||||||
|
* @param startTime specifies the starting time of the edit segment in the
|
||||||
|
* track time scale.
|
||||||
|
* @param duration specifies the duration of the edit segment in the track
|
||||||
|
* time scale.
|
||||||
|
* @param dwell If false, the track media should be played at its normal rate.
|
||||||
|
* If true, the media should be paused for the duration of this edit
|
||||||
|
* segment. This is a mechanism by which one can delay the start of a
|
||||||
|
* media track.
|
||||||
|
*
|
||||||
|
* @return Upon success, the edit id of the new edit segment. Upon an error,
|
||||||
|
* MP4_INVALID_EDIT_ID.
|
||||||
|
*
|
||||||
|
* @see MP4DeleteTrackEdit()
|
||||||
|
* @see MP4ReadSampleFromEditTime()
|
||||||
|
* @see MP4CopyTrack()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4EditId MP4AddTrackEdit(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4EditId editId DEFAULT(MP4_INVALID_EDIT_ID),
|
||||||
|
MP4Timestamp startTime DEFAULT(0),
|
||||||
|
MP4Duration duration DEFAULT(0),
|
||||||
|
bool dwell DEFAULT(false) );
|
||||||
|
|
||||||
|
/** Delete a track edit segment.
|
||||||
|
*
|
||||||
|
* MP4DeleteTrackEdit deletes the specified track edit segment. Note that
|
||||||
|
* since editId's form a sequence, deleting an editId will cause all edit
|
||||||
|
* segments with editId's greater than the deleted one to be reassigned to
|
||||||
|
* their editId minus one.
|
||||||
|
*
|
||||||
|
* Deleting an edit segment does not delete any media samples.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param editId specifies the edit segment to be deleted.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4AddTrackEdit()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4DeleteTrackEdit(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4EditId editId );
|
||||||
|
|
||||||
|
/** Get the number of edit segments for a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackNumberOfEdits returns the number of edit segments in the
|
||||||
|
* specified track in the mp4 file. Edit id's are the consecutive sequence of
|
||||||
|
* numbers from 1 to the total number of edit segments, i.e. 1-based indexing,
|
||||||
|
* not 0-based indexing.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the number of edit segments is
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* @return Upon success, the number of edit segments for the track. Upon an
|
||||||
|
* error, 0.
|
||||||
|
*
|
||||||
|
* @see MP4AddTrackEdit()
|
||||||
|
* @see MP4DeleteTrackEdit()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint32_t MP4GetTrackNumberOfEdits(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the start time of a track edit segment.
|
||||||
|
*
|
||||||
|
* MP4GetTrackEditStart returns the start time of the specified track edit
|
||||||
|
* segment in the timeline of the track edit list.
|
||||||
|
*
|
||||||
|
* Caveat: The value is in units of the track time scale.
|
||||||
|
*
|
||||||
|
* Note that this differs from the edit segment media start time,
|
||||||
|
* MP4GetTrackEditMediaStart(). For example:
|
||||||
|
*
|
||||||
|
* EditId | Start | MediaStart | Duration
|
||||||
|
* -------|-------|------------|---------
|
||||||
|
* 1 | 0 | 15 | 30
|
||||||
|
* 2 | 30 | 120 | 20
|
||||||
|
* 3 | 50 | 3000 | 10
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param editId specifies the edit segment for which the start time is
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* @return The start time of the edit segment in track time scale units of the
|
||||||
|
* track in the mp4 file.
|
||||||
|
*
|
||||||
|
* @see MP4SetTrackEditStart()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Timestamp MP4GetTrackEditStart(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4EditId editId );
|
||||||
|
|
||||||
|
/** Get the total duration of a sequence of track edit segments.
|
||||||
|
*
|
||||||
|
* MP4GetTrackEditTotalDuration returns the total duration of the specified
|
||||||
|
* sequence of track edit segments from the first edit segment up to and
|
||||||
|
* including the specified edit segment. If the edit id value is
|
||||||
|
* MP4_INVALID_EDIT_ID, then the total duration of all of the edit segments is
|
||||||
|
* returned.
|
||||||
|
*
|
||||||
|
* Caveat: The value is in units of the track time scale.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param editId specifies the edit segment for which the total duration is
|
||||||
|
* desired. A value of MP4_INVALID_EDIT_ID specifies that all edit
|
||||||
|
* segments should be included.
|
||||||
|
*
|
||||||
|
* @return The total duration of the edit segment sequence in track time scale
|
||||||
|
* units of the track in the mp4 file.
|
||||||
|
*
|
||||||
|
* @see MP4GetTrackEditDuration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Duration MP4GetTrackEditTotalDuration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4EditId editId DEFAULT(MP4_INVALID_EDIT_ID) );
|
||||||
|
|
||||||
|
/** Get the media start time of a track edit segment.
|
||||||
|
*
|
||||||
|
* MP4GetTrackEditMediaStart returns the media start time of the specified
|
||||||
|
* track edit segment.
|
||||||
|
*
|
||||||
|
* Caveat: The value is in units of the track time scale.
|
||||||
|
*
|
||||||
|
* Note that this differs from the edit segment start time,
|
||||||
|
* MP4GetTrackEditStart(). For example:
|
||||||
|
*
|
||||||
|
* EditId | Start | MediaStart | Duration
|
||||||
|
* -------|-------|------------|---------
|
||||||
|
* 1 | 0 | 15 | 30
|
||||||
|
* 2 | 30 | 120 | 20
|
||||||
|
* 3 | 50 | 3000 | 10
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param editId specifies the edit segment for which the media start time is
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* @return The media start time of the edit segment in track time scale units
|
||||||
|
* of the track in the mp4 file.
|
||||||
|
*
|
||||||
|
* @see MP4SetTrackEditMediaStart()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Timestamp MP4GetTrackEditMediaStart(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4EditId editId );
|
||||||
|
|
||||||
|
/** Set the media start time of a track edit segment.
|
||||||
|
*
|
||||||
|
* MP4SetTrackEditMediaStart sets the media start time of the specified edit
|
||||||
|
* segment from the specified track in the track time scale units. See
|
||||||
|
* MP4ConvertToTrackTimestamp() for how to map this value from another time
|
||||||
|
* scale.
|
||||||
|
*
|
||||||
|
* Note that this differs from the edit segment start time. For example:
|
||||||
|
*
|
||||||
|
* EditId | Start | MediaStart | Duration
|
||||||
|
* -------|-------|------------|---------
|
||||||
|
* 1 | 0 | 15 | 30
|
||||||
|
* 2 | 30 | 120 | 20
|
||||||
|
* 3 | 50 | 3000 | 10
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param editId specifies the edit segment to which the operation applies.
|
||||||
|
* Caveat: the first edit has id 1 not 0.
|
||||||
|
* @param startTime specifies the new value for the media start in track time
|
||||||
|
* scale units.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetTrackEditMediaStart()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackEditMediaStart(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4EditId editId,
|
||||||
|
MP4Timestamp startTime );
|
||||||
|
|
||||||
|
/** Get the duration of a track edit segment.
|
||||||
|
*
|
||||||
|
* MP4GetTrackEditDuration returns the duration of the specified track edit
|
||||||
|
* segment.
|
||||||
|
*
|
||||||
|
* Caveat: The value is in units of the track time scale.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param editId specifies the edit segment for which the duration is desired.
|
||||||
|
*
|
||||||
|
* @return The duration of the edit segment in track time scale units of the
|
||||||
|
* track in the mp4 file.
|
||||||
|
*
|
||||||
|
* @see MP4SetTrackEditDuration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Duration MP4GetTrackEditDuration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4EditId editId );
|
||||||
|
|
||||||
|
/** Set the duration of a track edit segment.
|
||||||
|
*
|
||||||
|
* MP4SetTrackEditDuration sets the duration of the specified edit segment
|
||||||
|
* from the specified track in the track time scale units. See
|
||||||
|
* MP4ConvertToTrackDuration() for how to map this value from another time
|
||||||
|
* scale.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param editId specifies the edit segment to which the operation applies.
|
||||||
|
* Caveat: the first edit has id 1 not 0.
|
||||||
|
* @param duration specifies the new value for the duration in track time
|
||||||
|
* scale units.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetTrackEditDuration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackEditDuration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4EditId editId,
|
||||||
|
MP4Duration duration );
|
||||||
|
|
||||||
|
/** Get the dwell value of a track edit segment.
|
||||||
|
*
|
||||||
|
* MP4GetTrackEditDwell returns the dwell value of the specified track edit
|
||||||
|
* segment. A value of true (1) indicates that during this edit segment the
|
||||||
|
* media will be paused; a value of false (0) indicates that during this edit
|
||||||
|
* segment the media will be played at its normal rate.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param editId specifies the edit segment for which the dwell value is
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* @return The dwell value of the edit segment of the track in the mp4 file.
|
||||||
|
*
|
||||||
|
* @see MP4SetTrackEditDwell()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
int8_t MP4GetTrackEditDwell(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4EditId editId );
|
||||||
|
|
||||||
|
/** Set the dwell value of a track edit segment.
|
||||||
|
*
|
||||||
|
* MP4SetTrackEditDwell sets the dwell value of the specified edit segment
|
||||||
|
* from the specified track.
|
||||||
|
*
|
||||||
|
* A value of true (1) indicates that during this edit segment the media will
|
||||||
|
* be paused; a value of false (0) indicates that during this edit segment the
|
||||||
|
* media will be played at its normal rate.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param editId specifies the edit segment to which the operation applies.
|
||||||
|
* Caveat: the first edit has id 1 not 0.
|
||||||
|
* @param dwell specifies the new dwell value.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetTrackEditDwell()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackEditDwell(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4EditId editId,
|
||||||
|
bool dwell );
|
||||||
|
|
||||||
|
/** Read a track sample based on a specified edit list time.
|
||||||
|
*
|
||||||
|
* MP4ReadSampleFromEditTime reads the sample corresponding to the time on the
|
||||||
|
* track edit list timeline from the specified track. Typically this sample is
|
||||||
|
* then decoded in a codec dependent fashion and rendered in an appropriate
|
||||||
|
* fashion.
|
||||||
|
*
|
||||||
|
* The argument, <b>ppBytes</b>, allows for two possible approaches for
|
||||||
|
* buffering:
|
||||||
|
*
|
||||||
|
* @li If the calling application wishes to handle its own buffering it can
|
||||||
|
* set <b>*ppBytes</b> to the buffer it wishes to use. The calling
|
||||||
|
* application is responsible for ensuring that the buffer is large enough
|
||||||
|
* to hold the sample. This can be done by using either MP4GetSampleSize()
|
||||||
|
* or MP4GetTrackMaxSampleSize() to determine beforehand how large the
|
||||||
|
* receiving buffer must be.
|
||||||
|
*
|
||||||
|
* @li If the value of <b>*ppBytes</b> is NULL, then an appropriately sized
|
||||||
|
* buffer is automatically allocated for the sample data and
|
||||||
|
* <b>*ppBytes</b> set to this pointer. The calling application is
|
||||||
|
* responsible for freeing this memory with MP4Free().
|
||||||
|
*
|
||||||
|
* The last four arguments are pointers to variables that can receive optional
|
||||||
|
* sample information.
|
||||||
|
*
|
||||||
|
* Typically for audio none of these are needed. MPEG audio such as MP3 or AAC
|
||||||
|
* has a fixed sample duration and every sample can be accessed at random.
|
||||||
|
*
|
||||||
|
* For video, all of these optional values could be needed. MPEG video can be
|
||||||
|
* encoded at a variable frame rate, with only occasional random access
|
||||||
|
* points, and with "B frames" which cause the rendering (display) order of
|
||||||
|
* the video frames to differ from the storage/decoding order.
|
||||||
|
*
|
||||||
|
* Other media types fall between these two extremes.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param when specifies which sample is to be read based on a time in the
|
||||||
|
* edit list timeline. See MP4GetSampleIdFromEditTime() for details.
|
||||||
|
* @param ppBytes Pointer to the pointer to the sample data. See function
|
||||||
|
* description above for details on this argument.
|
||||||
|
* @param pNumBytes Pointer to variable that will be hold the size in bytes of
|
||||||
|
* the sample.
|
||||||
|
* @param pStartTime If non-NULL, pointer to variable that will receive the
|
||||||
|
* starting timestamp for this sample. Caveat: The timestamp is in the
|
||||||
|
* track timescale.
|
||||||
|
* @param pDuration If non-NULL, pointer to variable that will receive the
|
||||||
|
* duration for this sample. Caveat: The duration is in the track
|
||||||
|
* timescale units.
|
||||||
|
* @param pRenderingOffset If non-NULL, pointer to variable that will receive
|
||||||
|
* the rendering offset for this sample. Currently the only media type
|
||||||
|
* that needs this feature is MPEG video. Caveat: The offset is in the
|
||||||
|
* track timescale units.
|
||||||
|
* @param pIsSyncSample If non-NULL, pointer to variable that will receive the
|
||||||
|
* state of the sync/random access flag for this sample.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4ReadSample()
|
||||||
|
* @see MP4GetSampleIdFromEditTime()
|
||||||
|
* @see MP4ReadSampleFromTime()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4ReadSampleFromEditTime(
|
||||||
|
/* input parameters */
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4Timestamp when,
|
||||||
|
/* input/output parameters */
|
||||||
|
uint8_t** ppBytes,
|
||||||
|
uint32_t* pNumBytes,
|
||||||
|
/* output parameters */
|
||||||
|
MP4Timestamp* pStartTime DEFAULT(NULL),
|
||||||
|
MP4Duration* pDuration DEFAULT(NULL),
|
||||||
|
MP4Duration* pRenderingOffset DEFAULT(NULL),
|
||||||
|
bool* pIsSyncSample DEFAULT(NULL) );
|
||||||
|
|
||||||
|
/** Get the sample id of a specified time in the edit list timeline.
|
||||||
|
*
|
||||||
|
* MP4GetSampleIdFromEditTime returns the sample id of the track sample in
|
||||||
|
* which the specified time occurs in the edit list timeline.
|
||||||
|
*
|
||||||
|
* The specified time should be in the track time scale. See
|
||||||
|
* MP4ConvertToTrackTimestamp() for how to map a time value to this time
|
||||||
|
* scale.
|
||||||
|
*
|
||||||
|
* Since the edit list can cause the sample start time and duration to be
|
||||||
|
* different that it in the standard track timeline, it is strongly advised
|
||||||
|
* that the caller retrieve the new sample start time and duration via this
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param when specifies the time in the track time scale that is desired.
|
||||||
|
* @param pStartTime If non-NULL, pointer to variable that will receive the
|
||||||
|
* starting timestamp for this sample. Caveat: The timestamp is in the
|
||||||
|
* track edit list timescale.
|
||||||
|
* @param pDuration If non-NULL, pointer to variable that will receive the
|
||||||
|
* duration for this sample in the edit list timeline. Caveat: The
|
||||||
|
* duration is in the track timescale units.
|
||||||
|
*
|
||||||
|
* @return Upon success, the sample id that occurs at the specified time. Upon
|
||||||
|
* an error, MP4_INVALID_SAMPLE_ID.
|
||||||
|
*
|
||||||
|
* @see MP4GetSampleIdFromTime()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4SampleId MP4GetSampleIdFromEditTime(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4Timestamp when,
|
||||||
|
MP4Timestamp* pStartTime DEFAULT(NULL),
|
||||||
|
MP4Duration* pDuration DEFAULT(NULL) );
|
||||||
|
|
||||||
|
/* time conversion utilties */
|
||||||
|
|
||||||
|
/* predefined values for timeScale parameter below */
|
||||||
|
#define MP4_SECONDS_TIME_SCALE 1
|
||||||
|
#define MP4_MILLISECONDS_TIME_SCALE 1000
|
||||||
|
#define MP4_MICROSECONDS_TIME_SCALE 1000000
|
||||||
|
#define MP4_NANOSECONDS_TIME_SCALE 1000000000
|
||||||
|
|
||||||
|
#define MP4_SECS_TIME_SCALE MP4_SECONDS_TIME_SCALE
|
||||||
|
#define MP4_MSECS_TIME_SCALE MP4_MILLISECONDS_TIME_SCALE
|
||||||
|
#define MP4_USECS_TIME_SCALE MP4_MICROSECONDS_TIME_SCALE
|
||||||
|
#define MP4_NSECS_TIME_SCALE MP4_NANOSECONDS_TIME_SCALE
|
||||||
|
|
||||||
|
/** Convert a duration from the movie (file) time scale to a specified time
|
||||||
|
* scale.
|
||||||
|
*
|
||||||
|
* MP4ConvertFromMovieDuration converts a duration such as the total movie
|
||||||
|
* (file) duration from the movie time scale to another specified time scale.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param duration specifies the duration that is to be converted.
|
||||||
|
* @param timeScale specifies the new time scale in ticks per second to which
|
||||||
|
* the duration should be converted.
|
||||||
|
*
|
||||||
|
* @return Upon success, the duration in the new time scale units. Upon error,
|
||||||
|
* (uint64_t) MP4_INVALID_DURATION.
|
||||||
|
*
|
||||||
|
* @see MP4GetDuration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint64_t MP4ConvertFromMovieDuration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4Duration duration,
|
||||||
|
uint32_t timeScale );
|
||||||
|
|
||||||
|
/** Convert a timestamp from the track time scale to a specified time scale.
|
||||||
|
*
|
||||||
|
* MP4ConvertFromTrackTimestamp converts a timestamp such as a sample start
|
||||||
|
* time from the track time scale to another specified time scale. This can be
|
||||||
|
* used by a player application to map all track samples to a common time
|
||||||
|
* scale.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track from which the timestamp originates.
|
||||||
|
* @param timeStamp specifies the timestamp that is to be converted.
|
||||||
|
* @param timeScale specifies the new time scale in ticks per second to which
|
||||||
|
* the timestamp should be converted.
|
||||||
|
*
|
||||||
|
* @return Upon success, the timestamp in the new time scale units. Upon
|
||||||
|
* error, (uint64_t) MP4_INVALID_TIMESTAMP.
|
||||||
|
*
|
||||||
|
* @see MP4ConvertToTrackTimestamp()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint64_t MP4ConvertFromTrackTimestamp(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4Timestamp timeStamp,
|
||||||
|
uint32_t timeScale );
|
||||||
|
|
||||||
|
/** Convert a timestamp from a specified time scale to the track time scale.
|
||||||
|
*
|
||||||
|
* MP4ConvertToTrackTimestamp converts a timestamp such as a sample start time
|
||||||
|
* from the specified time scale to the track time scale.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
* @param timeStamp specifies the timestamp that is to be converted.
|
||||||
|
* @param timeScale specifies the time scale in ticks per second in which the
|
||||||
|
* timestamp is currently expressed.
|
||||||
|
*
|
||||||
|
* @return Upon success, the timestamp in the track time scale units. Upon
|
||||||
|
* error, MP4_INVALID_TIMESTAMP.
|
||||||
|
*
|
||||||
|
* @see MP4ConvertFromTrackTimestamp()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Timestamp MP4ConvertToTrackTimestamp(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint64_t timeStamp,
|
||||||
|
uint32_t timeScale );
|
||||||
|
|
||||||
|
/** Convert duration from track time scale to an arbitrary time scale.
|
||||||
|
*
|
||||||
|
* MP4ConvertFromTrackDuration converts a duration such as a sample duration
|
||||||
|
* from the track time scale to another time scale. This can be used by a
|
||||||
|
* player application to map all track samples to a common time scale.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param duration value to be converted.
|
||||||
|
* @param timeScale time scale in ticks per second.
|
||||||
|
*
|
||||||
|
* @return On success, the duration in arbitrary time scale units.
|
||||||
|
* On error, (uint64_t) MP4_INVALID_DURATION.
|
||||||
|
*
|
||||||
|
* @see MP4GetSampleDuration()
|
||||||
|
* @see MP4ConvertToTrackDuration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint64_t MP4ConvertFromTrackDuration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4Duration duration,
|
||||||
|
uint32_t timeScale );
|
||||||
|
|
||||||
|
/** Convert duration from arbitrary time scale to track time scale.
|
||||||
|
*
|
||||||
|
* MP4ConvertToTrackDuration converts a duration such as a sample duration
|
||||||
|
* from the specified time scale to the track time scale.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param duration value to be converted.
|
||||||
|
* @param timeScale time scale in ticks per second.
|
||||||
|
*
|
||||||
|
* @return On success, the duration in track time scale units.
|
||||||
|
* On error, #MP4_INVALID_DURATION.
|
||||||
|
*
|
||||||
|
* @see MP4ConvertFromTrackDuration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Duration MP4ConvertToTrackDuration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint64_t duration,
|
||||||
|
uint32_t timeScale );
|
||||||
|
|
||||||
|
/** Convert binary data to a base 16 string.
|
||||||
|
*
|
||||||
|
* MP4BinaryToBase16 converts binary data to a base 16 string. This encoding
|
||||||
|
* maps groups of 4 bits into the character set [0-9a-f]. The string is in
|
||||||
|
* newly allocated memory, so the caller is responsible for freeing the memory
|
||||||
|
* with MP4Free().
|
||||||
|
*
|
||||||
|
* This utility is useful for generating the SDP descriptions for some RTP
|
||||||
|
* payloads.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* 0x12, 0xAB -> "12ab"
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param pData specifies the pointer to the binary data.
|
||||||
|
* @param dataSize specifies the size in bytes of the binary data.
|
||||||
|
*
|
||||||
|
* @return Upon success, a null terminated string representing the data in
|
||||||
|
* base 16. Upon error, NULL.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
char* MP4BinaryToBase16(
|
||||||
|
const uint8_t* pData,
|
||||||
|
uint32_t dataSize );
|
||||||
|
|
||||||
|
/** Convert binary data to a base 64 string.
|
||||||
|
*
|
||||||
|
* MP4BinaryToBase64 converts binary data to a base 64 string. This encoding
|
||||||
|
* maps groups of 6 bits into the character set [A-Za-z0-9+/=]. The string is
|
||||||
|
* in newly allocated memory, so the caller is responsible for freeing the
|
||||||
|
* memory with MP4Free().
|
||||||
|
*
|
||||||
|
* This utility is useful for generating the SDP descriptions for some RTP
|
||||||
|
* payloads.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* 0x12, 0xAB -> "Eqs="
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param pData specifies the pointer to the binary data.
|
||||||
|
* @param dataSize specifies the size in bytes of the binary data.
|
||||||
|
*
|
||||||
|
* @return Upon success, a null terminated string representing the data in
|
||||||
|
* base 64. Upon error, NULL.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
char* MP4BinaryToBase64(
|
||||||
|
const uint8_t* pData,
|
||||||
|
uint32_t dataSize );
|
||||||
|
|
||||||
|
/** Free memory allocated by other library functions.
|
||||||
|
*
|
||||||
|
* MP4Free frees a block of memory previously allocated by another library
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* Generally, library functions that allocate memory specify in their
|
||||||
|
* documentation whether MP4Free or another function must be used to free that
|
||||||
|
* memory.
|
||||||
|
*
|
||||||
|
* @param p specifies a pointer to the memory block to free.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4Free(
|
||||||
|
void* p );
|
||||||
|
|
||||||
|
/** Set the current log handler function.
|
||||||
|
*
|
||||||
|
* MP4SetLogCallback sets the function to call to output diagnostic
|
||||||
|
* information in place of the default log handler. The signature of the
|
||||||
|
* specified function must be compatible with the MP4LogCallback typedef.
|
||||||
|
*
|
||||||
|
* @param cb_func specifies the new log handler function.
|
||||||
|
*
|
||||||
|
* @see MP4LogCallback
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4SetLogCallback(
|
||||||
|
MP4LogCallback cb_func );
|
||||||
|
|
||||||
|
/** Get the current maximum log level.
|
||||||
|
*
|
||||||
|
* MP4LogGetLevel returns the currently set maximum level of diagnostic
|
||||||
|
* information passed to the log handler.
|
||||||
|
*
|
||||||
|
* @return the current maximum level of diagnostic information.
|
||||||
|
*
|
||||||
|
* @see MP4LogSetLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4LogLevel MP4LogGetLevel( void );
|
||||||
|
|
||||||
|
/** Set the maximum log level.
|
||||||
|
*
|
||||||
|
* MP4LogSetLevel sets the maximum level of diagnostic information passed to
|
||||||
|
* the current log handler.
|
||||||
|
*
|
||||||
|
* @param verbosity specifies the log level to set.
|
||||||
|
*
|
||||||
|
* @see MP4LogGetLevel()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4LogSetLevel(
|
||||||
|
MP4LogLevel verbosity );
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_GENERAL_H */
|
||||||
140
third_party/include/mp4v2/isma.h
vendored
Normal file
140
third_party/include/mp4v2/isma.h
vendored
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dave Mackie, dmackie@cisco.com
|
||||||
|
* Alix Marchandise-Franquet, alix@cisco.com
|
||||||
|
* Bill May, wmay@cisco.com
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_ISMA_H
|
||||||
|
#define MP4V2_ISMA_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_isma MP4v2 ISMA (Internet Streaming Media Alliance)
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/** something */
|
||||||
|
typedef struct mp4v2_ismacryp_session_params {
|
||||||
|
uint32_t scheme_type;
|
||||||
|
uint16_t scheme_version;
|
||||||
|
uint8_t key_ind_len;
|
||||||
|
uint8_t iv_len;
|
||||||
|
uint8_t selective_enc;
|
||||||
|
const char* kms_uri;
|
||||||
|
} mp4v2_ismacrypParams;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* API to initialize ismacryp properties to sensible defaults
|
||||||
|
* if input param is null, a params struct is allocated
|
||||||
|
*/
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
mp4v2_ismacrypParams* MP4DefaultISMACrypParams(
|
||||||
|
mp4v2_ismacrypParams* ptr );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddEncAudioTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timeScale,
|
||||||
|
MP4Duration sampleDuration,
|
||||||
|
mp4v2_ismacrypParams* icPp,
|
||||||
|
uint8_t audioType DEFAULT(MP4_MPEG4_AUDIO_TYPE) );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddEncVideoTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timeScale,
|
||||||
|
MP4Duration sampleDuration,
|
||||||
|
uint16_t width,
|
||||||
|
uint16_t height,
|
||||||
|
mp4v2_ismacrypParams* icPp,
|
||||||
|
uint8_t videoType DEFAULT(MP4_MPEG4_VIDEO_TYPE),
|
||||||
|
const char* oFormat DEFAULT(NULL) );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddEncH264VideoTrack(
|
||||||
|
MP4FileHandle dstFile,
|
||||||
|
uint32_t timeScale,
|
||||||
|
MP4Duration sampleDuration,
|
||||||
|
uint16_t width,
|
||||||
|
uint16_t height,
|
||||||
|
MP4FileHandle srcFile,
|
||||||
|
MP4TrackId srcTrackId,
|
||||||
|
mp4v2_ismacrypParams* icPp );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4EncAndCloneTrack(
|
||||||
|
MP4FileHandle srcFile,
|
||||||
|
MP4TrackId srcTrackId,
|
||||||
|
mp4v2_ismacrypParams* icPp,
|
||||||
|
MP4FileHandle dstFile DEFAULT(MP4_INVALID_FILE_HANDLE),
|
||||||
|
MP4TrackId dstHintTrackReferenceTrack DEFAULT(MP4_INVALID_TRACK_ID) );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4EncAndCopyTrack(
|
||||||
|
MP4FileHandle srcFile,
|
||||||
|
MP4TrackId srcTrackId,
|
||||||
|
mp4v2_ismacrypParams* icPp,
|
||||||
|
encryptFunc_t encfcnp,
|
||||||
|
uint32_t encfcnparam1,
|
||||||
|
MP4FileHandle dstFile DEFAULT(MP4_INVALID_FILE_HANDLE),
|
||||||
|
bool applyEdits DEFAULT(false),
|
||||||
|
MP4TrackId dstHintTrackReferenceTrack DEFAULT(MP4_INVALID_TRACK_ID) );
|
||||||
|
|
||||||
|
/** Add ISMA compliant OD and Scene tracks.
|
||||||
|
*
|
||||||
|
* MP4MakeIsmaCompliant modifies an mp4 file so that it complies with the
|
||||||
|
* minimal MPEG-4 Systems requirements defined by the Internet Streaming Media
|
||||||
|
* Alliance (ISMA).
|
||||||
|
*
|
||||||
|
* This involves creating an OD and Scene track, and using them to describe a
|
||||||
|
* simple scene of one audio, or one video, or one of each. Whether an SDP
|
||||||
|
* version of this information is added to the mp4 file can be controlled with
|
||||||
|
* the @p addIsmaComplianceSdp parameter.
|
||||||
|
*
|
||||||
|
* Caveat: whether the file is truly ISMA compliant also depends on the
|
||||||
|
* contents of the media and hint tracks. This function does not guarantee
|
||||||
|
* that these tracks are compliant.
|
||||||
|
*
|
||||||
|
* @param fileName specifies the path name of the file to be modified.
|
||||||
|
* @param addIsmaComplianceSdp specifies whether an SDP declaring ISMA
|
||||||
|
* compliance should be added to the file.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4MakeIsmaCompliant(
|
||||||
|
const char* fileName,
|
||||||
|
bool addIsmaComplianceSdp DEFAULT(true) );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
char* MP4MakeIsmaSdpIod(
|
||||||
|
uint8_t videoProfile,
|
||||||
|
uint32_t videoBitrate,
|
||||||
|
uint8_t* videoConfig,
|
||||||
|
uint32_t videoConfigLength,
|
||||||
|
uint8_t audioProfile,
|
||||||
|
uint32_t audioBitrate,
|
||||||
|
uint8_t* audioConfig,
|
||||||
|
uint32_t audioConfigLength );
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_ISMA_H */
|
||||||
243
third_party/include/mp4v2/itmf_generic.h
vendored
Normal file
243
third_party/include/mp4v2/itmf_generic.h
vendored
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
* 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 MP4v2.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Kona Blend.
|
||||||
|
* Portions created by Kona Blend are Copyright (C) 2009.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Kona Blend, kona8lend@gmail.com
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_ITMF_GENERIC_H
|
||||||
|
#define MP4V2_ITMF_GENERIC_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_itmf_generic MP4v2 iTMF (iTunes Metadata Format) Generic
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* This is a low-level API used to manage iTMF metadata.
|
||||||
|
*
|
||||||
|
* It provides support for virtually any kind of iTMF metadata item, including
|
||||||
|
* meaning atoms, sometimes referred to as reverse-DNS meanings. Structures
|
||||||
|
* are directly modified; i.e. there are no fuctions which modify values for
|
||||||
|
* you. There is little type-safety, logic checks, or specifications
|
||||||
|
* compliance checks. For these reasons it is recommended to use iTMF Tags API
|
||||||
|
* when possible.
|
||||||
|
*
|
||||||
|
* At the heart of this API is an #MP4ItmfItem which corresponds to an iTMF
|
||||||
|
* metadata item atom. The item, and any recursive data structures contained
|
||||||
|
* within require <b>manual</b> memory management. The general rule to follow
|
||||||
|
* is that you must always check/free a ptr if you intend to resize data. In
|
||||||
|
* cases where you know the existing data size is exactly what is needed, you
|
||||||
|
* may overwrite the buffer contents.
|
||||||
|
*
|
||||||
|
* Each item always has at least 1 data elements which corresponds to a data
|
||||||
|
* atom. Additionally, each item has optional <b>mean</b> and <b>name</b>
|
||||||
|
* values which correspond to mean and name atoms.
|
||||||
|
*
|
||||||
|
* Each #MP4ItmfItem has a list of #MP4ItmfData. Similarily, care must be
|
||||||
|
* taken to manage memory with one key difference; these structures also have
|
||||||
|
* a valueSize field. If value is NULL then set valueSize=0. Otherwise, set
|
||||||
|
* valueSize to the size (in bytes) of value buffer.
|
||||||
|
*
|
||||||
|
* In rare cases where the number of data elements in a single item is > 1,
|
||||||
|
* the user must manually free/alloc/copy the <b>elements</b> buffer and
|
||||||
|
* update <b>size</b> accordingly.
|
||||||
|
*
|
||||||
|
* The mp4 file structure is modified only when MP4AddItem(), MP4SetItem() and
|
||||||
|
* MP4RemoveItem() are used. Simply free'ing the item list does not modify the
|
||||||
|
* mp4 file.
|
||||||
|
*
|
||||||
|
* <b>iTMF Generic read workflow:</b>
|
||||||
|
*
|
||||||
|
* @li MP4ItmfGetItems()
|
||||||
|
* @li inspect each item...
|
||||||
|
* @li MP4ItmfItemListFree()
|
||||||
|
*
|
||||||
|
* <b>iTMF Generic read/modify/remove workflow:</b>
|
||||||
|
*
|
||||||
|
* @li MP4ItmfGetItems()
|
||||||
|
* @li inspect/modify item...
|
||||||
|
* @li MP4ItmfSetItem() each modified item...
|
||||||
|
* @li MP4ItmfRemoveItem()...
|
||||||
|
* @li MP4ItmfItemListFree()
|
||||||
|
*
|
||||||
|
* <b>iTMF Generic add workflow:</b>
|
||||||
|
*
|
||||||
|
* @li MP4ItmfItemAlloc()
|
||||||
|
* @li MP4ItmfAddItem()
|
||||||
|
* @li MP4ItmfItemFree()
|
||||||
|
*
|
||||||
|
* @par Warning:
|
||||||
|
* Care must be taken when using multiple mechanisms to modify an open mp4
|
||||||
|
* file as it is not thread-safe, nor does it permit overlapping different API
|
||||||
|
* workflows which have a begin/end to their workflow. That is to say do not
|
||||||
|
* interleave an iTMF Generic workflow with an iTMF Tags workflow.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/** Basic types of value data as enumerated in spec. */
|
||||||
|
typedef enum MP4ItmfBasicType_e
|
||||||
|
{
|
||||||
|
MP4_ITMF_BT_IMPLICIT = 0, /**< for use with tags for which no type needs to be indicated */
|
||||||
|
MP4_ITMF_BT_UTF8 = 1, /**< without any count or null terminator */
|
||||||
|
MP4_ITMF_BT_UTF16 = 2, /**< also known as UTF-16BE */
|
||||||
|
MP4_ITMF_BT_SJIS = 3, /**< deprecated unless it is needed for special Japanese characters */
|
||||||
|
MP4_ITMF_BT_HTML = 6, /**< the HTML file header specifies which HTML version */
|
||||||
|
MP4_ITMF_BT_XML = 7, /**< the XML header must identify the DTD or schemas */
|
||||||
|
MP4_ITMF_BT_UUID = 8, /**< also known as GUID; stored as 16 bytes in binary (valid as an ID) */
|
||||||
|
MP4_ITMF_BT_ISRC = 9, /**< stored as UTF-8 text (valid as an ID) */
|
||||||
|
MP4_ITMF_BT_MI3P = 10, /**< stored as UTF-8 text (valid as an ID) */
|
||||||
|
MP4_ITMF_BT_GIF = 12, /**< (deprecated) a GIF image */
|
||||||
|
MP4_ITMF_BT_JPEG = 13, /**< a JPEG image */
|
||||||
|
MP4_ITMF_BT_PNG = 14, /**< a PNG image */
|
||||||
|
MP4_ITMF_BT_URL = 15, /**< absolute, in UTF-8 characters */
|
||||||
|
MP4_ITMF_BT_DURATION = 16, /**< in milliseconds, 32-bit integer */
|
||||||
|
MP4_ITMF_BT_DATETIME = 17, /**< in UTC, counting seconds since midnight, January 1, 1904; 32 or 64-bits */
|
||||||
|
MP4_ITMF_BT_GENRES = 18, /**< a list of enumerated values */
|
||||||
|
MP4_ITMF_BT_INTEGER = 21, /**< a signed big-endian integer with length one of { 1,2,3,4,8 } bytes */
|
||||||
|
MP4_ITMF_BT_RIAA_PA = 24, /**< RIAA parental advisory; { -1=no, 1=yes, 0=unspecified }, 8-bit ingteger */
|
||||||
|
MP4_ITMF_BT_UPC = 25, /**< Universal Product Code, in text UTF-8 format (valid as an ID) */
|
||||||
|
MP4_ITMF_BT_BMP = 27, /**< Windows bitmap image */
|
||||||
|
|
||||||
|
MP4_ITMF_BT_UNDEFINED = 255 /**< undefined */
|
||||||
|
} MP4ItmfBasicType;
|
||||||
|
|
||||||
|
/** Data structure.
|
||||||
|
* Models an iTMF data atom contained in an iTMF metadata item atom.
|
||||||
|
*/
|
||||||
|
typedef struct MP4ItmfData_s
|
||||||
|
{
|
||||||
|
uint8_t typeSetIdentifier; /**< always zero. */
|
||||||
|
MP4ItmfBasicType typeCode; /**< iTMF basic type. */
|
||||||
|
uint32_t locale; /**< always zero. */
|
||||||
|
uint8_t* value; /**< may be NULL. */
|
||||||
|
uint32_t valueSize; /**< value size in bytes. */
|
||||||
|
} MP4ItmfData;
|
||||||
|
|
||||||
|
/** List of data. */
|
||||||
|
typedef struct MP4ItmfDataList_s
|
||||||
|
{
|
||||||
|
MP4ItmfData* elements; /**< flat array. NULL when size is zero. */
|
||||||
|
uint32_t size; /**< number of elements. */
|
||||||
|
} MP4ItmfDataList;
|
||||||
|
|
||||||
|
/** Item structure.
|
||||||
|
* Models an iTMF metadata item atom contained in an ilst atom.
|
||||||
|
*/
|
||||||
|
typedef struct MP4ItmfItem_s
|
||||||
|
{
|
||||||
|
void* __handle; /**< internal use only. */
|
||||||
|
|
||||||
|
char* code; /**< four-char code identifing atom type. NULL-terminated. */
|
||||||
|
char* mean; /**< may be NULL. UTF-8 meaning. NULL-terminated. */
|
||||||
|
char* name; /**< may be NULL. UTF-8 name. NULL-terminated. */
|
||||||
|
MP4ItmfDataList dataList; /**< list of data. can be zero length. */
|
||||||
|
} MP4ItmfItem;
|
||||||
|
|
||||||
|
/** List of items. */
|
||||||
|
typedef struct MP4ItmfItemList_s
|
||||||
|
{
|
||||||
|
MP4ItmfItem* elements; /**< flat array. NULL when size is zero. */
|
||||||
|
uint32_t size; /**< number of elements. */
|
||||||
|
} MP4ItmfItemList;
|
||||||
|
|
||||||
|
/** Allocate an item on the heap.
|
||||||
|
* @param code four-char code identifying atom type. NULL-terminated.
|
||||||
|
* @param numData number of data elements to allocate. Must be >= 1.
|
||||||
|
* @return newly allocated item.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4ItmfItem* MP4ItmfItemAlloc(
|
||||||
|
const char* code,
|
||||||
|
uint32_t numData );
|
||||||
|
|
||||||
|
/** Free an item (deep free).
|
||||||
|
* @param item to be free'd.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4ItmfItemFree(
|
||||||
|
MP4ItmfItem* item );
|
||||||
|
|
||||||
|
/** Free an item list (deep free).
|
||||||
|
* @param itemList to be free'd.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4ItmfItemListFree(
|
||||||
|
MP4ItmfItemList* itemList );
|
||||||
|
|
||||||
|
/** Get list of all items from file.
|
||||||
|
* @param hFile handle of file to operate on.
|
||||||
|
* @return On succes, list of items, which must be free'd. On failure, NULL.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4ItmfItemList* MP4ItmfGetItems(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Get list of items by code from file.
|
||||||
|
* @param hFile handle of file to operate on.
|
||||||
|
* @param code four-char code identifying atom type. NULL-terminated.
|
||||||
|
* @return On succes, list of items, which must be free'd. On failure, NULL.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4ItmfItemList* MP4ItmfGetItemsByCode(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* code );
|
||||||
|
|
||||||
|
/** Get list of items by meaning from file.
|
||||||
|
* Implicitly only returns atoms of code <b>{----}</b>.
|
||||||
|
* @param hFile handle of file to operate on.
|
||||||
|
* @param meaning UTF-8 meaning. NULL-terminated.
|
||||||
|
* @param name may be NULL. UTF-8 name. NULL-terminated.
|
||||||
|
* @return On succes, list of items, which must be free'd. On failure, NULL.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4ItmfItemList* MP4ItmfGetItemsByMeaning(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* meaning,
|
||||||
|
const char* name );
|
||||||
|
|
||||||
|
/** Add an item to file.
|
||||||
|
* @param hFile handle of file to operate on.
|
||||||
|
* @param item object to add.
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4ItmfAddItem(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const MP4ItmfItem* item );
|
||||||
|
|
||||||
|
/** Overwrite an existing item in file.
|
||||||
|
* @param hFile handle of file to operate on.
|
||||||
|
* @param item object to overwrite. Must have a valid index obtained from prior get.
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4ItmfSetItem(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const MP4ItmfItem* item );
|
||||||
|
|
||||||
|
/** Remove an existing item from file.
|
||||||
|
* @param hFile handle of file to operate on.
|
||||||
|
* @param item object to remove. Must have a valid index obtained from prior get.
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4ItmfRemoveItem(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const MP4ItmfItem* item );
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_ITMF_GENERIC_H */
|
||||||
317
third_party/include/mp4v2/itmf_tags.h
vendored
Normal file
317
third_party/include/mp4v2/itmf_tags.h
vendored
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
/*
|
||||||
|
* 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 MP4v2.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Kona Blend.
|
||||||
|
* Portions created by Kona Blend are Copyright (C) 2009.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Kona Blend, kona8lend@gmail.com
|
||||||
|
* David Byron, dbyron0@gmail.com
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_ITMF_TAGS_H
|
||||||
|
#define MP4V2_ITMF_TAGS_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_itmf_tags MP4v2 iTMF (iTunes Metadata Format) Tags
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* This is a high-level API used to manage iTMF metadata.
|
||||||
|
*
|
||||||
|
* It provides more type-safety and simplified memory management as compared
|
||||||
|
* to iTMF Generic API.
|
||||||
|
*
|
||||||
|
* At the heart of this API is a read-only structure that holds all known
|
||||||
|
* items and their current values. The value is always a pointer which if
|
||||||
|
* NULL indicates its corresponding atom does not exist. Thus, one must
|
||||||
|
* always check if the pointer is non-NULL before attempting to extract
|
||||||
|
* its value.
|
||||||
|
*
|
||||||
|
* The structure may not be directly modified. Instead, <b>set</b> functions
|
||||||
|
* corresponding to each item are used to modify the backing-store of
|
||||||
|
* the read-only structure. Setting the value ptr to NULL will effectively
|
||||||
|
* remove it. Setting the value ptr to real data will immediately make a
|
||||||
|
* copy of the value in the backing-store and the read-only structure
|
||||||
|
* will correctly reflect the change.
|
||||||
|
*
|
||||||
|
* The hidden data cache memory is automatically managed. Thus the user need
|
||||||
|
* only guarantee the data is available during the lifetime of the set-function
|
||||||
|
* call.
|
||||||
|
*
|
||||||
|
* <b>iTMF Tags read workflow:</b>
|
||||||
|
*
|
||||||
|
* @li MP4TagsAlloc()
|
||||||
|
* @li MP4TagsFetch()
|
||||||
|
* @li inspect each tag of interest...
|
||||||
|
* @li MP4TagsStore() (if modified)
|
||||||
|
* @li MP4TagsFree()
|
||||||
|
*
|
||||||
|
* <b>iTMF Tags read/modify/add/remove workflow:</b>
|
||||||
|
*
|
||||||
|
* @li MP4TagsAlloc()
|
||||||
|
* @li MP4TagsFetch()
|
||||||
|
* @li inspect each tag of interest...
|
||||||
|
* @li MP4TagsSetName(), MP4TagsSetArtist()...
|
||||||
|
* @li MP4TagsStore()
|
||||||
|
* @li MP4TagsFree()
|
||||||
|
*
|
||||||
|
* @par Warning:
|
||||||
|
* Care must be taken when using multiple mechanisms to modify an open mp4
|
||||||
|
* file as it is not thread-safe, nor does it permit overlapping different
|
||||||
|
* API workflows which have a begin/end to their workflow. That is to say
|
||||||
|
* do not interleave an iTMF Generic workflow with an iTMF Tags workflow.
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/** Enumeration of possible MP4TagArtwork::type values. */
|
||||||
|
typedef enum MP4TagArtworkType_e
|
||||||
|
{
|
||||||
|
MP4_ART_UNDEFINED = 0,
|
||||||
|
MP4_ART_BMP = 1,
|
||||||
|
MP4_ART_GIF = 2,
|
||||||
|
MP4_ART_JPEG = 3,
|
||||||
|
MP4_ART_PNG = 4
|
||||||
|
} MP4TagArtworkType;
|
||||||
|
|
||||||
|
/** Data object representing a single piece of artwork. */
|
||||||
|
typedef struct MP4TagArtwork_s
|
||||||
|
{
|
||||||
|
void* data; /**< raw picture data */
|
||||||
|
uint32_t size; /**< data size in bytes */
|
||||||
|
MP4TagArtworkType type; /**< data type */
|
||||||
|
} MP4TagArtwork;
|
||||||
|
|
||||||
|
typedef struct MP4TagTrack_s
|
||||||
|
{
|
||||||
|
uint16_t index;
|
||||||
|
uint16_t total;
|
||||||
|
} MP4TagTrack;
|
||||||
|
|
||||||
|
typedef struct MP4TagDisk_s
|
||||||
|
{
|
||||||
|
uint16_t index;
|
||||||
|
uint16_t total;
|
||||||
|
} MP4TagDisk;
|
||||||
|
|
||||||
|
/** Tags <b>convenience</b> structure.
|
||||||
|
*
|
||||||
|
* This structure is used in the tags convenience API which allows for
|
||||||
|
* simplified retrieval and modification of the majority of known tags.
|
||||||
|
*
|
||||||
|
* This is a read-only structure and each tag is present if and only if the
|
||||||
|
* pointer is a <b>non-NULL</b> value. The actual data is backed by a hidden
|
||||||
|
* data cache which is only updated when the appropriate metadata <b>set</b>
|
||||||
|
* function is used, or if MP4TagsFetch() is invoked. Thus, if other API
|
||||||
|
* is used to manipulate relevent atom structure of the MP4 file, the user
|
||||||
|
* is responsible for re-fetching the data in this structure.
|
||||||
|
*/
|
||||||
|
typedef struct MP4Tags_s
|
||||||
|
{
|
||||||
|
void* __handle; /* internal use only */
|
||||||
|
|
||||||
|
const char* name;
|
||||||
|
const char* artist;
|
||||||
|
const char* albumArtist;
|
||||||
|
const char* album;
|
||||||
|
const char* grouping;
|
||||||
|
const char* composer;
|
||||||
|
const char* comments;
|
||||||
|
const char* genre;
|
||||||
|
const uint16_t* genreType;
|
||||||
|
const char* releaseDate;
|
||||||
|
const MP4TagTrack* track;
|
||||||
|
const MP4TagDisk* disk;
|
||||||
|
const uint16_t* tempo;
|
||||||
|
const uint8_t* compilation;
|
||||||
|
|
||||||
|
const char* tvShow;
|
||||||
|
const char* tvNetwork;
|
||||||
|
const char* tvEpisodeID;
|
||||||
|
const uint32_t* tvSeason;
|
||||||
|
const uint32_t* tvEpisode;
|
||||||
|
|
||||||
|
const char* description;
|
||||||
|
const char* longDescription;
|
||||||
|
const char* lyrics;
|
||||||
|
|
||||||
|
const char* sortName;
|
||||||
|
const char* sortArtist;
|
||||||
|
const char* sortAlbumArtist;
|
||||||
|
const char* sortAlbum;
|
||||||
|
const char* sortComposer;
|
||||||
|
const char* sortTVShow;
|
||||||
|
|
||||||
|
const MP4TagArtwork* artwork;
|
||||||
|
uint32_t artworkCount;
|
||||||
|
|
||||||
|
const char* copyright;
|
||||||
|
const char* encodingTool;
|
||||||
|
const char* encodedBy;
|
||||||
|
const char* purchaseDate;
|
||||||
|
|
||||||
|
const uint8_t* podcast;
|
||||||
|
const char* keywords; /* TODO: Needs testing */
|
||||||
|
const char* category;
|
||||||
|
|
||||||
|
const uint8_t* hdVideo;
|
||||||
|
const uint8_t* mediaType;
|
||||||
|
const uint8_t* contentRating;
|
||||||
|
const uint8_t* gapless;
|
||||||
|
|
||||||
|
const char* iTunesAccount;
|
||||||
|
const uint8_t* iTunesAccountType;
|
||||||
|
const uint32_t* iTunesCountry;
|
||||||
|
const uint32_t* contentID;
|
||||||
|
const uint32_t* artistID;
|
||||||
|
const uint64_t* playlistID;
|
||||||
|
const uint32_t* genreID;
|
||||||
|
const uint32_t* composerID;
|
||||||
|
const char* xid;
|
||||||
|
} MP4Tags;
|
||||||
|
|
||||||
|
/** Allocate tags convenience structure for reading and settings tags.
|
||||||
|
*
|
||||||
|
* This function allocates a new structure which represents a snapshot
|
||||||
|
* of all the tags therein, tracking if the tag is missing,
|
||||||
|
* or present and with value. It is the caller's responsibility to free
|
||||||
|
* the structure with MP4TagsFree().
|
||||||
|
*
|
||||||
|
* @return structure with all tags missing.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
const MP4Tags* MP4TagsAlloc( void );
|
||||||
|
|
||||||
|
/** Fetch data from mp4 file and populate structure.
|
||||||
|
*
|
||||||
|
* The tags structure and its hidden data-cache is updated to
|
||||||
|
* reflect the actual tags values found in the <b>hFile</b>.
|
||||||
|
*
|
||||||
|
* @param tags structure to fetch (write) into.
|
||||||
|
* @param hFile handle of file to fetch data from.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4TagsFetch(
|
||||||
|
const MP4Tags* tags,
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Store data to mp4 file from structure.
|
||||||
|
*
|
||||||
|
* The tags structure is pushed out to the mp4 file,
|
||||||
|
* adding tags if needed, removing tags if needed, and updating
|
||||||
|
* the values to modified tags.
|
||||||
|
*
|
||||||
|
* @param tags structure to store (read) from.
|
||||||
|
* @param hFile handle of file to store data to.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4TagsStore(
|
||||||
|
const MP4Tags* tags,
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Free tags convenience structure.
|
||||||
|
*
|
||||||
|
* This function frees memory associated with the structure.
|
||||||
|
*
|
||||||
|
* @param tags structure to destroy.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4TagsFree(
|
||||||
|
const MP4Tags* tags );
|
||||||
|
|
||||||
|
/** Accessor that indicates whether a tags structure
|
||||||
|
* contains any metadata
|
||||||
|
*
|
||||||
|
* @param tags the structure to inspect
|
||||||
|
*
|
||||||
|
* @param hasMetadata populated with false if @p tags
|
||||||
|
* contains no metadata, true if @p tags contains metadata
|
||||||
|
*
|
||||||
|
* @retval false error determining if @p tags contains
|
||||||
|
* metadata
|
||||||
|
*
|
||||||
|
* @retval true successfully determined if @p tags contains
|
||||||
|
* metadata
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4TagsHasMetadata (
|
||||||
|
const MP4Tags* tags,
|
||||||
|
bool* hasMetadata );
|
||||||
|
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetName ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetArtist ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetAlbumArtist ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetAlbum ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetGrouping ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetComposer ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetComments ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetGenre ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetGenreType ( const MP4Tags*, const uint16_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetReleaseDate ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetTrack ( const MP4Tags*, const MP4TagTrack* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetDisk ( const MP4Tags*, const MP4TagDisk* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetTempo ( const MP4Tags*, const uint16_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetCompilation ( const MP4Tags*, const uint8_t* );
|
||||||
|
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetTVShow ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetTVNetwork ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetTVEpisodeID ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetTVSeason ( const MP4Tags*, const uint32_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetTVEpisode ( const MP4Tags*, const uint32_t* );
|
||||||
|
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetDescription ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetLongDescription ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetLyrics ( const MP4Tags*, const char* );
|
||||||
|
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetSortName ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetSortArtist ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetSortAlbumArtist ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetSortAlbum ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetSortComposer ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetSortTVShow ( const MP4Tags*, const char* );
|
||||||
|
|
||||||
|
MP4V2_EXPORT bool MP4TagsAddArtwork ( const MP4Tags*, MP4TagArtwork* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetArtwork ( const MP4Tags*, uint32_t, MP4TagArtwork* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsRemoveArtwork ( const MP4Tags*, uint32_t );
|
||||||
|
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetCopyright ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetEncodingTool ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetEncodedBy ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetPurchaseDate ( const MP4Tags*, const char* );
|
||||||
|
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetPodcast ( const MP4Tags*, const uint8_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetKeywords ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetCategory ( const MP4Tags*, const char* );
|
||||||
|
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetHDVideo ( const MP4Tags*, const uint8_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetMediaType ( const MP4Tags*, const uint8_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetContentRating ( const MP4Tags*, const uint8_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetGapless ( const MP4Tags*, const uint8_t* );
|
||||||
|
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetITunesAccount ( const MP4Tags*, const char* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetITunesAccountType ( const MP4Tags*, const uint8_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetITunesCountry ( const MP4Tags*, const uint32_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetContentID ( const MP4Tags*, const uint32_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetArtistID ( const MP4Tags*, const uint32_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetPlaylistID ( const MP4Tags*, const uint64_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetGenreID ( const MP4Tags*, const uint32_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetComposerID ( const MP4Tags*, const uint32_t* );
|
||||||
|
MP4V2_EXPORT bool MP4TagsSetXID ( const MP4Tags*, const char* );
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_ITMF_TAGS_H */
|
||||||
77
third_party/include/mp4v2/mp4v2.h
vendored
Normal file
77
third_party/include/mp4v2/mp4v2.h
vendored
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dave Mackie, dmackie@cisco.com
|
||||||
|
* Alix Marchandise-Franquet, alix@cisco.com
|
||||||
|
* Bill May, wmay@cisco.com
|
||||||
|
* Kona Blend, kona8lend@gmail.com
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_MP4V2_H
|
||||||
|
#define MP4V2_MP4V2_H
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include <mp4v2/platform.h>
|
||||||
|
#include <mp4v2/project.h>
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/* exploit C++ ability of default values for function parameters */
|
||||||
|
#if defined( DEFAULT )
|
||||||
|
# define __MP4V2_SAVE_DEFAULT DEFAULT
|
||||||
|
#endif
|
||||||
|
#undef DEFAULT
|
||||||
|
#if defined( __cplusplus )
|
||||||
|
# define DEFAULT(x) =x
|
||||||
|
#else
|
||||||
|
# define DEFAULT(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include <mp4v2/general.h>
|
||||||
|
#include <mp4v2/file.h>
|
||||||
|
#include <mp4v2/file_prop.h>
|
||||||
|
#include <mp4v2/track.h>
|
||||||
|
#include <mp4v2/track_prop.h>
|
||||||
|
#include <mp4v2/sample.h>
|
||||||
|
#include <mp4v2/chapter.h>
|
||||||
|
#include <mp4v2/itmf_generic.h>
|
||||||
|
#include <mp4v2/itmf_tags.h>
|
||||||
|
#include <mp4v2/streaming.h>
|
||||||
|
#include <mp4v2/isma.h>
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
/* restore macro DEFAULT to state prior to mp4v2 headers */
|
||||||
|
#undef DEFAULT
|
||||||
|
#if defined( __MP4V2_SAVE_DEFAULT )
|
||||||
|
# define DEFAULT __MP4V2_SAVE_DEFAULT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_MP4V2_H */
|
||||||
97
third_party/include/mp4v2/platform.h
vendored
Normal file
97
third_party/include/mp4v2/platform.h
vendored
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* 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 MP4v2.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Kona Blend.
|
||||||
|
* Portions created by Kona Blend are Copyright (C) 2008.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Kona Blend, kona8lend@gmail.com
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_PLATFORM_H
|
||||||
|
#define MP4V2_PLATFORM_H
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#if defined( _WIN32 ) || defined( __MINGW32__ )
|
||||||
|
# if defined( MP4V2_EXPORTS )
|
||||||
|
# define MP4V2_EXPORT __declspec(dllexport)
|
||||||
|
# elif defined( MP4V2_USE_DLL_IMPORT ) || !defined( MP4V2_USE_STATIC_LIB )
|
||||||
|
# define MP4V2_EXPORT __declspec(dllimport)
|
||||||
|
# else
|
||||||
|
# define MP4V2_EXPORT
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define MP4V2_EXPORT __attribute__((visibility("default")))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined( __GNUC__ )
|
||||||
|
# define MP4V2_DEPRECATED __attribute__((deprecated))
|
||||||
|
#else
|
||||||
|
# define MP4V2_DEPRECATED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* TODO-KB: cleanup -- absolutely no need for a C-API to fuss with reserved
|
||||||
|
* C++ keywords. This will involve changing the public interface and current
|
||||||
|
* plan of action:
|
||||||
|
*
|
||||||
|
* typdef enum {
|
||||||
|
* mp4_false,
|
||||||
|
* mp4_true,
|
||||||
|
* } mp4_bool_t;
|
||||||
|
*
|
||||||
|
* followed by updating all public signatures and implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined( __cplusplus )
|
||||||
|
#ifndef bool
|
||||||
|
#if SIZEOF_BOOL == 8
|
||||||
|
typedef uint64_t bool;
|
||||||
|
#else
|
||||||
|
#if SIZEOF_BOOL == 4
|
||||||
|
typedef uint32_t bool;
|
||||||
|
#else
|
||||||
|
#if SIZEOF_BOOL == 2
|
||||||
|
typedef uint16_t bool;
|
||||||
|
#else
|
||||||
|
typedef unsigned char bool;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef false
|
||||||
|
#define false FALSE
|
||||||
|
#endif
|
||||||
|
#ifndef true
|
||||||
|
#define true TRUE
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_PLATFORM_H */
|
||||||
25
third_party/include/mp4v2/project.h
vendored
Normal file
25
third_party/include/mp4v2/project.h
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#ifndef MP4V2_PROJECT_H
|
||||||
|
#define MP4V2_PROJECT_H
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define MP4V2_PROJECT_name "MP4v2"
|
||||||
|
#define MP4V2_PROJECT_name_lower "mp4v2"
|
||||||
|
#define MP4V2_PROJECT_name_upper "MP4V2"
|
||||||
|
#define MP4V2_PROJECT_name_formal "MP4v2 2.1.3"
|
||||||
|
#define MP4V2_PROJECT_url_website "https://mp4v2.org"
|
||||||
|
#define MP4V2_PROJECT_url_downloads "https://github.com/enzo1982/releases"
|
||||||
|
#define MP4V2_PROJECT_url_discussion "https://github.com/enzo1982/discussions"
|
||||||
|
#define MP4V2_PROJECT_url_bugreport "https://github.com/enzo1982/issues"
|
||||||
|
#define MP4V2_PROJECT_support "<support@mp4v2.org>"
|
||||||
|
#define MP4V2_PROJECT_version "2.1.3"
|
||||||
|
#define MP4V2_PROJECT_version_hex 0x00020103
|
||||||
|
#define MP4V2_PROJECT_version_major 2
|
||||||
|
#define MP4V2_PROJECT_version_minor 1
|
||||||
|
#define MP4V2_PROJECT_version_point 3
|
||||||
|
#define MP4V2_PROJECT_repo_url "git@github.com:enzo1982/mp4v2.git"
|
||||||
|
#define MP4V2_PROJECT_build "Fri Nov 14 02:25:57 UTC 2025"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_PROJECT_H */
|
||||||
25
third_party/include/mp4v2/project.h.in
vendored
Normal file
25
third_party/include/mp4v2/project.h.in
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#ifndef MP4V2_PROJECT_H
|
||||||
|
#define MP4V2_PROJECT_H
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#define MP4V2_PROJECT_name "@PROJECT_name@"
|
||||||
|
#define MP4V2_PROJECT_name_lower "@PROJECT_name_lower@"
|
||||||
|
#define MP4V2_PROJECT_name_upper "@PROJECT_name_upper@"
|
||||||
|
#define MP4V2_PROJECT_name_formal "@PROJECT_name_formal@"
|
||||||
|
#define MP4V2_PROJECT_url_website "@PROJECT_url_website@"
|
||||||
|
#define MP4V2_PROJECT_url_downloads "@PROJECT_url_downloads@"
|
||||||
|
#define MP4V2_PROJECT_url_discussion "@PROJECT_url_discussion@"
|
||||||
|
#define MP4V2_PROJECT_url_bugreport "@PROJECT_url_bugreport@"
|
||||||
|
#define MP4V2_PROJECT_support "@PROJECT_support@"
|
||||||
|
#define MP4V2_PROJECT_version "@PROJECT_version@"
|
||||||
|
#define MP4V2_PROJECT_version_hex @PROJECT_version_hex@
|
||||||
|
#define MP4V2_PROJECT_version_major @PROJECT_version_major@
|
||||||
|
#define MP4V2_PROJECT_version_minor @PROJECT_version_minor@
|
||||||
|
#define MP4V2_PROJECT_version_point @PROJECT_version_point@
|
||||||
|
#define MP4V2_PROJECT_repo_url "@PROJECT_repo_url@"
|
||||||
|
#define MP4V2_PROJECT_build "@PROJECT_build@"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_PROJECT_H */
|
||||||
590
third_party/include/mp4v2/sample.h
vendored
Normal file
590
third_party/include/mp4v2/sample.h
vendored
Normal file
@ -0,0 +1,590 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dave Mackie, dmackie@cisco.com
|
||||||
|
* Alix Marchandise-Franquet, alix@cisco.com
|
||||||
|
* Bill May, wmay@cisco.com
|
||||||
|
* Kona Blend, kona8lend@gmail.com
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_SAMPLE_H
|
||||||
|
#define MP4V2_SAMPLE_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_sample MP4v2 Sample
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/** Sample dependency types.
|
||||||
|
*
|
||||||
|
* Bit combinations 0x03, 0x30, 0xc0 are reserved.
|
||||||
|
*/
|
||||||
|
typedef enum MP4SampleDependencyType_e {
|
||||||
|
MP4_SDT_UNKNOWN = 0x00, /**< unknown */
|
||||||
|
MP4_SDT_HAS_REDUNDANT_CODING = 0x01, /**< contains redundant coding */
|
||||||
|
MP4_SDT_HAS_NO_REDUNDANT_CODING = 0x02, /**< does not contain redundant coding */
|
||||||
|
MP4_SDT_HAS_DEPENDENTS = 0x04, /**< referenced by other samples */
|
||||||
|
MP4_SDT_HAS_NO_DEPENDENTS = 0x08, /**< not referenced by other samples */
|
||||||
|
MP4_SDT_IS_DEPENDENT = 0x10, /**< references other samples */
|
||||||
|
MP4_SDT_IS_INDEPENDENT = 0x20, /**< does not reference other samples */
|
||||||
|
MP4_SDT_EARLIER_DISPLAY_TIMES_ALLOWED = 0x40, /**< subequent samples in GOP may display earlier */
|
||||||
|
_MP4_SDT_RESERVED = 0x80 /**< reserved */
|
||||||
|
} MP4SampleDependencyType;
|
||||||
|
|
||||||
|
/** Read a track sample.
|
||||||
|
*
|
||||||
|
* MP4ReadSample reads the specified sample from the specified track.
|
||||||
|
* Typically this sample is then decoded in a codec dependent fashion and
|
||||||
|
* rendered in an appropriate fashion.
|
||||||
|
*
|
||||||
|
* The argument <b>ppBytes</b> allows for two possible approaches for
|
||||||
|
* buffering:
|
||||||
|
*
|
||||||
|
* If the calling application wishes to handle its own buffering it can set
|
||||||
|
* *ppBytes to the buffer it wishes to use. The calling application is
|
||||||
|
* responsible for ensuring that the buffer is large enough to hold the
|
||||||
|
* sample. This can be done by using either MP4GetSampleSize() or
|
||||||
|
* MP4GetTrackMaxSampleSize() to determine beforehand how large the
|
||||||
|
* receiving buffer must be.
|
||||||
|
*
|
||||||
|
* If the value of *ppBytes is NULL, then an appropriately sized buffer is
|
||||||
|
* automatically allocated for the sample data and *ppBytes set to this
|
||||||
|
* pointer. The calling application is responsible for freeing this memory
|
||||||
|
* with MP4Free().
|
||||||
|
*
|
||||||
|
* The last four arguments are pointers to variables that can receive
|
||||||
|
* optional sample information.
|
||||||
|
*
|
||||||
|
* Typically for audio none of these are needed. MPEG audio such as MP3 or
|
||||||
|
* AAC has a fixed sample duration and every sample can be accessed at
|
||||||
|
* random.
|
||||||
|
*
|
||||||
|
* For video, all of these optional values could be needed. MPEG video can
|
||||||
|
* be encoded at a variable frame rate, with only occasional random access
|
||||||
|
* points, and with "B frames" which cause the rendering (display) order
|
||||||
|
* of the video frames to differ from the storage/decoding order.
|
||||||
|
*
|
||||||
|
* Other media types fall between these two extremes.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param sampleId specifies which sample is to be read.
|
||||||
|
* Caveat: the first sample has id <b>1</b> not <b>0</b>.
|
||||||
|
* @param ppBytes pointer to the pointer to the sample data.
|
||||||
|
* @param pNumBytes pointer to variable that will be hold the size in bytes
|
||||||
|
* of the sample.
|
||||||
|
* @param pStartTime if non-NULL, pointer to variable that will receive the
|
||||||
|
* starting timestamp for this sample. Caveat: The timestamp is in
|
||||||
|
* <b>trackId</b>'s timescale.
|
||||||
|
* @param pDuration if non-NULL, pointer to variable that will receive the
|
||||||
|
* duration for this sample. Caveat: The duration is in
|
||||||
|
* <b>trackId</b>'s timescale.
|
||||||
|
* @param pRenderingOffset if non-NULL, pointer to variable that will
|
||||||
|
* receive the rendering offset for this sample. Currently the only
|
||||||
|
* media type that needs this feature is MPEG video. Caveat: The offset
|
||||||
|
* is in <b>trackId</b>'s timescale.
|
||||||
|
* @param pIsSyncSample if non-NULL, pointer to variable that will receive
|
||||||
|
* the state of the sync/random access flag for this sample.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*
|
||||||
|
* @see MP4GetSampleSize()
|
||||||
|
* @see MP4GetTrackMaxSampleSize()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4ReadSample(
|
||||||
|
/* input parameters */
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4SampleId sampleId,
|
||||||
|
/* input/output parameters */
|
||||||
|
uint8_t** ppBytes,
|
||||||
|
uint32_t* pNumBytes,
|
||||||
|
/* output parameters */
|
||||||
|
MP4Timestamp* pStartTime DEFAULT(NULL),
|
||||||
|
MP4Duration* pDuration DEFAULT(NULL),
|
||||||
|
MP4Duration* pRenderingOffset DEFAULT(NULL),
|
||||||
|
bool* pIsSyncSample DEFAULT(NULL) );
|
||||||
|
|
||||||
|
/** Read a track sample based on a specified time.
|
||||||
|
*
|
||||||
|
* MP4ReadSampleFromTime is similar to MP4ReadSample() except the sample
|
||||||
|
* is specified by using a timestamp instead of sampleId.
|
||||||
|
* Typically this sample is then decoded in a codec dependent fashion and
|
||||||
|
* rendered in an appropriate fashion.
|
||||||
|
*
|
||||||
|
* The argument <b>ppBytes</b> allows for two possible approaches for
|
||||||
|
* buffering:
|
||||||
|
*
|
||||||
|
* If the calling application wishes to handle its own buffering it can set
|
||||||
|
* *ppBytes to the buffer it wishes to use. The calling application is
|
||||||
|
* responsible for ensuring that the buffer is large enough to hold the
|
||||||
|
* sample. This can be done by using either MP4GetSampleSize() or
|
||||||
|
* MP4GetTrackMaxSampleSize() to determine beforehand how large the
|
||||||
|
* receiving buffer must be.
|
||||||
|
*
|
||||||
|
* If the value of *ppBytes is NULL, then an appropriately sized buffer is
|
||||||
|
* automatically allocated for the sample data and *ppBytes set to this
|
||||||
|
* pointer. The calling application is responsible for freeing this memory
|
||||||
|
* with MP4Free().
|
||||||
|
*
|
||||||
|
* The last four arguments are pointers to variables that can receive
|
||||||
|
* optional sample information.
|
||||||
|
*
|
||||||
|
* Typically for audio none of these are needed. MPEG audio such as MP3 or
|
||||||
|
* AAC has a fixed sample duration and every sample can be accessed at
|
||||||
|
* random.
|
||||||
|
*
|
||||||
|
* For video, all of these optional values could be needed. MPEG video can
|
||||||
|
* be encoded at a variable frame rate, with only occasional random access
|
||||||
|
* points, and with "B frames" which cause the rendering (display) order
|
||||||
|
* of the video frames to differ from the storage/decoding order.
|
||||||
|
*
|
||||||
|
* Other media types fall between these two extremes.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param when specifies which sample is to be read based on a time in the
|
||||||
|
* track timeline. See MP4GetSampleIdFromTime() for details.
|
||||||
|
* @param ppBytes pointer to the pointer to the sample data.
|
||||||
|
* @param pNumBytes pointer to variable that will be hold the size in bytes
|
||||||
|
* of the sample.
|
||||||
|
* @param pStartTime if non-NULL, pointer to variable that will receive the
|
||||||
|
* starting timestamp for this sample. Caveat: The timestamp is in
|
||||||
|
* <b>trackId</b>'s timescale.
|
||||||
|
* @param pDuration if non-NULL, pointer to variable that will receive the
|
||||||
|
* duration for this sample. Caveat: The duration is in
|
||||||
|
* <b>trackId</b>'s timescale.
|
||||||
|
* @param pRenderingOffset if non-NULL, pointer to variable that will
|
||||||
|
* receive the rendering offset for this sample. Currently the only
|
||||||
|
* media type that needs this feature is MPEG video. Caveat: The offset
|
||||||
|
* is in <b>trackId</b>'s timescale.
|
||||||
|
* @param pIsSyncSample if non-NULL, pointer to variable that will receive
|
||||||
|
* the state of the sync/random access flag for this sample.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*
|
||||||
|
* @see MP4ReadSample()
|
||||||
|
* @see MP4GetSampleIdFromTime()
|
||||||
|
* @see MP4GetSampleSize()
|
||||||
|
* @see MP4GetTrackMaxSampleSize()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4ReadSampleFromTime(
|
||||||
|
/* input parameters */
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4Timestamp when,
|
||||||
|
/* input/output parameters */
|
||||||
|
uint8_t** ppBytes,
|
||||||
|
uint32_t* pNumBytes,
|
||||||
|
/* output parameters */
|
||||||
|
MP4Timestamp* pStartTime DEFAULT(NULL),
|
||||||
|
MP4Duration* pDuration DEFAULT(NULL),
|
||||||
|
MP4Duration* pRenderingOffset DEFAULT(NULL),
|
||||||
|
bool* pIsSyncSample DEFAULT(NULL) );
|
||||||
|
|
||||||
|
/** Write a track sample.
|
||||||
|
*
|
||||||
|
* MP4WriteSample writes the given sample at the end of the specified track.
|
||||||
|
* Currently the library does not support random insertion of samples into
|
||||||
|
* the track timeline. Note that with mp4 there cannot be any holes or
|
||||||
|
* overlapping samples in the track timeline. The last three arguments give
|
||||||
|
* optional sample information.
|
||||||
|
*
|
||||||
|
* The value of duration can be given as #MP4_INVALID_DURATION if all samples
|
||||||
|
* in the track have the same duration. This can be specified with
|
||||||
|
* MP4AddTrack() and related functions.
|
||||||
|
*
|
||||||
|
* Typically for audio none of the optional arguments are needed. MPEG audio
|
||||||
|
* such as MP3 or AAC has a fixed sample duration and every sample can be
|
||||||
|
* accessed at random.
|
||||||
|
*
|
||||||
|
* For video, all of the optional arguments could be needed. MPEG video
|
||||||
|
* can be encoded at a variable frame rate, with only occasional random
|
||||||
|
* access points, and with "B frames" which cause the rendering (display)
|
||||||
|
* order of the video frames to differ from the storage/decoding order.
|
||||||
|
*
|
||||||
|
* Other media types fall between these two extremes.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param pBytes pointer to sample data.
|
||||||
|
* @param numBytes length of sample data in bytes.
|
||||||
|
* @param duration sample duration. Caveat: should be in track timescale.
|
||||||
|
* @param renderingOffset the rendering offset for this sample.
|
||||||
|
* Currently the only media type that needs this feature is MPEG
|
||||||
|
* video. Caveat: The offset should be in the track timescale.
|
||||||
|
* @param isSyncSample the sync/random access flag for this sample.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*
|
||||||
|
* @see MP4AddTrack()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4WriteSample(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const uint8_t* pBytes,
|
||||||
|
uint32_t numBytes,
|
||||||
|
MP4Duration duration DEFAULT(MP4_INVALID_DURATION),
|
||||||
|
MP4Duration renderingOffset DEFAULT(0),
|
||||||
|
bool isSyncSample DEFAULT(true) );
|
||||||
|
|
||||||
|
/** Write a track sample and supply dependency information.
|
||||||
|
*
|
||||||
|
* MP4WriteSampleDependency writes the given sample at the end of the
|
||||||
|
* specified track. Currently the library does not support random insertion of
|
||||||
|
* samples into the track timeline. Note that with mp4 there cannot be any
|
||||||
|
* holes or overlapping samples in the track timeline. The last three
|
||||||
|
* arguments give optional sample information.
|
||||||
|
*
|
||||||
|
* The value of duration can be given as #MP4_INVALID_DURATION if all samples
|
||||||
|
* in the track have the same duration. This can be specified with
|
||||||
|
* MP4AddTrack() and related functions.
|
||||||
|
*
|
||||||
|
* When this method is used instead of MP4WriteSample() it enables <b>sdtp</b>
|
||||||
|
* atom to be written out. This atom may be used by advanced players to
|
||||||
|
* optimize trick-operations such as fast-fwd, reverse or scrubbing.
|
||||||
|
*
|
||||||
|
* An <b>sdtp</b> atom will always be written out if this method is used.
|
||||||
|
* To avoid writing the atom, use MP4WriteSample() instead.
|
||||||
|
*
|
||||||
|
* Intermixing use of MP4WriteSampleDependency() and MP4WriteSample() on the
|
||||||
|
* same track is not permitted.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param pBytes pointer to sample data.
|
||||||
|
* @param numBytes length of sample data in bytes.
|
||||||
|
* @param duration sample duration. Caveat: should be in track timescale.
|
||||||
|
* @param renderingOffset the rendering offset for this sample.
|
||||||
|
* Currently the only media type that needs this feature is MPEG
|
||||||
|
* video. Caveat: The offset should be in the track timescale.
|
||||||
|
* @param isSyncSample the sync/random access flag for this sample.
|
||||||
|
* @param dependencyFlags bitmask specifying sample dependency characteristics.
|
||||||
|
* See #MP4SampleDependencyType for bit constants.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*
|
||||||
|
* @see MP4AddTrack()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4WriteSampleDependency(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const uint8_t* pBytes,
|
||||||
|
uint32_t numBytes,
|
||||||
|
MP4Duration duration,
|
||||||
|
MP4Duration renderingOffset,
|
||||||
|
bool isSyncSample,
|
||||||
|
uint32_t dependencyFlags );
|
||||||
|
|
||||||
|
/** Make a copy of a sample.
|
||||||
|
*
|
||||||
|
* MP4CopySample creates a new sample based on an existing sample. Note that
|
||||||
|
* another copy of the media sample data is created in the file using this
|
||||||
|
* function. I.e. this call is equivalent to MP4ReadSample() followed by
|
||||||
|
* MP4WriteSample().
|
||||||
|
*
|
||||||
|
* Note that is the responsibility of the caller to ensure that the copied
|
||||||
|
* media sample makes sense in the destination track, e.g. copying a video
|
||||||
|
* sample to an audio track is unlikely to result in anything good happening,
|
||||||
|
* even copying a sample from video track to another requires that the tracks
|
||||||
|
* use the same encoding and that issues such as image size are addressed.
|
||||||
|
*
|
||||||
|
* @param srcFile source sample file handle.
|
||||||
|
* @param srcTrackId source sample track id.
|
||||||
|
* @param srcSampleId source sample id.
|
||||||
|
* @param dstFile destination file handle for new (copied) sample.
|
||||||
|
* If the value is #MP4_INVALID_FILE_HANDLE, the copy is created in
|
||||||
|
* the same file as <b>srcFile</b>.
|
||||||
|
* @param dstTrackId destination track id for new sample.
|
||||||
|
* If the value is #MP4_INVALID_TRACK_ID, the the copy is created in
|
||||||
|
* the same track as the <b>srcTrackId</b>.
|
||||||
|
* @param dstSampleDuration duration in track timescale for new sample.
|
||||||
|
* If the value is #MP4_INVALID_DURATION, then the duration of
|
||||||
|
* the source sample is used.
|
||||||
|
*
|
||||||
|
* @return On success, thew id of the new sample.
|
||||||
|
* On error, #MP4_INVALID_SAMPLE_ID.
|
||||||
|
*
|
||||||
|
* @see MP4ReadSample()
|
||||||
|
* @see MP4WriteSample()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4CopySample(
|
||||||
|
MP4FileHandle srcFile,
|
||||||
|
MP4TrackId srcTrackId,
|
||||||
|
MP4SampleId srcSampleId,
|
||||||
|
MP4FileHandle dstFile DEFAULT(MP4_INVALID_FILE_HANDLE),
|
||||||
|
MP4TrackId dstTrackId DEFAULT(MP4_INVALID_TRACK_ID),
|
||||||
|
MP4Duration dstSampleDuration DEFAULT(MP4_INVALID_DURATION) );
|
||||||
|
|
||||||
|
/** Make a copy of a sample.
|
||||||
|
*
|
||||||
|
* MP4EncAndCopySample is similar to MP4CopySample() except that it
|
||||||
|
* offers an encryption hook to the caller.
|
||||||
|
*
|
||||||
|
* @param srcFile source sample file handle.
|
||||||
|
* @param srcTrackId source sample track id.
|
||||||
|
* @param srcSampleId source sample id.
|
||||||
|
* @param encfcnp undocumented.
|
||||||
|
* @param encfcnparam1 undocumented.
|
||||||
|
* @param dstFile destination file handle for new (copied) sample.
|
||||||
|
* If the value is #MP4_INVALID_FILE_HANDLE, the copy is created in
|
||||||
|
* the same file as <b>srcFile</b>.
|
||||||
|
* @param dstTrackId destination track id for new sample.
|
||||||
|
* If the value is #MP4_INVALID_TRACK_ID, the the copy is created in
|
||||||
|
* the same track as the <b>srcTrackId</b>.
|
||||||
|
* @param dstSampleDuration duration in track timescale for new sample.
|
||||||
|
* If the value is #MP4_INVALID_DURATION, then the duration of
|
||||||
|
* the source sample is used.
|
||||||
|
*
|
||||||
|
* @return On success, thew id of the new sample.
|
||||||
|
* On error, #MP4_INVALID_SAMPLE_ID.
|
||||||
|
*
|
||||||
|
* @see MP4CopySample()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4EncAndCopySample(
|
||||||
|
MP4FileHandle srcFile,
|
||||||
|
MP4TrackId srcTrackId,
|
||||||
|
MP4SampleId srcSampleId,
|
||||||
|
encryptFunc_t encfcnp,
|
||||||
|
uint32_t encfcnparam1,
|
||||||
|
MP4FileHandle dstFile DEFAULT(MP4_INVALID_FILE_HANDLE),
|
||||||
|
MP4TrackId dstTrackId DEFAULT(MP4_INVALID_TRACK_ID),
|
||||||
|
MP4Duration dstSampleDuration DEFAULT(MP4_INVALID_DURATION) );
|
||||||
|
|
||||||
|
/** Not implemented.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4ReferenceSample(
|
||||||
|
MP4FileHandle srcFile,
|
||||||
|
MP4TrackId srcTrackId,
|
||||||
|
MP4SampleId srcSampleId,
|
||||||
|
MP4FileHandle dstFile,
|
||||||
|
MP4TrackId dstTrackId,
|
||||||
|
MP4Duration dstSampleDuration DEFAULT(MP4_INVALID_DURATION) );
|
||||||
|
|
||||||
|
/** Get size of a track sample.
|
||||||
|
*
|
||||||
|
* MP4GetSampleSize returns the size in bytes of the specified sample from the
|
||||||
|
* the specified track.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param sampleId id of sample for operation. Caveat: the first sample has
|
||||||
|
* id <b>1</b>, not <b>0</b>.
|
||||||
|
*
|
||||||
|
* @return On success the sample size in bytes. On error, <b>0</b>.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint32_t MP4GetSampleSize(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4SampleId sampleId);
|
||||||
|
|
||||||
|
/** Get the maximum sample size of a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackMaxSampleSize returns the maximum size in bytes of all the
|
||||||
|
* samples in the specified track.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
*
|
||||||
|
* @return On success, the maximum sample size in bytes. On error, <b>0</b>.
|
||||||
|
*
|
||||||
|
* @see MP4GetSampleSize()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint32_t MP4GetTrackMaxSampleSize(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get sample id of a specified time.
|
||||||
|
*
|
||||||
|
* MP4GetSampleIdFromTime returns the sample id of the track sample in which
|
||||||
|
* the specified time occurs.
|
||||||
|
*
|
||||||
|
* The specified time should be in the track timescale.
|
||||||
|
*
|
||||||
|
* It is wise to use MP4GetSampleTime() with the returned sample id so one
|
||||||
|
* can adjust for any difference between the specified time and the actual
|
||||||
|
* start time of the sample.
|
||||||
|
*
|
||||||
|
* If the calling application needs a sample that can be accessed randomly
|
||||||
|
* then the <b>wantSyncSample</b> argument should be set to true. This could
|
||||||
|
* be the case for a player that is implementing a positioning function and
|
||||||
|
* needs to be able to start decoding a track from the returned sample id.
|
||||||
|
*
|
||||||
|
* See MP4ConvertToTrackTimestamp() for how to map a time value to this
|
||||||
|
* timescale.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param when time in track timescale.
|
||||||
|
* @param wantSyncSample specifies if the result sample id must correspond
|
||||||
|
* to a sample whose sync/random access flag is true.
|
||||||
|
*
|
||||||
|
* @return On success, the sample id that occurs at the specified time.
|
||||||
|
* On error, #MP4_INVALID_SAMPLE_ID.
|
||||||
|
*
|
||||||
|
* @see MP4ConvertToTrackTimestamp()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4SampleId MP4GetSampleIdFromTime(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4Timestamp when,
|
||||||
|
bool wantSyncSample DEFAULT(false) );
|
||||||
|
|
||||||
|
/** Get start time of track sample.
|
||||||
|
*
|
||||||
|
* MP4GetSampleTime returns the start time of the specified sample from
|
||||||
|
* the specified track in the track timescale units.
|
||||||
|
*
|
||||||
|
* See MP4ConvertFromTrackTimestamp() for how to map this value to another
|
||||||
|
* timescale.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param sampleId id of sample for operation. Caveat: the first sample has
|
||||||
|
* id <b>1</b>, not <b>0</b>.
|
||||||
|
*
|
||||||
|
* @return On success, sample start time in track timescale units.
|
||||||
|
* On error, #MP4_INVALID_TIMESTAMP.
|
||||||
|
*
|
||||||
|
* @see MP4ConvertFromTrackTimestamp()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Timestamp MP4GetSampleTime(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4SampleId sampleId );
|
||||||
|
|
||||||
|
/** Get the duration of a track sample.
|
||||||
|
*
|
||||||
|
* MP4GetSampleDuration returns the duration of the specified sample from
|
||||||
|
* the specified track in the track timescale units.
|
||||||
|
*
|
||||||
|
* See MP4ConvertFromTrackDuration() for how to map this value to another
|
||||||
|
* timescale.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param sampleId id of sample for operation. Caveat: the first sample has
|
||||||
|
* id <b>1</b>, not <b>0</b>.
|
||||||
|
*
|
||||||
|
* @return On success, the sample duration in track timescale units.
|
||||||
|
* On error, #MP4_INVALID_DURATION.
|
||||||
|
*
|
||||||
|
* @see MP4ConvertFromTrackDuration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Duration MP4GetSampleDuration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4SampleId sampleId );
|
||||||
|
|
||||||
|
/** Get the rendering offset of a track sample.
|
||||||
|
*
|
||||||
|
* MP4GetSampleRenderingOffset returns the rendering offset of the specified
|
||||||
|
* sample from the specified track in the track timescale units.
|
||||||
|
*
|
||||||
|
* The sample rendering offset is typically zero for all media types other
|
||||||
|
* than video. For video, encodings such as those defined by MPEG have
|
||||||
|
* three types of frames: I, P, and B. To increase coding efficiency B
|
||||||
|
* frames can depend on I or P frames that should be rendered after the B
|
||||||
|
* frame. However to decode the B frame the I or P frame must already have
|
||||||
|
* been decoded. This situation is addressed by placing the frames in
|
||||||
|
* decoding order in the video track, and then setting the rendering offset
|
||||||
|
* property to indicate when the video frame should actually be rendered to
|
||||||
|
* the screen. Hence the start time of a sample indicates when it should be
|
||||||
|
* decoded, the start time plus the rendering offset indicates when it
|
||||||
|
* should be rendered.
|
||||||
|
*
|
||||||
|
* See MP4ConvertFromTrackDuration() for how to map this value to another
|
||||||
|
* timescale.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param sampleId id of sample for operation. Caveat: the first sample has
|
||||||
|
* id <b>1</b>, not <b>0</b>.
|
||||||
|
*
|
||||||
|
* @return On success, the rendering offset in track timescale units.
|
||||||
|
* On error, #MP4_INVALID_DURATION.
|
||||||
|
*
|
||||||
|
* @see MP4ConvertFromTrackDuration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Duration MP4GetSampleRenderingOffset(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4SampleId sampleId );
|
||||||
|
|
||||||
|
/** Set the rendering offset of a track sample.
|
||||||
|
*
|
||||||
|
* MP4SetSampleRenderingOffset sets the rendering offset of the specified
|
||||||
|
* sample from the specified track in the track timescale units.
|
||||||
|
*
|
||||||
|
* See MP4ConvertToTrackDuration() for how to map this value from another
|
||||||
|
* timescale and MP4GetSampleRenderingOffset() for a description of this
|
||||||
|
* sample property.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param sampleId id of sample for operation. Caveat: the first sample has
|
||||||
|
* id <b>1</b>, not <b>0</b>.
|
||||||
|
* @param renderingOffset new offset value in timescale units.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*
|
||||||
|
* @see MP4ConvertToTrackDuration()
|
||||||
|
* @see MP4GetSampleRenderingOffset()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetSampleRenderingOffset(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4SampleId sampleId,
|
||||||
|
MP4Duration renderingOffset );
|
||||||
|
|
||||||
|
/** Get sync/random access state of sample.
|
||||||
|
*
|
||||||
|
* MP4GetSampleSync returns the state of the sync/random access flag of
|
||||||
|
* the specified sample from the specified track.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param sampleId id of sample for operation. Caveat: the first sample has
|
||||||
|
* id <b>1</b>, not <b>0</b>.
|
||||||
|
*
|
||||||
|
* @return <b>1</b> when true, <b>0</b> when false. On error, <b>-1</b>.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
int8_t MP4GetSampleSync(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4SampleId sampleId );
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_SAMPLE_H */
|
||||||
699
third_party/include/mp4v2/streaming.h
vendored
Normal file
699
third_party/include/mp4v2/streaming.h
vendored
Normal file
@ -0,0 +1,699 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dave Mackie, dmackie@cisco.com
|
||||||
|
* Alix Marchandise-Franquet, alix@cisco.com
|
||||||
|
* Bill May, wmay@cisco.com
|
||||||
|
* Robert Kausch, robert.kausch@freac.org
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_STREAMING_H
|
||||||
|
#define MP4V2_STREAMING_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_hint MP4v2 Streaming
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/** Get the RTP payload parameters of the hint track.
|
||||||
|
*
|
||||||
|
* MP4GetHintTrackRtpPayload gets the RTP payload parameters for the hint
|
||||||
|
* track. The RTP payload is the set of rules by which media samples are
|
||||||
|
* packed into RTP packets. This call is typically used in constructing the
|
||||||
|
* SDP media level description for the hint track.
|
||||||
|
*
|
||||||
|
* The payloadName identifies which RTP payload is being used for the RTP
|
||||||
|
* packets created from the hint track. This value is sent to the receiver in
|
||||||
|
* the SDP description. For example, MP3 audio sent according to the rules in
|
||||||
|
* IETF RFC 2250 uses the name "MPA" for the RTP payload.
|
||||||
|
*
|
||||||
|
* The payloadNumber is a shorter form of the payloadName. This value is
|
||||||
|
* associated with the payload name in the SDP description and then sent in
|
||||||
|
* every RTP packet. Payload numbers 1 thru 95 are statically assigned in IETF
|
||||||
|
* RFC 1890, numbers 96 thru 127 are dynamically assigned within a session.
|
||||||
|
*
|
||||||
|
* The maxPayloadSize specifies the maximum number of bytes that should be
|
||||||
|
* placed in the RTP payload section of the RTP packets.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param ppPayloadName specifies a pointer to the variable to receive the
|
||||||
|
* string RTP payload name.
|
||||||
|
* @param pPayloadNumber specifies a pointer to the variable to receive the
|
||||||
|
* RTP payload number.
|
||||||
|
* @param pMaxPayloadSize specifies a pointer to the variable to receive the
|
||||||
|
* maximum RTP payload size in bytes.
|
||||||
|
* @param ppEncodingParams
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4SetHintTrackRtpPayload()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetHintTrackRtpPayload(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
char** ppPayloadName DEFAULT(NULL),
|
||||||
|
uint8_t* pPayloadNumber DEFAULT(NULL),
|
||||||
|
uint16_t* pMaxPayloadSize DEFAULT(NULL),
|
||||||
|
char** ppEncodingParams DEFAULT(NULL) );
|
||||||
|
|
||||||
|
#define MP4_SET_DYNAMIC_PAYLOAD 0xff
|
||||||
|
|
||||||
|
/** Set the RTP payload parameters of the hint track.
|
||||||
|
*
|
||||||
|
* MP4SetHintTrackRtpPayload sets the RTP payload parameters for the hint
|
||||||
|
* track. The RTP payload is the set of rules by which media samples are
|
||||||
|
* packed into RTP packets.
|
||||||
|
*
|
||||||
|
* The payload name identifies which RTP payload is being used for the RTP
|
||||||
|
* packets created from the hint track. This value is sent to the receiver in
|
||||||
|
* the SDP description. For example, MP3 audio sent according to the rules in
|
||||||
|
* IETF RFC 2250 uses the name "MPA" for the RTP payload.
|
||||||
|
*
|
||||||
|
* The payload number is a shorter form of the payload name. This value is
|
||||||
|
* associated with the payload name in the SDP description and then sent in
|
||||||
|
* every RTP packet. Payload numbers 1 thru 95 are statically assigned in IETF
|
||||||
|
* RFC 1890, numbers 96 thru 127 are dynamically assigned within a session. If
|
||||||
|
* the RTP payload in use is one of the statically assigned ones, you should
|
||||||
|
* pass this value to the library. If you need a dynamic payload number
|
||||||
|
* assigned, pass the define value MP4_SET_DYNAMIC_PAYLOAD for this parameter
|
||||||
|
* and the library will choose an valid available number and return this
|
||||||
|
* value.
|
||||||
|
*
|
||||||
|
* The maxPayloadSize specifies the maximum number of bytes that should be
|
||||||
|
* placed in the RTP payload section of the RTP packets. It is desirable that
|
||||||
|
* RTP packets not exceed the maximum transmission unit (MTU) of the IP
|
||||||
|
* network they travel over since otherwise the packets must be fragmented at
|
||||||
|
* the IP level which consumes router resources and can lead to less robust
|
||||||
|
* behavior in the face of packet loss.
|
||||||
|
*
|
||||||
|
* The default value for maxPayloadSize is 1460, which is the MTU for an
|
||||||
|
* Ethernet or similar network minus the standard sizes of the IP, UDP, and
|
||||||
|
* RTP headers (1500 - 20 - 8 - 12 = 1460).
|
||||||
|
*
|
||||||
|
* If you anticipate streaming over IP networks with smaller MTU sizes, or
|
||||||
|
* that extensions to the network headers might be used, a more conservative
|
||||||
|
* value should be chosen. The minimum MTU for an IP network is 576 bytes.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param pPayloadName specifies the RTP payload name.
|
||||||
|
* @param pPayloadNumber specifies a pointer to the RTP payload number.
|
||||||
|
* @param maxPayloadSize specifies the maximum RTP payload size in bytes.
|
||||||
|
* @param encode_params
|
||||||
|
* @param include_rtp_map specifies if the a=rtpmap statement is included.
|
||||||
|
* @param include_mpeg4_esid specifies if the a=mpeg4-esid statement is
|
||||||
|
* included.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetHintTrackRtpPayload()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetHintTrackRtpPayload(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
const char* pPayloadName,
|
||||||
|
uint8_t* pPayloadNumber,
|
||||||
|
uint16_t maxPayloadSize DEFAULT(0),
|
||||||
|
const char * encode_params DEFAULT(NULL),
|
||||||
|
bool include_rtp_map DEFAULT(true),
|
||||||
|
bool include_mpeg4_esid DEFAULT(true) );
|
||||||
|
|
||||||
|
/** Get the SDP session level description of the file.
|
||||||
|
*
|
||||||
|
* MP4GetSessionSdp returns the SDP (IETF RFC 2327) session level fragment for
|
||||||
|
* the file. This is used by a streaming server to create a complete SDP
|
||||||
|
* description of the multimedia session represented by the file.
|
||||||
|
*
|
||||||
|
* The mp4broadcaster test program provided with the MP4v2 library gives an
|
||||||
|
* example of using this call to create the complete SDP description.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return The SDP session level description fragment of the mp4 file.
|
||||||
|
*
|
||||||
|
* @see MP4SetSessionSdp()
|
||||||
|
* @see MP4AppendSessionSdp()
|
||||||
|
* @see MP4GetHintTrackSdp()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
const char* MP4GetSessionSdp(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Set the SDP session level description of the file.
|
||||||
|
*
|
||||||
|
* MP4SetSessionSdp sets the SDP (IETF RFC 2327) session level fragment for
|
||||||
|
* the file. This is used by a streaming server to create a complete SDP
|
||||||
|
* description of the multimedia session represented by the file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param sdpString specifies the new value of the session SDP string.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetSessionSdp()
|
||||||
|
* @see MP4AppendSessionSdp()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetSessionSdp(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* sdpString );
|
||||||
|
|
||||||
|
/** Add to the SDP session level description of the file.
|
||||||
|
*
|
||||||
|
* MP4AppendSessionSdp appends the specified string to the SDP (IETF RFC 2327)
|
||||||
|
* session level fragment for the file. This is used by a streaming server to
|
||||||
|
* create a complete SDP description of the multimedia session represented by
|
||||||
|
* the file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param sdpString specifies the addition to the session SDP string.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetSessionSdp()
|
||||||
|
* @see MP4SetSessionSdp()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4AppendSessionSdp(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* sdpString );
|
||||||
|
|
||||||
|
/** Get the SDP media level description associated with a hint track.
|
||||||
|
*
|
||||||
|
* MP4GetHintTrackSdp returns the SDP (IETF RFC 2327) media level fragment
|
||||||
|
* associated with the hint track. This is used by a streaming server to
|
||||||
|
* create a complete SDP description of the multimedia session represented by
|
||||||
|
* the file.
|
||||||
|
*
|
||||||
|
* The mp4broadcaster test program provided with the MP4 library gives an
|
||||||
|
* example of using this call to create the complete SDP description.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return SDP media level description fragment associated with the hint
|
||||||
|
* track.
|
||||||
|
*
|
||||||
|
* @see MP4SetHintTrackSdp()
|
||||||
|
* @see MP4AppendHintTrackSdp()
|
||||||
|
* @see MP4GetSessionSdp()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
const char* MP4GetHintTrackSdp(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId );
|
||||||
|
|
||||||
|
/** Set the SDP media level description of the hint track.
|
||||||
|
*
|
||||||
|
* MP4SetHintTrackSdp sets the SDP (IETF RFC 2327) media level fragment for
|
||||||
|
* the hint track. This is used by a streaming server to create a complete SDP
|
||||||
|
* description of the multimedia session represented by the file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param sdpString specifies the new value of the hint track SDP string.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetHintTrackSdp()
|
||||||
|
* @see MP4AppendHintTrackSdp()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetHintTrackSdp(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
const char* sdpString );
|
||||||
|
|
||||||
|
/** Add to the SDP media level description of the hint track.
|
||||||
|
*
|
||||||
|
* MP4AppendHintTrackSdp appends the specified string to the SDP (IETF RFC
|
||||||
|
* 2327) media level fragment for the hint track. This is used by a streaming
|
||||||
|
* server to create a complete SDP description of the multimedia session
|
||||||
|
* represented by the file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param sdpString specifies the addition to the hint track SDP string.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetHintTrackSdp()
|
||||||
|
* @see MP4AppendHintTrackSdp()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4AppendHintTrackSdp(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
const char* sdpString );
|
||||||
|
|
||||||
|
/** Get the reference track id for a hint track.
|
||||||
|
*
|
||||||
|
* MP4GetHintTrackReferenceTrackId gets the track id of the reference media
|
||||||
|
* track associated with the specified hint track.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return Upon success, the track id of the reference media track. Upon an
|
||||||
|
* error, MP4_INVALID_TRACK_ID.
|
||||||
|
*
|
||||||
|
* @see MP4AddHintTrack()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4GetHintTrackReferenceTrackId(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId );
|
||||||
|
|
||||||
|
/** Read an RTP hint.
|
||||||
|
*
|
||||||
|
* MP4ReadRtpHint reads the specified hint sample from the specified hint
|
||||||
|
* track and enables subsequent calls to MP4ReadRtpPacket() to read the
|
||||||
|
* individual RTP packets associated with this hint. If desired, the number of
|
||||||
|
* RTP packets associated with this hint is returned.
|
||||||
|
*
|
||||||
|
* Note that a hint track sample is just like any other track sample. I.e.
|
||||||
|
* MP4ReadSample(), MP4GetSampleSize(), MP4GetSampleTime(), etc. are all
|
||||||
|
* valid. The RTP specific functions are provided to interpret the information
|
||||||
|
* contain in the hint track samples that give instructions on how to form the
|
||||||
|
* actual RTP packets.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param hintSampleId specifies which hint sample is to be read. Caveat: the
|
||||||
|
* first sample has id 1 not 0.
|
||||||
|
* @param pNumPackets Pointer to variable that will be hold the number of
|
||||||
|
* packets in the hint.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4ReadRtpPacket()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4ReadRtpHint(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
MP4SampleId hintSampleId,
|
||||||
|
uint16_t* pNumPackets DEFAULT(NULL) );
|
||||||
|
|
||||||
|
/** Get the number of packets in an RTP hint.
|
||||||
|
*
|
||||||
|
* MP4GetRtpHintNumberOfPackets returns the number of packets contained in the
|
||||||
|
* current RTP hint as established by a call to MP4ReadRtpHint().
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return Upon success, the number of packets in the current RTP hint. Upon
|
||||||
|
* an error, 0.
|
||||||
|
*
|
||||||
|
* @see MP4ReadRtpHint()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint16_t MP4GetRtpHintNumberOfPackets(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId );
|
||||||
|
|
||||||
|
/** Get the B frame flag of an RTP packet.
|
||||||
|
*
|
||||||
|
* MP4GetRtpPacketBFrame returns the state of the B Frame flag of an RTP
|
||||||
|
* packet. See MP4AddRtpHint() for a description of this flag.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param packetIndex specifies the packet to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return Upon success, the state of the B frame flag for the specified
|
||||||
|
* packet. Upon an error, -1.
|
||||||
|
*
|
||||||
|
* @see MP4AddRtpHint()
|
||||||
|
* @see MP4ReadRtpPacket()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
int8_t MP4GetRtpPacketBFrame(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
uint16_t packetIndex );
|
||||||
|
|
||||||
|
/** Get the transmit offset of an RTP packet.
|
||||||
|
*
|
||||||
|
* MP4GetRtpPacketTransmitOffset returns the transmit offset of an RTP packet.
|
||||||
|
* This offset may be set by some hinters to smooth out the packet
|
||||||
|
* transmission times and reduce network burstiness. A transmitter would need
|
||||||
|
* to apply this offset to the calculated transmission time based on the hint
|
||||||
|
* start time.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param packetIndex specifies the packet to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return The transmit offset for the specified packet in the hint track
|
||||||
|
* timescale.
|
||||||
|
*
|
||||||
|
* @see MP4AddRtpHint()
|
||||||
|
* @see MP4ReadRtpPacket()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
int32_t MP4GetRtpPacketTransmitOffset(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
uint16_t packetIndex );
|
||||||
|
|
||||||
|
/** Read an RTP packet.
|
||||||
|
*
|
||||||
|
* MP4ReadRtpPacket reads the specified packet from the current hint sample,
|
||||||
|
* as previously read by MP4ReadRtpHint().
|
||||||
|
*
|
||||||
|
* The argument ppBytes allows for two possible approaches for buffering:
|
||||||
|
*
|
||||||
|
* @li If the calling application wishes to handle its own buffering it can
|
||||||
|
* set *ppBytes to the buffer it wishes to use. The calling application is
|
||||||
|
* responsible for ensuring that the buffer is large enough to hold the
|
||||||
|
* packet. This can be done by using MP4GetRtpPayload() to retrieve the
|
||||||
|
* maximum packet payload size and hence how large the receiving buffer
|
||||||
|
* must be. Caveat: the value returned by MP4GetRtpPayload() is the
|
||||||
|
* maximum payload size, if the RTP packet header is going to be included
|
||||||
|
* by the library this value should be incremented by 12.
|
||||||
|
*
|
||||||
|
* @li If the value of *ppBytes is NULL, then an appropriately sized buffer is
|
||||||
|
* automatically allocated for the sample data and *ppBytes set to this
|
||||||
|
* pointer. The calling application is responsible for freeing this memory
|
||||||
|
* with MP4Free().
|
||||||
|
*
|
||||||
|
* The application is expected to provide the value of the RTP SSRC identifier
|
||||||
|
* which uniquely identifies the originator of the media stream. For most
|
||||||
|
* applications, a single random value can be provided. The value should be
|
||||||
|
* the same for all packets for the duration of the RTP transmission. If the
|
||||||
|
* parameter @p includeHeader is false, then this value has no effect.
|
||||||
|
*
|
||||||
|
* By default the library constructs the standard 12 byte RTP header from the
|
||||||
|
* information in the hint sample, and the specified SSRC. It then
|
||||||
|
* concatenates the RTP header with the packet payload, that is the RTP
|
||||||
|
* payload specific header and the media data for the packet. The @p
|
||||||
|
* includeHeader and @p includePayload parameters allow control over these
|
||||||
|
* steps, so that either just the packet payloads or just the RTP headers can
|
||||||
|
* be returned. A potential use of this feature is if the calling application
|
||||||
|
* wishes to construct an extended RTP header with non-standard options.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param packetIndex specifies which packet is to be read. Valid values range
|
||||||
|
* from zero to the number of packets in this hint minus one.
|
||||||
|
* @param ppBytes Pointer to the pointer to the packet data. See the function
|
||||||
|
* description for details on this argument.
|
||||||
|
* @param pNumBytes Pointer to variable that will be hold the size in bytes of
|
||||||
|
* the packet.
|
||||||
|
* @param ssrc specifies the RTP SSRC to be used when constructing the RTP
|
||||||
|
* packet header.
|
||||||
|
* @param includeHeader specifies whether the library should include the
|
||||||
|
* standard 12 byte RTP header to the returned packet. The header is
|
||||||
|
* constructed from the information in the hint sample and the specified
|
||||||
|
* ssrc.
|
||||||
|
* @param includePayload specifies whether the library should include the
|
||||||
|
* packet payload (RTP payload header and media data) in the returned
|
||||||
|
* packet.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4ReadRtpHint()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4ReadRtpPacket(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
uint16_t packetIndex,
|
||||||
|
uint8_t** ppBytes,
|
||||||
|
uint32_t* pNumBytes,
|
||||||
|
uint32_t ssrc DEFAULT(0),
|
||||||
|
bool includeHeader DEFAULT(true),
|
||||||
|
bool includePayload DEFAULT(true) );
|
||||||
|
|
||||||
|
/** Get the RTP start time of a hint track.
|
||||||
|
*
|
||||||
|
* MP4GetRtpTimestampStart returns the RTP timestamp start of the specified
|
||||||
|
* hint track. Typically this is a random value that is chosen when the first
|
||||||
|
* RTP packet is constructed by the MP4 library. However the value can be set
|
||||||
|
* explicitly for the hint track and stored. Typically this is used if it is
|
||||||
|
* desired that timestamps start at zero.
|
||||||
|
*
|
||||||
|
* An application will need this value in order to construct RTCP Sender
|
||||||
|
* Reports that relate the hint track time to an real time clock. The
|
||||||
|
* mp4broadcaster test program provided with the MP4 library gives an example
|
||||||
|
* of this.
|
||||||
|
*
|
||||||
|
* See IETF RFC 1889 for details regarding RTP timestamps and RTCP.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return Upon success, the RTP start time in the RTP time scale which is
|
||||||
|
* identical to the hint track time scale. Upon an error,
|
||||||
|
* MP4_INVALID_TIMESTAMP.
|
||||||
|
*
|
||||||
|
* @see MP4SetRtpTimestampStart()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Timestamp MP4GetRtpTimestampStart(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId );
|
||||||
|
|
||||||
|
/** Get the RTP start time of a hint track.
|
||||||
|
*
|
||||||
|
* MP4SetRtpTimestampStart sets the RTP timestamp start of the specified hint
|
||||||
|
* track. Typically this is a random value that is chosen when the first RTP
|
||||||
|
* packet is constructed by the MP4 library. However the value can be set
|
||||||
|
* explicitly for the hint track and stored. Typically this is used if it is
|
||||||
|
* desired that timestamps start at zero.
|
||||||
|
*
|
||||||
|
* See IETF RFC 1889 for details regarding RTP timestamps and RTCP.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param rtpStart specifies the desired RTP start timestamp for the hint
|
||||||
|
* track.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetRtpTimestampStart()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetRtpTimestampStart(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
MP4Timestamp rtpStart );
|
||||||
|
|
||||||
|
/** Add an RTP hint.
|
||||||
|
*
|
||||||
|
* MP4AddRtpHint creates a new hint sample for the specified hint track and
|
||||||
|
* enables subsequent calls to MP4AddRtpPacket() to create the RTP packets
|
||||||
|
* associated with this hint. After all the RTP packets for the hint have been
|
||||||
|
* created, MP4WriteRtpHint() should be called to write the hint to the track.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4AddRtpPacket()
|
||||||
|
* @see MP4WriteRtpHint()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4AddRtpHint(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId );
|
||||||
|
|
||||||
|
/** Add an RTP video specific hint.
|
||||||
|
*
|
||||||
|
* MP4AddRtpVideoHint is an extended version of MP4AddRtpHint specifically to
|
||||||
|
* handle MPEG video frames.
|
||||||
|
*
|
||||||
|
* The isBFrame parameter allows the packets in the RTP hint to be marked as
|
||||||
|
* belonging to a video B frame. This can be useful to a streaming server if
|
||||||
|
* packets must be dropped due to system load or network congestion. No other
|
||||||
|
* video frames are dependent on the contents of B frames, so they are least
|
||||||
|
* damaging type of frames to drop.
|
||||||
|
*
|
||||||
|
* The timestampOffset parameter allows an offset to be added to the RTP
|
||||||
|
* timestamp of the packets in the RTP hint. This is necessary for MPEG video
|
||||||
|
* that contains B frames since the video frames are transmitted out of order
|
||||||
|
* with respect to when they should be rendered. I.e. I and P frames are
|
||||||
|
* transmitted before any B frames that depend on them. The RTP timestamp must
|
||||||
|
* represent the rendering time of the data in the packets hence an offset
|
||||||
|
* must be added.
|
||||||
|
*
|
||||||
|
* Note: The timestampOffset is equivalent to the sample rendering offset of a
|
||||||
|
* video media track. See MP4GetSampleRenderingOffset().
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param isBFrame specifies if this hint will contain packets for a video B
|
||||||
|
* frame.
|
||||||
|
* @param timestampOffset specifies a positive offset to add to the RTP
|
||||||
|
* timestamp for this hint. Caveat: the value is in the hint track
|
||||||
|
* timescale.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4AddRtpHint()
|
||||||
|
* @see MP4AddRtpPacket()
|
||||||
|
* @see MP4WriteRtpHint()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4AddRtpVideoHint(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
bool isBFrame DEFAULT(false),
|
||||||
|
uint32_t timestampOffset DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Add an RTP packet.
|
||||||
|
*
|
||||||
|
* MP4AddRtpPacket creates a new RTP packet for the currently pending RTP hint
|
||||||
|
* sample for the specified hint track. It also enables subsequent calls to
|
||||||
|
* MP4AddRtpImmediateData() and MP4AddRtpSampleData to add data to the RTP
|
||||||
|
* packets. After all the RTP packets for the hint have been created,
|
||||||
|
* MP4WriteRtpHint() should be called to write the hint to the track.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param setMBit specifies the value of the RTP packet header marker bit for
|
||||||
|
* this packet. The value depends on the rules of the RTP payload used for
|
||||||
|
* this hint track.
|
||||||
|
* @param transmitOffset specifies an offset to apply to the normal
|
||||||
|
* transmission time of this packet. The purpose of this offset is to
|
||||||
|
* allow smoothing of packet transmission over the duration of the hint.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4AddRtpHint()
|
||||||
|
* @see MP4AddRtpImmediateData()
|
||||||
|
* @see MP4AddRtpSampleData()
|
||||||
|
* @see MP4WriteRtpHint()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4AddRtpPacket(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
bool setMBit DEFAULT(false),
|
||||||
|
int32_t transmitOffset DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Add immediate data to an RTP packet.
|
||||||
|
*
|
||||||
|
* MP4AddRtpImmediateData adds immediate data to the current pending RTP
|
||||||
|
* packet. Typically, this is used to add RTP payload specific headers to RTP
|
||||||
|
* packets. Note that the size of a block of immediate data is limited to 14
|
||||||
|
* bytes. But multiple immediate data blocks can be added if more space is
|
||||||
|
* needed.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param pBytes specifies a pointer to the immediate data that should be
|
||||||
|
* included in the current RTP packet.
|
||||||
|
* @param numBytes specifies the length in bytes of the immediate data that
|
||||||
|
* should be included in the current RTP packet.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4AddRtpPacket()
|
||||||
|
* @see MP4AddRtpSampleData()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4AddRtpImmediateData(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
const uint8_t* pBytes,
|
||||||
|
uint32_t numBytes );
|
||||||
|
|
||||||
|
/** Add media sample data to an RTP packet.
|
||||||
|
*
|
||||||
|
* MP4AddRtpSampleData adds a reference in the current pending RTP packet to
|
||||||
|
* the media data in the specified media sample of the reference media track.
|
||||||
|
* Note this is a reference, not a copy, of the media data.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param sampleId specifies the reference media sample id from which the
|
||||||
|
* media data should be taken.
|
||||||
|
* @param dataOffset specifies the byte offset in the specified media sample
|
||||||
|
* where data should be taken from for the current RTP packet.
|
||||||
|
* @param dataLength specifies the length in bytes of the media data that
|
||||||
|
* should be included in the current RTP packet.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4AddRtpPacket()
|
||||||
|
* @see MP4AddRtpImmediateData()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4AddRtpSampleData(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
MP4SampleId sampleId,
|
||||||
|
uint32_t dataOffset,
|
||||||
|
uint32_t dataLength );
|
||||||
|
|
||||||
|
/** Add ES configuration information to an RTP hint.
|
||||||
|
*
|
||||||
|
* MP4AddRtpESConfigurationPacket adds a packet to the current RTP hint that
|
||||||
|
* contains a copy of the elementary stream configuration information of the
|
||||||
|
* reference media track. Some RTP payloads require this information to be
|
||||||
|
* transmitted at the start of streaming or periodically during streaming.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4SetTrackESConfiguration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4AddRtpESConfigurationPacket(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId );
|
||||||
|
|
||||||
|
/** Write an RTP hint.
|
||||||
|
*
|
||||||
|
* MP4WriteRtpHint writes the current pending hint created with
|
||||||
|
* MP4AddRtpHint() to the specified hint track.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param hintTrackId specifies the hint track to which the operation applies.
|
||||||
|
* @param duration specifies the duration for this hint sample. Typically this
|
||||||
|
* is the same duration as for the corresponding sample in the reference
|
||||||
|
* media track. Caveat: The duration should be in the hint track timescale
|
||||||
|
* units, again typically the same as the reference media track.
|
||||||
|
* @param isSyncSample specifies the sync/random access flag for this sample.
|
||||||
|
* Typically this is the same as for the corresponding sample in the
|
||||||
|
* reference media track.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4AddRtpHint()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4WriteRtpHint(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId hintTrackId,
|
||||||
|
MP4Duration duration,
|
||||||
|
bool isSyncSample DEFAULT(true) );
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_STREAMING_H */
|
||||||
615
third_party/include/mp4v2/track.h
vendored
Normal file
615
third_party/include/mp4v2/track.h
vendored
Normal file
@ -0,0 +1,615 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dave Mackie, dmackie@cisco.com
|
||||||
|
* Alix Marchandise-Franquet, alix@cisco.com
|
||||||
|
* Bill May, wmay@cisco.com
|
||||||
|
* Kona Blend, kona8lend@gmail.com
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_TRACK_H
|
||||||
|
#define MP4V2_TRACK_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_track MP4v2 Track
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/** Add a user defined track.
|
||||||
|
*
|
||||||
|
* MP4AddTrack adds a user defined track to the mp4 file. Care should be
|
||||||
|
* taken to avoid any of the standardized track type names. A useful
|
||||||
|
* convention is use only uppercase characters for user defined track types.
|
||||||
|
* The string should be exactly four characters in length, e.g. "MINE".
|
||||||
|
*
|
||||||
|
* Note this should not be used to add any of the known track types defined
|
||||||
|
* in the MP4 standard (ISO/IEC 14496-1:2001).
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param type specifies the type of track to be added.
|
||||||
|
* @param timeScale the time scale in ticks per second of the track. Default is 1000.
|
||||||
|
*
|
||||||
|
* @return On success, the track-id of new track.
|
||||||
|
* On failure, #MP4_INVALID_TRACK_ID.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* type,
|
||||||
|
uint32_t timeScale DEFAULT(MP4_MSECS_TIME_SCALE) );
|
||||||
|
|
||||||
|
/** Add an MPEG-4 systems track.
|
||||||
|
*
|
||||||
|
* MP4AddSystemsTrack adds an MPEG-4 Systems track to the mp4 file. Note
|
||||||
|
* this should not be used to add OD or scene tracks, MP4AddODTrack() and
|
||||||
|
* MP4AddSceneTrack() should be used for those purposes. Other known
|
||||||
|
* MPEG-4 System track types are:
|
||||||
|
*
|
||||||
|
* @li #MP4_CLOCK_TRACK_TYPE
|
||||||
|
* @li #MP4_MPEG7_TRACK_TYPE
|
||||||
|
* @li #MP4_OCI_TRACK_TYPE
|
||||||
|
* @li #MP4_IPMP_TRACK_TYPE
|
||||||
|
* @li #MP4_MPEGJ_TRACK_TYPE
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param type specifies the type of track to be added.
|
||||||
|
*
|
||||||
|
* @return On success, the track-id of new track.
|
||||||
|
* On failure, #MP4_INVALID_TRACK_ID.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddSystemsTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* type );
|
||||||
|
|
||||||
|
/** Add a object descriptor (OD) track.
|
||||||
|
*
|
||||||
|
* MP4AddODTrack adds an object descriptor (aka OD) track to the mp4 file.
|
||||||
|
* MP4WriteSample() can then be used to add the desired OD commands to the
|
||||||
|
* track. The burden is currently on the calling application to understand
|
||||||
|
* OD.
|
||||||
|
*
|
||||||
|
* Those wishing to have a simple audio/video scene without understanding
|
||||||
|
* OD may wish to use MP4MakeIsmaCompliant() to create the minimal OD and
|
||||||
|
* BIFS information.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
*
|
||||||
|
* @return On success, the track-id of new track.
|
||||||
|
* On failure, #MP4_INVALID_TRACK_ID.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddODTrack(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Add a scene (BIFS) track.
|
||||||
|
*
|
||||||
|
* MP4AddSceneTrack adds a scene (aka BIFS) track to the mp4 file.
|
||||||
|
* MP4WriteSample() can then be used to add the desired BIFS commands to
|
||||||
|
* the track. The burden is currently on the calling application to
|
||||||
|
* understand BIFS.
|
||||||
|
*
|
||||||
|
* Those wishing to have a simple audio/video scene without understanding
|
||||||
|
* BIFS may wish to use MP4MakeIsmaCompliant() to create the minimal OD
|
||||||
|
* and BIFS information.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
*
|
||||||
|
* @return On success, the track-id of new track.
|
||||||
|
* On failure, #MP4_INVALID_TRACK_ID.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddSceneTrack(
|
||||||
|
MP4FileHandle hFile );
|
||||||
|
|
||||||
|
/** Add audio track to mp4 file.
|
||||||
|
*
|
||||||
|
* MP4AddAudioTrack adds an audio track to the mp4 file. MP4WriteSample()
|
||||||
|
* can then be used to add the desired audio samples.
|
||||||
|
*
|
||||||
|
* It is recommended that the time scale be set to the sampling frequency
|
||||||
|
* (e.g. 44100 Hz) of the audio so as to preserve the timing information
|
||||||
|
* accurately.
|
||||||
|
*
|
||||||
|
* If the audio encoding uses a fixed duration for each sample that should
|
||||||
|
* be specified here. If not then the value #MP4_INVALID_DURATION
|
||||||
|
* should be given for the sampleDuration argument.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param timeScale the time scale in ticks per second of the track.
|
||||||
|
* @param sampleDuration the fixed duration for all track samples.
|
||||||
|
* Caveat: the value should be in track-timescale units.
|
||||||
|
* @param audioType the audio encoding type.
|
||||||
|
* See MP4GetTrackEsdsObjectTypeId() for known values.
|
||||||
|
*
|
||||||
|
* @return On success, the track-id of the new track.
|
||||||
|
* On error, #MP4_INVALID_TRACK_ID.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddAudioTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timeScale,
|
||||||
|
MP4Duration sampleDuration,
|
||||||
|
uint8_t audioType DEFAULT(MP4_MPEG4_AUDIO_TYPE) );
|
||||||
|
|
||||||
|
/** Add ulaw track to mp4 file.
|
||||||
|
*
|
||||||
|
* MP4AddULawAudioTrack adds a ulaw track to the mp4 file. MP4WriteSample()
|
||||||
|
* can then be used to add the desired audio samples.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param timeScale the time scale in ticks per second of the track.
|
||||||
|
*
|
||||||
|
* @return On success, the track-id of the new track.
|
||||||
|
* On error, #MP4_INVALID_TRACK_ID.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddULawAudioTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timeScale);
|
||||||
|
|
||||||
|
/** Add alaw track to mp4 file.
|
||||||
|
*
|
||||||
|
* MP4AddALawAudioTrack adds a alaw track to the mp4 file. MP4WriteSample()
|
||||||
|
* can then be used to add the desired audio samples.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param timeScale the time scale in ticks per second of the track.
|
||||||
|
*
|
||||||
|
* @return On success, the track-id of the new track.
|
||||||
|
* On error, #MP4_INVALID_TRACK_ID.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddALawAudioTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timeScale);
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddAC3AudioTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t samplingRate,
|
||||||
|
uint8_t fscod,
|
||||||
|
uint8_t bsid,
|
||||||
|
uint8_t bsmod,
|
||||||
|
uint8_t acmod,
|
||||||
|
uint8_t lfeon,
|
||||||
|
uint8_t bit_rate_code );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddAmrAudioTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timeScale,
|
||||||
|
uint16_t modeSet,
|
||||||
|
uint8_t modeChangePeriod,
|
||||||
|
uint8_t framesPerSample,
|
||||||
|
bool isAmrWB );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4SetAmrVendor(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint32_t vendor );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4SetAmrDecoderVersion(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint8_t decoderVersion );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4SetAmrModeSet(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trakId,
|
||||||
|
uint16_t modeSet );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint16_t MP4GetAmrModeSet(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddHrefTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timeScale,
|
||||||
|
MP4Duration sampleDuration,
|
||||||
|
const char* base_url DEFAULT(NULL) );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
const char* MP4GetHrefTrackBaseUrl(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Add a video track.
|
||||||
|
*
|
||||||
|
* MP4AddVideoTrack adds a video track to the mp4 file. MP4WriteSample()
|
||||||
|
* can then be used to add the desired video samples.
|
||||||
|
*
|
||||||
|
* It is recommended that the time scale be set to 90000 so as to preserve
|
||||||
|
* the timing information accurately for the range of video frame rates
|
||||||
|
* commonly in use.
|
||||||
|
*
|
||||||
|
* If the video frame rate is to be fixed then the sampleDuration argument
|
||||||
|
* should be give the appropriate fixed value. If the video frame rate is
|
||||||
|
* to be variable then the value #MP4_INVALID_DURATION should be
|
||||||
|
* given for the sampleDuration argument.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param timeScale the timescale in ticks per second of the track.
|
||||||
|
* @param sampleDuration specifies fixed sample duration for all track
|
||||||
|
* samples. Caveat: the value should be in track timescale units.
|
||||||
|
* @param width specifies the video frame width in pixels.
|
||||||
|
* @param height specifies the video frame height in pixels.
|
||||||
|
* @param videoType specifies the video encoding type.
|
||||||
|
* See MP4GetTrackVideoType() for known values.
|
||||||
|
*
|
||||||
|
* @return On success, the track-id of the new track.
|
||||||
|
* On error, #MP4_INVALID_TRACK_ID.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddVideoTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timeScale,
|
||||||
|
MP4Duration sampleDuration,
|
||||||
|
uint16_t width,
|
||||||
|
uint16_t height,
|
||||||
|
uint8_t videoType DEFAULT(MP4_MPEG4_VIDEO_TYPE) );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddH264VideoTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timeScale,
|
||||||
|
MP4Duration sampleDuration,
|
||||||
|
uint16_t width,
|
||||||
|
uint16_t height,
|
||||||
|
uint8_t AVCProfileIndication,
|
||||||
|
uint8_t profile_compat,
|
||||||
|
uint8_t AVCLevelIndication,
|
||||||
|
uint8_t sampleLenFieldSizeMinusOne );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4AddH264SequenceParameterSet(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const uint8_t* pSequence,
|
||||||
|
uint16_t sequenceLen );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4AddH264PictureParameterSet(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const uint8_t* pPict,
|
||||||
|
uint16_t pictLen );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4SetH263Vendor(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint32_t vendor );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4SetH263DecoderVersion(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint8_t decoderVersion );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4SetH263Bitrates(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint32_t avgBitrate,
|
||||||
|
uint32_t maxBitrate );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddH263VideoTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timeScale,
|
||||||
|
MP4Duration sampleDuration,
|
||||||
|
uint16_t width,
|
||||||
|
uint16_t height,
|
||||||
|
uint8_t h263Level,
|
||||||
|
uint8_t h263Profile,
|
||||||
|
uint32_t avgBitrate,
|
||||||
|
uint32_t maxBitrate );
|
||||||
|
|
||||||
|
/** Add a hint track.
|
||||||
|
*
|
||||||
|
* MP4AddHintTrack adds a hint track to the mp4 file. A hint track is used
|
||||||
|
* to describe how to send the reference media track over a particular
|
||||||
|
* network transport. In the case of the IETF RTP protocol, the hint track
|
||||||
|
* describes how the media data should be placed into packets and any
|
||||||
|
* media specific protocol headers that should be added.
|
||||||
|
*
|
||||||
|
* Typically there is a one to one correspondence between reference media
|
||||||
|
* track samples and hint track samples. The start time, duration, and
|
||||||
|
* sync flags are typically the same, however provisions are made for
|
||||||
|
* deviations from this rule.
|
||||||
|
*
|
||||||
|
* The MP4 library provides extensive support for RTP hint tracks. This
|
||||||
|
* includes a easy to use API to create RTP hint tracks, and read out
|
||||||
|
* fully constructed RTP packets based on the hint track.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param refTrackId specifies the reference media track for this hint track.
|
||||||
|
*
|
||||||
|
* @return On success, the track-id of the new track.
|
||||||
|
* On error, #MP4_INVALID_TRACK_ID.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddHintTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId refTrackId );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddTextTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId refTrackId );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddSubtitleTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timescale,
|
||||||
|
uint16_t width,
|
||||||
|
uint16_t height );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddSubpicTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint32_t timescale,
|
||||||
|
uint16_t width,
|
||||||
|
uint16_t height );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddPixelAspectRatio(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId refTrackId,
|
||||||
|
uint32_t hSpacing,
|
||||||
|
uint32_t vSpacing );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4AddColr(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId refTrackId,
|
||||||
|
uint16_t primary,
|
||||||
|
uint16_t transfer,
|
||||||
|
uint16_t matrix );
|
||||||
|
|
||||||
|
/** Make a clone of a specified track.
|
||||||
|
*
|
||||||
|
* MP4CloneTrack creates a new track to an mp4 file that is a copy of an
|
||||||
|
* existing track with respect to the track media type, and other control
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* Note this function does not copy the media samples of the source track to
|
||||||
|
* the new track. If you want to do that use MP4CopyTrack() instead.
|
||||||
|
*
|
||||||
|
* @param srcFile specifies the mp4 file of the source track of the operation.
|
||||||
|
* @param srcTrackId specifies the track id of the track to be cloned.
|
||||||
|
* @param dstFile specifies the mp4 file of the new, cloned track. If the
|
||||||
|
* value is MP4_INVALID_FILE_HANDLE, the new track is created in the same
|
||||||
|
* file as the source track.
|
||||||
|
* @param dstHintTrackReferenceTrack specifies the track id of the reference
|
||||||
|
* track in the destination file when cloning a hint track.
|
||||||
|
*
|
||||||
|
* @return Upon success, the track id of the new track. Upon an error,
|
||||||
|
* MP4_INVALID_TRACK_ID.
|
||||||
|
*
|
||||||
|
* @see MP4CopyTrack()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4CloneTrack(
|
||||||
|
MP4FileHandle srcFile,
|
||||||
|
MP4TrackId srcTrackId,
|
||||||
|
MP4FileHandle dstFile DEFAULT(MP4_INVALID_FILE_HANDLE),
|
||||||
|
MP4TrackId dstHintTrackReferenceTrack DEFAULT(MP4_INVALID_TRACK_ID) );
|
||||||
|
|
||||||
|
/** Make a copy of a specified track.
|
||||||
|
*
|
||||||
|
* MP4CopyTrack creates a new track to an mp4 file that is a copy of an
|
||||||
|
* existing track with respect to the track media type, other control
|
||||||
|
* information, and media samples.
|
||||||
|
*
|
||||||
|
* The applyEdits parameter of this function allows for easy creation of
|
||||||
|
* standalone clips from a larger mp4 file. To do this use MP4AddTrackEdit()
|
||||||
|
* to specify the start and duration of the clip, and then use MP4CopyTrack()
|
||||||
|
* to export that portion of the media to a new mp4 file.
|
||||||
|
*
|
||||||
|
* Note if you do not want to copy the media samples, but just want to create
|
||||||
|
* a track with the same type and control information of the source track use
|
||||||
|
* MP4CloneTrack().
|
||||||
|
*
|
||||||
|
* @param srcFile specifies the mp4 file of the source track of the operation.
|
||||||
|
* @param srcTrackId specifies the track id of the track to be copied.
|
||||||
|
* @param dstFile specifies the mp4 file of the new, copied track. If the
|
||||||
|
* value is MP4_INVALID_FILE_HANDLE, the new track is created in the same
|
||||||
|
* file as the source track.
|
||||||
|
* @param applyEdits specifies if the track edit list is to be applied during
|
||||||
|
* the copying of media samples. If false, then all samples are copied, if
|
||||||
|
* true then only those samples included by the track edit list are
|
||||||
|
* copied.
|
||||||
|
* @param dstHintTrackReferenceTrack specifies the track id of the reference
|
||||||
|
* track in the destination file when cloning a hint track.
|
||||||
|
*
|
||||||
|
* @return Upon success, the track id of the new track. Upon an error,
|
||||||
|
* MP4_INVALID_TRACK_ID.
|
||||||
|
*
|
||||||
|
* @see MP4CloneTrack()
|
||||||
|
* @see MP4AddTrackEdit()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4CopyTrack(
|
||||||
|
MP4FileHandle srcFile,
|
||||||
|
MP4TrackId srcTrackId,
|
||||||
|
MP4FileHandle dstFile DEFAULT(MP4_INVALID_FILE_HANDLE),
|
||||||
|
bool applyEdits DEFAULT(false),
|
||||||
|
MP4TrackId dstHintTrackReferenceTrack DEFAULT(MP4_INVALID_TRACK_ID) );
|
||||||
|
|
||||||
|
/** Delete a track.
|
||||||
|
*
|
||||||
|
* MP4DeleteTrack deletes the control information associated with the
|
||||||
|
* specified track. The trackId will become invalid if this call succeeds.
|
||||||
|
*
|
||||||
|
* Note that the samples associated with this track are not deleted with this
|
||||||
|
* call. This can be accomplished via MP4Optimize(). The reason for this is
|
||||||
|
* that multiple tracks can reference the same samples so a global view must
|
||||||
|
* be taken when deleting them.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4DeleteTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the number of tracks.
|
||||||
|
*
|
||||||
|
* MP4GetNumberOfTracks returns how many tracks of the specified type and
|
||||||
|
* subtype exist in the mp4 file. This can be used to determine if an mp4 file
|
||||||
|
* contains a track of a given type of media, for instance audio or video. It
|
||||||
|
* can also be used to determine if multiple options may be available. For
|
||||||
|
* instance multiple audio tracks in different languages.
|
||||||
|
*
|
||||||
|
* For audio and video tracks, a subtype can be specified to only count tracks
|
||||||
|
* of a particular encoding.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param type specifies the type of track for which a count is desired. A
|
||||||
|
* NULL value implies any type of track. See MP4GetTrackType() for
|
||||||
|
* predefined values.
|
||||||
|
* @param subType specifies the subtype of the tracks to be counted. Subtypes
|
||||||
|
* are only defined for audio and video tracks, see
|
||||||
|
* MP4GetTrackEsdsObjectTypeId() for predefined values. A zero value
|
||||||
|
* implies any subtype.
|
||||||
|
*
|
||||||
|
* @return The number of tracks of the specified type and subType in the mp4
|
||||||
|
* file.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint32_t MP4GetNumberOfTracks(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
const char* type DEFAULT(NULL),
|
||||||
|
uint8_t subType DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Find a track id.
|
||||||
|
*
|
||||||
|
* MP4FindTrackId gets the track id associated with the index'th track of the
|
||||||
|
* specified track type. For example, to get the track id of the first video
|
||||||
|
* track:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* MP4FindTrackId(hFile, 0, MP4_VIDEO_TRACK_TYPE);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* For audio and video tracks, a subtype can be specified to find a track of a
|
||||||
|
* particular encoding. For example, to get the track id of the first audio
|
||||||
|
* track encoded with MPEG-1 audio:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* MP4FindTrackId(hFile, 0, MP4_AUDIO_TRACK_TYPE, MP4_MPEG1_AUDIO_TYPE);
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* Caveat: The track id's do not imply anything about the ordering of the
|
||||||
|
* track information within the mp4 file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param index specifies which track is desired from matching tracks.
|
||||||
|
* @param type specifies the type of track to be matched. A NULL value implies
|
||||||
|
* any type of track. See MP4GetTrackType() for predefined values.
|
||||||
|
* @param subType specifies the subtype of the track to be matched. Subtypes
|
||||||
|
* are only defined for audio and video tracks, see
|
||||||
|
* MP4GetTrackEsdsObjectTypeId() for predefined values. A zero value
|
||||||
|
* implies any subtype.
|
||||||
|
*
|
||||||
|
* @return Upon success, the track index of the specified track. Upon an
|
||||||
|
* error, 0xFFFF.
|
||||||
|
*
|
||||||
|
* @see MP4FindTrackIndex()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4TrackId MP4FindTrackId(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
uint16_t index,
|
||||||
|
const char* type DEFAULT(NULL),
|
||||||
|
uint8_t subType DEFAULT(0) );
|
||||||
|
|
||||||
|
/** Find a track index.
|
||||||
|
*
|
||||||
|
* MP4FindTrackIndex gets the index of the track with the specified track id.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the index is desired.
|
||||||
|
*
|
||||||
|
* @return Upon success, the track index of the specified track. Upon an
|
||||||
|
* error, 0xFFFF.
|
||||||
|
*
|
||||||
|
* @see MP4FindTrackId()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint16_t MP4FindTrackIndex(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get maximum duration of chunk.
|
||||||
|
*
|
||||||
|
* MP4GetTrackDurationPerChunk gets the maximum duration for each chunk.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param duration out value of duration in track timescale units.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackDurationPerChunk(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4Duration* duration );
|
||||||
|
|
||||||
|
/** Set maximum duration of chunk.
|
||||||
|
*
|
||||||
|
* MP4SetTrackDurationPerChunk sets the maximum duration for each chunk.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param duration in timescale units.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackDurationPerChunk(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
MP4Duration duration );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4AddIPodUUID(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_TRACK_H */
|
||||||
784
third_party/include/mp4v2/track_prop.h
vendored
Normal file
784
third_party/include/mp4v2/track_prop.h
vendored
Normal file
@ -0,0 +1,784 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Dave Mackie, dmackie@cisco.com
|
||||||
|
* Alix Marchandise-Franquet, alix@cisco.com
|
||||||
|
* Bill May, wmay@cisco.com
|
||||||
|
* Kona Blend, kona8lend@gmail.com
|
||||||
|
* Robert Kausch, robert.kausch@freac.org
|
||||||
|
*/
|
||||||
|
#ifndef MP4V2_TRACK_PROP_H
|
||||||
|
#define MP4V2_TRACK_PROP_H
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
*
|
||||||
|
* @defgroup mp4_track_prop MP4v2 Track Properties
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/* specific track properties */
|
||||||
|
|
||||||
|
/** Get the track type.
|
||||||
|
*
|
||||||
|
* MP4GetTrackType gets the type of the track with the specified track id.
|
||||||
|
*
|
||||||
|
* Note: the library does not provide a MP4SetTrackType function, the
|
||||||
|
* track type needs to be specified when the track is created, e.g.
|
||||||
|
* MP4AddSystemsTrack(MP4_OCI_TRACK_TYPE).
|
||||||
|
*
|
||||||
|
* Known track types are:
|
||||||
|
*
|
||||||
|
* @li #MP4_OD_TRACK_TYPE
|
||||||
|
* @li #MP4_SCENE_TRACK_TYPE
|
||||||
|
* @li #MP4_AUDIO_TRACK_TYPE
|
||||||
|
* @li #MP4_VIDEO_TRACK_TYPE
|
||||||
|
* @li #MP4_HINT_TRACK_TYPE
|
||||||
|
* @li #MP4_CNTL_TRACK_TYPE
|
||||||
|
* @li #MP4_TEXT_TRACK_TYPE
|
||||||
|
* @li #MP4_CLOCK_TRACK_TYPE
|
||||||
|
* @li #MP4_MPEG7_TRACK_TYPE
|
||||||
|
* @li #MP4_OCI_TRACK_TYPE
|
||||||
|
* @li #MP4_IPMP_TRACK_TYPE
|
||||||
|
* @li #MP4_MPEGJ_TRACK_TYPE
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
*
|
||||||
|
* @return On success, a string indicating track type. On failure, NULL.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
const char* MP4GetTrackType(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the name of the track's media data atom.
|
||||||
|
*
|
||||||
|
* MP4GetTrackMediaDataName returns the four character name of the specified
|
||||||
|
* track's media data atom, i.e. the child atom of the track's @b stsd atom.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the media data atom name is
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* @return The name of the track's media data atom or NULL in case of an
|
||||||
|
* error.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
const char* MP4GetTrackMediaDataName(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the name of an encrypted track's original media data atom.
|
||||||
|
*
|
||||||
|
* MP4GetTrackMediaDataOriginalFormat is used to get the original media data
|
||||||
|
* atom name if a track has been encrypted. The track identified by @p trackId
|
||||||
|
* must be an encrypted track with @b encv as the media data name returned by
|
||||||
|
* MP4GetTrackMediaDataName.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the encoded track for which the original media
|
||||||
|
* data atom name is desired.
|
||||||
|
* @param originalFormat specifies a buffer to receive the original media data
|
||||||
|
atom name.
|
||||||
|
* @param buflen specifies the size of the buffer pointed to by @p
|
||||||
|
* originalFormat.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackMediaDataOriginalFormat(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
char* originalFormat,
|
||||||
|
uint32_t buflen );
|
||||||
|
|
||||||
|
/** Get the duration of a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackDuration returns the total duration of all the samples in the
|
||||||
|
* specified track in the mp4 file.
|
||||||
|
*
|
||||||
|
* Caveat: The value is in units of the track time scale.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the duration is desired.
|
||||||
|
*
|
||||||
|
* @return The duration in track time scale units of the track in the mp4
|
||||||
|
* file.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Duration MP4GetTrackDuration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the time scale of a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackTimeScale returns the time scale of the specified track in
|
||||||
|
* the mp4 file. The time scale determines the number of clock ticks per
|
||||||
|
* second for this track.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
*
|
||||||
|
* @return timescale (ticks per second) of the track in the mp4 file.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint32_t MP4GetTrackTimeScale(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Set the time scale of a track.
|
||||||
|
*
|
||||||
|
* MP4SetTrackTimeScale sets the time scale of the specified track in the
|
||||||
|
* mp4 file. The time scale determines the number of clock ticks per
|
||||||
|
* second for this track.
|
||||||
|
*
|
||||||
|
* Typically this value is set once when the track is created. However
|
||||||
|
* this call can be used to modify the value if that is desired. Since
|
||||||
|
* track sample durations are expressed in units of the track time scale,
|
||||||
|
* any change to the time scale value will effect the real time duration
|
||||||
|
* of the samples.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param value desired time scale for the track.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackTimeScale(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint32_t value );
|
||||||
|
|
||||||
|
/** Get ISO-639-2/T language code of a track.
|
||||||
|
* The language code is a 3-char alpha code consisting of lower-case letters.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param code buffer to hold 3-char+null (4-bytes total).
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackLanguage(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
char* code );
|
||||||
|
|
||||||
|
/** Set ISO-639-2/T language code of a track.
|
||||||
|
* The language code is a 3-char alpha code consisting of lower-case letters.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param code 3-char language code.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackLanguage(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* code );
|
||||||
|
|
||||||
|
/** Get track name.
|
||||||
|
*
|
||||||
|
* MP4GetTrackName gets the name of the track via udta.name property.
|
||||||
|
*
|
||||||
|
* The memory to store the track name is allocated by the library, so the
|
||||||
|
* caller is responsible for freeing it with MP4Free().
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param name pointer to a variable to receive the track name.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackName(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
char** name );
|
||||||
|
|
||||||
|
/** Set track name.
|
||||||
|
*
|
||||||
|
* MP4SetTrackName sets the name of the track via udta.name property.
|
||||||
|
* The udta atom is created if needed.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param name the name to set as the track name.
|
||||||
|
*
|
||||||
|
* @return <b>true</b> on success, <b>false</b> on failure.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackName(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* name );
|
||||||
|
|
||||||
|
/** Get the encoding type of an MPEG-4 audio track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackAudioMpeg4Type returns the MPEG-4 encoding type of the specified
|
||||||
|
* MPEG-4 audio track in the mp4 file. If an mp4 audio track has type
|
||||||
|
* MP4_MPEG4_AUDIO_TYPE, this call can be used to determine which specific
|
||||||
|
* MPEG-4 audio encoding is contained in the track.
|
||||||
|
*
|
||||||
|
* Known MPEG-4 audio encoding types are:
|
||||||
|
*
|
||||||
|
* Type | Description
|
||||||
|
* ------------------------------------|--------------------------------------
|
||||||
|
* MP4_MPEG4_AAC_MAIN_AUDIO_TYPE | MPEG-4 AAC Main profile
|
||||||
|
* MP4_MPEG4_AAC_LC_AUDIO_TYPE | MPEG-4 AAC Low Complexity profile
|
||||||
|
* MP4_MPEG4_AAC_SSR_AUDIO_TYPE | MPEG-4 AAC SSR profile
|
||||||
|
* MP4_MPEG4_AAC_LTP_AUDIO_TYPE | MPEG-4 AAC Long Term Prediction profile
|
||||||
|
* MP4_MPEG4_AAC_SCALABLE_AUDIO_TYPE | MPEG-4 AAC Scalable
|
||||||
|
* MP4_MPEG4_CELP_AUDIO_TYPE | MPEG-4 CELP
|
||||||
|
* MP4_MPEG4_HVXC_AUDIO_TYPE | MPEG-4 HVXC
|
||||||
|
* MP4_MPEG4_TTSI_AUDIO_TYPE | MPEG-4 Text To Speech
|
||||||
|
* MP4_MPEG4_MAIN_SYNTHETIC_AUDIO_TYPE | MPEG-4 Main Synthetic profile
|
||||||
|
* MP4_MPEG4_WAVETABLE_AUDIO_TYPE | MPEG-4 Wavetable Synthesis profile
|
||||||
|
* MP4_MPEG4_MIDI_AUDIO_TYPE | MPEG-4 MIDI profile
|
||||||
|
* MP4_MPEG4_ALGORITHMIC_FX_AUDIO_TYPE | MPEG-4 Algorithmic Synthesis and Audio FX profile
|
||||||
|
*
|
||||||
|
* Note: This information is retrieved from the audio track ES configuration.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the MPEG-4 audio type is
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* @return Upon success, the MPEG-4 audio type of the track. Upon error,
|
||||||
|
* MP4_MPEG4_INVALID_AUDIO_TYPE is returned.
|
||||||
|
*
|
||||||
|
* @see MP4GetTrackAudioType()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint8_t MP4GetTrackAudioMpeg4Type(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the encoding object type id from a track's esds atom.
|
||||||
|
*
|
||||||
|
* MP4GetTrackEsdsObjectTypeId returns the encoding object type of the
|
||||||
|
* specified audio or video track in the mp4 file.
|
||||||
|
*
|
||||||
|
* Known audio object types are:
|
||||||
|
*
|
||||||
|
* Type | Description
|
||||||
|
* ------------------------------|--------------------------------------------
|
||||||
|
* MP4_MPEG1_AUDIO_TYPE | MPEG-1 Audio Layers I, II, & III
|
||||||
|
* MP4_MPEG2_AUDIO_TYPE | MPEG-2 low bitrate extensions to MPEG-1 Audio
|
||||||
|
* ^ | MP4_MP3_AUDIO_TYPE is an alias for this value
|
||||||
|
* MP4_MPEG2_AAC_MAIN_AUDIO_TYPE | MPEG-2 AAC Main profile
|
||||||
|
* MP4_MPEG2_AAC_LC_AUDIO_TYPE | MPEG-2 AAC Low Complexity profile
|
||||||
|
* MP4_MPEG2_AAC_SSR_AUDIO_TYPE | MPEG-2 AAC SSR profile
|
||||||
|
* MP4_MPEG4_AUDIO_TYPE | MPEG-4 Audio, includes MPEG-4 extensions to AAC
|
||||||
|
* MP4_PRIVATE_AUDIO_TYPE | User private type
|
||||||
|
*
|
||||||
|
* Known video object types are:
|
||||||
|
*
|
||||||
|
* Type | Description
|
||||||
|
* -----------------------------|---------------------------------------------
|
||||||
|
* MP4_MPEG1_VIDEO_TYPE | MPEG-1 Video
|
||||||
|
* MP4_MPEG2_SIMPLE_VIDEO_TYPE | MPEG-2 Simple Profile Video
|
||||||
|
* MP4_MPEG2_MAIN_VIDEO_TYPE | MPEG-2 Main Profile Video (Broadcast/DVD)
|
||||||
|
* MP4_MPEG2_SNR_VIDEO_TYPE | MPEG-2 SNR Profile Video
|
||||||
|
* MP4_MPEG2_SPATIAL_VIDEO_TYPE | MPEG-2 Spatial Scalability Profile Video
|
||||||
|
* MP4_MPEG2_HIGH_VIDEO_TYPE | MPEG-2 High Profile Video (HDTV)
|
||||||
|
* MP4_MPEG2_442_VIDEO_TYPE | MPEG-2 442 Profile Video (Studio)
|
||||||
|
* MP4_MPEG4_VIDEO_TYPE | MPEG-4 Video
|
||||||
|
* MP4_JPEG_VIDEO_TYPE | JPEG stills or motion JPEG
|
||||||
|
* MP4_PRIVATE_VIDEO_TYPE | User private type
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the encoding object type is
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* @return Upon success, the encoding object type of the track. Upon error,
|
||||||
|
* MP4_INVALID_AUDIO_TYPE is returned.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint8_t MP4GetTrackEsdsObjectTypeId(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the fixed duration of samples in a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackFixedSampleDuration returns the duration of samples in the
|
||||||
|
* specified track in the mp4 file, if this value is fixed for all samples.
|
||||||
|
* This is typically the case for audio tracks and video tracks. If the track
|
||||||
|
* samples have variable duration, then MP4_INVALID_DURATION is returned.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track to which the operation applies.
|
||||||
|
*
|
||||||
|
* @return Upon success, the number of fixed duration of the samples in the
|
||||||
|
* track in track time scale units. Upon an error, MP4_INVALID_DURATION.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4Duration MP4GetTrackFixedSampleDuration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the average bit rate in bits per second of the specified track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackBitRate returns the average bit rate in bits per second in the
|
||||||
|
* specified track in the mp4 file.
|
||||||
|
*
|
||||||
|
* Note: hint tracks will not return their bit rate via this mechanism.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the bit rate is desired.
|
||||||
|
*
|
||||||
|
* @return Upon success, the average bit rate in bits per second of the track.
|
||||||
|
* Upon an error, 0.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint32_t MP4GetTrackBitRate(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackVideoMetadata(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint8_t** ppConfig,
|
||||||
|
uint32_t* pConfigSize );
|
||||||
|
|
||||||
|
/** Get the elementary stream (ES) configuration of a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackESConfiguration returns the elementary stream (ES) configuration
|
||||||
|
* of the specified track in the mp4 file. This information is codec specific
|
||||||
|
* and contains the configuration necessary for the given codec to decode the
|
||||||
|
* samples in the track.
|
||||||
|
*
|
||||||
|
* Caveat: the returned block of memory has been allocated by the library. The
|
||||||
|
* caller may safely modify the value without effecting the library, but the
|
||||||
|
* caller takes responsiblity for freeing the memory with MP4Free().
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the ES configuration is
|
||||||
|
* desired.
|
||||||
|
* @param ppConfig specifies a pointer to a pointer variable that will be
|
||||||
|
* given the address of the configuration information.
|
||||||
|
* @param pConfigSize specifies a pointer to a variable to hold the size of
|
||||||
|
* the ES configuration information.
|
||||||
|
*
|
||||||
|
* @return Upon success, *ppConfig will point to a newly allocated block of
|
||||||
|
* memory with the ES configuration, and *pConfigSize will indicated the
|
||||||
|
* number of bytes of the ES configuration. Upon error, *ppConfig will be
|
||||||
|
* NULL, and *pConfigSize will be 0.
|
||||||
|
*
|
||||||
|
* @see MP4SetTrackESConfiguration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackESConfiguration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint8_t** ppConfig,
|
||||||
|
uint32_t* pConfigSize );
|
||||||
|
|
||||||
|
/** Set the elementary stream (ES) configuration of a track.
|
||||||
|
*
|
||||||
|
* MP4SetTrackESConfiguration sets the elementary stream (ES) configuration of
|
||||||
|
* the specified track in the mp4 file. This information is codec specific and
|
||||||
|
* contains the configuration necessary for the given codec to decode the
|
||||||
|
* samples in the track.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId the track to which the operation applies.
|
||||||
|
* @param pConfig specifies a pointer to the ES configuration information.
|
||||||
|
* @param configSize specifies the size of the ES configuration information.
|
||||||
|
*
|
||||||
|
* @return Upon success, true (1). Upon an error, false (0).
|
||||||
|
*
|
||||||
|
* @see MP4GetTrackESConfiguration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackESConfiguration(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const uint8_t* pConfig,
|
||||||
|
uint32_t configSize );
|
||||||
|
|
||||||
|
/* h264 information routines */
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackH264ProfileLevel(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint8_t* pProfile,
|
||||||
|
uint8_t* pLevel );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackH264SeqPictHeaders(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint8_t*** pSeqHeaders,
|
||||||
|
uint32_t** pSeqHeaderSize,
|
||||||
|
uint8_t*** pPictHeader,
|
||||||
|
uint32_t** pPictHeaderSize );
|
||||||
|
|
||||||
|
/** Frees the memory allocated by MP4GetTrackH264SeqPictHeaders.
|
||||||
|
*
|
||||||
|
* MP4FreeH264SeqPictHeaders frees the memory that was allocated by a
|
||||||
|
* call to the MP4GetTrackH264SeqPictHeaders function.
|
||||||
|
*
|
||||||
|
* When a client application wants to extract the H.264 video data from
|
||||||
|
* an MP4 file it will call MP4GetTrackH264SeqPictHeaders to obtain the
|
||||||
|
* sequence and picture parameter sets. These parameter sets are
|
||||||
|
* required for decoding a sequence of one, or more, coded slices. When
|
||||||
|
* the client application is done with the data it must free it. On the
|
||||||
|
* Windows platform this cannot be done directly by the client
|
||||||
|
* application because the C runtime of the client application and the C
|
||||||
|
* runtime of the mp4v2 DLL may be different, which will result in an
|
||||||
|
* error at runtime. This function allows the client application to let
|
||||||
|
* the mp4v2 DLL free the memory with the appropriate CRT heap manager.
|
||||||
|
*
|
||||||
|
* @param pSeqHeaders pointer to an array of SPS pointers.
|
||||||
|
* @param pSeqHeaderSize pointer to array of SPS sizes.
|
||||||
|
* @param pPictHeader pointer to an array of PPS pointers.
|
||||||
|
* @param pPictHeaderSize pointer to array of PPS sizes.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
void MP4FreeH264SeqPictHeaders(
|
||||||
|
uint8_t** pSeqHeaders,
|
||||||
|
uint32_t* pSeqHeaderSize,
|
||||||
|
uint8_t** pPictHeader,
|
||||||
|
uint32_t* pPictHeaderSize );
|
||||||
|
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackH264LengthSize(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
uint32_t* pLength );
|
||||||
|
|
||||||
|
/** Get the number of samples in a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackNumberOfSamples returns the number of samples in the specified
|
||||||
|
* track in the mp4 file. Sample id's are the consecutive sequence of numbers
|
||||||
|
* from 1 to the total number of samples, i.e. 1-based indexing, not 0-based
|
||||||
|
* indexing.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the number of samples is
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* @return Upon success, the number of samples in the track. Upon an error, 0.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
MP4SampleId MP4GetTrackNumberOfSamples(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the video width in pixels of the specified video track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackVideoWidth returns the width of the video in pixels in the
|
||||||
|
* specified track in the mp4 file.
|
||||||
|
*
|
||||||
|
* Caveat: Not all mp4 implementations set this value accurately. The mp4
|
||||||
|
* specification states that the authoritative values are contained in the
|
||||||
|
* track ES configuration which is video encoding specific, and hence not
|
||||||
|
* interpretable by the mp4 library.
|
||||||
|
*
|
||||||
|
* If the value of 320 is returned, care should be taken to verify the
|
||||||
|
* accuracy of this value since this is the default value in the mp4
|
||||||
|
* specification.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the video width is desired.
|
||||||
|
*
|
||||||
|
* @return Upon success, the number of pixels of the video width in the
|
||||||
|
* track. Upon an error, 0.
|
||||||
|
*
|
||||||
|
* @see MP4GetTrackVideoHeight()
|
||||||
|
* @see MP4GetTrackESConfiguration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint16_t MP4GetTrackVideoWidth(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the video height in pixels of the specified video track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackVideoHeight returns the height of the video in pixels in the
|
||||||
|
* specified track in the mp4 file.
|
||||||
|
*
|
||||||
|
* Caveat: Not all mp4 implementations set this value accurately. The mp4
|
||||||
|
* specification states that the authoritative values are contained in the
|
||||||
|
* track ES configuration which is video encoding specific, and hence not
|
||||||
|
* interpretable by the mp4 library.
|
||||||
|
*
|
||||||
|
* If the value of 240 is returned, care should be taken to verify the
|
||||||
|
* accuracy of this value since this is the default value in the mp4
|
||||||
|
* specification.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the video height is desired.
|
||||||
|
*
|
||||||
|
* @return Upon success, the number of pixels of the video height in the
|
||||||
|
* track. Upon an error, 0.
|
||||||
|
*
|
||||||
|
* @see MP4GetTrackVideoWidth()
|
||||||
|
* @see MP4GetTrackESConfiguration()
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
uint16_t MP4GetTrackVideoHeight(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the video frame rate of the specified video track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackVideoFrameRate returns the frame rate of the video in the
|
||||||
|
* specified track in the mp4 file. If the video is variable rate, the average
|
||||||
|
* frame rate is returned.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the video frame rate is
|
||||||
|
* desired.
|
||||||
|
*
|
||||||
|
* @return Upon success, the number of video frames per second of the track.
|
||||||
|
* Upon an error, 0.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
double MP4GetTrackVideoFrameRate(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Get the number of channels of the specified audio track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackAudioChannels returns the number of audio channels in the
|
||||||
|
* specified track in the mp4 file.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the number of audio channels
|
||||||
|
* is desired.
|
||||||
|
*
|
||||||
|
* @return Upon success, the number of audio channels of the track. Upon an
|
||||||
|
* error, -1.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
int MP4GetTrackAudioChannels(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/** Check whether a track is ISMACrypt encrypted.
|
||||||
|
*
|
||||||
|
* MP4IsIsmaCrypMediaTrack checks whether the specified track is encrypted
|
||||||
|
* using ISMACrypt.
|
||||||
|
*
|
||||||
|
* @param hFile specifies the mp4 file to which the operation applies.
|
||||||
|
* @param trackId specifies the track for which the information is desired.
|
||||||
|
*
|
||||||
|
* @return true (1) if the track is ISMACrypt encrypted, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4IsIsmaCrypMediaTrack(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId );
|
||||||
|
|
||||||
|
/* generic track properties */
|
||||||
|
|
||||||
|
/** Check for presence of a track atom.
|
||||||
|
*
|
||||||
|
* MP4HaveTrackAtom checks for the presence of the track atom passed in @p
|
||||||
|
* atomName. @p atomName can specify an atom path to check for atoms that are
|
||||||
|
* not direct children of the @b trak atom, e.g. "mdia.minf.stbl".
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param atomName name of the atom to check for.
|
||||||
|
*
|
||||||
|
* @return true (1) if the atom is present, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4HaveTrackAtom(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* atomName );
|
||||||
|
|
||||||
|
/** Get the value of an integer property for a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackIntegerProperty determines the value of the integer property
|
||||||
|
* identified by @p propName, e.g. "tkhd.layer", for the track identified by
|
||||||
|
* @p trackId. The value is stored in the variable pointed to by @p retVal.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param propName path to the property to get.
|
||||||
|
* @param retVal pointer to a variable to receive the return value.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackIntegerProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* propName,
|
||||||
|
uint64_t* retVal );
|
||||||
|
|
||||||
|
/** Get the value of a float property for a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackFloatProperty determines the value of the float property
|
||||||
|
* identified by @p propName, e.g. "tkhd.volume", for the track identified by
|
||||||
|
* @p trackId. The value is stored in the variable pointed to by @p retVal.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param propName path to the property to get.
|
||||||
|
* @param retVal pointer to a variable to receive the return value.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackFloatProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* propName,
|
||||||
|
float* retVal );
|
||||||
|
|
||||||
|
/** Get the value of a string property for a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackStringProperty determines the value of the string property
|
||||||
|
* identified by @p propName, e.g. "udta.hnti.sdp .sdpText", for the track
|
||||||
|
* identified by @p trackId. The value is stored in the variable pointed to by
|
||||||
|
* @p retVal.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param propName path to the property to get.
|
||||||
|
* @param retVal pointer to a variable to receive the return value.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackStringProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* propName,
|
||||||
|
const char** retVal );
|
||||||
|
|
||||||
|
/** Get the value of a bytes property for a track.
|
||||||
|
*
|
||||||
|
* MP4GetTrackBytesProperty determines the value of the bytes property
|
||||||
|
* identified by @p propName, e.g. "tkhd.matrix", for the track identified by
|
||||||
|
* @p trackId. The value is stored in a newly allocated buffer the location of
|
||||||
|
* which is assigned to the variable pointed to by ppValue. The caller is
|
||||||
|
* responsible for freeing the memory with MP4Free().
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param propName path to the property to get.
|
||||||
|
* @param ppValue pointer to a variable to receive the memory location
|
||||||
|
* containing the property bytes.
|
||||||
|
* @param pValueSize pointer to a variable to receive the length of the
|
||||||
|
* property bytes value.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4GetTrackBytesProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* propName,
|
||||||
|
uint8_t** ppValue,
|
||||||
|
uint32_t* pValueSize );
|
||||||
|
|
||||||
|
/** Set the value of an integer property for a track.
|
||||||
|
*
|
||||||
|
* MP4SetTrackIntegerProperty sets the value of the integer property
|
||||||
|
* identified by @p propName, e.g. "tkhd.layer", for the track identified by
|
||||||
|
* @p trackId.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param propName path to the property to set.
|
||||||
|
* @param value the new value of the property.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackIntegerProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* propName,
|
||||||
|
int64_t value );
|
||||||
|
|
||||||
|
/** Set the value of a float property for a track.
|
||||||
|
*
|
||||||
|
* MP4SetTrackFloatProperty sets the value of the float property identified by
|
||||||
|
* @p propName, e.g. "tkhd.volume", for the track identified by @p trackId.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param propName path to the property to set.
|
||||||
|
* @param value the new value of the property.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackFloatProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* propName,
|
||||||
|
float value );
|
||||||
|
|
||||||
|
/** Set the value of a string property for a track.
|
||||||
|
*
|
||||||
|
* MP4SetTrackStringProperty sets the value of the string property identified
|
||||||
|
* by @p propName, e.g. "udta.hnti.sdp .sdpText", for the track identified by
|
||||||
|
* @p trackId.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param propName path to the property to set.
|
||||||
|
* @param value the new value of the property.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackStringProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* propName,
|
||||||
|
const char* value );
|
||||||
|
|
||||||
|
/** Set the value of a bytes property for a track.
|
||||||
|
*
|
||||||
|
* MP4SetTrackBytesProperty sets the value of the bytes property identified by
|
||||||
|
* @p propName, e.g. "tkhd.matrix", for the track identified by @p trackId.
|
||||||
|
*
|
||||||
|
* @param hFile handle of file for operation.
|
||||||
|
* @param trackId id of track for operation.
|
||||||
|
* @param propName path to the property to set.
|
||||||
|
* @param pValue pointer the bytes representing the new value of the property.
|
||||||
|
* @param valueSize the size of the bytes value pointed to by <b>pValue</b>.
|
||||||
|
*
|
||||||
|
* @return true (1) on success, false (0) otherwise.
|
||||||
|
*/
|
||||||
|
MP4V2_EXPORT
|
||||||
|
bool MP4SetTrackBytesProperty(
|
||||||
|
MP4FileHandle hFile,
|
||||||
|
MP4TrackId trackId,
|
||||||
|
const char* propName,
|
||||||
|
const uint8_t* pValue,
|
||||||
|
uint32_t valueSize);
|
||||||
|
|
||||||
|
/** @} ***********************************************************************/
|
||||||
|
|
||||||
|
#endif /* MP4V2_TRACK_PROP_H */
|
||||||
BIN
third_party/lib/libmp4v2.a
vendored
Normal file
BIN
third_party/lib/libmp4v2.a
vendored
Normal file
Binary file not shown.
BIN
third_party/lib/libutil.a
vendored
Normal file
BIN
third_party/lib/libutil.a
vendored
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user