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