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 266d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnarstruct ALooper; 2772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass AMessage; 283f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken; 2972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass IGraphicBufferProducer; 30e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhangclass IGraphicBufferConsumer; 3172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass MediaCodec; 3272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass MetaData; 3372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 3472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangstruct MediaCodecSource : public MediaSource, 3572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang public MediaBufferObserver { 3672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang enum FlagBits { 3772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang FLAG_USE_SURFACE_INPUT = 1, 3872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang FLAG_USE_METADATA_INPUT = 2, 3972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang }; 4072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 4172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang static sp<MediaCodecSource> Create( 4272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<ALooper> &looper, 4372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<AMessage> &format, 4472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<MediaSource> &source, 45e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang const sp<IGraphicBufferConsumer> &consumer = NULL, 4672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang uint32_t flags = 0); 4772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 4872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool isVideo() const { return mIsVideo; } 4972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<IGraphicBufferProducer> getGraphicBufferProducer(); 5072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // MediaSource 5272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t start(MetaData *params = NULL); 5372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t stop(); 5472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t pause(); 5572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual sp<MetaData> getFormat() { return mMeta; } 5672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t read( 5772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang MediaBuffer **buffer, 5872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const ReadOptions *options = NULL); 5972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 6072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // MediaBufferObserver 6172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual void signalBufferReturned(MediaBuffer *buffer); 6272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 6372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // for AHandlerReflector 6472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void onMessageReceived(const sp<AMessage> &msg); 6572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 6672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangprotected: 6772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual ~MediaCodecSource(); 6872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 6972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangprivate: 7072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang struct Puller; 7172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 7272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang enum { 7372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatPullerNotify, 7472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatEncoderActivity, 7572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatStart, 7672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatStop, 7772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatPause, 7872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang }; 7972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 8072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang MediaCodecSource( 8172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<ALooper> &looper, 8272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<AMessage> &outputFormat, 8372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<MediaSource> &source, 84e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang const sp<IGraphicBufferConsumer> &consumer, 8572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang uint32_t flags = 0); 8672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 8772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t onStart(MetaData *params); 8872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t init(); 8972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t initEncoder(); 9072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void releaseEncoder(); 9172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t feedEncoderInputBuffers(); 9272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void suspend(); 9372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void resume(int64_t skipFramesBeforeUs = -1ll); 9472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void signalEOS(status_t err = ERROR_END_OF_STREAM); 9572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool reachedEOS(); 9672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t postSynchronouslyAndReturnError(const sp<AMessage> &msg); 9772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 9872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<ALooper> mLooper; 9972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<ALooper> mCodecLooper; 10072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<AHandlerReflector<MediaCodecSource> > mReflector; 10172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<AMessage> mOutputFormat; 10272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<MetaData> mMeta; 10372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<Puller> mPuller; 10472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<MediaCodec> mEncoder; 10572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang uint32_t mFlags; 1063f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar List<sp<AReplyToken>> mStopReplyIDQueue; 10772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mIsVideo; 10872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mStarted; 10972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mStopping; 11072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mDoMoreWorkPending; 111c93a13669ce1b5a9e6527b4c86c9d8f5e92be828Lajos Molnar bool mSetEncoderFormat; 112c93a13669ce1b5a9e6527b4c86c9d8f5e92be828Lajos Molnar int mEncoderFormat; 113c93a13669ce1b5a9e6527b4c86c9d8f5e92be828Lajos Molnar int mEncoderDataSpace; 11472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<AMessage> mEncoderActivityNotify; 11572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<IGraphicBufferProducer> mGraphicBufferProducer; 116e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang sp<IGraphicBufferConsumer> mGraphicBufferConsumer; 11772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<MediaBuffer *> mInputBufferQueue; 11872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<size_t> mAvailEncoderInputIndices; 11972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<int64_t> mDecodingTimeQueue; // decoding time (us) for video 12072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 12172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // audio drift time 12272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang int64_t mFirstSampleTimeUs; 12372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<int64_t> mDriftTimeQueue; 12472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 12572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // following variables are protected by mOutputBufferLock 12672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang Mutex mOutputBufferLock; 12772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang Condition mOutputBufferCond; 12872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<MediaBuffer*> mOutputBufferQueue; 12916e79115e497386eaf010af388627f94314a55a3Chong Zhang bool mEncoderReachedEOS; 13072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t mErrorCode; 13172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 13272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang DISALLOW_EVIL_CONSTRUCTORS(MediaCodecSource); 13372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang}; 13472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 13572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang} // namespace android 13672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 13772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang#endif /* MediaCodecSource_H_ */ 138