⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_mpeg2_enc_defs.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 3 页
字号:
/*//////////////////////////////////////////////////////////////////////////////
//
//                  INTEL CORPORATION PROPRIETARY INFORMATION
//     This software is supplied under the terms of a license agreement or
//     nondisclosure agreement with Intel Corporation and may not be copied
//     or disclosed except in accordance with the terms of that agreement.
//          Copyright(c) 2002-2007 Intel Corporation. All Rights Reserved.
//
*/

#include "umc_defs.h"
#if defined (UMC_ENABLE_MPEG2_VIDEO_ENCODER)

#ifndef __UMC_MPEG2_ENC_DEFS_H
#define __UMC_MPEG2_ENC_DEFS_H

#include "ippvc.h"
#include "vm_event.h"
#include "vm_thread.h"
#include "umc_mpeg2_enc.h"

//#define ME_REF_ORIGINAL
#define SCENE_DETECTION
#define ALIGN_VALUE  16

#define MP2_ALLOC(TYPE, SIZE) ((TYPE*)ippsMalloc_8u(sizeof(TYPE)*(SIZE)))
#define MP2_FREE(PTR)         ippsFree(PTR)

#if defined(_DEBUG) || defined(MPEG2_ASSERT)
#define mpeg2_assert(value) \
if (!(value)) { \
  printf("######################################################\n"); \
  printf("%s: %d: Assertion failed: " #value "\n", __FILE__, __LINE__); \
  printf("######################################################\n"); \
  exit(1); \
}
#else
#define mpeg2_assert(value)
#endif

#define PICTURE_START_CODE 0x100L
#define SLICE_MIN_START    0x101L
#define SLICE_MAX_START    0x1AFL
#define USER_START_CODE    0x1B2L
#define SEQ_START_CODE     0x1B3L
#define EXT_START_CODE     0x1B5L
#define SEQ_END_CODE       0x1B7L
#define GOP_START_CODE     0x1B8L
#define ISO_END_CODE       0x1B9L
#define PACK_START_CODE    0x1BAL
#define SYSTEM_START_CODE  0x1BBL

/* picture_structure ISO/IEC 13818-2, 6.3.10 table 6-14 */
enum
{
  TOP_FIELD     = 1,
  BOTTOM_FIELD  = 2,
  FRAME_PICTURE = 3
};

/* macroblock type */
#define MB_INTRA    1
#define MB_PATTERN  2
#define MB_BACKWARD 4
#define MB_FORWARD  8
#define MB_QUANT    16

/* motion_type */
#define MC_FIELD 1
#define MC_FRAME 2
#define MC_16X8  2
#define MC_DMV   3

/* extension start code IDs */

#define SEQ_ID       1
#define DISP_ID      2
#define QUANT_ID     3
#define SEQSCAL_ID   5
#define PANSCAN_ID   7
#define CODING_ID    8
#define SPATSCAL_ID  9
#define TEMPSCAL_ID 10

/* input file type */
#define T_Y_U_V 0   // .y; .u; .v;
#define T_YUV   1   // .yuv
#define T_PPM   2   // .ppm

#define V_DC_Tbl Cr_DC_Tbl
#define U_DC_Tbl Cr_DC_Tbl

// scale parameters for frame/field or intra/predicted selection
// use because of counting bits for vectors encoding

#define SC_VAR_INTRA 16
#define SC_VAR_1V    16
#define SC_VAR_2V    17
#define SC_VAR_1VBI  16
#define SC_VAR_2VBI  17

#define SCALE_VAR(val, scale) ( (val)*(scale) )
#define SCALE_VAR_INTRA(val)              \
( i==0 ? (val+1)*SC_VAR_INTRA             \
       : (pMBInfo[k-1].mb_type==MB_INTRA  \
          ? val*SC_VAR_INTRA              \
          :(val+2)*SC_VAR_INTRA)          \
)

#define RANGE_TO_F_CODE(range, fcode) { \
  Ipp32s fc = 1;                        \
  while((4<<fc) < range && fc <= 15)    \
    fc++;                               \
  fcode = fc;                           \
}


#define CALC_START_STOP_ROWS                       \
  if(threads)                                      \
  {                                                \
    start_y = threadSpec[numTh].start_row;         \
    if(encodeInfo.FieldPicture) start_y >>= 1;     \
    if (numTh < encodeInfo.numThreads - 1) {       \
      stop_y = threadSpec[numTh + 1].start_row;    \
      if(encodeInfo.FieldPicture) stop_y >>= 1;    \
    } else {                                       \
      stop_y = YFrameVSize;                        \
    }                                              \
    if (encodeInfo.info.color_format == YUV420) {  \
      start_uv = (start_y >> 1);                   \
    } else {                                       \
      start_uv = start_y;                          \
    }                                              \
    k = (start_y/16)*MBcountH;                     \
  }                                                \
  else                                             \
  {                                                \
    start_y = start_uv = 0;                        \
    stop_y = YFrameVSize;                          \
    k = 0;                                         \
  }

#define SWAP_PTR(ptr0, ptr1) { \
  MB_prediction_info *tmp_ptr = ptr0; \
  ptr0 = ptr1; \
  ptr1 = tmp_ptr; \
}

#define SET_MOTION_VECTOR(vectorF, mv_x, mv_y) {                              \
  Ipp32s x_l = mv_x;                                                          \
  Ipp32s y_l = mv_y;                                                          \
  Ipp32s i_c = (BlkWidth_c  == 16) ? i : (i >> 1);                            \
  Ipp32s j_c = (BlkHeight_c == 16) ? j : (j >> 1);                            \
  Ipp32s x_c = (BlkWidth_c  == 16) ? x_l : (x_l/2);                           \
  Ipp32s y_c = (BlkHeight_c == 16) ? y_l : (y_l/2);                           \
  vectorF->x = x_l;                                                           \
  vectorF->y = y_l;                                                           \
  vectorF->mctype_l = ((x_l & 1) << 3) | ((y_l & 1) << 2);                    \
  vectorF->mctype_c = ((x_c & 1) << 3) | ((y_c & 1) << 2);                    \
  vectorF->offset_l = (i   + (x_l >> 1)) + (j   + (y_l >> 1)) * YFrameHSize;  \
  vectorF->offset_c = (i_c + (x_c >> 1)) + (j_c + (y_c >> 1)) * UVFrameHSize; \
}

// doubt about field pictures
#define SET_FIELD_VECTOR(vectorF, mv_x, mv_y) {                               \
  Ipp32s x_l = mv_x;                                                          \
  Ipp32s y_l = mv_y;                                                          \
  Ipp32s i_c = (BlkWidth_c  == 16) ? i : (i >> 1);                            \
  Ipp32s j_c = (BlkHeight_c == 16) ? j : (j >> 1);                            \
  Ipp32s x_c = (BlkWidth_c  == 16) ? x_l : (x_l/2);                           \
  Ipp32s y_c = (BlkHeight_c == 16) ? y_l : (y_l/2);                           \
  vectorF->x = x_l;                                                           \
  vectorF->y = y_l;                                                           \
  vectorF->mctype_l = ((x_l & 1) << 3) | ((y_l & 1) << 2);                    \
  vectorF->mctype_c = ((x_c & 1) << 3) | ((y_c & 1) << 2);                    \
  vectorF->offset_l = (i   + (x_l >> 1)) + (j   + (y_l &~ 1) ) * YFrameHSize; \
  vectorF->offset_c = (i_c + (x_c >> 1)) + (j_c + (y_c &~ 1) ) * UVFrameHSize;\
}

#define OFF_Y    0
#define OFF_U  256
#define OFF_V  512

#define DCT_FRAME  0
#define DCT_FIELD  1

#define BlkWidth_l   16
#define BlkHeight_l  16
#define BlkStride_l  16

#define func_getdiff_frame_l  ippiGetDiff16x16_8u16s_C1
#define func_getdiff_field_l  ippiGetDiff16x8_8u16s_C1
#define func_getdiffB_frame_l ippiGetDiff16x16B_8u16s_C1
#define func_getdiffB_field_l ippiGetDiff16x8B_8u16s_C1
#define func_mc_frame_l  ippiMC16x16_8u_C1
#define func_mc_field_l  ippiMC16x8_8u_C1
#define func_mcB_frame_l ippiMC16x16B_8u_C1
#define func_mcB_field_l ippiMC16x8B_8u_C1

#define VARMEAN_FRAME(pDiff, vardiff, meandiff, _vardiff)             \
  ippiVarSum8x8_16s32s_C1R(pDiff    , 32, &vardiff[0], &meandiff[0]); \
  ippiVarSum8x8_16s32s_C1R(pDiff+8  , 32, &vardiff[1], &meandiff[1]); \
  ippiVarSum8x8_16s32s_C1R(pDiff+128, 32, &vardiff[2], &meandiff[2]); \
  ippiVarSum8x8_16s32s_C1R(pDiff+136, 32, &vardiff[3], &meandiff[3]); \
  _vardiff = vardiff[0] + vardiff[1] + vardiff[2] + vardiff[3]

#define VARMEAN_FIELD(pDiff, vardiff, meandiff, _vardiff)             \
  ippiVarSum8x8_16s32s_C1R(pDiff   ,  64, &vardiff[0], &meandiff[0]); \
  ippiVarSum8x8_16s32s_C1R(pDiff+8 ,  64, &vardiff[1], &meandiff[1]); \
  ippiVarSum8x8_16s32s_C1R(pDiff+16,  64, &vardiff[2], &meandiff[2]); \
  ippiVarSum8x8_16s32s_C1R(pDiff+24,  64, &vardiff[3], &meandiff[3]); \
  _vardiff = vardiff[0] + vardiff[1] + vardiff[2] + vardiff[3]

#define VARMEAN_FRAME_Y(vardiff, meandiff, _vardiff)                                           \
  ippiVarSum8x8_8u32s_C1R(YBlock                    , YFrameHSize, &vardiff[0], &meandiff[0]); \
  ippiVarSum8x8_8u32s_C1R(YBlock + 8                , YFrameHSize, &vardiff[1], &meandiff[1]); \
  ippiVarSum8x8_8u32s_C1R(YBlock + 8*YFrameHSize    , YFrameHSize, &vardiff[2], &meandiff[2]); \
  ippiVarSum8x8_8u32s_C1R(YBlock + 8*YFrameHSize + 8, YFrameHSize, &vardiff[3], &meandiff[3]); \
  _vardiff = vardiff[0] + vardiff[1] + vardiff[2] + vardiff[3]

#define VARMEAN_FIELD_Y(vardiff, meandiff, _vardiff)                                           \
  ippiVarSum8x8_8u32s_C1R(YBlock,                   2*YFrameHSize, &vardiff[0], &meandiff[0]); \
  ippiVarSum8x8_8u32s_C1R(YBlock + 8,               2*YFrameHSize, &vardiff[1], &meandiff[1]); \
  ippiVarSum8x8_8u32s_C1R(YBlock + YFrameHSize,     2*YFrameHSize, &vardiff[2], &meandiff[2]); \
  ippiVarSum8x8_8u32s_C1R(YBlock + YFrameHSize + 8, 2*YFrameHSize, &vardiff[3], &meandiff[3]); \
  _vardiff = vardiff[0] + vardiff[1] + vardiff[2] + vardiff[3]

#define IF_GOOD_PRED(vardiff, meandiff)             \
  if(best->mb_type != MB_INTRA &&                   \
     vardiff[0] <= varThreshold &&     \
     vardiff[1] <= varThreshold &&     \
     vardiff[2] <= varThreshold &&     \
     vardiff[3] <= varThreshold)       \
    if(meandiff[0] < quantiser_scale_value &&       \
       meandiff[0] > -quantiser_scale_value)        \
      if(meandiff[1] < quantiser_scale_value &&     \
         meandiff[1] > -quantiser_scale_value)      \
        if(meandiff[2] < quantiser_scale_value &&   \
           meandiff[2] > -quantiser_scale_value)    \
          if(meandiff[3] < quantiser_scale_value && \
             meandiff[3] > -quantiser_scale_value)

#define GETDIFF_FRAME(X, CC, C, pDiff, DIR) \
  func_getdiff_frame_##C(                   \
    X##Block,                               \
    CC##FrameHSize,                         \
    X##RecFrame[pMBInfo[k].mv_field_sel[2][DIR]][DIR] + vector[2][DIR].offset_##C, \
    CC##FrameHSize,                         \
    pDiff + OFF_##X,                        \
    2*BlkStride_##C,                        \
    0, 0, vector[2][DIR].mctype_##C, 0)

#define GETDIFF_FRAME_FB(X, CC, C, pDiff)   \
  func_getdiffB_frame_##C(X##Block,         \
    CC##FrameHSize,                         \
    X##RecFrame[pMBInfo[k].mv_field_sel[2][0]][0] + vector[2][0].offset_##C, \
    CC##FrameHSize,                         \
    vector[2][0].mctype_##C,                \
    X##RecFrame[pMBInfo[k].mv_field_sel[2][1]][1] + vector[2][1].offset_##C, \
    CC##FrameHSize,                         \
    vector[2][1].mctype_##C,                \
    pDiff + OFF_##X,                        \
    2*BlkStride_##C,                        \
    ippRndZero)

#define GETDIFF_FIELD(X, CC, C, pDiff, DIR)            \
if (picture_structure == FRAME_PICTURE) {              \
  func_getdiff_field_##C(X##Block,                     \
    2*CC##FrameHSize,                                  \
    X##RecFrame[pMBInfo[k].mv_field_sel[0][DIR]][DIR] +vector[0][DIR].offset_##C, \
    2*CC##FrameHSize,                                  \
    pDiff + OFF_##X,                                   \
    4*BlkStride_##C,                                   \
    0, 0, vector[0][DIR].mctype_##C, 0);               \
                                                       \
  func_getdiff_field_##C(X##Block + CC##FrameHSize,    \
    2*CC##FrameHSize,                                  \
    X##RecFrame[pMBInfo[k].mv_field_sel[1][DIR]][DIR] + vector[1][DIR].offset_##C, \
    2*CC##FrameHSize,                                  \
    pDiff + OFF_##X + BlkStride_##C,                   \
    4*BlkStride_##C,                                   \
    0, 0, vector[1][DIR].mctype_##C, 0);               \
} else {                                               \
  func_getdiff_field_##C(X##Block,                     \
    CC##FrameHSize,                                    \
    X##RecFrame[pMBInfo[k].mv_field_sel[0][DIR]][DIR] + vector[0][DIR].offset_##C, \
    CC##FrameHSize,                                    \
    pDiff + OFF_##X,                                   \

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -