15c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong/* 25c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * Copyright (C) 2012 The Android Open Source Project 35c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * 45c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 55c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * you may not use this file except in compliance with the License. 65c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * You may obtain a copy of the License at 75c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * 85c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * http://www.apache.org/licenses/LICENSE-2.0 95c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * 105c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * Unless required by applicable law or agreed to in writing, software 115c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * distributed under the License is distributed on an "AS IS" BASIS, 125c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * See the License for the specific language governing permissions and 145c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong * limitations under the License. 155c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong */ 165c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 175c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#ifndef SOFT_AVC_ENCODER_H_ 185c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#define SOFT_AVC_ENCODER_H_ 195c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 205c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#include <media/stagefright/MediaBuffer.h> 215c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#include <media/stagefright/foundation/ABase.h> 225c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#include <utils/Vector.h> 235c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 245c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#include "avcenc_api.h" 252edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar#include "SoftVideoEncoderOMXComponent.h" 265c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 275c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongnamespace android { 285c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 295c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongstruct SoftAVCEncoder : public MediaBufferObserver, 302edda09a2ad1d112c52acd37d323f63f0a492d67Lajos Molnar public SoftVideoEncoderOMXComponent { 315c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong SoftAVCEncoder( 325c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong const char *name, 335c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong const OMX_CALLBACKTYPE *callbacks, 345c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_PTR appData, 355c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_COMPONENTTYPE **component); 365c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 375c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong // Override SimpleSoftOMXComponent methods 385c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong virtual OMX_ERRORTYPE internalGetParameter( 395c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_INDEXTYPE index, OMX_PTR params); 405c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 415c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong virtual OMX_ERRORTYPE internalSetParameter( 425c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_INDEXTYPE index, const OMX_PTR params); 435c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 445c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong virtual void onQueueFilled(OMX_U32 portIndex); 455c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 465c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong // Implement MediaBufferObserver 475c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong virtual void signalBufferReturned(MediaBuffer *buffer); 485c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 495c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 505c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong // Callbacks required by PV's encoder 515c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t allocOutputBuffers(unsigned int sizeInMbs, unsigned int numBuffers); 525c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong void unbindOutputBuffer(int32_t index); 535c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t bindOutputBuffer(int32_t index, uint8_t **yuv); 545c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 555c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongprotected: 565c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong virtual ~SoftAVCEncoder(); 575c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 585c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongprivate: 595c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong enum { 605c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong kNumBuffers = 2, 615c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong }; 625c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 635c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong // OMX input buffer's timestamp and flags 645c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong typedef struct { 655c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int64_t mTimeUs; 665c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t mFlags; 675c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong } InputBufferInfo; 685c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 695c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int32_t mIDRFrameRefreshIntervalInSec; 705c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong AVCProfile mAVCEncProfile; 715c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong AVCLevel mAVCEncLevel; 725c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 735c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int64_t mNumInputFrames; 745c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong int64_t mPrevTimestampUs; 755c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mStarted; 765c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mSpsPpsHeaderReceived; 775c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mReadyForNextFrame; 785c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mSawInputEOS; 795c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mSignalledError; 805c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong bool mIsIDRFrame; 815c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 825c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong tagAVCHandle *mHandle; 835c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong tagAVCEncParam *mEncParams; 845c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong uint8_t *mInputFrameData; 855c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong uint32_t *mSliceGroup; 865c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong Vector<MediaBuffer *> mOutputBuffers; 875c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong Vector<InputBufferInfo> mInputBufferInfoVec; 885c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 895c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_ERRORTYPE initEncParams(); 905c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_ERRORTYPE initEncoder(); 915c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong OMX_ERRORTYPE releaseEncoder(); 925c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong void releaseOutputBuffers(); 935c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 945c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong DISALLOW_EVIL_CONSTRUCTORS(SoftAVCEncoder); 955c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong}; 965c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 975c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong} // namespace android 985c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong 995c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#endif // SOFT_AVC_ENCODER_H_ 100