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

📄 sarcode.cpp

📁 h.263压缩标准的源代码。 这些代码都是经过试验的
💻 CPP
字号:
// Sarcode.cpp: implementation of the CSarcode class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "视频编解码器.h"
#include "Sarcode.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define   q1    16384
#define   q2    32768
#define   q3    49152
#define   top   65535


CSarcode::CSarcode()
{
     zerorun=0;
}

CSarcode::~CSarcode()
{

}


int CSarcode::decode_a_symbol(int cumul_freq[])
{
  length = high - low + 1;
  cum = (-1 + (code_value - low + 1) * cumul_freq[0]) / length;
  for (sacindex = 1; cumul_freq[sacindex] > cum; sacindex++);
  high = low - 1 + (length * cumul_freq[sacindex-1]) / cumul_freq[0];
  low += (length * cumul_freq[sacindex]) / cumul_freq[0];

  for ( ; ; ) 
  {  
    if (high < q2) ;
    else if (low >= q2) 
	{
      code_value -= q2; 
      low -= q2; 
      high -= q2;
    }
    else if (low >= q1 && high < q3) 
	{
      code_value -= q1; 
      low -= q1; 
      high -= q1;
    }
    else 
	    break;
     
    low *= 2; 
    high = 2*high + 1;
    bit_out_psc_layer(); 
    code_value = 2*code_value + bit;
  }

  return (sacindex-1);

}
///////
void CSarcode::bit_out_psc_layer()
{
  if (m_getbits.showbits(17)!=1)
  { // check for startcode in Arithmetic Decoder FIFO 

    bit = m_getbits.getbits(1);
    if(zerorun > 13) 
	{	/* if number of consecutive zeros = 14 */	 
      if (!bit) 
	  {
	    AfxMessageBox("PSC/GBSC, Header Data, or Encoded Stream Error !");
	    zerorun = 1;		
      }
      else 
	  { /* if there is a 'stuffing bit present */
	    AfxMessageBox("Removing Startcode Emulation Prevention bit!");
    	bit = m_getbits.getbits(1); 	/* overwrite the last bit */	
	    zerorun = !bit;	  	/* zerorun=1 if bit is a '0' */
      }
    }
    else
	{ /* if consecutive zero's not exceeded 14 */
      if (!bit)
    	zerorun++;
      else
	    zerorun = 0;
    }

  } /* end of if !(showbits(17)) */

  else 
  {
    bit = 0;
    AfxMessageBox("Startcode Found:Finishing Arithmetic Decoding using 'Garbage bits'!");
  }

}

void CSarcode::decoder_reset()
{
 int i;
  zerorun = 0;			/* clear consecutive zero's counter */
  code_value = 0;
  low = 0;
  high = top;
  for (i = 1; i <= 16; i++)
  {
    bit_out_psc_layer(); 
    code_value = 2 * code_value + bit;
  }
}

⌨️ 快捷键说明

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