mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-04 17:29:11 +00:00
IMAGE: Reduced scope for more variables in Indeo codec
This commit is contained in:
parent
71fd176f05
commit
fe65d374d1
@ -208,11 +208,10 @@ IVIBandDesc::IVIBandDesc() : _plane(0), _bandNum(0), _width(0), _height(0),
|
||||
}
|
||||
|
||||
int IVIBandDesc::initTiles(IVITile *refTile, int p, int b, int tHeight, int tWidth) {
|
||||
int x, y;
|
||||
IVITile *tile = _tiles;
|
||||
|
||||
for (y = 0; y < _height; y += tHeight) {
|
||||
for (x = 0; x < _width; x += tWidth) {
|
||||
for (int y = 0; y < _height; y += tHeight) {
|
||||
for (int x = 0; x < _width; x += tWidth) {
|
||||
tile->_xPos = x;
|
||||
tile->_yPos = y;
|
||||
tile->_mbSize = _mbSize;
|
||||
@ -265,7 +264,6 @@ IVIPlaneDesc::IVIPlaneDesc() : _width(0), _height(0), _numBands(0), _bands(nullp
|
||||
}
|
||||
|
||||
int IVIPlaneDesc::initPlanes(IVIPlaneDesc *planes, const IVIPicConfig *cfg, bool isIndeo4) {
|
||||
int p, b;
|
||||
uint32 b_width, b_height, align_fac, width_aligned, height_aligned, bufSize;
|
||||
IVIBandDesc *band;
|
||||
|
||||
@ -285,7 +283,7 @@ int IVIPlaneDesc::initPlanes(IVIPlaneDesc *planes, const IVIPicConfig *cfg, bool
|
||||
planes[1]._height = planes[2]._height = (cfg->_picHeight + 3) >> 2;
|
||||
planes[1]._numBands = planes[2]._numBands = cfg->_chromaBands;
|
||||
|
||||
for (p = 0; p < 3; p++) {
|
||||
for (int p = 0; p < 3; p++) {
|
||||
planes[p]._bands = (IVIBandDesc *)avMallocZArray(planes[p]._numBands, sizeof(IVIBandDesc));
|
||||
if (!planes[p]._bands)
|
||||
return -2;
|
||||
@ -305,7 +303,7 @@ int IVIPlaneDesc::initPlanes(IVIPlaneDesc *planes, const IVIPicConfig *cfg, bool
|
||||
height_aligned = FFALIGN(b_height, align_fac);
|
||||
bufSize = width_aligned * height_aligned * sizeof(int16);
|
||||
|
||||
for (b = 0; b < planes[p]._numBands; b++) {
|
||||
for (int b = 0; b < planes[p]._numBands; b++) {
|
||||
band = &planes[p]._bands[b]; // select appropriate _plane/band
|
||||
band->_plane = p;
|
||||
band->_bandNum = b;
|
||||
@ -339,10 +337,10 @@ int IVIPlaneDesc::initPlanes(IVIPlaneDesc *planes, const IVIPicConfig *cfg, bool
|
||||
}
|
||||
|
||||
int IVIPlaneDesc::initTiles(IVIPlaneDesc *planes, int tileWidth, int tileHeight) {
|
||||
int p, b, xTiles, yTiles, tWidth, tHeight, ret;
|
||||
int xTiles, yTiles, tWidth, tHeight, ret;
|
||||
IVIBandDesc *band;
|
||||
|
||||
for (p = 0; p < 3; p++) {
|
||||
for (int p = 0; p < 3; p++) {
|
||||
tWidth = !p ? tileWidth : (tileWidth + 3) >> 2;
|
||||
tHeight = !p ? tileHeight : (tileHeight + 3) >> 2;
|
||||
|
||||
@ -353,7 +351,7 @@ int IVIPlaneDesc::initTiles(IVIPlaneDesc *planes, int tileWidth, int tileHeight)
|
||||
if (tWidth <= 0 || tHeight <= 0)
|
||||
return -3;
|
||||
|
||||
for (b = 0; b < planes[p]._numBands; b++) {
|
||||
for (int b = 0; b < planes[p]._numBands; b++) {
|
||||
band = &planes[p]._bands[b];
|
||||
xTiles = IVI_NUM_TILES(band->_width, tWidth);
|
||||
yTiles = IVI_NUM_TILES(band->_height, tHeight);
|
||||
@ -377,11 +375,9 @@ int IVIPlaneDesc::initTiles(IVIPlaneDesc *planes, int tileWidth, int tileHeight)
|
||||
}
|
||||
|
||||
void IVIPlaneDesc::freeBuffers(IVIPlaneDesc *planes) {
|
||||
int p, b, t;
|
||||
|
||||
for (p = 0; p < 3; p++) {
|
||||
for (int p = 0; p < 3; p++) {
|
||||
if (planes[p]._bands)
|
||||
for (b = 0; b < planes[p]._numBands; b++) {
|
||||
for (int b = 0; b < planes[p]._numBands; b++) {
|
||||
avFreeP(&planes[p]._bands[b]._bufs[0]);
|
||||
avFreeP(&planes[p]._bands[b]._bufs[1]);
|
||||
avFreeP(&planes[p]._bands[b]._bufs[2]);
|
||||
@ -389,7 +385,7 @@ void IVIPlaneDesc::freeBuffers(IVIPlaneDesc *planes) {
|
||||
|
||||
if (planes[p]._bands[b]._blkVlc._custTab._table)
|
||||
planes[p]._bands[b]._blkVlc._custTab.freeVlc();
|
||||
for (t = 0; t < planes[p]._bands[b]._numTiles; t++)
|
||||
for (int t = 0; t < planes[p]._bands[b]._numTiles; t++)
|
||||
avFreeP(&planes[p]._bands[b]._tiles[t]._mbs);
|
||||
avFreeP(&planes[p]._bands[b]._tiles);
|
||||
}
|
||||
@ -488,7 +484,7 @@ IndeoDecoderBase::~IndeoDecoderBase() {
|
||||
}
|
||||
|
||||
int IndeoDecoderBase::decodeIndeoFrame() {
|
||||
int result, p, b;
|
||||
int result;
|
||||
AVFrame frameData;
|
||||
AVFrame *frame = &frameData;
|
||||
|
||||
@ -520,8 +516,8 @@ int IndeoDecoderBase::decodeIndeoFrame() {
|
||||
|
||||
if (isNonNullFrame()) {
|
||||
_ctx._bufInvalid[_ctx._dstBuf] = 1;
|
||||
for (p = 0; p < 3; p++) {
|
||||
for (b = 0; b < _ctx._planes[p]._numBands; b++) {
|
||||
for (int p = 0; p < 3; p++) {
|
||||
for (int b = 0; b < _ctx._planes[p]._numBands; b++) {
|
||||
result = decode_band(&_ctx._planes[p]._bands[b]);
|
||||
if (result < 0) {
|
||||
warning("Error while decoding band: %d, _plane: %d", b, p);
|
||||
@ -534,7 +530,7 @@ int IndeoDecoderBase::decodeIndeoFrame() {
|
||||
if (_ctx._isScalable)
|
||||
return -1;
|
||||
|
||||
for (p = 0; p < 3; p++) {
|
||||
for (int p = 0; p < 3; p++) {
|
||||
if (!_ctx._planes[p]._bands[0]._buf)
|
||||
return -1;
|
||||
}
|
||||
@ -600,9 +596,6 @@ int IndeoDecoderBase::decodeIndeoFrame() {
|
||||
}
|
||||
|
||||
int IndeoDecoderBase::decode_band(IVIBandDesc *band) {
|
||||
int result, i, t, idx1, idx2, pos;
|
||||
IVITile *tile;
|
||||
|
||||
band->_buf = band->_bufs[_ctx._dstBuf];
|
||||
if (!band->_buf) {
|
||||
warning("Band buffer points to no data!");
|
||||
@ -617,7 +610,7 @@ int IndeoDecoderBase::decode_band(IVIBandDesc *band) {
|
||||
}
|
||||
band->_dataPtr = _ctx._frameData + (_ctx._gb->pos() >> 3);
|
||||
|
||||
result = decodeBandHeader(band);
|
||||
int result = decodeBandHeader(band);
|
||||
if (result) {
|
||||
warning("Error while decoding band header: %d",
|
||||
result);
|
||||
@ -632,9 +625,9 @@ int IndeoDecoderBase::decode_band(IVIBandDesc *band) {
|
||||
band->_rvMap = &_ctx._rvmapTabs[band->_rvmapSel];
|
||||
|
||||
// apply corrections to the selected rvmap table if present
|
||||
for (i = 0; i < band->_numCorr; i++) {
|
||||
idx1 = band->_corr[i * 2];
|
||||
idx2 = band->_corr[i * 2 + 1];
|
||||
for (int i = 0; i < band->_numCorr; i++) {
|
||||
int idx1 = band->_corr[i * 2];
|
||||
int idx2 = band->_corr[i * 2 + 1];
|
||||
SWAP(band->_rvMap->_runtab[idx1], band->_rvMap->_runtab[idx2]);
|
||||
SWAP(band->_rvMap->_valtab[idx1], band->_rvMap->_valtab[idx2]);
|
||||
if (idx1 == band->_rvMap->_eobSym || idx2 == band->_rvMap->_eobSym)
|
||||
@ -643,10 +636,10 @@ int IndeoDecoderBase::decode_band(IVIBandDesc *band) {
|
||||
band->_rvMap->_escSym ^= idx1 ^ idx2;
|
||||
}
|
||||
|
||||
pos = _ctx._gb->pos();
|
||||
int pos = _ctx._gb->pos();
|
||||
|
||||
for (t = 0; t < band->_numTiles; t++) {
|
||||
tile = &band->_tiles[t];
|
||||
for (int t = 0; t < band->_numTiles; t++) {
|
||||
IVITile *tile = &band->_tiles[t];
|
||||
|
||||
if (tile->_mbSize != band->_mbSize) {
|
||||
warning("MB sizes mismatch: %d vs. %d",
|
||||
@ -690,9 +683,9 @@ int IndeoDecoderBase::decode_band(IVIBandDesc *band) {
|
||||
|
||||
// restore the selected rvmap table by applying its corrections in
|
||||
// reverse order
|
||||
for (i = band->_numCorr - 1; i >= 0; i--) {
|
||||
idx1 = band->_corr[i * 2];
|
||||
idx2 = band->_corr[i * 2 + 1];
|
||||
for (int i = band->_numCorr - 1; i >= 0; i--) {
|
||||
int idx1 = band->_corr[i * 2];
|
||||
int idx2 = band->_corr[i * 2 + 1];
|
||||
SWAP(band->_rvMap->_runtab[idx1], band->_rvMap->_runtab[idx2]);
|
||||
SWAP(band->_rvMap->_valtab[idx1], band->_rvMap->_valtab[idx2]);
|
||||
if (idx1 == band->_rvMap->_eobSym || idx2 == band->_rvMap->_eobSym)
|
||||
@ -708,32 +701,29 @@ int IndeoDecoderBase::decode_band(IVIBandDesc *band) {
|
||||
|
||||
void IndeoDecoderBase::recomposeHaar(const IVIPlaneDesc *_plane,
|
||||
uint8 *dst, const int dstPitch) {
|
||||
int x, y, indx, b0, b1, b2, b3, p0, p1, p2, p3;
|
||||
const short *b0Ptr, *b1Ptr, *b2Ptr, *b3Ptr;
|
||||
int32 pitch;
|
||||
|
||||
// all bands should have the same _pitch
|
||||
pitch = _plane->_bands[0]._pitch;
|
||||
int32 pitch = _plane->_bands[0]._pitch;
|
||||
|
||||
// get pointers to the wavelet bands
|
||||
b0Ptr = _plane->_bands[0]._buf;
|
||||
b1Ptr = _plane->_bands[1]._buf;
|
||||
b2Ptr = _plane->_bands[2]._buf;
|
||||
b3Ptr = _plane->_bands[3]._buf;
|
||||
const short *b0Ptr = _plane->_bands[0]._buf;
|
||||
const short *b1Ptr = _plane->_bands[1]._buf;
|
||||
const short *b2Ptr = _plane->_bands[2]._buf;
|
||||
const short *b3Ptr = _plane->_bands[3]._buf;
|
||||
|
||||
for (y = 0; y < _plane->_height; y += 2) {
|
||||
for (x = 0, indx = 0; x < _plane->_width; x += 2, indx++) {
|
||||
for (int y = 0; y < _plane->_height; y += 2) {
|
||||
for (int x = 0, indx = 0; x < _plane->_width; x += 2, indx++) {
|
||||
// load coefficients
|
||||
b0 = b0Ptr[indx]; //should be: b0 = (_numBands > 0) ? b0Ptr[indx] : 0;
|
||||
b1 = b1Ptr[indx]; //should be: b1 = (_numBands > 1) ? b1Ptr[indx] : 0;
|
||||
b2 = b2Ptr[indx]; //should be: b2 = (_numBands > 2) ? b2Ptr[indx] : 0;
|
||||
b3 = b3Ptr[indx]; //should be: b3 = (_numBands > 3) ? b3Ptr[indx] : 0;
|
||||
int b0 = b0Ptr[indx]; //should be: b0 = (_numBands > 0) ? b0Ptr[indx] : 0;
|
||||
int b1 = b1Ptr[indx]; //should be: b1 = (_numBands > 1) ? b1Ptr[indx] : 0;
|
||||
int b2 = b2Ptr[indx]; //should be: b2 = (_numBands > 2) ? b2Ptr[indx] : 0;
|
||||
int b3 = b3Ptr[indx]; //should be: b3 = (_numBands > 3) ? b3Ptr[indx] : 0;
|
||||
|
||||
// haar wavelet recomposition
|
||||
p0 = (b0 + b1 + b2 + b3 + 2) >> 2;
|
||||
p1 = (b0 + b1 - b2 - b3 + 2) >> 2;
|
||||
p2 = (b0 - b1 + b2 - b3 + 2) >> 2;
|
||||
p3 = (b0 - b1 - b2 + b3 + 2) >> 2;
|
||||
int p0 = (b0 + b1 + b2 + b3 + 2) >> 2;
|
||||
int p1 = (b0 + b1 - b2 - b3 + 2) >> 2;
|
||||
int p2 = (b0 - b1 + b2 - b3 + 2) >> 2;
|
||||
int p3 = (b0 - b1 - b2 + b3 + 2) >> 2;
|
||||
|
||||
// bias, convert and output four pixels
|
||||
dst[x] = avClipUint8(p0 + 128);
|
||||
@ -753,46 +743,43 @@ void IndeoDecoderBase::recomposeHaar(const IVIPlaneDesc *_plane,
|
||||
|
||||
void IndeoDecoderBase::recompose53(const IVIPlaneDesc *_plane,
|
||||
uint8 *dst, const int dstPitch) {
|
||||
int x, y, indx;
|
||||
int32 p0, p1, p2, p3, tmp0, tmp1, tmp2;
|
||||
int32 b0_1, b0_2, b1_1, b1_2, b1_3, b2_1, b2_2, b2_3, b2_4, b2_5, b2_6;
|
||||
int32 b3_1, b3_2, b3_3, b3_4, b3_5, b3_6, b3_7, b3_8, b3_9;
|
||||
int32 _pitch, back_pitch;
|
||||
const short *b0Ptr, *b1Ptr, *b2Ptr, *b3Ptr;
|
||||
const int numBands = 4;
|
||||
|
||||
// all bands should have the same _pitch
|
||||
_pitch = _plane->_bands[0]._pitch;
|
||||
int32 pitch_ = _plane->_bands[0]._pitch;
|
||||
|
||||
// pixels at the position "y-1" will be set to pixels at the "y" for the 1st iteration
|
||||
back_pitch = 0;
|
||||
int32 back_pitch = 0;
|
||||
|
||||
// get pointers to the wavelet bands
|
||||
b0Ptr = _plane->_bands[0]._buf;
|
||||
b1Ptr = _plane->_bands[1]._buf;
|
||||
b2Ptr = _plane->_bands[2]._buf;
|
||||
b3Ptr = _plane->_bands[3]._buf;
|
||||
const short *b0Ptr = _plane->_bands[0]._buf;
|
||||
const short *b1Ptr = _plane->_bands[1]._buf;
|
||||
const short *b2Ptr = _plane->_bands[2]._buf;
|
||||
const short *b3Ptr = _plane->_bands[3]._buf;
|
||||
|
||||
for (y = 0; y < _plane->_height; y += 2) {
|
||||
for (int y = 0; y < _plane->_height; y += 2) {
|
||||
|
||||
if (y + 2 >= _plane->_height)
|
||||
_pitch = 0;
|
||||
pitch_ = 0;
|
||||
// load storage variables with values
|
||||
if (numBands > 0) {
|
||||
b0_1 = b0Ptr[0];
|
||||
b0_2 = b0Ptr[_pitch];
|
||||
b0_2 = b0Ptr[pitch_];
|
||||
}
|
||||
|
||||
if (numBands > 1) {
|
||||
b1_1 = b1Ptr[back_pitch];
|
||||
b1_2 = b1Ptr[0];
|
||||
b1_3 = b1_1 - b1_2 * 6 + b1Ptr[_pitch];
|
||||
b1_3 = b1_1 - b1_2 * 6 + b1Ptr[pitch_];
|
||||
}
|
||||
|
||||
if (numBands > 2) {
|
||||
b2_2 = b2Ptr[0]; // b2[x, y ]
|
||||
b2_3 = b2_2; // b2[x+1,y ] = b2[x,y]
|
||||
b2_5 = b2Ptr[_pitch]; // b2[x ,y+1]
|
||||
b2_5 = b2Ptr[pitch_]; // b2[x ,y+1]
|
||||
b2_6 = b2_5; // b2[x+1,y+1] = b2[x,y+1]
|
||||
}
|
||||
|
||||
@ -801,11 +788,11 @@ void IndeoDecoderBase::recompose53(const IVIPlaneDesc *_plane,
|
||||
b3_3 = b3_2; // b3[x+1,y-1] = b3[x ,y-1]
|
||||
b3_5 = b3Ptr[0]; // b3[x ,y ]
|
||||
b3_6 = b3_5; // b3[x+1,y ] = b3[x ,y ]
|
||||
b3_8 = b3_2 - b3_5 * 6 + b3Ptr[_pitch];
|
||||
b3_8 = b3_2 - b3_5 * 6 + b3Ptr[pitch_];
|
||||
b3_9 = b3_8;
|
||||
}
|
||||
|
||||
for (x = 0, indx = 0; x < _plane->_width; x += 2, indx++) {
|
||||
for (int x = 0, indx = 0; x < _plane->_width; x += 2, indx++) {
|
||||
if (x + 2 >= _plane->_width) {
|
||||
b0Ptr--;
|
||||
b1Ptr--;
|
||||
@ -833,7 +820,7 @@ void IndeoDecoderBase::recompose53(const IVIPlaneDesc *_plane,
|
||||
tmp0 = b0_1;
|
||||
tmp2 = b0_2;
|
||||
b0_1 = b0Ptr[indx + 1];
|
||||
b0_2 = b0Ptr[_pitch + indx + 1];
|
||||
b0_2 = b0Ptr[pitch_ + indx + 1];
|
||||
tmp1 = tmp0 + b0_1;
|
||||
|
||||
p0 = tmp0 << 4;
|
||||
@ -850,7 +837,7 @@ void IndeoDecoderBase::recompose53(const IVIPlaneDesc *_plane,
|
||||
b1_1 = b1Ptr[back_pitch + indx + 1];
|
||||
|
||||
tmp2 = tmp1 - tmp0 * 6 + b1_3;
|
||||
b1_3 = b1_1 - b1_2 * 6 + b1Ptr[_pitch + indx + 1];
|
||||
b1_3 = b1_1 - b1_2 * 6 + b1Ptr[pitch_ + indx + 1];
|
||||
|
||||
p0 += (tmp0 + tmp1) << 3;
|
||||
p1 += (tmp0 + tmp1 + b1_1 + b1_2) << 2;
|
||||
@ -861,7 +848,7 @@ void IndeoDecoderBase::recompose53(const IVIPlaneDesc *_plane,
|
||||
// process the LH-band by applying LPF vertically and HPF horizontally
|
||||
if (numBands > 2) {
|
||||
b2_3 = b2Ptr[indx + 1];
|
||||
b2_6 = b2Ptr[_pitch + indx + 1];
|
||||
b2_6 = b2Ptr[pitch_ + indx + 1];
|
||||
|
||||
tmp0 = b2_1 + b2_2;
|
||||
tmp1 = b2_1 - b2_2 * 6 + b2_3;
|
||||
@ -881,7 +868,7 @@ void IndeoDecoderBase::recompose53(const IVIPlaneDesc *_plane,
|
||||
tmp1 = b3_2 + b3_5;
|
||||
tmp2 = b3_3 + b3_6;
|
||||
|
||||
b3_9 = b3_3 - b3_6 * 6 + b3Ptr[_pitch + indx + 1];
|
||||
b3_9 = b3_3 - b3_6 * 6 + b3Ptr[pitch_ + indx + 1];
|
||||
|
||||
p0 += (tmp0 + tmp1) << 2;
|
||||
p1 += (tmp0 - tmp1 * 6 + tmp2) << 1;
|
||||
@ -898,25 +885,24 @@ void IndeoDecoderBase::recompose53(const IVIPlaneDesc *_plane,
|
||||
|
||||
dst += dstPitch << 1;
|
||||
|
||||
back_pitch = -_pitch;
|
||||
back_pitch = -pitch_;
|
||||
|
||||
b0Ptr += _pitch + 1;
|
||||
b1Ptr += _pitch + 1;
|
||||
b2Ptr += _pitch + 1;
|
||||
b3Ptr += _pitch + 1;
|
||||
b0Ptr += pitch_ + 1;
|
||||
b1Ptr += pitch_ + 1;
|
||||
b2Ptr += pitch_ + 1;
|
||||
b3Ptr += pitch_ + 1;
|
||||
}
|
||||
}
|
||||
|
||||
void IndeoDecoderBase::outputPlane(IVIPlaneDesc *_plane, uint8 *dst, int dstPitch) {
|
||||
int x, y;
|
||||
const int16 *src = _plane->_bands[0]._buf;
|
||||
uint32 pitch = _plane->_bands[0]._pitch;
|
||||
|
||||
if (!src)
|
||||
return;
|
||||
|
||||
for (y = 0; y < _plane->_height; y++) {
|
||||
for (x = 0; x < _plane->_width; x++)
|
||||
for (int y = 0; y < _plane->_height; y++) {
|
||||
for (int x = 0; x < _plane->_width; x++)
|
||||
dst[x] = avClipUint8(src[x] + 128);
|
||||
src += pitch;
|
||||
dst += dstPitch;
|
||||
@ -925,13 +911,6 @@ void IndeoDecoderBase::outputPlane(IVIPlaneDesc *_plane, uint8 *dst, int dstPitc
|
||||
|
||||
int IndeoDecoderBase::processEmptyTile(IVIBandDesc *band,
|
||||
IVITile *tile, int32 mvScale) {
|
||||
int x, y, needMc, mbn, blk, numBlocks, mvX, mvY, mcType;
|
||||
int offs, mbOffset, rowOffset, ret;
|
||||
IVIMbInfo *mb, *refMb;
|
||||
const int16 *src;
|
||||
int16 *dst;
|
||||
IviMCFunc mcNoDeltaFunc;
|
||||
|
||||
if (tile->_numMBs != IVI_MBs_PER_TILE(tile->_width, tile->_height, band->_mbSize)) {
|
||||
warning("Allocated tile size %d mismatches "
|
||||
"parameters %d in processEmptyTile()",
|
||||
@ -939,16 +918,16 @@ int IndeoDecoderBase::processEmptyTile(IVIBandDesc *band,
|
||||
return -1;
|
||||
}
|
||||
|
||||
offs = tile->_yPos * band->_pitch + tile->_xPos;
|
||||
mb = tile->_mbs;
|
||||
refMb = tile->_refMbs;
|
||||
rowOffset = band->_mbSize * band->_pitch;
|
||||
needMc = 0; // reset the mc tracking flag
|
||||
int offs = tile->_yPos * band->_pitch + tile->_xPos;
|
||||
IVIMbInfo *mb = tile->_mbs;
|
||||
IVIMbInfo *refMb = tile->_refMbs;
|
||||
int rowOffset = band->_mbSize * band->_pitch;
|
||||
int needMc = 0; // reset the mc tracking flag
|
||||
|
||||
for (y = tile->_yPos; y < (tile->_yPos + tile->_height); y += band->_mbSize) {
|
||||
mbOffset = offs;
|
||||
for (int y = tile->_yPos; y < (tile->_yPos + tile->_height); y += band->_mbSize) {
|
||||
int mbOffset = offs;
|
||||
|
||||
for (x = tile->_xPos; x < (tile->_xPos + tile->_width); x += band->_mbSize) {
|
||||
for (int x = tile->_xPos; x < (tile->_xPos + tile->_width); x += band->_mbSize) {
|
||||
mb->_xPos = x;
|
||||
mb->_yPos = y;
|
||||
mb->_bufOffs = mbOffset;
|
||||
@ -1001,13 +980,15 @@ int IndeoDecoderBase::processEmptyTile(IVIBandDesc *band,
|
||||
} // for y
|
||||
|
||||
if (band->_inheritMv && needMc) { // apply motion compensation if there is at least one non-zero motion vector
|
||||
numBlocks = (band->_mbSize != band->_blkSize) ? 4 : 1; // number of blocks per mb
|
||||
mcNoDeltaFunc = (band->_blkSize == 8) ? IndeoDSP::ffIviMc8x8NoDelta
|
||||
int numBlocks = (band->_mbSize != band->_blkSize) ? 4 : 1; // number of blocks per mb
|
||||
IviMCFunc mcNoDeltaFunc = (band->_blkSize == 8) ? IndeoDSP::ffIviMc8x8NoDelta
|
||||
: IndeoDSP::ffIviMc4x4NoDelta;
|
||||
|
||||
int mbn;
|
||||
for (mbn = 0, mb = tile->_mbs; mbn < tile->_numMBs; mb++, mbn++) {
|
||||
mvX = mb->_mvX;
|
||||
mvY = mb->_mvY;
|
||||
int mvX = mb->_mvX;
|
||||
int mvY = mb->_mvY;
|
||||
int mcType;
|
||||
if (!band->_isHalfpel) {
|
||||
mcType = 0; // we have only fullpel vectors
|
||||
} else {
|
||||
@ -1016,10 +997,10 @@ int IndeoDecoderBase::processEmptyTile(IVIBandDesc *band,
|
||||
mvY >>= 1; // convert halfpel vectors into fullpel ones
|
||||
}
|
||||
|
||||
for (blk = 0; blk < numBlocks; blk++) {
|
||||
for (int blk = 0; blk < numBlocks; blk++) {
|
||||
// adjust block position in the buffer according with its number
|
||||
offs = mb->_bufOffs + band->_blkSize * ((blk & 1) + !!(blk & 2) * band->_pitch);
|
||||
ret = iviMc(band, mcNoDeltaFunc, nullptr, offs,
|
||||
int ret = iviMc(band, mcNoDeltaFunc, nullptr, offs,
|
||||
mvX, mvY, 0, 0, mcType, -1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@ -1027,9 +1008,9 @@ int IndeoDecoderBase::processEmptyTile(IVIBandDesc *band,
|
||||
}
|
||||
} else {
|
||||
// copy data from the reference tile into the current one
|
||||
src = band->_refBuf + tile->_yPos * band->_pitch + tile->_xPos;
|
||||
dst = band->_buf + tile->_yPos * band->_pitch + tile->_xPos;
|
||||
for (y = 0; y < tile->_height; y++) {
|
||||
const int16 *src = band->_refBuf + tile->_yPos * band->_pitch + tile->_xPos;
|
||||
int16 *dst = band->_buf + tile->_yPos * band->_pitch + tile->_xPos;
|
||||
for (int y = 0; y < tile->_height; y++) {
|
||||
memcpy(dst, src, tile->_width*sizeof(band->_buf[0]));
|
||||
src += band->_pitch;
|
||||
dst += band->_pitch;
|
||||
@ -1055,21 +1036,18 @@ int IndeoDecoderBase::decodeTileDataSize(GetBits *gb) {
|
||||
}
|
||||
|
||||
int IndeoDecoderBase::decodeBlocks(GetBits *_gb, IVIBandDesc *band, IVITile *tile) {
|
||||
int mbn, blk, numBlocks, blkSize, ret, isIntra;
|
||||
int ret;
|
||||
int mcType = 0, mcType2 = -1;
|
||||
int mvX = 0, mvY = 0, mvX2 = 0, mvY2 = 0;
|
||||
int32 prevDc;
|
||||
uint32 cbp, quant, bufOffs;
|
||||
IVIMbInfo *mb;
|
||||
IviMCFunc mcWithDeltaFunc, mcNoDeltaFunc;
|
||||
IviMCAvgFunc mcAvgWithDeltaFunc, mcAvgNoDeltaFunc;
|
||||
const uint8 *scaleTab;
|
||||
|
||||
// init intra prediction for the DC coefficient
|
||||
prevDc = 0;
|
||||
blkSize = band->_blkSize;
|
||||
int32 prevDc = 0;
|
||||
int blkSize = band->_blkSize;
|
||||
// number of blocks per mb
|
||||
numBlocks = (band->_mbSize != blkSize) ? 4 : 1;
|
||||
int numBlocks = (band->_mbSize != blkSize) ? 4 : 1;
|
||||
IviMCFunc mcWithDeltaFunc, mcNoDeltaFunc;
|
||||
IviMCAvgFunc mcAvgWithDeltaFunc, mcAvgNoDeltaFunc;
|
||||
|
||||
if (blkSize == 8) {
|
||||
mcWithDeltaFunc = IndeoDSP::ffIviMc8x8Delta;
|
||||
mcNoDeltaFunc = IndeoDSP::ffIviMc8x8NoDelta;
|
||||
@ -1082,18 +1060,21 @@ int IndeoDecoderBase::decodeBlocks(GetBits *_gb, IVIBandDesc *band, IVITile *til
|
||||
mcAvgNoDeltaFunc = IndeoDSP::ffIviMcAvg4x4NoDelta;
|
||||
}
|
||||
|
||||
for (mbn = 0, mb = tile->_mbs; mbn < tile->_numMBs; mb++, mbn++) {
|
||||
isIntra = !mb->_type;
|
||||
cbp = mb->_cbp;
|
||||
bufOffs = mb->_bufOffs;
|
||||
int mbn;
|
||||
IVIMbInfo *mb;
|
||||
|
||||
quant = band->_globQuant + mb->_qDelta;
|
||||
for (mbn = 0, mb = tile->_mbs; mbn < tile->_numMBs; mb++, mbn++) {
|
||||
int isIntra = !mb->_type;
|
||||
uint32 cbp = mb->_cbp;
|
||||
uint32 bufOffs = mb->_bufOffs;
|
||||
|
||||
uint32 quant = band->_globQuant + mb->_qDelta;
|
||||
if (_ctx._isIndeo4)
|
||||
quant = avClipUintp2(quant, 5);
|
||||
else
|
||||
quant = av_clip((int)quant, 0, 23);
|
||||
|
||||
scaleTab = isIntra ? band->_intraScale : band->_interScale;
|
||||
const uint8 *scaleTab = isIntra ? band->_intraScale : band->_interScale;
|
||||
if (scaleTab)
|
||||
quant = scaleTab[quant];
|
||||
|
||||
@ -1146,7 +1127,7 @@ int IndeoDecoderBase::decodeBlocks(GetBits *_gb, IVIBandDesc *band, IVITile *til
|
||||
}
|
||||
}
|
||||
|
||||
for (blk = 0; blk < numBlocks; blk++) {
|
||||
for (int blk = 0; blk < numBlocks; blk++) {
|
||||
// adjust block position in the buffer according to its number
|
||||
if (blk & 1) {
|
||||
bufOffs += blkSize;
|
||||
|
Loading…
x
Reference in New Issue
Block a user