MediaCodecSource.h revision ee0eba046f666303741a5a5f70afad17030cc8b1
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> 226a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar#include <media/stagefright/foundation/Mutexed.h> 2372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang#include <media/stagefright/MediaSource.h> 2472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 2516fcc47c113e63efa69f5af5decf1ad46ec653a9Lajos Molnar#include <gui/IGraphicBufferConsumer.h> 2616fcc47c113e63efa69f5af5decf1ad46ec653a9Lajos Molnar 2772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangnamespace android { 2872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 296d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnarstruct ALooper; 3016fcc47c113e63efa69f5af5decf1ad46ec653a9Lajos Molnarstruct AMessage; 313f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken; 3272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass IGraphicBufferProducer; 3316fcc47c113e63efa69f5af5decf1ad46ec653a9Lajos Molnarstruct MediaCodec; 3472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangclass MetaData; 3572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 3672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangstruct MediaCodecSource : public MediaSource, 3772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang public MediaBufferObserver { 3872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang enum FlagBits { 3972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang FLAG_USE_SURFACE_INPUT = 1, 4072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang FLAG_USE_METADATA_INPUT = 2, 4116fcc47c113e63efa69f5af5decf1ad46ec653a9Lajos Molnar FLAG_PREFER_SOFTWARE_CODEC = 4, // used for testing only 4272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang }; 4372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 4472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang static sp<MediaCodecSource> Create( 4572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<ALooper> &looper, 4672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<AMessage> &format, 4772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<MediaSource> &source, 48e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang const sp<IGraphicBufferConsumer> &consumer = NULL, 4972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang uint32_t flags = 0); 5072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool isVideo() const { return mIsVideo; } 5272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<IGraphicBufferProducer> getGraphicBufferProducer(); 53d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim void setInputBufferTimeOffset(int64_t timeOffsetUs); 5472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // MediaSource 5672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t start(MetaData *params = NULL); 5772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t stop(); 5872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t pause(); 59ee0eba046f666303741a5a5f70afad17030cc8b1Lajos Molnar virtual sp<MetaData> getFormat(); 6072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual status_t read( 6172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang MediaBuffer **buffer, 6272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const ReadOptions *options = NULL); 6372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 6472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // MediaBufferObserver 6572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual void signalBufferReturned(MediaBuffer *buffer); 6672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 6772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // for AHandlerReflector 6872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void onMessageReceived(const sp<AMessage> &msg); 6972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 7072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangprotected: 7172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang virtual ~MediaCodecSource(); 7272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 7372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhangprivate: 7472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang struct Puller; 7572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 7672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang enum { 7772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatPullerNotify, 7872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatEncoderActivity, 7972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatStart, 8072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatStop, 8172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kWhatPause, 82d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim kWhatSetInputBufferTimeOffset, 836a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar kWhatStopStalled, 8472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang }; 8572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 8672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang MediaCodecSource( 8772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<ALooper> &looper, 8872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<AMessage> &outputFormat, 8972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang const sp<MediaSource> &source, 90e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang const sp<IGraphicBufferConsumer> &consumer, 9172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang uint32_t flags = 0); 9272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 9372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t onStart(MetaData *params); 9472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t init(); 9572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t initEncoder(); 9672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void releaseEncoder(); 9772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t feedEncoderInputBuffers(); 9872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void suspend(); 9972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void resume(int64_t skipFramesBeforeUs = -1ll); 10072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang void signalEOS(status_t err = ERROR_END_OF_STREAM); 10172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool reachedEOS(); 10272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t postSynchronouslyAndReturnError(const sp<AMessage> &msg); 10372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 10472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<ALooper> mLooper; 10572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<ALooper> mCodecLooper; 10672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<AHandlerReflector<MediaCodecSource> > mReflector; 10772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<AMessage> mOutputFormat; 108ee0eba046f666303741a5a5f70afad17030cc8b1Lajos Molnar Mutexed<sp<MetaData>> mMeta; 10972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<Puller> mPuller; 11072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<MediaCodec> mEncoder; 11172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang uint32_t mFlags; 1123f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar List<sp<AReplyToken>> mStopReplyIDQueue; 11372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mIsVideo; 11472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mStarted; 11572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mStopping; 11672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool mDoMoreWorkPending; 117c93a13669ce1b5a9e6527b4c86c9d8f5e92be828Lajos Molnar bool mSetEncoderFormat; 118b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar int32_t mEncoderFormat; 119b77d03b62cb743d0faf74b54aa466b4d220b5e61Lajos Molnar int32_t mEncoderDataSpace; 12072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<AMessage> mEncoderActivityNotify; 12172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sp<IGraphicBufferProducer> mGraphicBufferProducer; 122e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049Chong Zhang sp<IGraphicBufferConsumer> mGraphicBufferConsumer; 12372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<MediaBuffer *> mInputBufferQueue; 12472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<size_t> mAvailEncoderInputIndices; 12572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<int64_t> mDecodingTimeQueue; // decoding time (us) for video 126d008275796ac4cccf85fefce53cef733a49bc1faWonsik Kim int64_t mInputBufferTimeOffsetUs; 12772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 12872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang // audio drift time 12972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang int64_t mFirstSampleTimeUs; 13072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang List<int64_t> mDriftTimeQueue; 13172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 1326a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar struct Output { 1336a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar Output(); 1346a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar List<MediaBuffer*> mBufferQueue; 1356a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar bool mEncoderReachedEOS; 1366a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar status_t mErrorCode; 1376a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar Condition mCond; 1386a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar }; 1396a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar Mutexed<Output> mOutput; 1406a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar 1416a3a56fbcd6c01c3895f14e43858971b0edca9b2Lajos Molnar int32_t mGeneration; 14272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 14372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang DISALLOW_EVIL_CONSTRUCTORS(MediaCodecSource); 14472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang}; 14572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 14672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang} // namespace android 14772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 14872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang#endif /* MediaCodecSource_H_ */ 149