Home | History | Annotate | Download | only in avc
      1 /*
      2  * Copyright 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_C2_SOFT_AVC_ENC_H__
     18 #define ANDROID_C2_SOFT_AVC_ENC_H__
     19 
     20 #include <map>
     21 
     22 #include <utils/Vector.h>
     23 
     24 #include <SimpleC2Component.h>
     25 
     26 #include "ih264_typedefs.h"
     27 #include "iv2.h"
     28 #include "ive2.h"
     29 
     30 namespace android {
     31 
     32 #define CODEC_MAX_CORES          4
     33 #define LEN_STATUS_BUFFER        (10  * 1024)
     34 #define MAX_VBV_BUFF_SIZE        (120 * 16384)
     35 #define MAX_NUM_IO_BUFS           3
     36 #define MAX_B_FRAMES              1
     37 
     38 #define DEFAULT_MAX_REF_FRM         2
     39 #define DEFAULT_MAX_REORDER_FRM     0
     40 #define DEFAULT_QP_MIN              10
     41 #define DEFAULT_QP_MAX              40
     42 #define DEFAULT_MAX_BITRATE         240000000
     43 #define DEFAULT_MAX_SRCH_RANGE_X    256
     44 #define DEFAULT_MAX_SRCH_RANGE_Y    256
     45 #define DEFAULT_MAX_FRAMERATE       120000
     46 #define DEFAULT_NUM_CORES           1
     47 #define DEFAULT_NUM_CORES_PRE_ENC   0
     48 #define DEFAULT_FPS                 30
     49 #define DEFAULT_ENC_SPEED           IVE_NORMAL
     50 
     51 #define DEFAULT_MEM_REC_CNT         0
     52 #define DEFAULT_RECON_ENABLE        0
     53 #define DEFAULT_CHKSUM_ENABLE       0
     54 #define DEFAULT_START_FRM           0
     55 #define DEFAULT_NUM_FRMS            0xFFFFFFFF
     56 #define DEFAULT_INP_COLOR_FORMAT       IV_YUV_420SP_VU
     57 #define DEFAULT_RECON_COLOR_FORMAT     IV_YUV_420P
     58 #define DEFAULT_LOOPBACK            0
     59 #define DEFAULT_SRC_FRAME_RATE      30
     60 #define DEFAULT_TGT_FRAME_RATE      30
     61 #define DEFAULT_MAX_WD              1920
     62 #define DEFAULT_MAX_HT              1920
     63 #define DEFAULT_MAX_LEVEL           41
     64 #define DEFAULT_STRIDE              0
     65 #define DEFAULT_WD                  1280
     66 #define DEFAULT_HT                  720
     67 #define DEFAULT_PSNR_ENABLE         0
     68 #define DEFAULT_ME_SPEED            100
     69 #define DEFAULT_ENABLE_FAST_SAD     0
     70 #define DEFAULT_ENABLE_ALT_REF      0
     71 #define DEFAULT_RC_MODE             IVE_RC_STORAGE
     72 #define DEFAULT_BITRATE             6000000
     73 #define DEFAULT_I_QP                22
     74 #define DEFAULT_I_QP_MAX            DEFAULT_QP_MAX
     75 #define DEFAULT_I_QP_MIN            DEFAULT_QP_MIN
     76 #define DEFAULT_P_QP                28
     77 #define DEFAULT_P_QP_MAX            DEFAULT_QP_MAX
     78 #define DEFAULT_P_QP_MIN            DEFAULT_QP_MIN
     79 #define DEFAULT_B_QP                22
     80 #define DEFAULT_B_QP_MAX            DEFAULT_QP_MAX
     81 #define DEFAULT_B_QP_MIN            DEFAULT_QP_MIN
     82 #define DEFAULT_AIR                 IVE_AIR_MODE_NONE
     83 #define DEFAULT_AIR_REFRESH_PERIOD  30
     84 #define DEFAULT_SRCH_RNG_X          64
     85 #define DEFAULT_SRCH_RNG_Y          48
     86 #define DEFAULT_I_INTERVAL          30
     87 #define DEFAULT_IDR_INTERVAL        1000
     88 #define DEFAULT_B_FRAMES            0
     89 #define DEFAULT_DISABLE_DEBLK_LEVEL 0
     90 #define DEFAULT_HPEL                1
     91 #define DEFAULT_QPEL                1
     92 #define DEFAULT_I4                  1
     93 #define DEFAULT_EPROFILE            IV_PROFILE_BASE
     94 #define DEFAULT_ENTROPY_MODE        0
     95 #define DEFAULT_SLICE_MODE          IVE_SLICE_MODE_NONE
     96 #define DEFAULT_SLICE_PARAM         256
     97 #define DEFAULT_ARCH                ARCH_ARM_A9Q
     98 #define DEFAULT_SOC                 SOC_GENERIC
     99 #define DEFAULT_INTRA4x4            0
    100 #define STRLENGTH                   500
    101 #define DEFAULT_CONSTRAINED_INTRA   0
    102 
    103 #define MIN(a, b) ((a) < (b))? (a) : (b)
    104 #define MAX(a, b) ((a) > (b))? (a) : (b)
    105 #define ALIGN16(x) ((((x) + 15) >> 4) << 4)
    106 #define ALIGN128(x) ((((x) + 127) >> 7) << 7)
    107 #define ALIGN4096(x) ((((x) + 4095) >> 12) << 12)
    108 
    109 /** Used to remove warnings about unused parameters */
    110 #define UNUSED(x) ((void)(x))
    111 
    112 /** Get time */
    113 #define GETTIME(a, b) gettimeofday(a, b);
    114 
    115 /** Compute difference between start and end */
    116 #define TIME_DIFF(start, end, diff) \
    117     diff = (((end).tv_sec - (start).tv_sec) * 1000000) + \
    118             ((end).tv_usec - (start).tv_usec);
    119 
    120 #define ive_aligned_malloc(alignment, size) memalign(alignment, size)
    121 #define ive_aligned_free(buf) free(buf)
    122 
    123 struct C2SoftAvcEnc : public SimpleC2Component {
    124     class IntfImpl;
    125 
    126     C2SoftAvcEnc(const char *name, c2_node_id_t id, const std::shared_ptr<IntfImpl> &intfImpl);
    127 
    128     // From SimpleC2Component
    129     c2_status_t onInit() override;
    130     c2_status_t onStop() override;
    131     void onReset() override;
    132     void onRelease() override;
    133     c2_status_t onFlush_sm() override;
    134     void process(
    135             const std::unique_ptr<C2Work> &work,
    136             const std::shared_ptr<C2BlockPool> &pool) override;
    137     c2_status_t drain(
    138             uint32_t drainMode,
    139             const std::shared_ptr<C2BlockPool> &pool) override;
    140 
    141 protected:
    142     virtual ~C2SoftAvcEnc();
    143 
    144 private:
    145     // OMX input buffer's timestamp and flags
    146     typedef struct {
    147         int64_t mTimeUs;
    148         int32_t mFlags;
    149     } InputBufferInfo;
    150 
    151     std::shared_ptr<IntfImpl> mIntf;
    152 
    153     int32_t mStride;
    154 
    155     struct timeval mTimeStart;   // Time at the start of decode()
    156     struct timeval mTimeEnd;     // Time at the end of decode()
    157 
    158 #ifdef FILE_DUMP_ENABLE
    159     char mInFile[200];
    160     char mOutFile[200];
    161 #endif /* FILE_DUMP_ENABLE */
    162 
    163     IV_COLOR_FORMAT_T mIvVideoColorFormat;
    164 
    165     IV_PROFILE_T mAVCEncProfile __unused;
    166     WORD32   mAVCEncLevel;
    167     bool     mStarted;
    168     bool     mSpsPpsHeaderReceived;
    169 
    170     bool     mSawInputEOS;
    171     bool     mSignalledError;
    172     bool     mIntra4x4;
    173     bool     mEnableFastSad;
    174     bool     mEnableAltRef;
    175     bool     mReconEnable;
    176     bool     mPSNREnable;
    177     bool     mEntropyMode;
    178     bool     mConstrainedIntraFlag;
    179     IVE_SPEED_CONFIG     mEncSpeed;
    180 
    181     iv_obj_t *mCodecCtx;         // Codec context
    182     iv_mem_rec_t *mMemRecords;   // Memory records requested by the codec
    183     size_t mNumMemRecords;       // Number of memory records requested by codec
    184     size_t mNumCores;            // Number of cores used by the codec
    185 
    186     std::shared_ptr<C2LinearBlock> mOutBlock;
    187 
    188     // configurations used by component in process
    189     // (TODO: keep this in intf but make them internal only)
    190     std::shared_ptr<C2StreamPictureSizeInfo::input> mSize;
    191     std::shared_ptr<C2StreamIntraRefreshTuning::output> mIntraRefresh;
    192     std::shared_ptr<C2StreamFrameRateInfo::output> mFrameRate;
    193     std::shared_ptr<C2StreamBitrateInfo::output> mBitrate;
    194     std::shared_ptr<C2StreamRequestSyncFrameTuning::output> mRequestSync;
    195 
    196     uint32_t mOutBufferSize;
    197     UWORD32 mHeaderGenerated;
    198     UWORD32 mBframes;
    199     IV_ARCH_T mArch;
    200     IVE_SLICE_MODE_T mSliceMode;
    201     UWORD32 mSliceParam;
    202     bool mHalfPelEnable;
    203     UWORD32 mIInterval;
    204     UWORD32 mIDRInterval;
    205     UWORD32 mDisableDeblkLevel;
    206     std::map<const void *, std::shared_ptr<C2Buffer>> mBuffers;
    207     MemoryBlockPool mConversionBuffers;
    208     std::map<const void *, MemoryBlock> mConversionBuffersInUse;
    209 
    210     void initEncParams();
    211     c2_status_t initEncoder();
    212     c2_status_t releaseEncoder();
    213 
    214     c2_status_t setFrameType(IV_PICTURE_CODING_TYPE_T  e_frame_type);
    215     c2_status_t setQp();
    216     c2_status_t setEncMode(IVE_ENC_MODE_T e_enc_mode);
    217     c2_status_t setDimensions();
    218     c2_status_t setNumCores();
    219     c2_status_t setFrameRate();
    220     c2_status_t setIpeParams();
    221     c2_status_t setBitRate();
    222     c2_status_t setAirParams();
    223     c2_status_t setMeParams();
    224     c2_status_t setGopParams();
    225     c2_status_t setProfileParams();
    226     c2_status_t setDeblockParams();
    227     c2_status_t setVbvParams();
    228     void logVersion();
    229     c2_status_t setEncodeArgs(
    230             ive_video_encode_ip_t *ps_encode_ip,
    231             ive_video_encode_op_t *ps_encode_op,
    232             const C2GraphicView *const input,
    233             uint8_t *base,
    234             uint32_t capacity,
    235             uint64_t workIndex);
    236     void finishWork(uint64_t workIndex,
    237             const std::unique_ptr<C2Work> &work,
    238             ive_video_encode_op_t *ps_encode_op);
    239     c2_status_t drainInternal(uint32_t drainMode,
    240             const std::shared_ptr<C2BlockPool> &pool,
    241             const std::unique_ptr<C2Work> &work);
    242 
    243     C2_DO_NOT_COPY(C2SoftAvcEnc);
    244 };
    245 
    246 #ifdef FILE_DUMP_ENABLE
    247 
    248 #define INPUT_DUMP_PATH     "/sdcard/media/avce_input"
    249 #define INPUT_DUMP_EXT      "yuv"
    250 #define OUTPUT_DUMP_PATH    "/sdcard/media/avce_output"
    251 #define OUTPUT_DUMP_EXT     "h264"
    252 
    253 #define GENERATE_FILE_NAMES() {                         \
    254     GETTIME(&mTimeStart, NULL);                         \
    255     strcpy(mInFile, "");                                \
    256     sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH,  \
    257             mTimeStart.tv_sec, mTimeStart.tv_usec,      \
    258             INPUT_DUMP_EXT);                            \
    259     strcpy(mOutFile, "");                               \
    260     sprintf(mOutFile, "%s_%ld.%ld.%s", OUTPUT_DUMP_PATH,\
    261             mTimeStart.tv_sec, mTimeStart.tv_usec,      \
    262             OUTPUT_DUMP_EXT);                           \
    263 }
    264 
    265 #define CREATE_DUMP_FILE(m_filename) {                  \
    266     FILE *fp = fopen(m_filename, "wb");                 \
    267     if (fp != NULL) {                                   \
    268         ALOGD("Opened file %s", m_filename);            \
    269         fclose(fp);                                     \
    270     } else {                                            \
    271         ALOGD("Could not open file %s", m_filename);    \
    272     }                                                   \
    273 }
    274 #define DUMP_TO_FILE(m_filename, m_buf, m_size)         \
    275 {                                                       \
    276     FILE *fp = fopen(m_filename, "ab");                 \
    277     if (fp != NULL && m_buf != NULL) {                  \
    278         int i;                                          \
    279         i = fwrite(m_buf, 1, m_size, fp);               \
    280         ALOGD("fwrite ret %d to write %d", i, m_size);  \
    281         if (i != (int)m_size) {                         \
    282             ALOGD("Error in fwrite, returned %d", i);   \
    283             perror("Error in write to file");           \
    284         }                                               \
    285         fclose(fp);                                     \
    286     } else {                                            \
    287         ALOGD("Could not write to file %s", m_filename);\
    288         if (fp != NULL)                                 \
    289             fclose(fp);                                 \
    290     }                                                   \
    291 }
    292 #else /* FILE_DUMP_ENABLE */
    293 #define INPUT_DUMP_PATH
    294 #define INPUT_DUMP_EXT
    295 #define OUTPUT_DUMP_PATH
    296 #define OUTPUT_DUMP_EXT
    297 #define GENERATE_FILE_NAMES()
    298 #define CREATE_DUMP_FILE(m_filename)
    299 #define DUMP_TO_FILE(m_filename, m_buf, m_size)
    300 #endif /* FILE_DUMP_ENABLE */
    301 
    302 }  // namespace android
    303 
    304 #endif  // ANDROID_C2_SOFT_AVC_ENC_H__
    305