@@ -944,25 +944,16 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||||||
return false ; //wait.
|
return false ; //wait.
|
||||||
}
|
}
|
||||||
|
|
||||||
mFetcher->removeFromNetworkQueue(this, false);
|
|
||||||
|
|
||||||
S32 cur_size = 0;
|
S32 cur_size = 0;
|
||||||
if (mFormattedImage.notNull())
|
if (mFormattedImage.notNull())
|
||||||
{
|
{
|
||||||
cur_size = mFormattedImage->getDataSize(); // amount of data we already have
|
cur_size = mFormattedImage->getDataSize(); // amount of data we already have
|
||||||
if (mFormattedImage->getDiscardLevel() == 0)
|
if (mFormattedImage->getDiscardLevel() == 0)
|
||||||
{
|
{
|
||||||
if(cur_size > 0)
|
// We already have all the data, just decode it
|
||||||
{
|
mLoadedDiscard = mFormattedImage->getDiscardLevel();
|
||||||
// We already have all the data, just decode it
|
mState = DECODE_IMAGE;
|
||||||
mLoadedDiscard = mFormattedImage->getDiscardLevel();
|
return false;
|
||||||
mState = DECODE_IMAGE;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return true; //abort
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mRequestedSize = mDesiredSize;
|
mRequestedSize = mDesiredSize;
|
||||||
@@ -1260,7 +1251,15 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
|
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
|
||||||
return true;
|
|
||||||
|
if(mDecodedDiscard<=0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1427,36 +1426,62 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,
|
|||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
// get length of stream:
|
// get length of stream:
|
||||||
data_size = buffer->countAfter(channels.in(), NULL);
|
data_size = buffer->countAfter(channels.in(), NULL);
|
||||||
|
|
||||||
LL_DEBUGS("Texture") << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << LL_ENDL;
|
LL_DEBUGS("Texture") << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << LL_ENDL;
|
||||||
if (data_size > 0)
|
if (data_size > 0)
|
||||||
{
|
{
|
||||||
// *TODO: set the formatted image data here directly to avoid the copy
|
bool clean_data = false;
|
||||||
mBuffer = new U8[data_size];
|
bool done = false;
|
||||||
buffer->readAfter(channels.in(), NULL, mBuffer, data_size);
|
if (!partial)
|
||||||
mBufferSize += data_size;
|
|
||||||
if (data_size < mRequestedSize && mRequestedDiscard == 0)
|
|
||||||
{
|
{
|
||||||
mHaveAllData = TRUE;
|
// we got the whole image in one go
|
||||||
|
done = true;
|
||||||
|
clean_data = true;
|
||||||
|
}
|
||||||
|
else if (data_size < mRequestedSize)
|
||||||
|
{
|
||||||
|
// we have the whole image
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
else if (data_size == mRequestedSize)
|
||||||
|
{
|
||||||
|
if (mRequestedDiscard <= 0)
|
||||||
|
{
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// this is the normal case where we get the data we requested,
|
||||||
|
// but still need to request more data.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (data_size > mRequestedSize)
|
else if (data_size > mRequestedSize)
|
||||||
{
|
{
|
||||||
// *TODO: This shouldn't be happening any more
|
// *TODO: This shouldn't be happening any more
|
||||||
llwarns << "data_size = " << data_size << " > requested: " << mRequestedSize << llendl;
|
llwarns << "data_size = " << data_size << " > requested: " << mRequestedSize << llendl;
|
||||||
mHaveAllData = TRUE;
|
done = true;
|
||||||
|
clean_data = true;
|
||||||
llassert_always(mDecodeHandle == 0);
|
llassert_always(mDecodeHandle == 0);
|
||||||
mFormattedImage = NULL; // discard any previous data we had
|
|
||||||
mBufferSize = data_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (clean_data)
|
||||||
|
{
|
||||||
|
resetFormattedData(); // discard any previous data we had
|
||||||
|
llassert(mBufferSize == 0);
|
||||||
|
}
|
||||||
|
if (done)
|
||||||
|
{
|
||||||
|
mHaveAllData = TRUE;
|
||||||
|
mRequestedDiscard = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *TODO: set the formatted image data here directly to avoid the copy
|
||||||
|
mBuffer = new U8[data_size];
|
||||||
|
buffer->readAfter(channels.in(), NULL, mBuffer, data_size);
|
||||||
|
mBufferSize += data_size;
|
||||||
|
mRequestedSize = data_size;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// We requested data but received none (and no error),
|
|
||||||
// so presumably we have all of it
|
|
||||||
mHaveAllData = TRUE;
|
|
||||||
}
|
|
||||||
mRequestedSize = data_size;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user