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