jpg2kmqestate.h

来自「JPEG里MQ算术编码测试程序 编解码器 C」· C头文件 代码 · 共 62 行

H
62
字号
#pragma once



class CJPG2KMQETransition;
class CJPG2KMQEState;


/* 
这个类为单个的编码上下文管理概率估计状态的状态。
当然,表现是冗余的,因为所有要求的就是Sigma的值,其在0-46范围内,
以及MPS的值,s(0或1)。
然而,这种扩展的表达方式避免了MP编码器的不必要的反引用步骤,因此
能够显著的增加输出。

m_pTransition指针保存的是CJPG2KMQEncoder的transition_table的入口地址。
这个表有92项,其通过idx=2*sigma+s来索引。
如果在编码一个MPS的时候发生重定标,根据state=state.transition->mps来
更新;如果在编码一个LPS的时候发生重定标,根据state=state.transition->lps
来更新状态。转换标是精心设计来保证所有的信息能通过这个简单的操作准确地得到
对应。

而将MPS标示在mps_p_bar最显著位(例如符号位)是允许编码器按照最普通的符号路径
实现;仅仅需要一个比较操作和非常少的其他的操作就可以达到。
*/
#define MQE_SPACER 3

#define MQE_CARRY_POS (16+MQE_SPACER+8)
#define MQE_CARRY_BIT ((long)(1<<MQE_CARRY_POS))

#define MQE_PARTIAL_POS (16+MQE_SPACER)
#define MQE_PARTIAL_CLEAR (~(((long)(-1))<<MQE_PARTIAL_POS))

#define MQE_MSBS_POS (MQE_PARTIAL_POS+1)
#define MQE_MSBS_CLEAR (~(((long)(-1))<<MQE_MSBS_POS))

#define MQE_A_MIN ((long)(1<<15))

class CJPG2KMQEState
{
public:
	CJPG2KMQEState();

	void	InitEncoder(int Sigma, long s);

	void	InitDecoder(int Sigma, long s);
	//Inline implementation appears later
	/* `Sigma' is in the range 0 to 46 and `s' is the MPS identity. */


public: // Data
	long m_p_bar_mps; // Holds `p_bar' * 2^8 + `s' (`s' is the MPS: 0 or 1)

	CJPG2KMQETransition *m_pTransition;
};

class CJPG2KMQETransition
{
public:
	CJPG2KMQEState	m_mps;
	CJPG2KMQEState	m_lps;
};

⌨️ 快捷键说明

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