172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang/* 272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * Copyright (C) 2014 The Android Open Source Project 372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * 472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * you may not use this file except in compliance with the License. 672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * You may obtain a copy of the License at 772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * 872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * http://www.apache.org/licenses/LICENSE-2.0 972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * 1072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * Unless required by applicable law or agreed to in writing, software 1172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * distributed under the License is distributed on an "AS IS" BASIS, 1272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * See the License for the specific language governing permissions and 1472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang * limitations under the License. 1572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang */ 1672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 1772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang#ifndef MediaCodecSource_H_ 1872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang#define MediaCodecSource_H_ 1972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 2072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang#include <media/stagefright/foundation/ABase.h> 2172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang#include <media/stagefright/foundation/AHandlerReflector.h> 2272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang#include <media/stagefright/MediaSource.h> 2372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 2472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangnamespace android { 2572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 2672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass ALooper; 2772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass AMessage; 2872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass IGraphicBufferProducer; 2972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass MediaCodec; 3072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass MetaData; 3172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 3272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangstruct MediaCodecSource : public MediaSource, 3372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang public MediaBufferObserver { 3472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang enum FlagBits { 3572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang FLAG_USE_SURFACE_INPUT = 1, 3672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang FLAG_USE_METADATA_INPUT = 2, 3772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang }; 3872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 3972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang static sp<MediaCodecSource> Create( 4072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<ALooper> &looper, 4172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<AMessage> &format, 4272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<MediaSource> &source, 4372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang uint32_t flags = 0); 4472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 4572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool isVideo() const { return mIsVideo; } 4672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<IGraphicBufferProducer> getGraphicBufferProducer(); 4772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 4872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // MediaSource 4972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t start(MetaData *params = NULL); 5072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t stop(); 5172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t pause(); 5272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual sp<MetaData> getFormat() { return mMeta; } 5372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t read( 5472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang MediaBuffer **buffer, 5572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const ReadOptions *options = NULL); 5672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // MediaBufferObserver 5872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual void signalBufferReturned(MediaBuffer *buffer); 5972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 6072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // for AHandlerReflector 6172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void onMessageReceived(const sp<AMessage> &msg); 6272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 6372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangprotected: 6472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual ~MediaCodecSource(); 6572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 6672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangprivate: 6772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang struct Puller; 6872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 6972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang enum { 7072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatPullerNotify, 7172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatEncoderActivity, 7272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatStart, 7372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatStop, 7472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatPause, 7572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang }; 7672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 7772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang MediaCodecSource( 7872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<ALooper> &looper, 7972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<AMessage> &outputFormat, 8072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<MediaSource> &source, 8172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang uint32_t flags = 0); 8272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 8372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t onStart(MetaData *params); 8472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t init(); 8572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t initEncoder(); 8672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void releaseEncoder(); 8772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t feedEncoderInputBuffers(); 8872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void suspend(); 8972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void resume(int64_t skipFramesBeforeUs = -1ll); 9072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void signalEOS(status_t err = ERROR_END_OF_STREAM); 9172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool reachedEOS(); 9272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t postSynchronouslyAndReturnError(const sp<AMessage> &msg); 9372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 9472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<ALooper> mLooper; 9572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<ALooper> mCodecLooper; 9672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<AHandlerReflector<MediaCodecSource> > mReflector; 9772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<AMessage> mOutputFormat; 9872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<MetaData> mMeta; 9972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<Puller> mPuller; 10072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<MediaCodec> mEncoder; 10172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang uint32_t mFlags; 10272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<uint32_t> mStopReplyIDQueue; 10372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mIsVideo; 10472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mStarted; 10572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mStopping; 10672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mDoMoreWorkPending; 10772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<AMessage> mEncoderActivityNotify; 10872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<IGraphicBufferProducer> mGraphicBufferProducer; 10972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<MediaBuffer *> mInputBufferQueue; 11072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<size_t> mAvailEncoderInputIndices; 11172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<int64_t> mDecodingTimeQueue; // decoding time (us) for video 11272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 11372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // audio drift time 11472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang int64_t mFirstSampleTimeUs; 11572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<int64_t> mDriftTimeQueue; 11672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 11772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // following variables are protected by mOutputBufferLock 11872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang Mutex mOutputBufferLock; 11972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang Condition mOutputBufferCond; 12072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<MediaBuffer*> mOutputBufferQueue; 12116e79115e497386eaf010af388627f94314a55a3Chong Zhang bool mEncoderReachedEOS; 12272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t mErrorCode; 12372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 12472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang DISALLOW_EVIL_CONSTRUCTORS(MediaCodecSource); 12572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang}; 12672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 12772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang} // namespace android 12872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 12972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang#endif /* MediaCodecSource_H_ */ 130