Exemplo n.º 1
0
/*!	\param[in] decode_mode Если <i>false</i> функция будет выполнять
	кодирование спектра, иначе (если <i>true</i>) будет выполнять
	декодирование спектра.
*/
void encoder::_encode_wtree_root(const bool decode_mode)
{
	// LL cаббенд
	const subbands::subband_t &sb_LL = _wtree.sb().get_LL();

	// модели для кодирования в LL саббенде
	const sz_t spec_LL_model = _ind_spec(0, sb_LL.lvl);
	const sz_t map_LL_model = _ind_map(0, sb_LL.lvl);

	// (де)кодирование коэффициентов и групповых признаков подрезания
	// из LL саббенда
	for (wtree::coefs_iterator i = _wtree.iterator_over_subband(sb_LL);
		 !i->end(); i->next())
	{
		const p_t &p_i = i->get();

		wnode &node = _wtree.at(p_i);

		if (decode_mode) {
			node.wc = _decode_spec(spec_LL_model);
			node.n = _decode_map(map_LL_model);

			_wtree.uncut_leafs(p_i, node.n);
		}  else {
			_encode_spec(spec_LL_model, node.wc);
			_encode_map(map_LL_model, node.n);
		}
	}

	// модель для кодирования коэффициентов с первого уровня
	const sz_t spec_1_model = _ind_spec(0, subbands::LVL_1);

	// (де)кодирование коэффициентов из саббендов первого уровня
	for (sz_t k = 0; subbands::SUBBANDS_ON_LEVEL > k; ++k)
	{
		// очередной саббенд с первого уровня
		const subbands::subband_t &sb = _wtree.sb().get(subbands::LVL_1, k);

		// цикл по всем элементам из саббенда
		for (wtree::coefs_iterator i = _wtree.iterator_over_subband(sb);
			 !i->end(); i->next())
		{
			if (decode_mode)
				_wtree.at(i->get()).wc = _decode_spec(spec_1_model);
			else
				_encode_spec(spec_1_model, _wtree.at(i->get()).wc);
		}
	}
}
Exemplo n.º 2
0
static int _dex_decode(AsmFormatPlugin * format, int raw)
{
	AsmFormatPluginHelper * helper = format->helper;
	DexHeader dh;

#ifdef DEBUG
	fprintf(stderr, "DEBUG: %s(%d)\n", __func__, raw);
#endif
	if(helper->seek(helper->format, 0, SEEK_SET) != 0)
		return -1;
	if(helper->read(helper->format, &dh, sizeof(dh)) != sizeof(dh))
		return -1;
	dh.map_off = _htol32(dh.map_off);
	if(_decode_map(format, &dh, raw) != 0)
		return -1;
	return 0;
}
Exemplo n.º 3
0
/*!
*/
void encoder::_encode_wtree_level(const sz_t lvl,
								  const bool decode_mode)
{
	const sz_t lvl_g = lvl;
	const sz_t lvl_j = lvl_g + subbands::LVL_PREV;
	const sz_t lvl_i = lvl_j + subbands::LVL_PREV;

	// цикл по саббендам в уровне
	for (sz_t k = 0; _wtree.sb().subbands_on_lvl(lvl) > k; ++k)
	{
		const subbands::subband_t &sb_g = _wtree.sb().get(lvl_g, k);
		const subbands::subband_t &sb_j = _wtree.sb().get(lvl_j, k);

		// кодирование коэффициентов
		for (wtree::coefs_iterator g = _wtree.iterator_over_subband(sb_g);
			 !g->end(); g->next())
		{
			const p_t &p_g = g->get();

			wnode &node_g = _wtree.at(p_g);

			if (node_g.invalid) continue;

			const sz_t model = _ind_spec<wnode::member_wc>(p_g, sb_g);

			if (decode_mode)
				node_g.wc = _decode_spec(model);
			else
				_encode_spec(model, node_g.wc);
		}

		// на предпоследнем уровне нет групповых признаков подрезания
		if (_wtree.lvls() == lvl) continue;

		// кодирование групповых признаков подрезания
		for (wtree::coefs_iterator j = _wtree.iterator_over_subband(sb_j);
			 !j->end(); j->next())
		{
			const p_t &p_j = j->get();

			const p_t &p_i = _wtree.prnt_uni(p_j);
			const wnode &node_i = _wtree.at(p_i);

			// маска подрезания, где текущий элемент не подрезан
			const n_t mask = _wtree.child_n_mask_uni(p_j, p_i);

			// переходим к следующему потомку, если ветвь подрезана
			if (!_wtree.test_n_mask(node_i.n, mask))
			{
				if (decode_mode) _wtree.uncut_leafs(p_j, 0);

				continue;
			}

			wnode &node_j = _wtree.at(p_j);

			const sz_t model = _ind_map<wnode::member_wc>(p_j, sb_g);

			if (decode_mode) {
				node_j.n = _decode_map(model);

				_wtree.uncut_leafs(p_j, node_j.n);
			} else {
				_encode_map(model, node_j.n);
			}
		}
	}
}
Exemplo n.º 4
0
/*!	\param[in] sb Саббенд из которого будут использоваться групповые
	признаки подрезания ветвей
	\param[in] decode_mode Если <i>false</i> функция будет выполнять
	кодирование спектра, иначе (если <i>true</i>) будет выполнять
	декодирование спектра.
*/
void encoder::_encode_wtree_subband(const subbands::subband_t &sb,
									const bool decode_mode)
{
	const sz_t lvl_i = sb.lvl;
	const sz_t lvl_j = lvl_i + subbands::LVL_NEXT;
	const sz_t lvl_g = lvl_j + subbands::LVL_NEXT;

	// псевдоним для саббенда sb (для ясности)
	const subbands::subband_t &sb_i = sb;

	// цикл по всем элементам из саббенда
	for (wtree::coefs_iterator i = _wtree.iterator_over_subband(sb_i);
		 !i->end(); i->next())
	{
		const p_t &p_i = i->get();
		const wnode &node_i = _wtree.at(p_i);

		// цикл по дочерним элементам
		for (wtree::coefs_iterator j = _wtree.iterator_over_children_uni(p_i);
			 !j->end(); j->next())
		{
			const p_t &p_j = j->get();

			// маска подрезания, где текущий элемент не подрезан
			const n_t mask = _wtree.child_n_mask_uni(p_j, p_i);

			// переходим к следующему потомку, если ветвь подрезана
			if (!_wtree.test_n_mask(node_i.n, mask)) continue;

			// элементы могут лежать в разных саббендах (случай с LL саббендом)
			const subbands::subband_t &sb_j = _wtree.sb().from_point(p_j, lvl_j);
			const subbands::subband_t &sb_g = _wtree.sb().get(lvl_g, sb_j.i);

			for (wtree::coefs_iterator g = _wtree.iterator_over_children(p_j);
				 !g->end(); g->next())
			{
				// координаты (де)кодируемого элемента
				const p_t &p_g = g->get();

				// номер модели для (де)кодирования
				const sz_t model = _ind_spec<wnode::member_wc>(p_g, sb_g);

				// (де)кодирование коэффициента
				if (decode_mode)
					_wtree.at(p_g).wc = _decode_spec(model);
				else
					_encode_spec(model, _wtree.at(p_g).wc);
			}
		}

		// (де)кодирование групповых признаков подрезания
		for (wtree::coefs_iterator j = _wtree.iterator_over_children_uni(p_i);
			 !j->end(); j->next())
		{
			// координаты текущего элемента
			const p_t &p_j = j->get();

			// маска подрезания, где текущий элемент не подрезан
			const n_t mask = _wtree.child_n_mask_uni(p_j, p_i);

			// переходим к следующему потомку, если ветвь подрезана
			if (!_wtree.test_n_mask(node_i.n, mask)) continue;

			// элементы могут лежать в разных саббендах (случай с LL саббендом)
			const subbands::subband_t &sb_j = _wtree.sb().from_point(p_j, lvl_j);
			const subbands::subband_t &sb_g = _wtree.sb().get(lvl_g, sb_j.i);

			// номер модели для (де)кодирования
			const sz_t model = _ind_map<wnode::member_wc>(p_j, sb_g);

			// (де)кодирование группового признака подрезания
			if (decode_mode)
				_wtree.at(p_j).n = _decode_map(model);
			else
				_encode_map(model, _wtree.at(p_j).n);
		}
	}
}