blob: 9451479db860a7b9c9d5948924f4531cca4f2c87 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* 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.
* -------------------------------------------------------------------
*/
#ifndef _MP4ENC_API_H_
#define _MP4ENC_API_H_
#include <string.h>
#ifndef _PV_TYPES_
#define _PV_TYPES_
typedef unsigned char UChar;
typedef char Char;
typedef unsigned int UInt;
typedef int Int;
typedef unsigned short UShort;
typedef short Short;
typedef unsigned int Bool;
typedef uint32_t ULong;
#define PV_CODEC_INIT 0
#define PV_CODEC_STOP 1
#endif
#define PV_TRUE 1
#define PV_FALSE 0
typedef enum
{
SHORT_HEADER,
SHORT_HEADER_WITH_ERR_RES,
H263_MODE,
H263_MODE_WITH_ERR_RES,
DATA_PARTITIONING_MODE,
COMBINE_MODE_NO_ERR_RES,
COMBINE_MODE_WITH_ERR_RES
} MP4EncodingMode;
typedef enum
{
CONSTANT_Q,
CBR_1,
VBR_1,
CBR_2,
VBR_2,
CBR_LOWDELAY
} MP4RateControlType;
typedef enum
{
PASS1,
PASS2
} PassNum;
typedef enum
{
PV_OFF,
PV_ON
} ParamEncMode;
/* {SPL0, SPL1, SPL2, SPL3, CPL1, CPL2, CPL2, CPL2} , SPL0: Simple Profile@Level0 , CPL1: Core Profile@Level1 */
/* {SSPL0, SSPL1, SSPL2, SSPL2, CSPL1, CSPL2, CSPL3, CSPL3} , SSPL0: Simple Scalable Profile@Level0, CPL1: Core Scalable Profile@Level1 */
typedef enum
{
/* Non-scalable profile */
SIMPLE_PROFILE_LEVEL0 = 0,
SIMPLE_PROFILE_LEVEL1,
SIMPLE_PROFILE_LEVEL2,
SIMPLE_PROFILE_LEVEL3,
CORE_PROFILE_LEVEL1,
CORE_PROFILE_LEVEL2,
/* Scalable profile */
SIMPLE_SCALABLE_PROFILE_LEVEL0 = 6,
SIMPLE_SCALABLE_PROFILE_LEVEL1,
SIMPLE_SCALABLE_PROFILE_LEVEL2,
CORE_SCALABLE_PROFILE_LEVEL1 = 10,
CORE_SCALABLE_PROFILE_LEVEL2,
CORE_SCALABLE_PROFILE_LEVEL3
} ProfileLevelType;
typedef struct tagMP4HintTrack
{
UChar MTB;
UChar LayerID;
UChar CodeType;
UChar RefSelCode;
} MP4HintTrack;
typedef struct tagvideoEncControls
{
void *videoEncoderData;
Int videoEncoderInit;
} VideoEncControls;
typedef struct tagvideoEncFrameIO
{
UChar *yChan; /* pointer to Y */
UChar *uChan; /* pointer to U */
UChar *vChan; /* pointer to V */
Int height; /* height for Y */
Int pitch; /* stride for Y */
ULong timestamp; /* modulo timestamp in millisecond*/
} VideoEncFrameIO ;
/**
@brief Encoding options structure */
typedef struct tagvideoEncOptions
{
/** @brief Sets the encoding mode, defined by the above enumaration. If there are conflicts between the encoding mode
* and subsequent encoding options, encoding mode take precedent over encoding options. */
MP4EncodingMode encMode;
/** @brief Sets the number of bytes per packet, only used in DATA_PARTITIONING_MODE or COMBINE_MODE_WITH_ERR_RES mode.
* The resync marker will be inserted as often as the size of the packet.*/
Int packetSize;
/** @brief Selects MPEG-4/H.263 profile and level, if specified other encoding options must conform with it. */
ProfileLevelType profile_level;
/** @brief Enables reversible variable length code (RVLC) mode. Normally it is set to PV_OFF.*/
ParamEncMode rvlcEnable;
/** @brief Set the frequency of GOB header interval */
Int gobHeaderInterval;
/** @brief Sets the number of bitstream layers: 1 is base only: 2 is base + enhancement */
Int numLayers;
/** @brief Sets the number of ticks per second used for timing information encoded in MPEG4 bitstream.*/
Int timeIncRes;
/** @brief Sets the number of ticks in time increment resolution between 2 source frames (equivalent to source frame rate). */
Int tickPerSrc;
/** @brief Specifies encoded heights in pixels, height[n] represents the n-th layer's height. */
Int encHeight[2];
/** @brief Specifies encoded widths in pixels, width[n] represents the n-th layer's width.*/
Int encWidth[2];
/** @brief Specifies target frame rates in frames per second, frameRate[n] represents the n-th layer's target frame rate.*/
float encFrameRate[2];
/** @brief Specifies target bit rates in bits per second unit, bitRate[n] represents the n-th layer's target bit rate. */
Int bitRate[2];
/** @brief Specifies default quantization parameters for I-Vop. Iquant[n] represents the n-th layer default quantization parameter. The default is Iquant[0]=12.*/
Int iQuant[2];
/** @brief Specifies default quantization parameters for P-Vop. Pquant[n] represents the n-th layer default quantization parameter. The default is Pquant[0]=10.*/
Int pQuant[2];
/** @brief specifies quantization mode (H263 mode or MPEG mode) of the encoded base and enhance layer (if any).
* In Simple and Simple Scalable profile, we use only H263 mode.*/
Int quantType[2];
/** @brief Sets rate control algorithm, one of (CONSTANT_Q, CBR_1, or VBR_1).
* CONSTANT_Q uses the default quantization values to encode the sequence.
* CBR_1 (constant bit rate) controls the output at a desired bit rate
* VBR_1 (variable bit rate) gives better picture quality at the expense of bit rate fluctuation
* Note: type=CONSTANT_Q produces sequences with arbitrary bit rate.
* type=CBR_1 produces sequences suitable for streaming.
* type=VBR_1 produces sequences suitable for download. */
MP4RateControlType rcType;
/** @brief Sets the VBV buffer size (in the unit of second delay) used to prevent buffer overflow and underflow
* on the decoder side. This function is redundant to PVSetVBVSize. Either one of them is used at a time. */
float vbvDelay;
/** @brief Specifies whether frame skipping is permitted or not. When rate control type is set to CONSTANT_Q
* frame skipping is automatically banned. In CBR_1 and VBR_1 rate control, frame skipping is allowed by default.
* However, users can force no frame skipping with this flag, but buffer constraint may be violated.*/
ParamEncMode noFrameSkipped;
/** @brief Sets the maximum number of P-frames between two I-frames. I-frame mode is periodically forced
* if no I-frame is encoded after the specified period to add error resiliency and help resynchronize in case of errors.
* If scene change detection can add additional I-frame if new scenes are detected.
* intraPeriod is the I frame interval in terms of second.
* intraPeriod =0 indicates I-frame encoding only;
* intraPeriod = -1 indicates I-frame followed by all P-frames; (default)
* intraPeriod = N, indicates the number of P-frames between 2 I-frames.*/
Int intraPeriod;
/** @brief Specifies the number Intra MBs to be refreshed in a P-frame. */
Int numIntraMB;
/**
* @brief Specifies whether the scene change detection (SCD) is enabled or disabled.
* With SCD enable, when a new scene is detected, I-Vop mode will be used for the first frame of
* the new scene resulting in better picture quality. An insertion of an I-VOP resets the intraPeriod
* specified by the IntraPeriodAPI().*/
ParamEncMode sceneDetect;
/** @brief Specifies the search range of motion estimation search. Larger value implies
* larger search range, better motion vector match, but more complexity.
* If searchRange=n, the motion vector search is in the range of [-n,n-1] pixels.
* If half-pel mode is on, the range is [-n, (n-1)+1/2] pixels. The default value is 16.*/
Int searchRange;
/** @brief Turns on/off 8x8 block motion estimation and compensation.
* If on, four motion vectors may be used for motion estimation and compensation of a macroblock,
* otherwise one motion vector per macroblock is used. When the 8x8 MV is off, the total encoding complexity
* is less but the image quality is also worse. Therefore, it can be used in complexity limited environment.*/
ParamEncMode mv8x8Enable;
/** @brief Set the threshold for using intra DC VLC.
* Value must range from 0-7.*/
Int intraDCVlcTh;
/** @brief This flag turns on the use of AC prediction */
Bool useACPred;
} VideoEncOptions;
#ifdef __cplusplus
extern "C"
{
#endif
/* API's */
/* Always start with this one !!*/
/**
* @brief Gets default encoding options. This way users only have to set relevant encoding options and leave the one
* they are unsure of.
* @encOption Pointer to VideoEncOption structure.
* @encUseCase This value determines the set of default encoding options, for example, different encoding options
* are assigned to streaming use-case as compared to download use-case. It can be project dependent too.
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVGetDefaultEncOption(VideoEncOptions *encOption, Int encUseCase);
/**
* @brief Verifies the consistency of encoding parameters, allocates memory needed and set necessary internal variables.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVInitVideoEncoder(VideoEncControls *encCtrl, VideoEncOptions *encOption);
/* acquiring encoder info APIs */
/**
* @brief This function returns VOL header. It has to be called before the frame is encoded. If so,
* then the VOL Header is passed back to the application. Then all frames that are encoded do not contain the VOL Header.
* If you do not call the API then the VOL Header is passed within the first frame that is encoded.
* The behavior is unknown if it is called after the first frame is encoded. It is mainly used for MP4 file format authoring.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs.
* @param volHeader is the Buffer for VOL header.
* @param size is the size of VOL header in bytes.
* @param layer is the layer of the requested VOL header.
* @return true for correct operation; false if error happens.
*/
OSCL_IMPORT_REF Bool PVGetVolHeader(VideoEncControls *encCtrl, UChar *volHeader, Int *size, Int layer);
/**
* @brief This function returns the profile and level in H.263 coding when the encoding parameters are set
* @param encCtrl is video encoder control structure that is always passed as input in all APIs.
* @param profileID is the pointer of the profile ID. Right now we only support profile 0
* @param levelID is the pointer of the level ID that could be 10-70.
* @return true for correct operation; false if error happens.
*/
OSCL_IMPORT_REF Bool PVGetH263ProfileLevelID(VideoEncControls *encCtrl, Int *profileID, Int *levelID);
/**
* @brief This function returns the profile and level of MPEG4 when the encoding parameters are set
* @param encCtrl is video encoder control structure that is always passed as input in all APIs.
* @param profile_level is the pointer of the profile enumeration
* @param nLayer is the index of the layer of interest
* @return true for correct operation; false if error happens.
*/
OSCL_IMPORT_REF Bool PVGetMPEG4ProfileLevelID(VideoEncControls *encCtrl, Int *profile_level, Int nLayer);
/**
* @brief This function returns maximum frame size in bytes
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @param maxVideoFrameSize is the pointer of the maximum frame size
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVGetMaxVideoFrameSize(VideoEncControls *encCtrl, Int *maxVideoFrameSize);
#ifndef LIMITED_API
/**
* @brief This function returns the total amount of memory (in bytes) allocated by the encoder library.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Int PVGetEncMemoryUsage(VideoEncControls *encCtrl);
/**
* @brief This function is used by PVAuthor to get the size of the VBV buffer.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @param VBVSize is the pointer of The size of the VBV buffer in bytes.
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVGetVBVSize(VideoEncControls *encCtrl, Int *VBVSize);
#endif
/**
* @brief This function encodes a frame in YUV 4:2:0 format from the *video_in input frame and put the result in YUV
* for reconstructed frame and bstream for MPEG4 bitstream. The application is required to allocate memory for
* bitstream buffer.The size of the input bitstream memory and the returned output buffer are specified in the
* size field. The encoded layer is specified by the nLayer field. If the current frame is not encoded, size=0 and nLayer=-1.
* Note: If the allocated buffer size is too small to fit a bitstream of a frame, then those extra bits will be left out
* which can cause syntactic error at the decoder side.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @param vid_in is the pointer to VideoEncFrameIO structure containing the YUV input data
* @param vid_out is the pointer to VideoEncFrameIO structure containing the reconstructed YUV output data after encoding
* @param nextModTime is the timestamp encoder expects from the next input
* @param bstream is the pointer to MPEG4 bitstream buffer
* @param size is the size of bitstream buffer allocated (input) and size of the encoded bitstream (output).
* @param nLayer is the layer of the encoded frame either 0 for base or 1 for enhancement layer. The value -1 indicates skipped frame due to buffer overflow.
* @return true newfor correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVEncodeVideoFrame(VideoEncControls *encCtrl, VideoEncFrameIO *vid_in, VideoEncFrameIO *vid_out,
ULong *nextModTime, UChar *bstream, Int *size, Int *nLayer);
/**
* @brief This function is used to query overrun buffer. It is used when PVEncodeVideoFrame.returns size that is
* larger than the input size.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @return Pointer to the overrun buffer. NULL if overrun buffer is not used.
*/
OSCL_IMPORT_REF UChar* PVGetOverrunBuffer(VideoEncControls *encCtrl);
#ifndef NO_SLICE_ENCODE /* This set of APIs are not working. This functionality has been partially
replaced by the introduction of overrun buffer. */
/* slice-based coding */
/**
* @brief This function sets the input YUV frame and timestamp to be encoded by the slice-based encoding function PVEncodeSlice().
* It also return the memory address the reconstructed frame will be copied to (in advance) and the coded layer number.
* The encoder library processes the timestamp and determine if this frame is to be encoded or not. If the current frame
* is not encoded, nLayer=-1. For frame-based motion estimation, the motion estimation of the entire frame is also performed
* in this function. For MB-based motion estimation, the motion vector is searched while coding each MB in PVEncodeSlice().
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @param vid_in is the pointer to VideoEncFrameIO structure containing the YUV input data
* @param nextModTime is the timestamp encoder expects from the next input if this input is rejected and nLayer is set to -1.
* @param nLayer is the layer of the encoded frame either 0 for base or 1 for enhancement layer. The value -1 indicates skipped frame due to buffer overflow.
* @return true newfor correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVEncodeFrameSet(VideoEncControls *encCtrl, VideoEncFrameIO *vid_in, ULong *nextModTime, Int *nLayer);
/**
* @brief This function encodes a GOB (short header mode) or a packet (data partitioning mode or combined mode with resync marker)
* and output the reconstructed frame and MPEG4 bitstream. The application is required to allocate memory for the bitstream buffer.
* The size of the input bitstream memory and the returned output buffer are specified in the size field. If the buffer size is
* smaller than the requested packet size, user has to call PVEncodeSlice again to get the rest of that pending packet before moving
* on to the next packet. For the combined mode without resync marker, the function returns when the buffer is full.
* The end-of-frame flag indicates the completion of the frame encoding. Next frame must be sent in with PVEncodeFrameSet().
* At the end-of-frame, the next video input address and the next video modulo timestamp will be set.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @param bstream is the pointer to MPEG4 bitstream buffer.
* @param size is the size of bitstream buffer allocated (input) and size of the encoded bitstream (output).
* @param endofFrame is a flag indicating the end-of-frame, '1'. Otherwise, '0'. When PVSetNoCurrentFrameSkip is OFF,
* end-of-frame '-1' indicates current frame bitstream must be disregarded.
* @param vid_out is the pointer to VideoEncFrameIO structure containing the reconstructed YUV output data after encoding
* @param nextModTime is the timestamp encoder expects from the next input
* @return true newfor correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVEncodeSlice(VideoEncControls *encCtrl, UChar *bstream, Int *size,
Int *endofFrame, VideoEncFrameIO *vid_out, ULong *nextModTime);
#endif
/**
* @brief This function returns MP4 file format hint track information.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @param info is the structure for MP4 hint track information
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVGetHintTrack(VideoEncControls *encCtrl, MP4HintTrack *info);
#ifndef LIMITED_API
/**
* @brief updates target frame rates of the encoded base and enhance layer (if any) while encoding operation is ongoing.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @param frameRate is the pointers to array of target frame rates in frames per second,
* frameRate[n] represents the n-th layer's target frame rate.
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVUpdateEncFrameRate(VideoEncControls *encCtrl, float *frameRate); /* for 2-way */
/**
* @brief updates target bit rates of the encoded base and enhance layer (if any) while encoding operation is ongoing.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @param bitRate is the pointers to array of target bit rates in bits per second unit,
* bitRate[n] represents the n-th layer's target bit rate.
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVUpdateBitRate(VideoEncControls *encCtrl, Int *bitRate); /* for 2-way */
/**
* @brief updates the INTRA frame refresh interval while encoding operation is ongoing.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @param aIFramePeriod is a new value of INTRA frame interval in the unit of number of coded frames.
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVUpdateIFrameInterval(VideoEncControls *encCtrl, Int aIFramePeriod);/* for 2-way */
/**
* @brief specifies the number Intra MBs to be refreshed
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @param numMB is the number of Intra MBs to be refreshed
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVUpdateNumIntraMBRefresh(VideoEncControls *encCtrl, Int numMB); /* for 2-way */
/**
* @brief This function is called whenever users want the next base frame to be encoded as an I-Vop.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVIFrameRequest(VideoEncControls *encCtrl); /* for 2-way */
#endif // LIMITED_API
/* finishing encoder */
/**
* @brief This function frees up all the memory allocated by the encoder library.
* @param encCtrl is video encoder control structure that is always passed as input in all APIs
* @return true for correct operation; false if error happens
*/
OSCL_IMPORT_REF Bool PVCleanUpVideoEncoder(VideoEncControls *encCtrl);
#ifdef __cplusplus
}
#endif
#endif /* _MP4ENC_API_H_ */