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