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