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

📄 macroblock.h

📁 Mobile IP VCEG的信道模拟程序
💻 H
字号:
/************************************************************************
*
*  macroblock.h for H.26L decoder. 
*  Copyright (C) 1999  Telenor Satellite Services, Norway
*  
*  Contacts: 
*  Inge Lille-Lang鴜               <inge.lille-langoy@telenor.com>
*  
*
*  Telenor Satellite Services 
*  P.O.Box 6914 St.Olavs plass                       
*  N-0130 Oslo, Norway                 
*  
************************************************************************/
#ifndef MACROBLOCK_H
#define MACROBLOCK_H

#define SINGLE_SCAN 0
#define DOUBLE_SCAN 1

/* 
Array used to decide type of prediction:
0 = DC prediction
1 = vertical prediction
2 = horisontal prediction
3 = diagonal
4 = diagonal   
all not appl. choises is set to 0
*/

#ifdef USE_9_INTRA_MODES

const byte PRED_IPRED[10][10][9]= 
{
	{	// A=outside
		{0,9,9,9,9,9,9,9,9}, //	B=outside
		{0,2,9,9,9,9,9,9,9}, // B=mode0	  // typo in Seoul doc
		{9,9,9,9,9,9,9,9,9}, // B=mode1
		{2,0,9,9,9,9,9,9,9}, // B=mode2
		{9,9,9,9,9,9,9,9,9}, // B=mode3
		{9,9,9,9,9,9,9,9,9}, // B=mode4
		{9,9,9,9,9,9,9,9,9}, // B=mode5
		{9,9,9,9,9,9,9,9,9}, // B=mode6
		{9,9,9,9,9,9,9,9,9}, // B=mode7
		{9,9,9,9,9,9,9,9,9}, // B=mode8
	},
	{	// A=mode0
		{0,1,9,9,9,9,9,9,9},
		{0,2,1,6,4,8,5,7,3},
		{1,0,2,6,5,4,3,8,7},
		{2,8,0,1,7,4,3,6,5},
		{2,0,1,3,8,5,4,7,6},
		{2,0,1,4,6,7,8,3,5},
		{0,1,5,2,6,3,8,4,7},
		{0,1,6,2,4,7,5,8,3},
		{2,7,0,1,4,8,6,3,5},
		{2,8,0,1,7,3,4,5,6},
	},
	{	// A=mode1
		{1,0,9,9,9,9,9,9,9},
		{1,2,5,6,3,0,4,8,7},
		{1,6,2,5,3,0,4,8,7},
		{2,1,7,6,8,3,5,0,4},
		{1,2,5,3,6,8,4,7,0},
		{1,6,2,0,4,5,8,7,3},
		{1,5,2,6,3,8,4,0,7},
		{1,6,0,2,4,5,7,3,8},
		{2,1,7,6,0,8,5,4,3},
		{1,2,7,8,3,4,5,6,0},
	},
	{	// A=mode2
		{9,9,9,9,9,9,9,9,9},
		{0,2,1,8,7,6,5,4,3},
		{1,2,0,6,5,7,4,8,3},
		{2,8,7,1,0,6,4,3,5},
		{2,0,8,1,3,7,5,4,6},
		{2,0,4,1,7,8,6,3,5},
		{2,0,1,5,8,4,6,7,3},
		{2,0,6,1,4,7,8,5,3},
		{2,7,8,1,0,5,4,6,3},
		{2,8,7,1,0,4,3,6,5},
	},
	{	// A=mode3
		{9,9,9,9,9,9,9,9,9},
		{0,2,1,3,5,8,6,4,7},
		{1,0,2,5,3,6,4,8,7},
		{2,8,1,0,3,5,7,6,4},
		{3,2,5,8,1,4,6,7,0},
		{4,2,0,6,1,5,8,3,7},
		{5,3,1,2,8,6,4,0,7},
		{1,6,0,2,4,5,8,3,7},
		{2,7,0,1,5,4,8,6,3},
		{2,8,3,5,1,0,7,6,4},
	},
	{	// A=mode4
		{9,9,9,9,9,9,9,9,9},
		{2,0,6,1,4,7,5,8,3},
		{1,6,2,0,4,5,3,7,8},
		{2,8,7,6,4,0,1,5,3},
		{4,2,1,0,6,8,3,5,7},
		{4,2,6,0,1,5,7,8,3},
		{1,2,5,0,6,3,4,7,8},
		{6,4,0,1,2,7,5,3,8},
		{2,7,4,6,0,1,8,5,3},
		{2,8,7,4,6,1,3,5,0},
	},
	{	// A=mode5
		{9,9,9,9,9,9,9,9,9},
		{5,1,2,3,6,8,0,4,7},
		{1,5,6,3,2,0,4,8,7},
		{2,1,5,3,6,8,7,4,0},
		{5,3,1,2,6,8,4,7,0},
		{1,6,2,4,5,8,0,3,7},
		{5,1,3,6,2,0,8,4,7},
		{1,6,5,2,0,4,3,7,8},
		{2,7,1,6,5,0,8,3,4},
		{2,5,1,3,6,8,4,0,7},
	},
	{	// A=mode6
		{9,9,9,9,9,9,9,9,9},
		{1,6,2,0,5,4,3,7,8},
		{1,6,5,4,2,3,0,7,8},
		{2,1,6,7,4,8,5,3,0},
		{2,1,6,5,8,4,3,0,7},
		{6,4,1,2,0,5,7,8,3},
		{1,6,5,2,3,0,4,8,7},
		{6,1,4,0,2,7,5,3,8},
		{2,7,4,6,1,5,0,8,3},
		{2,1,6,8,4,7,3,5,0},
	},
	{	// A=mode7
		{9,9,9,9,9,9,9,9,9},
		{2,0,4,7,6,1,8,5,3},
		{6,1,2,0,4,7,5,8,3},
		{2,7,8,0,1,6,4,3,5},
		{2,4,0,8,3,1,7,6,5},
		{4,2,7,0,6,1,8,5,3},
		{2,1,0,8,5,6,7,4,3},
		{2,6,4,1,7,0,5,8,3},
		{2,7,4,0,8,6,1,5,3},
		{2,8,7,4,1,0,3,6,5},
	},
	{	// A=mode8
		{9,9,9,9,9,9,9,9,9},
		{2,0,8,1,3,4,6,5,7},
		{1,2,0,6,8,5,7,3,4},
		{2,8,7,1,0,3,6,5,4},
		{8,3,2,5,1,0,4,7,6},
		{2,0,4,8,5,1,7,6,3},
		{2,1,0,8,5,3,6,4,7},
		{2,1,6,0,8,4,5,7,3},
		{2,7,8,4,0,6,1,5,3},
		{2,8,3,0,7,4,1,6,5},
	}
};

const byte IPRED_ORDER[81][2]=  
{
	{0,0},							// 1 bit

	{0,1}, {1,0},					// 3 bits

	{1,1}, {0,2}, {2,0}, {0,3}, 	// 5 bits

	{3,0}, {1,2}, {2,1}, {0,4},		// 7 bits
	{4,0}, {3,1}, {1,3}, {0,5},

	{5,0}, {2,2}, {1,4}, {4,1},		// 9 bits
	{0,6}, {3,2}, {1,5}, {2,3},
	{5,1}, {6,0}, {0,7}, {4,2},
	{2,4}, {3,3}, {6,1}, {1,6}, 

	{7,0}, {0,8}, {5,2}, {4,3},		// 11 bits
	{2,5}, {3,4}, {1,7}, {4,4}, 
	{7,1}, {8,0}, {6,2}, {3,5}, 
	{5,3}, {2,6}, {1,8}, {2,7}, 
	{7,2}, {8,1}, {5,4}, {4,5}, 
	{3,6}, {6,3}, {8,2}, {4,6}, 
	{5,5}, {6,4}, {2,8}, {7,3}, 
	{3,7}, {6,5}, {5,6}, {7,4}, 

	{4,7}, {8,3}, {3,8}, {7,5},		// 13 bits
	{8,4}, {5,7}, {4,8}, {6,6}, 
	{7,6}, {5,8}, {8,5}, {6,7}, 
	{8,6}, {7,7}, {6,8}, {8,7}, 
	{7,8}, {8,8}
};

#else // !USE_9_INTRA_MODES

/* prob order=PRED_IPRED[B(block left)][A(block above)][intra mode]*/
/*const byte PRED_IPRED[6][6][5]= 
{   
  {
    {0,0,0,0,0},
    {0,2,0,0,0},
    {0,0,0,0,0},
    {2,0,0,0,0},
    {0,0,0,0,0},
    {0,0,0,0,0}
  },
  {
    {0,1,0,0,0},
    {0,2,1,3,4},
    {0,1,2,3,4},
    {2,0,1,3,4},
    {0,3,2,1,4},
    {0,2,4,3,1}
  },
  {
    {1,0,0,0,0},
    {1,0,2,3,4},
    {1,0,2,3,4},
    {1,2,0,3,4},
    {1,3,0,2,4},
    {0,1,2,4,3}
  },
  {
    {0,0,0,0,0},
    {0,2,1,3,4},
    {0,2,1,3,4},
    {2,0,3,1,4},
    {2,0,3,1,4},
    {0,2,3,4,1}
  },
  {
    {0,0,0,0,0},
    {3,0,1,2,4},
    {1,0,3,2,4},
    {2,3,0,1,4},
    {3,0,2,1,4},
    {0,1,2,3,4}
  },
  {
    {0,0,0,0,0},
    {0,1,2,4,3},
    {1,0,2,4,3},    
    {2,0,4,1,3},
    {0,1,3,4,2},
    {0,2,4,1,3}
  }
};*/
  
const byte PRED_IPRED[7][7][6]= 
{
  {
    {0,0,0,0,0,0},
    {0,4,0,0,0,0},
    {0,0,0,0,0,0},
    {0,0,0,0,0,0},
    {0,0,0,0,0,0},
    {4,0,0,0,0,0},
    {0,0,0,0,0,0},    
  },
  {     
    {0,2,0,0,0,0},
    {0,4,1,3,5,2},
    {0,1,4,3,2,5},
    {0,1,2,3,4,5},
    {3,0,4,1,5,2},
    {4,0,3,5,1,2},
    {5,4,0,3,1,2},    
  },
  {
    {0,0,0,0,0,0},
    {1,0,4,3,2,5},
    {1,0,2,4,3,5},
    {1,0,2,3,4,5},
    {3,1,0,4,2,5},
    {4,0,1,5,3,2},
    {0,1,5,4,3,2},    
  },
  {
    {2,0,0,0,0,0},
    {2,3,0,4,1,5},
    {2,0,3,1,4,5},
    {2,1,0,3,4,5},
    {2,3,1,0,5,4},
    {2,4,0,3,5,1},
    {2,0,1,4,5,3},    
  },
  {
    {0,0,0,0,0,0},
    {3,0,4,2,1,5},
    {0,3,2,1,4,5},
    {3,0,2,1,4,5},
    {3,0,4,2,1,5},
    {4,3,0,5,1,2},
    {5,3,0,4,1,2},   
  },
  {
    {0,0,0,0,0,0},
    {0,4,3,1,5,2}, 
    {0,4,1,3,2,5}, 
    {0,4,2,1,3,5},
    {4,0,3,5,1,2},
    {4,0,3,5,1,2},
    {4,5,0,3,1,2},    
  },
  {
    {0,0,0,0,0,0},
    {0,4,3,5,1,2},
    {0,1,4,3,5,2},
    {0,1,3,2,4,5},
    {3,0,5,4,1,2},
    {4,0,5,3,1,2},
    {5,0,4,1,3,2},   
  }
};
/*
const byte PRED_IPRED[7][7][6]= 
{
  {
    {0,0,0,0,0,0},
    {0,4,0,0,0,0},
    {0,0,0,0,0,0},
    {0,0,0,0,0,0},
    {0,0,0,0,0,0},
    {4,0,0,0,0,0},
    {0,0,0,0,0,0},    
  },
  {     
    {0,2,0,0,0,0},
    {0,4,1,3,2,5},
    {0,1,4,3,2,5},
    {0,1,2,4,3,5},
    {0,3,4,1,5,2},
    {4,0,3,1,5,2},
    {4,5,0,3,1,2},    
  },
  {
    {0,0,0,0,0,0},
    {1,0,4,3,2,5},
    {1,0,3,4,2,5},
    {1,0,2,3,4,5},
    {3,1,0,4,5,2},
    {4,0,1,3,5,2},
    {0,1,5,4,3,2},    
  },
  {
    {2,0,0,0,0,0},
    {2,3,0,1,4,5},
    {2,0,3,1,4,5},
    {2,0,1,3,4,5},
    {2,3,1,0,4,5},
    {2,4,0,3,5,1},
    {2,0,5,4,1,3},    
  },
  {
    {0,0,0,0,0,0},
    {0,3,4,1,2,5},
    {0,3,1,2,4,5},
    {0,2,3,1,4,5},
    {3,0,4,2,1,5},
    {4,3,0,5,1,2},
    {5,0,4,3,1,2},   
  },
  {
    {0,0,0,0,0,0},
    {0,4,3,1,5,2}, 
    {0,4,1,3,5,2}, 
    {0,4,1,2,3,5},
    {4,0,3,5,1,2},
    {4,0,3,5,1,2},
    {4,5,0,3,1,2},    
  },
  {
    {0,0,0,0,0,0},
    {0,4,3,1,5,2},
    {0,1,4,3,5,2},
    {0,1,3,2,4,5},
    {0,4,3,5,1,2},
    {4,0,5,3,1,2},
    {5,0,4,1,3,2},   
  }
};*/

/* used to find two intra prediction modes from one codeword */
/*const byte IPRED_ORDER[25][2]=  
{
  {0,0},{1,0},{0,1},{0,2},{1,1},
  {2,0},{3,0},{2,1},{1,2},{0,3},
  {0,4},{1,3},{2,2},{3,1},{4,0},
  {4,1},{3,2},{2,3},{1,4},{2,4},
  {3,3},{4,2},{4,3},{3,4},{4,4}
};*/

const byte IPRED_ORDER[36][2]=  
{
  {0,0},{1,0},{0,1},{0,2},{1,1},{2,0},
  {3,0},{2,1},{1,2},{0,3},{0,4},{1,3},
  {2,2},{3,1},{4,0},{5,0},{4,1},{3,2},
  {2,3},{1,4},{0,5},{1,5},{2,4},{3,3},
  {4,2},{5,1},{5,2},{4,3},{3,4},{2,5},
  {3,5},{4,4},{5,3},{5,4},{4,5},{5,5}
};

#endif

/*single scan pattern*/
const byte SNGL_SCAN[16][2] =          
{
  {0,0},{1,0},{0,1},{0,2},
  {1,1},{2,0},{3,0},{2,1},
  {1,2},{0,3},{1,3},{2,2},
  {3,1},{3,2},{2,3},{3,3}     
};

/* double scan pattern */
const byte DBL_SCAN[8][2][2] =        
{
  {{0,0},{0,1}},
  {{1,0},{0,2}},
  {{2,1},{0,1}},
  {{2,1},{1,2}},
  {{2,0},{2,3}},
  {{3,1},{0,3}},
  {{3,2},{1,3}},
  {{3,3},{2,3}},
};

/* gives CBP value from codeword number, both for intra and inter */
const byte NCBP[48][2]=
{  
  {47, 0},{31,16},{15, 1},{ 0, 2},{23, 4},{27, 8},{29,32},{30, 3},{ 7, 5},{11,10},{13,12},{14,15}, 
  {39,47},{43, 7},{45,11},{46,13},{16,14},{ 3, 6},{ 5, 9},{10,31},{12,35},{19,37},{21,42},{26,44},
  {28,33},{35,34},{37,36},{42,40},{44,39},{ 1,43},{ 2,45},{ 4,46},{ 8,17},{17,18},{18,20},{20,24},
  {24,19},{ 6,21},{ 9,26},{22,28},{25,23},{32,27},{33,29},{34,30},{36,22},{40,25},{38,38},{41,41},    
};

/* used to control block sizes : Not used/16x16/16x8/8x16/8x8/8x4/4x8/4x4 */
const int BLOCK_STEP[8][2]= 
{
  {0,0},{4,4},{4,2},{2,4},{2,2},{2,1},{1,2},{1,1}
};

/* QP dependent scale factor for coefficients */
const int JQ1[]=
{
  3881,  4351, 4890, 5481,  6154,  6914,  7761,  8718,  
  9781, 10987,12339,13828, 15523, 17435, 19561, 21873,
  24552,27656,30847,34870, 38807, 43747, 49103, 54683,
  61694,68745,77615,89113,100253,109366,126635,141533,
};

/* gives chroma QP from QP */ 
const byte QP_SCALE_CR[32] = 
{
  0 , 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,
  16,17,17,18,19,20,20,21,22,22,23,23,24,24,25,25
};

#endif

⌨️ 快捷键说明

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