1d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang/* 2d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * Copyright (C) 2017 The Android Open Source Project 3d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * 4d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 5d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * you may not use this file except in compliance with the License. 6d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * You may obtain a copy of the License at 7d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * 8d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * http://www.apache.org/licenses/LICENSE-2.0 9d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * 10d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * Unless required by applicable law or agreed to in writing, software 11d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * distributed under the License is distributed on an "AS IS" BASIS, 12d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * See the License for the specific language governing permissions and 14d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang * limitations under the License. 15d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang */ 16d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 17d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#ifndef FRAME_DECODER_H_ 18d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#define FRAME_DECODER_H_ 19d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 2084415e084da7a7f8af8984cc603b04b209fca1f8Dongwon Kang#include <memory> 2184415e084da7a7f8af8984cc603b04b209fca1f8Dongwon Kang#include <vector> 2284415e084da7a7f8af8984cc603b04b209fca1f8Dongwon Kang 23d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#include <media/stagefright/foundation/AString.h> 24d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#include <media/stagefright/foundation/ABase.h> 25d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#include <media/MediaSource.h> 26d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#include <media/openmax/OMX_Video.h> 27d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#include <system/graphics-base.h> 28d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 29d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangnamespace android { 30d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 31d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangstruct AMessage; 32d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangclass MediaCodecBuffer; 3349ce671c4efa4c5d038351ca441e34c5afa5241fDongwon Kangclass IMediaSource; 34d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangclass VideoFrame; 35f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhangstruct MediaCodec; 36d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 370c1407f79ef36422330c2003a608d37df714256bChong Zhangstruct FrameRect { 380c1407f79ef36422330c2003a608d37df714256bChong Zhang int32_t left, top, right, bottom; 390c1407f79ef36422330c2003a608d37df714256bChong Zhang}; 400c1407f79ef36422330c2003a608d37df714256bChong Zhang 410c1407f79ef36422330c2003a608d37df714256bChong Zhangstruct FrameDecoder : public RefBase { 42d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang FrameDecoder( 43d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const AString &componentName, 44d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<MetaData> &trackMeta, 45f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang const sp<IMediaSource> &source); 46d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 47f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang status_t init( 48f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang int64_t frameTimeUs, size_t numFrames, int option, int colorFormat); 49d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 500c1407f79ef36422330c2003a608d37df714256bChong Zhang sp<IMemory> extractFrame(FrameRect *rect = NULL); 51f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang 52f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang status_t extractFrames(std::vector<sp<IMemory> >* frames); 53d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 543f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang static sp<IMemory> getMetadataOnly( 55d5fa357ddff0589d8a331583a56e62712af471beChong Zhang const sp<MetaData> &trackMeta, int colorFormat, bool thumbnail = false); 56d5fa357ddff0589d8a331583a56e62712af471beChong Zhang 57d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangprotected: 58f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang virtual ~FrameDecoder(); 59d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 60d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang virtual sp<AMessage> onGetFormatAndSeekOptions( 61d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int64_t frameTimeUs, 62d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang size_t numFrames, 63d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int seekMode, 64d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang MediaSource::ReadOptions *options) = 0; 65d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 660c1407f79ef36422330c2003a608d37df714256bChong Zhang virtual status_t onExtractRect(FrameRect *rect) = 0; 670c1407f79ef36422330c2003a608d37df714256bChong Zhang 68d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang virtual status_t onInputReceived( 69d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<MediaCodecBuffer> &codecBuffer, 703d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen MetaDataBase &sampleMeta, 71d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang bool firstSample, 72d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang uint32_t *flags) = 0; 73d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 74d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang virtual status_t onOutputReceived( 75d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<MediaCodecBuffer> &videoFrameBuffer, 76d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<AMessage> &outputFormat, 77d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int64_t timeUs, 78d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang bool *done) = 0; 79d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 80d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang sp<MetaData> trackMeta() const { return mTrackMeta; } 81d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang OMX_COLOR_FORMATTYPE dstFormat() const { return mDstFormat; } 82d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int32_t dstBpp() const { return mDstBpp; } 83d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 843f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang void addFrame(const sp<IMemory> &frame) { 853f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang mFrames.push_back(frame); 86d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang } 87d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 88d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangprivate: 89d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang AString mComponentName; 90d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang sp<MetaData> mTrackMeta; 91d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang sp<IMediaSource> mSource; 92d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang OMX_COLOR_FORMATTYPE mDstFormat; 93d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int32_t mDstBpp; 943f4e6ddcf05aa1a286bc3963b5a9f53bf30b4327Chong Zhang std::vector<sp<IMemory> > mFrames; 95f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang MediaSource::ReadOptions mReadOptions; 96f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang sp<MediaCodec> mDecoder; 97f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang sp<AMessage> mOutputFormat; 98f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang bool mHaveMoreInputs; 99f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang bool mFirstSample; 100d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 101f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang status_t extractInternal(); 102d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 103d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang DISALLOW_EVIL_CONSTRUCTORS(FrameDecoder); 104d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang}; 105d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 106d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangstruct VideoFrameDecoder : public FrameDecoder { 107d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang VideoFrameDecoder( 108d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const AString &componentName, 109d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<MetaData> &trackMeta, 110f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang const sp<IMediaSource> &source); 111d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 112d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangprotected: 113d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang virtual sp<AMessage> onGetFormatAndSeekOptions( 114d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int64_t frameTimeUs, 115d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang size_t numFrames, 116d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int seekMode, 117d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang MediaSource::ReadOptions *options) override; 118d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 1190c1407f79ef36422330c2003a608d37df714256bChong Zhang virtual status_t onExtractRect(FrameRect *rect) override { 1200c1407f79ef36422330c2003a608d37df714256bChong Zhang // Rect extraction for sequences is not supported for now. 1210c1407f79ef36422330c2003a608d37df714256bChong Zhang return (rect == NULL) ? OK : ERROR_UNSUPPORTED; 1220c1407f79ef36422330c2003a608d37df714256bChong Zhang } 1230c1407f79ef36422330c2003a608d37df714256bChong Zhang 124d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang virtual status_t onInputReceived( 125d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<MediaCodecBuffer> &codecBuffer, 1263d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen MetaDataBase &sampleMeta, 127d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang bool firstSample, 128d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang uint32_t *flags) override; 129d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 130d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang virtual status_t onOutputReceived( 131d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<MediaCodecBuffer> &videoFrameBuffer, 132d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<AMessage> &outputFormat, 133d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int64_t timeUs, 134d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang bool *done) override; 135d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 136d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangprivate: 137d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang bool mIsAvcOrHevc; 138d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang MediaSource::ReadOptions::SeekMode mSeekMode; 139d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int64_t mTargetTimeUs; 140d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang size_t mNumFrames; 141d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang size_t mNumFramesDecoded; 142d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang}; 143d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 144d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangstruct ImageDecoder : public FrameDecoder { 145d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang ImageDecoder( 146d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const AString &componentName, 147d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<MetaData> &trackMeta, 148f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang const sp<IMediaSource> &source); 149d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 150d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangprotected: 151d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang virtual sp<AMessage> onGetFormatAndSeekOptions( 152d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int64_t frameTimeUs, 153d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang size_t numFrames, 154d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int seekMode, 155d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang MediaSource::ReadOptions *options) override; 156d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 1570c1407f79ef36422330c2003a608d37df714256bChong Zhang virtual status_t onExtractRect(FrameRect *rect) override; 1580c1407f79ef36422330c2003a608d37df714256bChong Zhang 159d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang virtual status_t onInputReceived( 160d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<MediaCodecBuffer> &codecBuffer __unused, 1613d21ae3fad5a894cf15f2e7e7a1d54d0f3d19db0Marco Nelissen MetaDataBase &sampleMeta __unused, 162d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang bool firstSample __unused, 163d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang uint32_t *flags __unused) override { return OK; } 164d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 165d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang virtual status_t onOutputReceived( 166d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<MediaCodecBuffer> &videoFrameBuffer, 167d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang const sp<AMessage> &outputFormat, 168d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int64_t timeUs, 169d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang bool *done) override; 170d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 171d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhangprivate: 172d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang VideoFrame *mFrame; 173f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang int32_t mWidth; 174f49d8f7b8c5f77016e9ba848219966890c9810a8Chong Zhang int32_t mHeight; 175d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int32_t mGridRows; 176d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int32_t mGridCols; 1770c1407f79ef36422330c2003a608d37df714256bChong Zhang int32_t mTileWidth; 1780c1407f79ef36422330c2003a608d37df714256bChong Zhang int32_t mTileHeight; 179d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang int32_t mTilesDecoded; 1800c1407f79ef36422330c2003a608d37df714256bChong Zhang int32_t mTargetTiles; 181d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang}; 182d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 183d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang} // namespace android 184d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang 185d3e0d861aa68a7ef129fe228595bff734448ebc8Chong Zhang#endif // FRAME_DECODER_H_ 186