1e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani/*
2e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * Copyright 2015 The Android Open Source Project
3e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani *
4e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * Licensed under the Apache License, Version 2.0 (the "License");
5e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * you may not use this file except in compliance with the License.
6e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * You may obtain a copy of the License at
7e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani *
8e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani *      http://www.apache.org/licenses/LICENSE-2.0
9e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani *
10e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * Unless required by applicable law or agreed to in writing, software
11e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * distributed under the License is distributed on an "AS IS" BASIS,
12e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * See the License for the specific language governing permissions and
14e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani * limitations under the License.
15e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani */
16e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
17e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#ifndef SOFT_H264_DEC_H_
18e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
19e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define SOFT_H264_DEC_H_
20e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
21e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include "SoftVideoDecoderOMXComponent.h"
22e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#include <sys/time.h>
23e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
24e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhaninamespace android {
25e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
26e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani/** Number of entries in the time-stamp array */
27e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define MAX_TIME_STAMPS 64
28e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
29e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani/** Maximum number of cores supported by the codec */
30e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define CODEC_MAX_NUM_CORES 4
31e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
32e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define CODEC_MAX_WIDTH     1920
33e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
34e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define CODEC_MAX_HEIGHT    1088
35e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
36e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani/** Input buffer size */
37e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define INPUT_BUF_SIZE (1024 * 1024)
38e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
39e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define MIN(a, b) ((a) < (b)) ? (a) : (b)
40e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
41e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani/** Used to remove warnings about unused parameters */
42e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define UNUSED(x) ((void)(x))
43e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
44e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani/** Get time */
45e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define GETTIME(a, b) gettimeofday(a, b);
46e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
47e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani/** Compute difference between start and end */
48e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define TIME_DIFF(start, end, diff) \
49e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    diff = ((end.tv_sec - start.tv_sec) * 1000000) + \
50e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            (end.tv_usec - start.tv_usec);
51e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
52e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhanistruct SoftAVC : public SoftVideoDecoderOMXComponent {
53e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    SoftAVC(const char *name, const OMX_CALLBACKTYPE *callbacks,
54e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            OMX_PTR appData, OMX_COMPONENTTYPE **component);
55e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
56e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhaniprotected:
57e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    virtual ~SoftAVC();
58e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
59e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    virtual void onQueueFilled(OMX_U32 portIndex);
60e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    virtual void onPortFlushCompleted(OMX_U32 portIndex);
61e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    virtual void onReset();
62e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhaniprivate:
63e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    // Number of input and output buffers
64e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    enum {
65e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        kNumBuffers = 8
66e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    };
67e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
68e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    iv_obj_t *mCodecCtx;         // Codec context
69e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
70e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    size_t mNumCores;            // Number of cores to be uesd by the codec
71e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
72e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    struct timeval mTimeStart;   // Time at the start of decode()
73e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    struct timeval mTimeEnd;     // Time at the end of decode()
74e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
75e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    // Internal buffer to be used to flush out the buffers from decoder
76e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    uint8_t *mFlushOutBuffer;
77e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
78e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    // Status of entries in the timestamp array
79e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    bool mTimeStampsValid[MAX_TIME_STAMPS];
80e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
81e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    // Timestamp array - Since codec does not take 64 bit timestamps,
82e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    // they are maintained in the plugin
83e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    OMX_S64 mTimeStamps[MAX_TIME_STAMPS];
84e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
85e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#ifdef FILE_DUMP_ENABLE
86e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    char mInFile[200];
87e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#endif /* FILE_DUMP_ENABLE */
88e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
89e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    OMX_COLOR_FORMATTYPE mOmxColorFormat;    // OMX Color format
90e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    IV_COLOR_FORMAT_T mIvColorFormat;        // Ittiam Color format
91e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
92e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    bool mIsInFlush;        // codec is flush mode
93e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    bool mReceivedEOS;      // EOS is receieved on input port
944d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
95e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    // The input stream has changed to a different resolution, which is still supported by the
96e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    // codec. So the codec is switching to decode the new resolution.
97e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    bool mChangingResolution;
98e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    bool mFlushNeeded;
99f3a5cf243fc2608c0d5dc4984806a4a8176455cfRobert Shih    bool mSignalledError;
1004d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    size_t mStride;
101e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
1024d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar    status_t initDecoder();
103e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status_t deInitDecoder();
104e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status_t setFlushMode();
105e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status_t setParams(size_t stride);
106e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    void logVersion();
107e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status_t setNumCores();
108e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status_t resetDecoder();
109e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    status_t resetPlugin();
1104d29fa302b4a93de9f4fc92b8054bae7b42688acHarish Mahendrakar
111e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
11287fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim    bool setDecodeArgs(
113e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            ivd_video_decode_ip_t *ps_dec_ip,
114e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            ivd_video_decode_op_t *ps_dec_op,
115e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            OMX_BUFFERHEADERTYPE *inHeader,
116e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            OMX_BUFFERHEADERTYPE *outHeader,
117e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            size_t timeStampIx);
118e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
119e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    DISALLOW_EVIL_CONSTRUCTORS(SoftAVC);
120e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani};
121e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
122e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#ifdef FILE_DUMP_ENABLE
123e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
124e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define INPUT_DUMP_PATH     "/sdcard/media/avcd_input"
125e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define INPUT_DUMP_EXT      "h264"
126e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
127e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define GENERATE_FILE_NAMES() {                         \
128e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    GETTIME(&mTimeStart, NULL);                         \
129e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    strcpy(mInFile, "");                                \
130e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH,  \
131e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            mTimeStart.tv_sec, mTimeStart.tv_usec,      \
132e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            INPUT_DUMP_EXT);                            \
133e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
134e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
135e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define CREATE_DUMP_FILE(m_filename) {                  \
136e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    FILE *fp = fopen(m_filename, "wb");                 \
137e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (fp != NULL) {                                   \
138e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        fclose(fp);                                     \
139e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    } else {                                            \
140e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ALOGD("Could not open file %s", m_filename);    \
141e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }                                                   \
142e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
143e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define DUMP_TO_FILE(m_filename, m_buf, m_size)         \
144e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani{                                                       \
145e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    FILE *fp = fopen(m_filename, "ab");                 \
146e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    if (fp != NULL && m_buf != NULL) {                  \
147e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        int i;                                          \
148e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        i = fwrite(m_buf, 1, m_size, fp);               \
149e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ALOGD("fwrite ret %d to write %d", i, m_size);  \
150e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        if (i != (int) m_size) {                        \
151e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            ALOGD("Error in fwrite, returned %d", i);   \
152e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani            perror("Error in write to file");           \
153e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        }                                               \
154e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        fclose(fp);                                     \
155e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    } else {                                            \
156e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani        ALOGD("Could not write to file %s", m_filename);\
157e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani    }                                                   \
158e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani}
159e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#else /* FILE_DUMP_ENABLE */
160e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define INPUT_DUMP_PATH
161e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define INPUT_DUMP_EXT
162e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define OUTPUT_DUMP_PATH
163e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define OUTPUT_DUMP_EXT
164e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define GENERATE_FILE_NAMES()
165e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define CREATE_DUMP_FILE(m_filename)
166e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#define DUMP_TO_FILE(m_filename, m_buf, m_size)
167e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#endif /* FILE_DUMP_ENABLE */
168e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
169e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani} // namespace android
170e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani
171e5b9b3db87a55d3430f881ba59ba95f7d6ae41d0Venkatarama Avadhani#endif  // SOFT_H264_DEC_H_
172