NuPlayerDecoder.h revision 095248375e29adde961ec2a44989ecb3a6dda6a2
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/* 2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License. 6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software 11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and 14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License. 15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */ 16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#ifndef NUPLAYER_DECODER_H_ 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define NUPLAYER_DECODER_H_ 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h" 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AHandler.h> 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 25f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 275bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstruct ABuffer; 281cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnarstruct MediaCodec; 29095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnarstruct MediaBuffer; 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct NuPlayer::Decoder : public AHandler { 321173118eace0e9e347cb007f0da817cee87579edGlenn Kasten Decoder(const sp<AMessage> ¬ify, 331173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<NativeWindowWrapper> &nativeWindow = NULL); 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 35bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia virtual void configure(const sp<AMessage> &format); 36bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia virtual void init(); 373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 38095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar status_t getInputBuffers(Vector<sp<ABuffer> > *dstBuffers) const; 39bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia virtual void signalFlush(); 40bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia virtual void signalResume(); 41bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia virtual void initiateShutdown(); 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia virtual bool supportsSeamlessFormatChange(const sp<AMessage> &to) const; 446d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih 451cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar enum { 461cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatFillThisBuffer = 'flTB', 471cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatDrainThisBuffer = 'drTB', 481cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatOutputFormatChanged = 'fmtC', 491cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatFlushCompleted = 'flsC', 501cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatShutdownCompleted = 'shDC', 511cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatEOS = 'eos ', 521cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatError = 'err ', 531cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar }; 541cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 561cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~Decoder(); 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum { 63078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatCodecNotify = 'cdcN', 641cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatConfigure = 'conf', 65095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar kWhatGetInputBuffers = 'gInB', 661cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatInputBufferFilled = 'inpF', 671cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatRenderBuffer = 'rndr', 681cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatFlush = 'flus', 691cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatShutdown = 'shuD', 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 731173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<NativeWindowWrapper> mNativeWindow; 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 751cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar sp<AMessage> mInputFormat; 761cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar sp<AMessage> mOutputFormat; 771cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar sp<MediaCodec> mCodec; 78078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sp<ALooper> mCodecLooper; 791cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar sp<ALooper> mDecoderLooper; 801cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar 811cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar Vector<sp<ABuffer> > mInputBuffers; 821cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar Vector<sp<ABuffer> > mOutputBuffers; 83095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar Vector<bool> mInputBufferIsDequeued; 84095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar Vector<MediaBuffer *> mMediaBuffers; 851cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar 861cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void handleError(int32_t err); 871cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar bool handleAnInputBuffer(); 881cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar bool handleAnOutputBuffer(); 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 90095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar void releaseAndResetMediaBuffers(); 911cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void requestCodecNotification(); 921cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar bool isStaleReply(const sp<AMessage> &msg); 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 941cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void onConfigure(const sp<AMessage> &format); 951cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void onFlush(); 96704e72658b1082264a26a83c50046da34f07d1a1Wei Jia void onResume(); 971cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void onInputBufferFilled(const sp<AMessage> &msg); 981cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void onRenderBuffer(const sp<AMessage> &msg); 991cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void onShutdown(); 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1011cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar int32_t mBufferGeneration; 102704e72658b1082264a26a83c50046da34f07d1a1Wei Jia bool mPaused; 1031cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar AString mComponentName; 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1056d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih bool supportsSeamlessAudioFormatChange(const sp<AMessage> &targetFormat) const; 1066d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Decoder); 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 110a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhangstruct NuPlayer::CCDecoder : public RefBase { 111a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang enum { 112a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang kWhatClosedCaptionData, 113a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang kWhatTrackAdded, 114a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang }; 115a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 116a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang CCDecoder(const sp<AMessage> ¬ify); 117a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 118a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang size_t getTrackCount() const; 119a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang sp<AMessage> getTrackInfo(size_t index) const; 120a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang status_t selectTrack(size_t index, bool select); 121a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang bool isSelected() const; 122a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang void decode(const sp<ABuffer> &accessUnit); 123a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang void display(int64_t timeUs); 124a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 125a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhangprivate: 126a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang struct CCData; 127a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 128a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang sp<AMessage> mNotify; 129a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang KeyedVector<int64_t, sp<ABuffer> > mCCMap; 130a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang size_t mTrackCount; 131a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang int32_t mSelectedTrack; 132a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 133a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang bool isNullPad(CCData *cc) const; 134a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang void dumpBytePair(const sp<ABuffer> &ccBuf) const; 135a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang bool extractFromSEI(const sp<ABuffer> &accessUnit); 136a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 137a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang DISALLOW_EVIL_CONSTRUCTORS(CCDecoder); 138a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang}; 139a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif // NUPLAYER_DECODER_H_ 143