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"
255c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#include "SimpleSoftOMXComponent.h"
265c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
275c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongnamespace android {
285c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
295c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongstruct MediaBuffer;
305c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
315c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongstruct SoftAVCEncoder : public MediaBufferObserver,
325c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong                        public SimpleSoftOMXComponent {
335c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    SoftAVCEncoder(
345c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong            const char *name,
355c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong            const OMX_CALLBACKTYPE *callbacks,
365c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong            OMX_PTR appData,
375c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong            OMX_COMPONENTTYPE **component);
385c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
395c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    // Override SimpleSoftOMXComponent methods
405c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    virtual OMX_ERRORTYPE internalGetParameter(
415c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong            OMX_INDEXTYPE index, OMX_PTR params);
425c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
435c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    virtual OMX_ERRORTYPE internalSetParameter(
445c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong            OMX_INDEXTYPE index, const OMX_PTR params);
455c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
465c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    virtual void onQueueFilled(OMX_U32 portIndex);
475c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
48bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala    // Override SoftOMXComponent methods
49bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala
50bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala    virtual OMX_ERRORTYPE getExtensionIndex(
51bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala            const char *name, OMX_INDEXTYPE *index);
525c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
535c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    // Implement MediaBufferObserver
545c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    virtual void signalBufferReturned(MediaBuffer *buffer);
555c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
565c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
575c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    // Callbacks required by PV's encoder
585c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    int32_t allocOutputBuffers(unsigned int sizeInMbs, unsigned int numBuffers);
595c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    void    unbindOutputBuffer(int32_t index);
605c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    int32_t bindOutputBuffer(int32_t index, uint8_t **yuv);
615c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
625c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongprotected:
635c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    virtual ~SoftAVCEncoder();
645c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
655c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dongprivate:
665c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    enum {
675c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong        kNumBuffers = 2,
685c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    };
695c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
70bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala    enum {
71bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala        kStoreMetaDataExtensionIndex = OMX_IndexVendorStartUnused + 1
72bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala    };
73bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala
745c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    // OMX input buffer's timestamp and flags
755c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    typedef struct {
765c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong        int64_t mTimeUs;
775c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong        int32_t mFlags;
785c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    } InputBufferInfo;
795c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
805c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    int32_t  mVideoWidth;
815c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    int32_t  mVideoHeight;
825c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    int32_t  mVideoFrameRate;
835c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    int32_t  mVideoBitRate;
845c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    int32_t  mVideoColorFormat;
85bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala    bool     mStoreMetaDataInBuffers;
865c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    int32_t  mIDRFrameRefreshIntervalInSec;
875c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    AVCProfile mAVCEncProfile;
885c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    AVCLevel   mAVCEncLevel;
895c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
905c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    int64_t  mNumInputFrames;
915c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    int64_t  mPrevTimestampUs;
925c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    bool     mStarted;
935c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    bool     mSpsPpsHeaderReceived;
945c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    bool     mReadyForNextFrame;
955c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    bool     mSawInputEOS;
965c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    bool     mSignalledError;
975c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    bool     mIsIDRFrame;
985c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
995c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    tagAVCHandle          *mHandle;
1005c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    tagAVCEncParam        *mEncParams;
1015c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    uint8_t               *mInputFrameData;
1025c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    uint32_t              *mSliceGroup;
1035c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    Vector<MediaBuffer *> mOutputBuffers;
1045c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    Vector<InputBufferInfo> mInputBufferInfoVec;
1055c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
1065c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    void initPorts();
1075c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    OMX_ERRORTYPE initEncParams();
1085c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    OMX_ERRORTYPE initEncoder();
1095c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    OMX_ERRORTYPE releaseEncoder();
1105c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    void releaseOutputBuffers();
1115c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
112bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala    uint8_t* extractGrallocData(void *data, buffer_handle_t *buffer);
113bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala    void releaseGrallocData(buffer_handle_t buffer);
114bf5bea96f236adb5eef78c2f414ef82b3602a0f7Eino-Ville Talvala
1155c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong    DISALLOW_EVIL_CONSTRUCTORS(SoftAVCEncoder);
1165c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong};
1175c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
1185c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong}  // namespace android
1195c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong
1205c61b361d1c55a93a215cfb2c325b4987f57f1c5James Dong#endif  // SOFT_AVC_ENCODER_H_
121