182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON/*
282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Copyright (c) 2009-2011 Intel Corporation.  All rights reserved.
382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON*
482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Licensed under the Apache License, Version 2.0 (the "License");
582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* you may not use this file except in compliance with the License.
682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* You may obtain a copy of the License at
782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON*
882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* http://www.apache.org/licenses/LICENSE-2.0
982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON*
1082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* Unless required by applicable law or agreed to in writing, software
1182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* distributed under the License is distributed on an "AS IS" BASIS,
1282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* See the License for the specific language governing permissions and
1482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON* limitations under the License.
1582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON*/
1682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
1782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#ifndef __VIDEO_ENCODER_BASE_H__
1882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#define __VIDEO_ENCODER_BASE_H__
1982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
2082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <va/va.h>
2182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <va/va_tpi.h>
2282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "VideoEncoderDef.h"
2382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "VideoEncoderInterface.h"
2482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "IntelMetadataBuffer.h"
2582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <utils/List.h>
2682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include <utils/threads.h>
2782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#include "VideoEncoderUtils.h"
2882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
2982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONstruct SurfaceMap {
3082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VASurfaceID surface;
3182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VASurfaceID surface_backup;
3282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    IntelMetadataBufferType type;
3382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    int32_t value;
3482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    ValueInfo vinfo;
3582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool added;
3682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON};
3782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
3882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONstruct EncodeTask {
3982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VASurfaceID enc_surface;
4082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VASurfaceID ref_surface;
4182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VASurfaceID rec_surface;
4282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VABufferID coded_buffer;
4382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
4482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    FrameType type;
4582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    int flag;
4682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    int64_t timestamp;  //corresponding input frame timestamp
4782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    void *priv;  //input buffer data
4882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
4982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool completed;   //if encode task is done complet by HW
5082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON};
5182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
5282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONclass VideoEncoderBase : IVideoEncoder {
5382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
5482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONpublic:
5582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VideoEncoderBase();
5682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual ~VideoEncoderBase();
5782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
5882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status start(void);
5982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual void flush(void);
6082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status stop(void);
6182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status encode(VideoEncRawBuffer *inBuffer, uint32_t timeout);
6282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
6382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    /*
6482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    * getOutput can be called several time for a frame (such as first time  codec data, and second time others)
6582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    * encoder will provide encoded data according to the format (whole frame, codec_data, sigle NAL etc)
6682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    * If the buffer passed to encoded is not big enough, this API call will return ENCODE_BUFFER_TOO_SMALL
6782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    * and caller should provide a big enough buffer and call again
6882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    */
6982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status getOutput(VideoEncOutputBuffer *outBuffer, uint32_t timeout);
7082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
7182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status getParameters(VideoParamConfigSet *videoEncParams);
7282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status setParameters(VideoParamConfigSet *videoEncParams);
7382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status setConfig(VideoParamConfigSet *videoEncConfig);
7482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status getConfig(VideoParamConfigSet *videoEncConfig);
7582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status getMaxOutSize(uint32_t *maxSize);
7682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
7782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONprotected:
7882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status sendEncodeCommand(EncodeTask* task) = 0;
7982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status derivedSetParams(VideoParamConfigSet *videoEncParams) = 0;
8082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status derivedGetParams(VideoParamConfigSet *videoEncParams) = 0;
8182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status derivedGetConfig(VideoParamConfigSet *videoEncConfig) = 0;
8282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status derivedSetConfig(VideoParamConfigSet *videoEncConfig) = 0;
8382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status getExtFormatOutput(VideoEncOutputBuffer *outBuffer) = 0;
8482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    virtual Encode_Status updateFrameInfo(EncodeTask* task) ;
8582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
8682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status renderDynamicFrameRate();
8782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status renderDynamicBitrate(EncodeTask* task);
8882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status renderHrd();
8982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status queryProfileLevelConfig(VADisplay dpy, VAProfile profile);
9082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
9182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONprivate:
9282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    void setDefaultParams(void);
9382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status setUpstreamBuffer(VideoParamsUpstreamBuffer *upStreamBuffer);
9482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status getNewUsrptrFromSurface(uint32_t width, uint32_t height, uint32_t format,
9582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON            uint32_t expectedSize, uint32_t *outsize, uint32_t *stride, uint8_t **usrptr);
9682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VASurfaceMap* findSurfaceMapByValue(intptr_t value);
9782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status manageSrcSurface(VideoEncRawBuffer *inBuffer, VASurfaceID *sid);
9882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    void PrepareFrameInfo(EncodeTask* task);
9982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
10082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status prepareForOutput(VideoEncOutputBuffer *outBuffer, bool *useLocalBuffer);
10182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status cleanupForOutput();
10282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status outputAllData(VideoEncOutputBuffer *outBuffer);
10382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status queryAutoReferenceConfig(VAProfile profile);
10482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status querySupportedSurfaceMemTypes();
10582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    Encode_Status copySurfaces(VASurfaceID srcId, VASurfaceID destId);
10682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VASurfaceID CreateSurfaceFromExternalBuf(int32_t value, ValueInfo& vinfo);
10782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
10882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTONprotected:
10982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
11082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mInitialized;
11182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mStarted;
11282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VADisplay mVADisplay;
11382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VAContextID mVAContext;
11482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VAConfigID mVAConfig;
11582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VAEntrypoint mVAEntrypoint;
11682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
11782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
11882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VideoParamsCommon mComParams;
11982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VideoParamsHRD mHrdParam;
12082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VideoParamsStoreMetaDataInBuffers mStoreMetaDataInBuffers;
12182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
12282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mNewHeader;
12382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
12482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mRenderMaxSliceSize; //Max Slice Size
12582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mRenderQP;
12682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mRenderAIR;
12782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mRenderCIR;
12882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mRenderFrameRate;
12982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mRenderBitRate;
13082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mRenderHrd;
13182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mRenderMaxFrameSize;
13282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mRenderMultiTemporal;
13382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mForceKFrame;
13482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
13582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VABufferID mSeqParamBuf;
13682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VABufferID mRcParamBuf;
13782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VABufferID mFrameRateParamBuf;
13882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VABufferID mPicParamBuf;
13982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VABufferID mSliceParamBuf;
14082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VASurfaceID* mAutoRefSurfaces;
14182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
14282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    android::List <VASurfaceMap *> mSrcSurfaceMapList;  //all mapped surface info list from input buffer
14382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    android::List <EncodeTask *> mEncodeTaskList;  //all encode tasks list
14482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    android::List <VABufferID> mVACodedBufferList;  //all available codedbuffer list
14582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
14682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VASurfaceID mRefSurface;        //reference surface, only used in base
14782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VASurfaceID mRecSurface;        //reconstructed surface, only used in base
14882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t mFrameNum;
14982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t mCodedBufSize;
15082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mAutoReference;
15182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t mAutoReferenceSurfaceNum;
15282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t mEncPackedHeaders;
15382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t mEncMaxRefFrames;
15482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
15582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mSliceSizeOverflow;
15682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
15782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    //Current Outputting task
15882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    EncodeTask *mCurOutputTask;
15982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
16082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    //Current outputting CodedBuffer status
16182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VABufferID mOutCodedBuffer;
16282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mCodedBufferMapped;
16382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint8_t *mOutCodedBufferPtr;
16482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VACodedBufferSegment *mCurSegment;
16582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t mOffsetInSeg;
16682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t mTotalSize;
16782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t mTotalSizeCopied;
16882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    android::Mutex               mCodedBuffer_Lock, mEncodeTask_Lock;
16982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    android::Condition           mCodedBuffer_Cond, mEncodeTask_Cond;
17082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
17182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    bool mFrameSkipped;
17282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
17382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    //supported surface memory types
17482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    int mSupportedSurfaceMemType;
17582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
17682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    //VASurface mapping extra action
17782b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    int mVASurfaceMappingAction;
17882b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
17982b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    // For Temporal Layer Bitrate FrameRate settings
18082b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    VideoConfigTemperalLayerBitrateFramerate mTemporalLayerBitrateFramerate[3];
18182b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON
18282b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#ifdef INTEL_VIDEO_XPROC_SHARING
18382b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON    uint32_t mSessionFlag;
18482b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#endif
18582b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON};
18682b428e49a70ddc051a36d2b3a25d90db79770dcGuilhem IMBERTON#endif /* __VIDEO_ENCODER_BASE_H__ */
187