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_MPEG2_DEC_H_
1872dc0b6eea5a305d58537dcd2ee28e23c72b6e44Lajos Molnar#define ANDROID_C2_SOFT_MPEG2_DEC_H_
19033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
20033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <SimpleC2Component.h>
21033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
22033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#include <media/stagefright/foundation/ColorUtils.h>
23033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
24d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include "iv_datatypedef.h"
25d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include "iv.h"
26d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar#include "ivd.h"
27d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar
28033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimnamespace android {
29033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
30033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdec_api_function              impeg2d_api_function
31033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_init_ip_t                impeg2d_init_ip_t
32033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_init_op_t                impeg2d_init_op_t
33033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_fill_mem_rec_ip_t        impeg2d_fill_mem_rec_ip_t
34033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_fill_mem_rec_op_t        impeg2d_fill_mem_rec_op_t
35033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_ctl_set_num_cores_ip_t   impeg2d_ctl_set_num_cores_ip_t
36033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_ctl_set_num_cores_op_t   impeg2d_ctl_set_num_cores_op_t
37033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_ctl_get_seq_info_ip_t    impeg2d_ctl_get_seq_info_ip_t
38033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#define ivdext_ctl_get_seq_info_op_t    impeg2d_ctl_get_seq_info_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)IMPEG2D_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#ifdef FILE_DUMP_ENABLE
50033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define INPUT_DUMP_PATH     "/sdcard/clips/mpeg2d_input"
51033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define INPUT_DUMP_EXT      "m2v"
52033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define GENERATE_FILE_NAMES() {                         \
53033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        GETTIME(&mTimeStart, NULL);                         \
54033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        strcpy(mInFile, "");                                \
55033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH,  \
56033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                mTimeStart.tv_sec, mTimeStart.tv_usec,      \
57033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                INPUT_DUMP_EXT);                            \
58033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
59033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define CREATE_DUMP_FILE(m_filename) {                  \
60033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        FILE *fp = fopen(m_filename, "wb");                 \
61033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (fp != NULL) {                                   \
62033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            fclose(fp);                                     \
63033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        } else {                                            \
64033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGD("Could not open file %s", m_filename);    \
65033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }                                                   \
66033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
67033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define DUMP_TO_FILE(m_filename, m_buf, m_size)         \
68033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    {                                                       \
69033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        FILE *fp = fopen(m_filename, "ab");                 \
70033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        if (fp != NULL && m_buf != NULL) {                  \
71033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            uint32_t i;                                     \
72033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            i = fwrite(m_buf, 1, m_size, fp);               \
73033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGD("fwrite ret %d to write %d", i, m_size);  \
74033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            if (i != (uint32_t)m_size) {                    \
75033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                ALOGD("Error in fwrite, returned %d", i);   \
76033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                perror("Error in write to file");           \
77033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            }                                               \
78033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            fclose(fp);                                     \
79033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        } else {                                            \
80033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            ALOGD("Could not write to file %s", m_filename);\
81033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        }                                                   \
82033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    }
83033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#else /* FILE_DUMP_ENABLE */
84033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define INPUT_DUMP_PATH
85033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define INPUT_DUMP_EXT
86033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define OUTPUT_DUMP_PATH
87033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define OUTPUT_DUMP_EXT
88033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define GENERATE_FILE_NAMES()
89033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define CREATE_DUMP_FILE(m_filename)
90033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    #define DUMP_TO_FILE(m_filename, m_buf, m_size)
91033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#endif /* FILE_DUMP_ENABLE */
92033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
93033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kimstruct C2SoftMpeg2Dec : public SimpleC2Component {
942ff92f427b4d8688f4633486cd2e56bfc8febde3Rakesh Kumar    class IntfImpl;
952ff92f427b4d8688f4633486cd2e56bfc8febde3Rakesh Kumar
962ff92f427b4d8688f4633486cd2e56bfc8febde3Rakesh Kumar    C2SoftMpeg2Dec(const char* name, c2_node_id_t id,
972ff92f427b4d8688f4633486cd2e56bfc8febde3Rakesh Kumar                   const std::shared_ptr<IntfImpl>& intfImpl);
98033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    virtual ~C2SoftMpeg2Dec();
99033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
100033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // From SimpleC2Component
101033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t onInit() override;
102033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t onStop() override;
103033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void onReset() override;
104033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void onRelease() override;
105033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t onFlush_sm() override;
106033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void process(
107033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::unique_ptr<C2Work> &work,
108033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::shared_ptr<C2BlockPool> &pool) override;
109033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t drain(
110033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            uint32_t drainMode,
111033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::shared_ptr<C2BlockPool> &pool) override;
112033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim private:
113033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t getNumMemRecords();
114033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t fillMemRecords();
115033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t createDecoder();
116033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t setNumCores();
117033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t setParams(size_t stride);
118033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t getVersion();
119033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t initDecoder();
120033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool setDecodeArgs(ivd_video_decode_ip_t *ps_decode_ip,
121033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       ivd_video_decode_op_t *ps_decode_op,
122033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       C2ReadView *inBuffer,
123033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       C2GraphicView *outBuffer,
124033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       size_t inOffset,
125033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       size_t inSize,
126033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim                       uint32_t tsMarker);
127033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool getSeqInfo();
128033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // TODO:This is not the right place for colorAspects functions. These should
129033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // be part of c2-vndk so that they can be accessed by all video plugins
130033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // until then, make them feel at home
131033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool colorAspectsDiffer(const ColorAspects &a, const ColorAspects &b);
132033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void updateFinalColorAspects(
133033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const ColorAspects &otherAspects, const ColorAspects &preferredAspects);
134033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t handleColorAspectsChange();
135033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t ensureDecoderState(const std::shared_ptr<C2BlockPool> &pool);
136033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void finishWork(uint64_t index, const std::unique_ptr<C2Work> &work);
137033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t setFlushMode();
138033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    c2_status_t drainInternal(
139033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            uint32_t drainMode,
140033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::shared_ptr<C2BlockPool> &pool,
141033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim            const std::unique_ptr<C2Work> &work);
142033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t resetDecoder();
143033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    void resetPlugin();
144033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t deleteDecoder();
145033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    status_t reInitDecoder();
146033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
147033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // TODO:This is not the right place for this enum. These should
148033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // be part of c2-vndk so that they can be accessed by all video plugins
149033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // until then, make them feel at home
150033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    enum {
151033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        kNotSupported,
152033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        kPreferBitstream,
153033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim        kPreferContainer,
154033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    };
155033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
1562ff92f427b4d8688f4633486cd2e56bfc8febde3Rakesh Kumar    std::shared_ptr<IntfImpl> mIntf;
157033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    iv_obj_t *mDecHandle;
158033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    iv_mem_rec_t *mMemRecords;
159033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    size_t mNumMemRecords;
160033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    std::shared_ptr<C2GraphicBlock> mOutBlock;
161033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint8_t *mOutBufferDrain;
162033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
163033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    size_t mNumCores;
164033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    IV_COLOR_FORMAT_T mIvColorformat;
165033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
166033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint32_t mWidth;
167033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint32_t mHeight;
168033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    uint32_t mStride;
169033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool mSignalledOutputEos;
170033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool mSignalledError;
171033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
172033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // ColorAspects
173033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    Mutex mColorAspectsLock;
174033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    int mPreference;
175033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ColorAspects mDefaultColorAspects;
176033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ColorAspects mBitstreamColorAspects;
177033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    ColorAspects mFinalColorAspects;
178033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    bool mUpdateColorAspects;
179033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
180033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    // profile
181033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    struct timeval mTimeStart;
182033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    struct timeval mTimeEnd;
183033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#ifdef FILE_DUMP_ENABLE
184033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim    char mInFile[200];
185033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim#endif /* FILE_DUMP_ENABLE */
186033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
187d087ee640c4664516a25cec687a76b31bb62b2e1Lajos Molnar    C2_DO_NOT_COPY(C2SoftMpeg2Dec);
188033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim};
189033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
190033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim}  // namespace android
191033ea548eec7ec220082ea6b199bf6e77f67a40dWonsik Kim
19272dc0b6eea5a305d58537dcd2ee28e23c72b6e44Lajos Molnar#endif  // ANDROID_C2_SOFT_MPEG2_DEC_H_
193