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