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