/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _HEIF_DECODER_IMPL_ #define _HEIF_DECODER_IMPL_ #include "include/HeifDecoderAPI.h" #include #include #include #include namespace android { class IDataSource; class IMemory; class MediaMetadataRetriever; /* * An implementation of HeifDecoder based on Android's MediaMetadataRetriever. */ class HeifDecoderImpl : public HeifDecoder { public: HeifDecoderImpl(); ~HeifDecoderImpl() override; bool init(HeifStream* stream, HeifFrameInfo* frameInfo) override; bool getSequenceInfo(HeifFrameInfo* frameInfo, size_t *frameCount) override; bool getEncodedColor(HeifEncodedColor* outColor) const override; bool setOutputColor(HeifColorFormat heifColor) override; bool decode(HeifFrameInfo* frameInfo) override; bool decodeSequence(int frameIndex, HeifFrameInfo* frameInfo) override; bool getScanline(uint8_t* dst) override; size_t skipScanlines(size_t count) override; private: struct DecodeThread; sp mDataSource; sp mRetriever; sp mFrameMemory; HeifFrameInfo mImageInfo; HeifFrameInfo mSequenceInfo; android_pixel_format_t mOutputColor; size_t mCurScanline; size_t mTotalScanline; bool mFrameDecoded; bool mHasImage; bool mHasVideo; size_t mSequenceLength; // Slice decoding only Mutex mLock; Condition mScanlineReady; sp mThread; size_t mAvailableLines; size_t mNumSlices; uint32_t mSliceHeight; bool mAsyncDecodeDone; bool decodeAsync(); bool getScanlineInner(uint8_t* dst); bool reinit(HeifFrameInfo* frameInfo); }; } // namespace android #endif // _HEIF_DECODER_IMPL_