NuPlayerDecoder.h revision b86e68f834b7040518b99d1d0245d5f2e5cb9c86
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; 3987603c0dd1f4e62e52feffa8d6e960ad21f68893Lajos Molnar virtual void signalFlush(const sp<AMessage> &format = NULL); 4087603c0dd1f4e62e52feffa8d6e960ad21f68893Lajos Molnar virtual void signalUpdateFormat(const sp<AMessage> &format); 41bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia virtual void signalResume(); 42bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia virtual void initiateShutdown(); 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44bc2fb720bbd0acd122bacc67e844e982d068f6f9Wei Jia virtual bool supportsSeamlessFormatChange(const sp<AMessage> &to) const; 456d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih 461cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar enum { 471cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatFillThisBuffer = 'flTB', 481cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatDrainThisBuffer = 'drTB', 491cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatOutputFormatChanged = 'fmtC', 501cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatFlushCompleted = 'flsC', 511cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatShutdownCompleted = 'shDC', 521cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatEOS = 'eos ', 531cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatError = 'err ', 541cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar }; 551cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 571cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~Decoder(); 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum { 64078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber kWhatCodecNotify = 'cdcN', 651cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatConfigure = 'conf', 66095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar kWhatGetInputBuffers = 'gInB', 671cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatInputBufferFilled = 'inpF', 681cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatRenderBuffer = 'rndr', 691cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatFlush = 'flus', 701cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar kWhatShutdown = 'shuD', 7187603c0dd1f4e62e52feffa8d6e960ad21f68893Lajos Molnar kWhatUpdateFormat = 'uFmt', 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 751173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<NativeWindowWrapper> mNativeWindow; 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 771cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar sp<AMessage> mInputFormat; 781cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar sp<AMessage> mOutputFormat; 791cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar sp<MediaCodec> mCodec; 80078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sp<ALooper> mCodecLooper; 811cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar sp<ALooper> mDecoderLooper; 821cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar 831cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar Vector<sp<ABuffer> > mInputBuffers; 841cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar Vector<sp<ABuffer> > mOutputBuffers; 8587603c0dd1f4e62e52feffa8d6e960ad21f68893Lajos Molnar Vector<sp<ABuffer> > mCSDsForCurrentFormat; 8687603c0dd1f4e62e52feffa8d6e960ad21f68893Lajos Molnar Vector<sp<ABuffer> > mCSDsToSubmit; 87095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar Vector<bool> mInputBufferIsDequeued; 88095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar Vector<MediaBuffer *> mMediaBuffers; 891cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar 901cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void handleError(int32_t err); 911cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar bool handleAnInputBuffer(); 921cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar bool handleAnOutputBuffer(); 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 94095248375e29adde961ec2a44989ecb3a6dda6a2Lajos Molnar void releaseAndResetMediaBuffers(); 951cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void requestCodecNotification(); 961cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar bool isStaleReply(const sp<AMessage> &msg); 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 981cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void onConfigure(const sp<AMessage> &format); 991cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void onFlush(); 100704e72658b1082264a26a83c50046da34f07d1a1Wei Jia void onResume(); 1011cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void onInputBufferFilled(const sp<AMessage> &msg); 1021cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void onRenderBuffer(const sp<AMessage> &msg); 1031cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar void onShutdown(); 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1051cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar int32_t mBufferGeneration; 106704e72658b1082264a26a83c50046da34f07d1a1Wei Jia bool mPaused; 1071cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar AString mComponentName; 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1096d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih bool supportsSeamlessAudioFormatChange(const sp<AMessage> &targetFormat) const; 11087603c0dd1f4e62e52feffa8d6e960ad21f68893Lajos Molnar void rememberCodecSpecificData(const sp<AMessage> &format); 1116d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Decoder); 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 115a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhangstruct NuPlayer::CCDecoder : public RefBase { 116a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang enum { 117a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang kWhatClosedCaptionData, 118a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang kWhatTrackAdded, 119a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang }; 120a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 121a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang CCDecoder(const sp<AMessage> ¬ify); 122a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 123a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang size_t getTrackCount() const; 124a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang sp<AMessage> getTrackInfo(size_t index) const; 125a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang status_t selectTrack(size_t index, bool select); 126a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang bool isSelected() const; 127a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang void decode(const sp<ABuffer> &accessUnit); 128a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang void display(int64_t timeUs); 129b86e68f834b7040518b99d1d0245d5f2e5cb9c86Chong Zhang void flush(); 130a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 131a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhangprivate: 132a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang sp<AMessage> mNotify; 133a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang KeyedVector<int64_t, sp<ABuffer> > mCCMap; 134b86e68f834b7040518b99d1d0245d5f2e5cb9c86Chong Zhang size_t mCurrentChannel; 135a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang int32_t mSelectedTrack; 136b86e68f834b7040518b99d1d0245d5f2e5cb9c86Chong Zhang int32_t mTrackIndices[4]; 137b86e68f834b7040518b99d1d0245d5f2e5cb9c86Chong Zhang Vector<size_t> mFoundChannels; 138a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 139b86e68f834b7040518b99d1d0245d5f2e5cb9c86Chong Zhang bool isTrackValid(size_t index) const; 140b86e68f834b7040518b99d1d0245d5f2e5cb9c86Chong Zhang int32_t getTrackIndex(size_t channel) const; 141a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang bool extractFromSEI(const sp<ABuffer> &accessUnit); 142b86e68f834b7040518b99d1d0245d5f2e5cb9c86Chong Zhang sp<ABuffer> filterCCBuf(const sp<ABuffer> &ccBuf, size_t index); 143a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 144a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang DISALLOW_EVIL_CONSTRUCTORS(CCDecoder); 145a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang}; 146a7fa1d9530b6870f2c7850e3025d7db963661803Chong Zhang 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif // NUPLAYER_DECODER_H_ 150