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