1033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim/*
2033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * Copyright (C) 2018 The Android Open Source Project
3033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim *
4033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
5033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * you may not use this file except in compliance with the License.
6033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * You may obtain a copy of the License at
7033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim *
8033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim *      http://www.apache.org/licenses/LICENSE-2.0
9033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim *
10033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * Unless required by applicable law or agreed to in writing, software
11033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
12033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * See the License for the specific language governing permissions and
14033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim * limitations under the License.
15033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim */
16033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1772dc0b6eea5a305d58537dcd2ee28e23c72b6e44Lajos Molnar#ifndef ANDROID_C2_SOFT_VPX_DEC_H_
1872dc0b6eea5a305d58537dcd2ee28e23c72b6e44Lajos Molnar#define ANDROID_C2_SOFT_VPX_DEC_H_
19033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
20033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <SimpleC2Component.h>
21033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
22033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
23033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include "vpx/vpx_decoder.h"
24033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include "vpx/vp8dx.h"
25033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
26033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimnamespace android {
27033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
28aa9c743015a71323b4204320a44cc1f7802a1055Lajos Molnarstruct C2SoftVpxDec : public SimpleC2Component {
296f709d0299c4b7b77fc06a5423122fb9859d62afManisha Jajoo    class IntfImpl;
306f709d0299c4b7b77fc06a5423122fb9859d62afManisha Jajoo
31aa9c743015a71323b4204320a44cc1f7802a1055Lajos Molnar    C2SoftVpxDec(const char* name, c2_node_id_t id,
326f709d0299c4b7b77fc06a5423122fb9859d62afManisha Jajoo              const std::shared_ptr<IntfImpl>& intfImpl);
33aa9c743015a71323b4204320a44cc1f7802a1055Lajos Molnar    virtual ~C2SoftVpxDec();
34033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
35033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // From SimpleC2Component
36033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t onInit() override;
37033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t onStop() override;
38033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void onReset() override;
39033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void onRelease() override;
40033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t onFlush_sm() override;
41033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void process(
42033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::unique_ptr<C2Work> &work,
43033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::shared_ptr<C2BlockPool> &pool) override;
44033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t drain(
45033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            uint32_t drainMode,
46033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::shared_ptr<C2BlockPool> &pool) override;
47033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim private:
48033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    enum {
49033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        MODE_VP8,
50033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        MODE_VP9,
51033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    } mMode;
52033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
536f709d0299c4b7b77fc06a5423122fb9859d62afManisha Jajoo    std::shared_ptr<IntfImpl> mIntf;
54033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    vpx_codec_ctx_t *mCodecCtx;
55033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool mFrameParallelMode;  // Frame parallel is only supported by VP9 decoder.
56033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
57033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint32_t mWidth;
58033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint32_t mHeight;
59033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool mSignalledOutputEos;
60033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool mSignalledError;
61033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
62033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t initDecoder();
63033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t destroyDecoder();
64033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void finishWork(uint64_t index, const std::unique_ptr<C2Work> &work,
65033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                    const std::shared_ptr<C2GraphicBlock> &block);
66033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool outputBuffer(
67033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::shared_ptr<C2BlockPool> &pool,
68033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::unique_ptr<C2Work> &work);
69033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t drainInternal(
70033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            uint32_t drainMode,
71033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::shared_ptr<C2BlockPool> &pool,
72033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::unique_ptr<C2Work> &work);
73033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
74aa9c743015a71323b4204320a44cc1f7802a1055Lajos Molnar    C2_DO_NOT_COPY(C2SoftVpxDec);
75033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim};
76033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
77033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}  // namespace android
78033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
7972dc0b6eea5a305d58537dcd2ee28e23c72b6e44Lajos Molnar#endif  // ANDROID_C2_SOFT_VPX_DEC_H_
80