IMAGE: Inline indeo getVLC2

This commit is contained in:
Willem Jan Palenstijn 2017-07-12 17:04:39 +02:00
parent dde259f068
commit 60fae8847e
6 changed files with 51 additions and 83 deletions

View file

@ -1,60 +0,0 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "image/codecs/indeo/get_bits.h"
namespace Image {
namespace Indeo {
int GetBits::getVLC2(int16 (*table)[2], int bits, int maxDepth) {
int code;
int n, nbBits;
unsigned int index;
index = peekBits(bits);
code = table[index][0];
n = table[index][1];
if (maxDepth > 1 && n < 0) {
skip(bits);
nbBits = -n;
index = peekBits(nbBits) + code;
code = table[index][0];
n = table[index][1];
if (maxDepth > 2 && n < 0) {
skip(nbBits);
nbBits = -n;
index = peekBits(nbBits) + code;
code = table[index][0];
n = table[index][1];
}
}
skip(n);
return code;
}
} // End of namespace Indeo
} // End of namespace Image

View file

@ -54,7 +54,37 @@ public:
* read the longest vlc code
* = (max_vlc_length + bits - 1) / bits
*/
int getVLC2(int16 (*table)[2], int bits, int maxDepth);
template <int maxDepth>
int getVLC2(int16 (*table)[2], int bits) {
int code;
int n, nbBits;
unsigned int index;
index = peekBits(bits);
code = table[index][0];
n = table[index][1];
if (maxDepth > 1 && n < 0) {
skip(bits);
nbBits = -n;
index = peekBits(nbBits) + code;
code = table[index][0];
n = table[index][1];
if (maxDepth > 2 && n < 0) {
skip(nbBits);
nbBits = -n;
index = peekBits(nbBits) + code;
code = table[index][0];
n = table[index][1];
}
}
skip(n);
return code;
}
};
} // End of namespace Indeo

View file

@ -1258,16 +1258,15 @@ int IndeoDecoderBase::decodeCodedBlocks(GetBits *gb, IVIBandDesc *band,
// zero column flags
memset(colFlags, 0, sizeof(colFlags));
while (scanPos <= numCoeffs) {
sym = gb->getVLC2(band->_blkVlc._tab->_table,
IVI_VLC_BITS, 1);
sym = gb->getVLC2<1>(band->_blkVlc._tab->_table, IVI_VLC_BITS);
if (sym == rvmap->_eobSym)
break; // End of block
// Escape - run/val explicitly coded using 3 vlc codes
if (sym == rvmap->_escSym) {
run = gb->getVLC2(band->_blkVlc._tab->_table, IVI_VLC_BITS, 1) + 1;
lo = gb->getVLC2(band->_blkVlc._tab->_table, IVI_VLC_BITS, 1);
hi = gb->getVLC2(band->_blkVlc._tab->_table, IVI_VLC_BITS, 1);
run = gb->getVLC2<1>(band->_blkVlc._tab->_table, IVI_VLC_BITS) + 1;
lo = gb->getVLC2<1>(band->_blkVlc._tab->_table, IVI_VLC_BITS);
hi = gb->getVLC2<1>(band->_blkVlc._tab->_table, IVI_VLC_BITS);
// merge them and convert into signed val
val = IVI_TOSIGNED((hi << 6) | lo);
} else {

View file

@ -484,8 +484,8 @@ int Indeo4Decoder::decodeMbInfo(IVIBandDesc *band, IVITile *tile) {
mb->_qDelta = 0;
if (!band->_plane && !band->_bandNum && _ctx._inQ) {
mb->_qDelta = _ctx._gb->getVLC2(_ctx._mbVlc._tab->_table,
IVI_VLC_BITS, 1);
mb->_qDelta = _ctx._gb->getVLC2<1>(_ctx._mbVlc._tab->_table,
IVI_VLC_BITS);
mb->_qDelta = IVI_TOSIGNED(mb->_qDelta);
}
@ -522,8 +522,8 @@ int Indeo4Decoder::decodeMbInfo(IVIBandDesc *band, IVITile *tile) {
if (refMb) mb->_qDelta = refMb->_qDelta;
} else if (mb->_cbp || (!band->_plane && !band->_bandNum &&
_ctx._inQ)) {
mb->_qDelta = _ctx._gb->getVLC2(_ctx._mbVlc._tab->_table,
IVI_VLC_BITS, 1);
mb->_qDelta = _ctx._gb->getVLC2<1>(_ctx._mbVlc._tab->_table,
IVI_VLC_BITS);
mb->_qDelta = IVI_TOSIGNED(mb->_qDelta);
}
@ -543,22 +543,22 @@ int Indeo4Decoder::decodeMbInfo(IVIBandDesc *band, IVITile *tile) {
}
} else {
// decode motion vector deltas
mvDelta = _ctx._gb->getVLC2(_ctx._mbVlc._tab->_table,
IVI_VLC_BITS, 1);
mvDelta = _ctx._gb->getVLC2<1>(_ctx._mbVlc._tab->_table,
IVI_VLC_BITS);
mvY += IVI_TOSIGNED(mvDelta);
mvDelta = _ctx._gb->getVLC2(_ctx._mbVlc._tab->_table,
IVI_VLC_BITS, 1);
mvDelta = _ctx._gb->getVLC2<1>(_ctx._mbVlc._tab->_table,
IVI_VLC_BITS);
mvX += IVI_TOSIGNED(mvDelta);
mb->_mvX = mvX;
mb->_mvY = mvY;
if (mb->_type == 3) {
mvDelta = _ctx._gb->getVLC2(
mvDelta = _ctx._gb->getVLC2<1>(
_ctx._mbVlc._tab->_table,
IVI_VLC_BITS, 1);
IVI_VLC_BITS);
mvY += IVI_TOSIGNED(mvDelta);
mvDelta = _ctx._gb->getVLC2(
mvDelta = _ctx._gb->getVLC2<1>(
_ctx._mbVlc._tab->_table,
IVI_VLC_BITS, 1);
IVI_VLC_BITS);
mvX += IVI_TOSIGNED(mvDelta);
mb->_bMvX = -mvX;
mb->_bMvY = -mvY;

View file

@ -299,7 +299,7 @@ int Indeo5Decoder::decodeMbInfo(IVIBandDesc *band, IVITile *tile) {
mb->_qDelta = 0;
if (!band->_plane && !band->_bandNum && (_ctx._frameFlags & 8)) {
mb->_qDelta = _ctx._gb->getVLC2(_ctx._mbVlc._tab->_table, IVI_VLC_BITS, 1);
mb->_qDelta = _ctx._gb->getVLC2<1>(_ctx._mbVlc._tab->_table, IVI_VLC_BITS);
mb->_qDelta = IVI_TOSIGNED(mb->_qDelta);
}
@ -332,7 +332,7 @@ int Indeo5Decoder::decodeMbInfo(IVIBandDesc *band, IVITile *tile) {
if (refMb) mb->_qDelta = refMb->_qDelta;
} else if (mb->_cbp || (!band->_plane && !band->_bandNum &&
(_ctx._frameFlags & 8))) {
mb->_qDelta = _ctx._gb->getVLC2(_ctx._mbVlc._tab->_table, IVI_VLC_BITS, 1);
mb->_qDelta = _ctx._gb->getVLC2<1>(_ctx._mbVlc._tab->_table, IVI_VLC_BITS);
mb->_qDelta = IVI_TOSIGNED(mb->_qDelta);
}
}
@ -351,9 +351,9 @@ int Indeo5Decoder::decodeMbInfo(IVIBandDesc *band, IVITile *tile) {
}
} else {
// decode motion vector deltas
mvDelta = _ctx._gb->getVLC2(_ctx._mbVlc._tab->_table, IVI_VLC_BITS, 1);
mvDelta = _ctx._gb->getVLC2<1>(_ctx._mbVlc._tab->_table, IVI_VLC_BITS);
mvY += IVI_TOSIGNED(mvDelta);
mvDelta = _ctx._gb->getVLC2(_ctx._mbVlc._tab->_table, IVI_VLC_BITS, 1);
mvDelta = _ctx._gb->getVLC2<1>(_ctx._mbVlc._tab->_table, IVI_VLC_BITS);
mvX += IVI_TOSIGNED(mvDelta);
mb->_mvX = mvX;
mb->_mvY = mvY;

View file

@ -24,7 +24,6 @@ MODULE_OBJS := \
codecs/smc.o \
codecs/svq1.o \
codecs/truemotion1.o \
codecs/indeo/get_bits.o \
codecs/indeo/indeo.o \
codecs/indeo/indeo_dsp.o \
codecs/indeo/mem.o \