📄 umc_mpeg2_enc_defs.h
字号:
/*//////////////////////////////////////////////////////////////////////////////
//
// 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 + -