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_HEVC_DEC_H_
1872dc0b6eea5a305d58537dcd2ee28e23c72b6e44Lajos Molnar#define ANDROID_C2_SOFT_HEVC_DEC_H_
19033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
20d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include <media/stagefright/foundation/ColorUtils.h>
21d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar
22033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <SimpleC2Component.h>
23033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
24d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include "ihevc_typedefs.h"
25d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include "iv.h"
26d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include "ivd.h"
27033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
28033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimnamespace android {
29033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
30033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdec_api_function              ihevcd_cxa_api_function
31033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_create_ip_t              ihevcd_cxa_create_ip_t
32033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_create_op_t              ihevcd_cxa_create_op_t
33033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_delete_ip_t              ihevcd_cxa_delete_ip_t
34033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_delete_op_t              ihevcd_cxa_delete_op_t
35033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_ctl_set_num_cores_ip_t   ihevcd_cxa_ctl_set_num_cores_ip_t
36033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_ctl_set_num_cores_op_t   ihevcd_cxa_ctl_set_num_cores_op_t
37033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_ctl_get_vui_params_ip_t  ihevcd_cxa_ctl_get_vui_params_ip_t
38033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_ctl_get_vui_params_op_t  ihevcd_cxa_ctl_get_vui_params_op_t
39033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ALIGN64(x)                      ((((x) + 63) >> 6) << 6)
40033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define MAX_NUM_CORES                   4
41033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define IVDEXT_CMD_CTL_SET_NUM_CORES    \
42033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        (IVD_CONTROL_API_COMMAND_TYPE_T)IHEVCD_CXA_CMD_CTL_SET_NUM_CORES
43033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define MIN(a, b)                       (((a) < (b)) ? (a) : (b))
44033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define GETTIME(a, b)                   gettimeofday(a, b);
45033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define TIME_DIFF(start, end, diff)     \
46033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    diff = (((end).tv_sec - (start).tv_sec) * 1000000) + \
47033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ((end).tv_usec - (start).tv_usec);
48033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
49033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
50033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimstruct C2SoftHevcDec : public SimpleC2Component {
512a806f1540b86f752c51e1158415c13d2d9b7735Manisha Jajoo    class IntfImpl;
522a806f1540b86f752c51e1158415c13d2d9b7735Manisha Jajoo
532a806f1540b86f752c51e1158415c13d2d9b7735Manisha Jajoo    C2SoftHevcDec(const char* name, c2_node_id_t id,
542a806f1540b86f752c51e1158415c13d2d9b7735Manisha Jajoo                  const std::shared_ptr<IntfImpl>& intfImpl);
55033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    virtual ~C2SoftHevcDec();
56033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
57033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // From SimpleC2Component
58033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t onInit() override;
59033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t onStop() override;
60033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void onReset() override;
61033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void onRelease() override;
62033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t onFlush_sm() override;
63033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void process(
64033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::unique_ptr<C2Work> &work,
65033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::shared_ptr<C2BlockPool> &pool) override;
66033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t drain(
67033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            uint32_t drainMode,
68033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::shared_ptr<C2BlockPool> &pool) override;
69033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim private:
70033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t createDecoder();
71033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t setNumCores();
72033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t setParams(size_t stride);
73033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t getVersion();
74033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t initDecoder();
75033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool setDecodeArgs(ivd_video_decode_ip_t *ps_decode_ip,
76033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       ivd_video_decode_op_t *ps_decode_op,
77033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       C2ReadView *inBuffer,
78033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       C2GraphicView *outBuffer,
79033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       size_t inOffset,
80033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       size_t inSize,
81033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       uint32_t tsMarker);
82033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool getVuiParams();
83033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // TODO:This is not the right place for colorAspects functions. These should
84033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // be part of c2-vndk so that they can be accessed by all video plugins
85033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // until then, make them feel at home
86033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool colorAspectsDiffer(const ColorAspects &a, const ColorAspects &b);
87033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void updateFinalColorAspects(
88033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const ColorAspects &otherAspects, const ColorAspects &preferredAspects);
89033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t handleColorAspectsChange();
90033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool);
91033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void finishWork(uint64_t index, const std::unique_ptr<C2Work> &work);
92033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t setFlushMode();
93033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t drainInternal(
94033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            uint32_t drainMode,
95033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::shared_ptr<C2BlockPool> &pool,
96033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::unique_ptr<C2Work> &work);
97033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t resetDecoder();
98033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void resetPlugin();
99033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t deleteDecoder();
100033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
101033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // TODO:This is not the right place for this enum. These should
102033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // be part of c2-vndk so that they can be accessed by all video plugins
103033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // until then, make them feel at home
104033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    enum {
105033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        kNotSupported,
106033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        kPreferBitstream,
107033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        kPreferContainer,
108033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    };
109033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1102a806f1540b86f752c51e1158415c13d2d9b7735Manisha Jajoo    std::shared_ptr<IntfImpl> mIntf;
111033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    iv_obj_t *mDecHandle;
112033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    std::shared_ptr<C2GraphicBlock> mOutBlock;
113033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint8_t *mOutBufferFlush;
114033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
115033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    size_t mNumCores;
116033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_COLOR_FORMAT_T mIvColorformat;
117033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
118033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint32_t mWidth;
119033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint32_t mHeight;
120033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint32_t mStride;
121033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool mSignalledOutputEos;
122033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool mSignalledError;
123033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
124033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // ColorAspects
125033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    Mutex mColorAspectsLock;
126033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    int mPreference;
127033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ColorAspects mDefaultColorAspects;
128033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ColorAspects mBitstreamColorAspects;
129033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ColorAspects mFinalColorAspects;
130033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool mUpdateColorAspects;
131033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
132033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // profile
133033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    struct timeval mTimeStart;
134033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    struct timeval mTimeEnd;
135033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
136d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar    C2_DO_NOT_COPY(C2SoftHevcDec);
137033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim};
138033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
139033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}  // namespace android
140033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
14172dc0b6eea5a305d58537dcd2ee28e23c72b6e44Lajos Molnar#endif  // ANDROID_C2_SOFT_HEVC_DEC_H_
142