/* * Copyright (c) 2009-2011 Intel Corporation. All rights reserved. * * 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 __VIDEO_ENCODER_BASE_H__ #define __VIDEO_ENCODER_BASE_H__ #include <va/va.h> #include <va/va_tpi.h> #include "VideoEncoderDef.h" #include "VideoEncoderInterface.h" #include "IntelMetadataBuffer.h" #include <utils/List.h> #include <utils/threads.h> #include "VideoEncoderUtils.h" struct SurfaceMap { VASurfaceID surface; VASurfaceID surface_backup; IntelMetadataBufferType type; int32_t value; ValueInfo vinfo; bool added; }; struct EncodeTask { VASurfaceID enc_surface; VASurfaceID ref_surface; VASurfaceID rec_surface; VABufferID coded_buffer; FrameType type; int flag; int64_t timestamp; //corresponding input frame timestamp void *priv; //input buffer data bool completed; //if encode task is done complet by HW }; class VideoEncoderBase : IVideoEncoder { public: VideoEncoderBase(); virtual ~VideoEncoderBase(); virtual Encode_Status start(void); virtual void flush(void); virtual Encode_Status stop(void); virtual Encode_Status encode(VideoEncRawBuffer *inBuffer, uint32_t timeout); /* * getOutput can be called several time for a frame (such as first time codec data, and second time others) * encoder will provide encoded data according to the format (whole frame, codec_data, sigle NAL etc) * If the buffer passed to encoded is not big enough, this API call will return ENCODE_BUFFER_TOO_SMALL * and caller should provide a big enough buffer and call again */ virtual Encode_Status getOutput(VideoEncOutputBuffer *outBuffer, uint32_t timeout); virtual Encode_Status getParameters(VideoParamConfigSet *videoEncParams); virtual Encode_Status setParameters(VideoParamConfigSet *videoEncParams); virtual Encode_Status setConfig(VideoParamConfigSet *videoEncConfig); virtual Encode_Status getConfig(VideoParamConfigSet *videoEncConfig); virtual Encode_Status getMaxOutSize(uint32_t *maxSize); protected: virtual Encode_Status sendEncodeCommand(EncodeTask* task) = 0; virtual Encode_Status derivedSetParams(VideoParamConfigSet *videoEncParams) = 0; virtual Encode_Status derivedGetParams(VideoParamConfigSet *videoEncParams) = 0; virtual Encode_Status derivedGetConfig(VideoParamConfigSet *videoEncConfig) = 0; virtual Encode_Status derivedSetConfig(VideoParamConfigSet *videoEncConfig) = 0; virtual Encode_Status getExtFormatOutput(VideoEncOutputBuffer *outBuffer) = 0; virtual Encode_Status updateFrameInfo(EncodeTask* task) ; Encode_Status renderDynamicFrameRate(); Encode_Status renderDynamicBitrate(EncodeTask* task); Encode_Status renderHrd(); Encode_Status queryProfileLevelConfig(VADisplay dpy, VAProfile profile); private: void setDefaultParams(void); Encode_Status setUpstreamBuffer(VideoParamsUpstreamBuffer *upStreamBuffer); Encode_Status getNewUsrptrFromSurface(uint32_t width, uint32_t height, uint32_t format, uint32_t expectedSize, uint32_t *outsize, uint32_t *stride, uint8_t **usrptr); VASurfaceMap* findSurfaceMapByValue(intptr_t value); Encode_Status manageSrcSurface(VideoEncRawBuffer *inBuffer, VASurfaceID *sid); void PrepareFrameInfo(EncodeTask* task); Encode_Status prepareForOutput(VideoEncOutputBuffer *outBuffer, bool *useLocalBuffer); Encode_Status cleanupForOutput(); Encode_Status outputAllData(VideoEncOutputBuffer *outBuffer); Encode_Status queryAutoReferenceConfig(VAProfile profile); Encode_Status querySupportedSurfaceMemTypes(); Encode_Status copySurfaces(VASurfaceID srcId, VASurfaceID destId); VASurfaceID CreateSurfaceFromExternalBuf(int32_t value, ValueInfo& vinfo); protected: bool mInitialized; bool mStarted; VADisplay mVADisplay; VAContextID mVAContext; VAConfigID mVAConfig; VAEntrypoint mVAEntrypoint; VideoParamsCommon mComParams; VideoParamsHRD mHrdParam; VideoParamsStoreMetaDataInBuffers mStoreMetaDataInBuffers; bool mNewHeader; bool mRenderMaxSliceSize; //Max Slice Size bool mRenderQP; bool mRenderAIR; bool mRenderCIR; bool mRenderFrameRate; bool mRenderBitRate; bool mRenderHrd; bool mRenderMaxFrameSize; bool mRenderMultiTemporal; bool mForceKFrame; VABufferID mSeqParamBuf; VABufferID mRcParamBuf; VABufferID mFrameRateParamBuf; VABufferID mPicParamBuf; VABufferID mSliceParamBuf; VASurfaceID* mAutoRefSurfaces; android::List <VASurfaceMap *> mSrcSurfaceMapList; //all mapped surface info list from input buffer android::List <EncodeTask *> mEncodeTaskList; //all encode tasks list android::List <VABufferID> mVACodedBufferList; //all available codedbuffer list VASurfaceID mRefSurface; //reference surface, only used in base VASurfaceID mRecSurface; //reconstructed surface, only used in base uint32_t mFrameNum; uint32_t mCodedBufSize; bool mAutoReference; uint32_t mAutoReferenceSurfaceNum; uint32_t mEncPackedHeaders; uint32_t mEncMaxRefFrames; bool mSliceSizeOverflow; //Current Outputting task EncodeTask *mCurOutputTask; //Current outputting CodedBuffer status VABufferID mOutCodedBuffer; bool mCodedBufferMapped; uint8_t *mOutCodedBufferPtr; VACodedBufferSegment *mCurSegment; uint32_t mOffsetInSeg; uint32_t mTotalSize; uint32_t mTotalSizeCopied; android::Mutex mCodedBuffer_Lock, mEncodeTask_Lock; android::Condition mCodedBuffer_Cond, mEncodeTask_Cond; bool mFrameSkipped; //supported surface memory types int mSupportedSurfaceMemType; //VASurface mapping extra action int mVASurfaceMappingAction; // For Temporal Layer Bitrate FrameRate settings VideoConfigTemperalLayerBitrateFramerate mTemporalLayerBitrateFramerate[3]; #ifdef INTEL_VIDEO_XPROC_SHARING uint32_t mSessionFlag; #endif }; #endif /* __VIDEO_ENCODER_BASE_H__ */