14a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* 24a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Copyright (C) 2009 The Android Open Source Project 34a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * 44a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 54a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * you may not use this file except in compliance with the License. 64a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * You may obtain a copy of the License at 74a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * 84a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 94a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * 104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Unless required by applicable law or agreed to in writing, software 114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * See the License for the specific language governing permissions and 144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * limitations under the License. 154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber */ 164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#ifndef AVC_DECODER_H_ 184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#define AVC_DECODER_H_ 204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include <media/stagefright/MediaBuffer.h> 224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include <media/stagefright/MediaSource.h> 234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include <utils/Vector.h> 244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberstruct tagAVCHandle; 264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Hubernamespace android { 284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberstruct AVCDecoder : public MediaSource, 304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber public MediaBufferObserver { 314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecoder(const sp<MediaSource> &source); 324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber virtual status_t start(MetaData *params); 344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber virtual status_t stop(); 354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber virtual sp<MetaData> getFormat(); 374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber virtual status_t read( 394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber MediaBuffer **buffer, const ReadOptions *options); 404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber virtual void signalBufferReturned(MediaBuffer *buffer); 424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberprotected: 444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber virtual ~AVCDecoder(); 454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberprivate: 474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber sp<MediaSource> mSource; 484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber bool mStarted; 494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber sp<MetaData> mFormat; 514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber Vector<MediaBuffer *> mCodecSpecificData; 534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber tagAVCHandle *mHandle; 554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber Vector<MediaBuffer *> mFrames; 564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber MediaBuffer *mInputBuffer; 574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int64_t mAnchorTimeUs; 594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int64_t mNumSamplesOutput; 60b5ae1c8712ee74ae30a115b80ecde9990bdb9a9fAndreas Huber int64_t mPendingSeekTimeUs; 616624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber MediaSource::ReadOptions::SeekMode mPendingSeekMode; 626624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber 636624c9fd0bc5e3858a22a04c05b5059445c1c367Andreas Huber int64_t mTargetTimeUs; 644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 6515644555189965b8dcb422c5f17ae4c7ada91ceeAndreas Huber bool mSPSSeen; 6615644555189965b8dcb422c5f17ae4c7ada91ceeAndreas Huber bool mPPSSeen; 6715644555189965b8dcb422c5f17ae4c7ada91ceeAndreas Huber 684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber void addCodecSpecificData(const uint8_t *data, size_t size); 694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber static int32_t ActivateSPSWrapper( 714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber void *userData, unsigned int sizeInMbs, unsigned int numBuffers); 724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber static int32_t BindFrameWrapper( 744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber void *userData, int32_t index, uint8_t **yuv); 754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber static void UnbindFrame(void *userData, int32_t index); 774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int32_t activateSPS( 794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber unsigned int sizeInMbs, unsigned int numBuffers); 804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int32_t bindFrame(int32_t index, uint8_t **yuv); 824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber void releaseFrames(); 844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 853172ab47988a008c873ce94a5e85c452197b51baAndreas Huber MediaBuffer *drainOutputBuffer(); 863172ab47988a008c873ce94a5e85c452197b51baAndreas Huber 874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecoder(const AVCDecoder &); 884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCDecoder &operator=(const AVCDecoder &); 894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber}; 904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} // namespace android 924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#endif // AVC_DECODER_H_ 94