Home | History | Annotate | Download | only in include
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /*********************************************************************************/
     19 /*  File: cvei.h                                                                */
     20 /*  Purpose:                                                                    */
     21 /*  Date:                                                                       */
     22 /*  Revision History:                                                           */
     23 /** @introduction   Common Video Encoder Interface (CVEI) is intended to be used by
     24     application developers who want to create a multimedia application with video
     25     encoding feature. CVEI is designed such that new video encoder algorithms or
     26     modules can be plugged in seamlessly without user interaction. In other words,
     27     any changes to the CVEI library are transparent to the users. Users can still
     28     use the same set of APIs for new encoding tools.
     29 
     30     @requirement    CVEI will take an input frame in one of several format supported
     31     by PV and encode it to an MPEG4 bitstream. It will also return a reconstructed
     32     image in YUV 4:2:0 format. Currently the input format supported are YUV 4:2:0,
     33     RGB24 and UYVY 4:2:2.
     34 
     35     CVEI is designed such that it is simple to use. It should hides implementation
     36     dependency  from the users. In this version, we decided that the operation will
     37     be synchronous, i.e., the encoding will be a blocked call. Asynchronous operation
     38     will be in the level above CVEI, i.e., in Author Engine Video Module which will
     39     take care of capturing device as well.
     40 
     41     @brief  The following classes are used to interface with codecs. Their names
     42     are CPVxxxVideoEncoder where xxx is codec specific such as MPEG4, H263, H26L,
     43     etc. All of them are subclasses of CPVCommonVideoEncoder.
     44 */
     45 /*********************************************************************************/
     46 
     47 #ifndef __CVEI_H
     48 #define __CVEI_H
     49 
     50 #include "oscl_scheduler_ao.h"
     51 #include "oscl_base.h"
     52 #include "mp4enc_api.h" /* for MP4HintTrack */
     53 
     54 #define MAX_LAYER 2
     55 
     56 /** General returned values. */
     57 enum TCVEI_RETVAL
     58 {
     59     ECVEI_SUCCESS,
     60     ECVEI_FAIL,
     61     ECVEI_FLUSH,
     62     ECVEI_MORE_OUTPUT
     63 } ;
     64 
     65 /** Returned events with the callback function. */
     66 enum TCVEI_EVENT
     67 {
     68     /** Called when a packet or a frame of output bitstream is ready. */
     69     ECVEI_BUFFER_READY,
     70 
     71     /** Called when the last packet of a frame of output bitstream is ready. */
     72     ECVEI_FRAME_DONE,
     73 
     74     /** Called when no buffers is available for output bitstream. A buffer can be added thru AddBuffer API. */
     75     ECVEI_NO_BUFFERS,
     76 
     77     /** Called when there is an error with the encoding operation. */
     78     ECVEI_ERROR
     79 };
     80 
     81 /** Contains supported input format */
     82 enum TPVVideoFormat
     83 {
     84     ECVEI_RGB24,
     85     ECVEI_RGB12,
     86     ECVEI_YUV420,
     87     ECVEI_UYVY,
     88     ECVEI_YUV420SEMIPLANAR
     89 };
     90 
     91 /** Type of contents for optimal encoding mode. */
     92 enum TPVContentType
     93 {
     94     /** Content is to be streamed in real-time. */
     95     ECVEI_STREAMING,
     96 
     97     /** Content is to be downloaded and playbacked later.*/
     98     ECVEI_DOWNLOAD,
     99 
    100     /** Content is to be 3gpp baseline compliant. */
    101     ECVEI_H263
    102 };
    103 
    104 /** Rate control type. */
    105 enum TMP4RateControlType
    106 {
    107     /** Constant quality, variable bit rate, fixed quantization level. */
    108     ECONSTANT_Q,
    109 
    110     /** Short-term constant bit rate control. */
    111     ECBR_1,
    112 
    113     /** Long-term constant bit rate control. */
    114     EVBR_1
    115 };
    116 
    117 /** Targeted profile and level to encode. */
    118 enum TPVM4VProfileLevel
    119 {
    120     /* Non-scalable profile */
    121     ECVEI_SIMPLE_LEVEL0 = 0,
    122     ECVEI_SIMPLE_LEVEL1,
    123     ECVEI_SIMPLE_LEVEL2,
    124     ECVEI_SIMPLE_LEVEL3,
    125     ECVEI_CORE_LEVEL1,
    126     ECVEI_CORE_LEVEL2,
    127 
    128     /* Scalable profile */
    129     ECVEI_SIMPLE_SCALABLE_LEVEL0 = 6,
    130     ECVEI_SIMPLE_SCALABLE_LEVEL1,
    131     ECVEI_SIMPLE_SCALABLE_LEVEL2,
    132 
    133     ECVEI_CORE_SCALABLE_LEVEL1 = 10,
    134     ECVEI_CORE_SCALABLE_LEVEL2,
    135     ECVEI_CORE_SCALABLE_LEVEL3
    136 };
    137 
    138 /** This structure contains encoder settings. */
    139 struct TPVVideoEncodeParam
    140 {
    141     /** Specifies an  ID that will be used to specify this encoder while returning
    142     the bitstream in asynchronous mode. */
    143     uint32              iEncodeID;
    144 
    145     /** Specifies whether base only (iNumLayer = 1) or base + enhancement layer
    146     (iNumLayer =2 ) is to be used. */
    147     int32               iNumLayer;
    148 
    149     /** Specifies the width in pixels of the encoded frames. IFrameWidth[0] is for
    150     base layer and iFrameWidth[1] is for enhanced layer. */
    151     int                 iFrameWidth[MAX_LAYER];
    152 
    153     /** Specifies the height in pixels of the encoded frames. IFrameHeight[0] is for
    154     base layer and iFrameHeight[1] is for enhanced layer. */
    155     int                 iFrameHeight[MAX_LAYER];
    156 
    157     /** Specifies the cumulative bit rate in bit per second. IBitRate[0] is for base
    158     layer and iBitRate[1] is for base+enhanced layer.*/
    159     int                 iBitRate[MAX_LAYER];
    160 
    161     /** Specifies the cumulative frame rate in frame per second. IFrameRate[0] is for
    162     base layer and iFrameRate[1] is for base+enhanced layer. */
    163     float               iFrameRate[MAX_LAYER];
    164 
    165     /** Specifies the picture quality factor on the scale of 1 to 10. It trades off
    166     the picture quality with the frame rate. Higher frame quality means lower frame rate.
    167     Lower frame quality for higher frame rate.*/
    168     int32               iFrameQuality;
    169 
    170     /** Enable the use of iFrameQuality to determine the frame rate. If it is false,
    171     the encoder will try to meet the specified frame rate regardless of the frame quality.*/
    172     bool                iEnableFrameQuality;
    173 
    174     /** Specifies the maximum number of P-frames between 2 INTRA frames. An INTRA mode is
    175     forced to a frame once this interval is reached. When there is only one I-frame is present
    176     at the beginning of the clip, iIFrameInterval should be set to -1. */
    177     int32               iIFrameInterval;
    178 
    179     /** According to iIFrameInterval setting, the minimum number of intra MB per frame is
    180     optimally calculated for error resiliency. However, when iIFrameInterval is set to -1,
    181     iNumIntraMBRefresh must be specified to guarantee the minimum number of intra
    182     macroblocks per frame.*/
    183     uint32              iNumIntraMBRefresh;
    184 
    185     /** Specifies the VBV buffer size which determines the end-to-end delay between the
    186     encoder and the decoder.  The size is in unit of seconds. For download application,
    187     the buffer size can be larger than the streaming application. For 2-way application,
    188     this buffer shall be kept minimal. For a special case, in VBR mode, iBufferDelay will
    189     be set to -1 to allow buffer underflow. */
    190     float               iBufferDelay;
    191 
    192     /** Specifies the type of the access whether it is streaming, CVEI_STREAMING
    193     (data partitioning mode) or download, CVEI_DOWNLOAD (combined mode).*/
    194     TPVContentType      iContentType;
    195 
    196     /** Specifies the rate control algorithm among one of the following constant Q,
    197     CBR and VBR.  The structure TMP4RateControlType is defined below.*/
    198     TMP4RateControlType iRateControlType;
    199 
    200     /** Specifies high quality but also high complexity mode for rate control. */
    201     bool                iRDOptimal;
    202 
    203     /** Specifies the initial quantization parameter for the first I-frame. If constant Q
    204     rate control is used, this QP will be used for all the I-frames. This number must be
    205     set between 1 and 31, otherwise, Initialize() will fail. */
    206     int                 iIquant[2];
    207 
    208     /** Specifies the initial quantization parameter for the first P-frame. If constant Q
    209     rate control is used, this QP will be used for all the P-frames. This number must be
    210     set between 1 and 31, otherwise, Initialize() will fail. */
    211     int                 iPquant[2];
    212 
    213     /** Specifies the initial quantization parameter for the first B-frame. If constant Q
    214     rate control is used, this QP will be used for all the B-frames. This number must be
    215     set between 1 and 31, otherwise, Initialize() will fail. */
    216     int                 iBquant[2];
    217 
    218     /** Specifies the search range in pixel unit for motion vector. The range of the
    219     motion vector will be of dimension [-iSearchRange.5, +iSearchRange.0]. */
    220     int32               iSearchRange;
    221 
    222     /** Specifies the use of 8x8 motion vectors. */
    223     bool                iMV8x8;
    224 
    225     /** Specifies the use of half-pel motion vectors. */
    226     bool                iMVHalfPel;
    227 
    228     /** Specifies automatic scene detection where I-frame will be used the the first frame
    229     in a new scene. */
    230     bool                iSceneDetection;
    231 
    232     /** Specifies the packet size in bytes which represents the number of bytes between two resync markers.
    233     For ECVEI_DOWNLOAD and ECVEI_H263, if iPacketSize is set to 0, there will be no resync markers in the bitstream.
    234     For ECVEI_STREAMING is parameter must be set to a value greater than 0.*/
    235     uint32              iPacketSize;
    236 
    237     /** Specifies whether the current frame skipping decision is allowed after encoding
    238     the current frame. If there is no memory of what has been coded for the current frame,
    239     iNoCurrentSkip has to be on. */
    240     bool                iNoCurrentSkip;
    241 
    242     /** Specifies that no frame skipping is allowed. Frame skipping is a tool used to
    243     control the average number of bits spent to meet the target bit rate. */
    244     bool                iNoFrameSkip;
    245 
    246     /** Specifies the duration of the clip in millisecond.*/
    247     int32               iClipDuration;
    248 
    249     /** Specifies the profile and level used to encode the bitstream. When present,
    250     other settings will be checked against the range allowable by this target profile
    251     and level. Fail may be returned from the Initialize call. */
    252     TPVM4VProfileLevel  iProfileLevel;
    253 
    254     /** Specifies FSI Buffer input */
    255     uint8*              iFSIBuff;
    256 
    257     /** Specifies FSI Buffer Length */
    258     int             iFSIBuffLength;
    259 
    260 
    261 };
    262 
    263 
    264 /** Structure for input format information */
    265 struct TPVVideoInputFormat
    266 {
    267     /** Contains the width in pixels of the input frame. */
    268     int32           iFrameWidth;
    269 
    270     /** Contains the height in pixels of the input frame. */
    271     int32           iFrameHeight;
    272 
    273     /** Contains the input frame rate in the unit of frame per second. */
    274     float           iFrameRate;
    275 
    276     /** Contains Frame Orientation. Used for RGB input. 1 means Bottom_UP RGB, 0 means Top_Down RGB, -1 for video formats other than RGB*/
    277     int             iFrameOrientation;
    278 
    279     /** Contains the format of the input video, e.g., YUV 4:2:0, UYVY, RGB24, etc. */
    280     TPVVideoFormat  iVideoFormat;
    281 };
    282 
    283 
    284 /** Contains the input data information */
    285 struct TPVVideoInputData
    286 {
    287     /** Pointer to an input frame buffer in input source format.*/
    288     uint8       *iSource;
    289 
    290     /** The corresponding time stamp of the input frame. */
    291     uint32      iTimeStamp;
    292 };
    293 
    294 /** Contains the output data information */
    295 struct TPVVideoOutputData
    296 {
    297     /** Pointer to the reconstructed frame buffer in YUV 4:2:0 domain. */
    298     uint8           *iFrame;
    299 
    300     /** The number of layer encoded, 0 for base, 1 for enhanced. */
    301     int32           iLayerNumber;
    302 
    303     /** Pointer to the encoded bitstream buffer. */
    304     uint8           *iBitStream;
    305 
    306     /** The size in bytes of iBStream. */
    307     int32           iBitStreamSize;
    308 
    309     /** The time stamp of the encoded frame according to the bitstream. */
    310     uint32          iVideoTimeStamp;
    311 
    312     /** The time stamp of the encoded frame as given before the encoding. */
    313     uint32          iExternalTimeStamp;
    314 
    315     /** The hint track information. */
    316     MP4HintTrack    iHintTrack;
    317 };
    318 
    319 /** An observer class for callbacks to report the status of the CVEI */
    320 class MPVCVEIObserver
    321 {
    322     public:
    323         /** The callback funtion with aEvent being one of TCVEIEvent enumeration. */
    324         virtual void HandlePVCVEIEvent
    325         (uint32 aId, uint32 aEvent, uint32 aParam1 = 0) = 0;
    326         virtual ~MPVCVEIObserver() {}
    327 };
    328 
    329 /** This class is the base class for codec specific interface class.
    330 The users must maintain an instance of the codec specific class throughout
    331 the encoding session.
    332 */
    333 class CommonVideoEncoder : public OsclTimerObject
    334 {
    335     public:
    336         /** Constructor for CVEI class. */
    337         CommonVideoEncoder() : OsclTimerObject(OsclActiveObject::EPriorityNominal, "PVEncoder") {};
    338 
    339         /** Initialization function to set the input video format and the
    340         encoding parameters. This function returns CVEI_ERROR if there is
    341         any errors. Otherwise, the function returns CVEI_SUCCESS.*/
    342         virtual  TCVEI_RETVAL Initialize(TPVVideoInputFormat *aVidInFormat, TPVVideoEncodeParam *aEncParam) = 0;
    343 
    344         /** Set the observer for asynchronous encoding mode. */
    345         virtual  TCVEI_RETVAL SetObserver(MPVCVEIObserver *aObserver) = 0;
    346 
    347         /** Add a buffer to the queue of output buffers for output bitstream in
    348         asynchronous encoding mode. */
    349         virtual  TCVEI_RETVAL AddBuffer(TPVVideoOutputData *aVidOut) = 0;
    350 
    351         /** This function sends in an input video data structure containing a source
    352         frame and the associated timestamp. The encoded bitstream will be returned by
    353         observer callback.
    354         The above 3 APIs only replace EncodeFrame() API. Other APIs such as initialization
    355         and update parameters remain the same. */
    356         virtual  TCVEI_RETVAL Encode(TPVVideoInputData *aVidIn) = 0;
    357 
    358         /** This function returns the maximum VBV buffer size such that the
    359             application can allocate a buffer that guarantees to fit one frame.*/
    360         virtual  int32 GetBufferSize() = 0;
    361 
    362         /** This function returns the VOL header part (starting from the VOS header)
    363         of the encoded bitstream. This function must be called after Initialize.
    364         The output is written to the memory (volHeader) allocated by the users.*/
    365         virtual  TCVEI_RETVAL GetVolHeader(uint8 *volHeader, int32 *size, int32 layer) = 0;
    366 
    367         /** This function sends in an input video data structure containing a source
    368         frame and the associated timestamp. It returns an output video data structure
    369         containing coded bit stream, reconstructed frame in YUV 4:2:0 (can be changed
    370         to source format) and the timestamp associated with the coded frame.
    371         The input timestamp may not correspond to the output timestamp. User can send
    372         an input structure in without getting any encoded data back or getting an encoded
    373         frame in the past. This function returns ECVEI_ERROR if there is any errors.
    374         Otherwise, the function returns ECVEI_SUCCESS.
    375         In case of Overrun Buffer usage, it is possible that return value is ECVEI_MORE_OUTPUT
    376         which indicates that frame cannot fit in the current buffer*/
    377         virtual  TCVEI_RETVAL EncodeFrame(TPVVideoInputData  *aVidIn, TPVVideoOutputData *aVidOut, int *aRemainingBytes
    378 #ifdef PVAUTHOR_PROFILING
    379                                           , void *aParam1 = 0
    380 #endif
    381                                          ) = 0;
    382 
    383         /** Before the termination of the encoding process, the users have to query
    384         whether there are any encoded frame pending inside the CVEI. The returned value
    385         will indicate whether there are more frames to be flushed (ECVEI_FLUSH).
    386         FlushOutput has to be called until there are no more frames, i.e., it returns
    387         ECVEI_SUCCESS. This function may be called during the encoding operation if
    388         there is no input frame and the application does not want to waste the time
    389         waiting for input frame. It can call this function to flush encoded frame
    390         out of the memory. */
    391         virtual  TCVEI_RETVAL FlushOutput(TPVVideoOutputData *aVidOut) = 0;
    392 
    393         /** This function cleanup the CVEI allocated resources. */
    394         virtual  TCVEI_RETVAL Terminate() = 0;
    395 
    396         /**This function dynamically changes the target bit rate of the encoder
    397         while encoding. aBitRate[n] is the new accumulate target bit rate of layer n.
    398         Successful update is returned with ECVEI_SUCCESS.*/
    399         virtual  TCVEI_RETVAL UpdateBitRate(int32 aNumLayer, int32 *aBitRate) = 0;
    400 
    401         /** This function dynamically changes the target frame rate of the encoder
    402         while encoding. aFrameRate[n] is the new accumulate target frame rate of
    403         layer n. Successful update is returned with ECVEI_SUCCESS. */
    404         virtual  TCVEI_RETVAL UpdateFrameRate(int32 aNumLayer, float *aFrameRate) = 0;
    405 
    406         /** This function dynamically changes the I-Vop update interval while
    407         encoding to a new value, aIFrameInterval. */
    408         virtual  TCVEI_RETVAL UpdateIFrameInterval(int32 aIFrameInterval) = 0;
    409 
    410         /** This function forces an I-Vop mode to the next frame to be encoded. */
    411         virtual  TCVEI_RETVAL IFrameRequest() = 0;
    412 
    413         /** This function returns the input width of a specific layer
    414         (not necessarily multiple of 16). */
    415         virtual  int32 GetEncodeWidth(int32 aLayer) = 0;
    416 
    417         /** This function returns the input height of a specific layer
    418         (not necessarily multiple of 16). */
    419         virtual  int32 GetEncodeHeight(int32 aLayer) = 0;
    420 
    421         /** This function returns the target encoded frame rate of a specific layer. */
    422         virtual  float GetEncodeFrameRate(int32 aLayer) = 0;
    423     protected:
    424         virtual void Run(void) = 0;
    425         virtual void DoCancel(void) = 0;
    426         /* internal enum */
    427         enum TCVEIState
    428         {
    429             EIdle,
    430             EEncode
    431         };
    432 
    433         TCVEIState  iState;
    434         uint32      iId;
    435 };
    436 
    437 #endif
    438