/*
* Copyright (c) 2020-2021 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @addtogroup format
* @{
*
* @brief Defines format-related APIs.
*
* For example, you use this module to define custom data types and to initialize, create,
* destroy the muxer and demuxer, and set their parameters. Also, you can read demuxer data frames,
* select demuxer tracks, add muxer tracks, and write data frames into a container.
*
* @since 1.0
* @version 1.0
*/
/**
* @file format_interface.h
*
* @brief Declares format-related APIs.
*
* For example, you use the functions provided in this file to define custom data types and to initialize,
* create, destroy the muxer and demuxer, and set their parameters. Also, you can read demuxer data frames,
* select demuxer tracks, add muxer tracks, and write data frames into a container.
*
* @since 1.0
* @version 1.0
*/
#ifndef FORMAT_INTERFACE_H
#define FORMAT_INTERFACE_H
#include "format_type.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */
/**
* @brief Initializes the format.
*
* You can call this function to initialize the demuxer and muxer.
* This function should always be called before other format-specific functions,
* and it can be called only once within a process.
*
* @since 1.0
* @version 1.0
*/
void FormatInit(void);
/**
* @brief Deinitializes the format.
*
* You can call this function to deinitialize the demuxer and muxer.
* This function works in pair with {@link FormatInit}.
*
* @since 1.0
* @version 1.0
*/
void FormatDeInit(void);
/**
* @brief Creates a demuxer component and returns its context handle.
*
* This function returns the demuxer context handle without probing the container format or
* obtaining stream information.
*
* @param source Indicates the pointer to the format source of the demuxer. For details, see {@link FormatSource}.
* @param handle Indicates the double pointer to the demuxer context handle.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
*/
int32_t FormatDemuxerCreate(const FormatSource *source, FormatHandle * const handle);
/**
* @brief Sets demuxer attributes.
*
* You can call this function to set the HTTP header, HTTP referer, and other extension items for the demuxer
* after {@link FormatDemuxerCreate} is called.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param trackId Identifies the track. If the value is an invalid value (-1),
* this parameter identifies the file or program.
* @param metaData Indicates the pointer to an array of key-value pairs representing parameter names and values.
* For details, see {@link ParameterItem}.
* @param metaDataCnt Indicates the number of key-value pairs in the array.
* This parameter works in pair with metaData.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerSetParameter(const FormatHandle handle, int32_t trackId,
const ParameterItem *metaData, int32_t metaDataCnt);
/**
* @brief Obtains demuxer attributes.
*
* You can call this function to obtain the HTTP header, HTTP referer, and other extension items for the demuxer
* after {@link FormatDemuxerCreate} is called. The demuxer will store the value in the metaData
* based on the key.If the demuxer has allocated memory for the metaData to store the value,
* the caller should manually free the memory.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param trackId Identifies the track. If the value is an invalid value (-1),
* this parameter identifies the file or program.
* @param metaData Indicates the pointer to the buffer for storing the parameters values
* that the demuxer has searched for based on the input key. For details, see {@link ParameterItem}.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerGetParameter(const FormatHandle handle, int32_t trackId, ParameterItem *metaData);
/**
* @brief Sets a callback for the demuxer.
*
* The callback will be invoked to notify the upper layer of internal events of the demuxer.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param callBack Indicates the pointer to the callback, as defined in {@link FormatCallback}.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerSetCallBack(const FormatHandle handle, const FormatCallback *callBack);
/**
* @brief Sets buffer information for the demuxer.
*
* If there is a buffer mechanism in the demuxer, you can call this function to set the maximum buffer size and time.
* Alternatively, you can disable the buffer mechanism by setting the buffer size and time to 0 in
* the setting parameter. If there is no buffer mechanism or the default setting is retained,
* you can skip this function.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param setting Indicates the pointer to the maximum demuxer buffer size and time,
* as defined in {@link FormatBufferSetting}.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
*/
int32_t FormatDemuxerSetBufferConfig(const FormatHandle handle, const FormatBufferSetting *setting);
/**
* @brief Obtains the buffer information of the demuxer.
*
* If there is a buffer mechanism in the demuxer, you can call this function to obtain the maximum buffer size and time.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param setting Indicates the pointer to the maximum demuxer buffer size and time,
* as defined in {@link FormatBufferSetting}.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerGetBufferConfig(const FormatHandle handle, FormatBufferSetting *setting);
/**
* @brief Makes preparations for the demuxer.
*
* This function triggers the demuxer to probe the media file container format and parse stream information.
* You can obtain media file attributes only after this function is called.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerPrepare(const FormatHandle handle);
/**
* @brief Obtains the attributes of a media file.
*
* The attributes contain file, program, and stream attributes.
* This function should be called after {@link FormatDemuxerPrepare} is called.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param info Indicates the pointer to the source attributes, as defined in {@link FileInfo}.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerGetFileInfo(const FormatHandle handle, FileInfo *info);
/**
* @brief Selects a specified media track.
*
* The media tracks to select must belong to the same program.
* If you do not call this function, the default media tracks of the default program are selected.
* If programId is valid but trackId is invalid, the default media track of the specified program is used.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param programId Identifies the program.
* @param trackId Identifies the media track. If a valid value is passed, the media track must belong to
* the specified program. If an invalid value is passed, the default media track of the specified program is used.
* If multiple audio tracks are specified, the player determines which audio track to use.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerSelectTrack(const FormatHandle handle, int32_t programId, int32_t trackId);
/**
* @brief Unselects a specified media track from which the demuxer reads data frames.
*
* The demuxer can read all media tracks of the default program. You can call this function to
* unselect all or certain tracks of a specified program that the demuxer is expected not to read.
* If trackId is invalid, the demuxer will read none of the tracks of the specified program.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param programId Identifies the program.
* @param trackId Identifies the media track that the demuxer will unselect.
* This parameter works in pair with programId. If a valid value is passed, the media track must belong to
* the program specified by programId. If an invalid value is passed, and all media tracks of the specified
* program are unselected.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerUnselectTrack(const FormatHandle handle, int32_t programId, int32_t trackId);
/**
* @brief Starts the demuxer.
*
* After being started, the caller can read data frames from the demuxer.
* This function should be called after {@link FormatDemuxerPrepare} is called.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerStart(const FormatHandle handle);
/**
* @brief Obtains the ID of the media track selected by the demuxer for output.
*
* The demuxer automatically selects the default program and its media tracks.
* However, if the program and media tracks have changed after {@link FormatDemuxerSelectTrack} and
* {@link FormatDemuxerUnselectTrack} are called, you can obtain the currently selected program and media tracks
* by calling this function (FormatDemuxerGetSelectedTrack.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param programId Identifies the pointer to the program.
* @param trackId Identifies the array of selected media tracks. This parameter works in pair with nums.
* @param nums Indicates the pointer to the total number of selected media tracks.
* This parameter works in pair with trackId.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerGetSelectedTrack(const FormatHandle handle, int32_t *programId, int32_t trackId[], int32_t *nums);
/**
* @brief Reads data frames.
*
* After the data frames are read,
* you need to call {@link FormatDemuxerFreeFame} to free them.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param frame Indicates the pointer to the data structure {@link FormatFrame}.
* @param timeOutMs Indicates the time required for waiting data frame read.
* The value 0 indicates that data frames are immediately read without any wait.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerReadFrame(const FormatHandle handle, FormatFrame *frame, int32_t timeOutMs);
/**
* @brief Frees data frames.
*
* You can call this function to free the data frames obtained by calling {@link FormatDemuxerReadFrame}.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param frame Indicates the pointer to the data structure {@link FormatFrame}.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerFreeFrame(const FormatHandle handle, FormatFrame *frame);
/**
* @brief Seeks for a specified position for the demuxer.
*
* After being started, the demuxer seeks for a specified position to read data frames.
* You can specify the position close to the time specified by streamIndex.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @param streamIndex Identifies the stream in the media file.
* @param timeStampUs Indicates the target position, in microseconds.
* @param mode Indicates the seek mode, as defined in {@link FormatSeekMode}.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerSeek(const FormatHandle handle, int32_t streamIndex, int64_t timeStampUs, FormatSeekMode mode);
/**
* @brief Stops the demuxer from working.
*
* After this function is called, the demuxer cannot resume decapsulation.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerStop(const FormatHandle handle);
/**
* @brief Destroys demuxer resources.
*
* This function works in pair with {@link FormatDemuxerCreate}.
* If you do not call this function, resource leakage may occur.
*
* @param handle Indicates the pointer to the demuxer context handle.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatDemuxerDestroy(const FormatHandle handle);
/**
* @brief Creates a muxer and returns its context handle.
*
* @param handle Indicates the double pointer to the muxer context handle.
* @param outputConfig Indicates the pointer to the muxer output configuration,
* as defined in {@link FormatOutputConfig}.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerCreate(FormatHandle * const handle, const FormatOutputConfig *outputConfig);
/**
* @brief Destroys a muxer and releases its resources created by calling {@link FormatMuxerCreate}.
*
* @param handle Indicates the pointer to the muxer context handle.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerDestroy(const FormatHandle handle);
/**
* @brief Adds a media track source for the muxer. For details about track sources, see {@link TrackSource}.
*
* This function must be called after {@link FormatMuxerCreate} is successfully called and
* before {@link FormatMuxerStart} is called.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param trackSource Indicates the pointer to the track source.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerAddTrack(const FormatHandle handle, const TrackSource *trackSource);
/**
* @brief Sets a callback for the muxer. For details about the callback, see {@link FormatCallback}.
*
* This function should be called after {@link FormatMuxerCreate} is successfully called.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param FormatCallback Indicates the pointer to the muxer callback to set.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerSetCallBack(const FormatHandle handle, const FormatCallback *callBack);
/**
* @brief Sets the orientation of the video track for the muxer.
*
* This function should be called after {@link FormatMuxerAddTrack} is successfully called.
* The following degrees are supported: 0, 90, 180, and 270.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param degrees Indicates the clockwise angle of the video track.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerSetOrientation(const FormatHandle handle, int degrees);
/**
* @brief Sets the geographical information for the output file of the muxer.
*
* This function should be called after {@link FormatMuxerCreate} is successfully called.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param latitude Indicates the latitude, within the range [-90,90].
* @param longitude Indicates the longitude, within the range [-180,180].
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerSetLocation(const FormatHandle handle, int latitude, int longitude);
/**
* @brief Sets the maximum size (in bytes) for the output file of the muxer.
*
* This function should be called after {@link FormatMuxerCreate} is successfully called.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param bytes Indicates the maximum size of a file, in bytes. If the value is 0 or negative,
* the operation fails and the maximum size does not take effect. In this case, the maximum size of a single file
* supported by the current file system is used as the value of this parameter.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerSetMaxFileSize(const FormatHandle handle, int64_t bytes);
/**
* @brief Sets the maximum duration (in seconds) for the output file.
*
* You need to call this function before calling {@link FormatMuxerStart}. If the maximum duration you set is valid
* and capturing is approaching 90% of that duration or the remaining duration is 1s, the message
* {@link MUXER_INFO_MAX_DURATION_APPROACHING} is reported via {@link OnInfo} of {@link FormatCallback}. If the output
* file has been set by calling {@link FormatMuxerCreate}, you need to call {@link FormatMuxerSetNextOutputFile}
* to set the next output file. Otherwise, the current output file will be overwritten when the capturing reaches
* the maximum duration you set.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param duration Indicates the maximum duration to set, in seconds. If the value is 0 or negative,
* the operation fails. In this case, the default duration (60 seconds) will be used.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerSetMaxFileDuration(const FormatHandle handle, int64_t durationUs);
/**
* @brief Manually splits a file.
*
* This function can be called after {@link FormatMuxerStart} is called. Once this function is called,
* the file is split based on the manual split type. After manual split is complete, file split will proceed to
* use the initially set split type. You can call this function again only after
* the {@link MUXER_INFO_FILE_SPLIT_FINISHED} event is reported.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param type Indicates the file split type, as defined in {@link FileSplitType}.
* @param timestamp Indicates the file split timestamp. This parameter is not supported currently.
* The value ¨C1 indicates that the file is split at the time this function is called.
* @param duration Indicates the period from the file split time to the time the next output file starts.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerSetFileSplitDuration(const FormatHandle handle, ManualSplitType type,
int64_t timestampUs, uint32_t durationUs);
/**
* @brief Starts the muxer.
*
* You can call this function to encapsulate media data after the muxer is created, media tracks are added,
* and related parameters are set.
*
* @param handle Indicates the pointer to the muxer context handle.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerStart(FormatHandle handle);
/**
* @brief Writes data frames into the muxer.
*
* This function should be called after {@link FormatMuxerCreate} is successfully called.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param frameData Indicates the pointer to the data structure {@link FormatFrame}.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerWriteFrame(const FormatHandle handle, const FormatFrame *frameData);
/**
* @brief Sets the descriptor for the next output file.
*
* If {@link FormatMuxerCreate} is successfully called and the file descriptor involved is valid, you can call
* this function (FormatMuxerSetNextOutputFile) upon receiving the message
* {@link MUXER_INFO_MAX_FILESIZE_APPROACHING} or {@link MUXER_INFO_MAX_DURATION_APPROACHING}.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param fd Indicates the file descriptor to set.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerSetNextOutputFile(const FormatHandle handle, int32_t fd);
/**
* @brief Stops the muxer that was started by calling {@link FormatMuxerStart}.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param block Indicates how to stop the muxer. The value true indicates that the muxer is stopped
* after all buffered data is processed, and false indicates that the buffered data is discarded and
* the muxer is immediately stopped.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerStop(const FormatHandle handle, bool block);
/**
* @brief Sets muxer attributes.
*
* This is an extended function that can be used to add MP4-dedicated boxes and tags (such as exif).
*
* @param handle Indicates the pointer to the muxer context handle.
* @param trackId Identifies the media track. If the value is {@link FORMAT_INVALID_TRACK_ID},
* this function sets the muxer attributes.
* @param item Indicates the pointer to the items carrying muxer attributes. You can specify multiple items at a time
* in this parameter, which works in pair with itemNum.
* @param itemNum Indicates the number of attributes set at a time.
* @return Returns 0 if the operation is successful; returns a non-zero value otherwise.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerSetParameter(const FormatHandle handle, int32_t trackId, const ParameterItem *item,
int32_t itemNum);
/**
* @brief Obtains muxer attributes.
*
* This is an extended function that can be used to obtain muxer or track attributes.
* The demuxer then obtains the muxer attributes based on the key contained in item.
*
* @param handle Indicates the pointer to the muxer context handle.
* @param trackId Identifies the media track. If the value is {@link FORMAT_INVALID_TRACK_ID},
* this function obtains the muxer attributes.
* @param item Indicates the pointer to the items carrying muxer attributes. You can specify multiple items at a time
* in this parameter, which works in pair with itemNum.
* @param itemNum Indicates the number of attributes set at a time.
* @return Returns 0 if the operation is successful; returns a non-zero value if any requested attribute
* fails to be obtained or is not found.
* @since 1.0
* @version 1.0
*/
int32_t FormatMuxerGetParameter(const FormatHandle handle, int32_t trackId, ParameterItem *item, int32_t itemNum);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif // FORMAT_INTERFACE_H
/** @} */