зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1282354 - Move code for SurfaceCache placeholder insertion from RasterImage to DecoderFactory. r=dholbert
This commit is contained in:
Родитель
d7bb652cf1
Коммит
8220b27059
|
@ -108,6 +108,7 @@ DecoderFactory::GetDecoder(DecoderType aType,
|
|||
DecoderFactory::CreateDecoder(DecoderType aType,
|
||||
NotNull<RasterImage*> aImage,
|
||||
NotNull<SourceBuffer*> aSourceBuffer,
|
||||
const IntSize& aIntrinsicSize,
|
||||
const Maybe<IntSize>& aTargetSize,
|
||||
DecoderFlags aDecoderFlags,
|
||||
SurfaceFlags aSurfaceFlags,
|
||||
|
@ -139,6 +140,17 @@ DecoderFactory::CreateDecoder(DecoderType aType,
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
// Add a placeholder to the SurfaceCache so we won't trigger any more decoders
|
||||
// with the same parameters.
|
||||
IntSize surfaceSize = aTargetSize.valueOr(aIntrinsicSize);
|
||||
SurfaceKey surfaceKey =
|
||||
RasterSurfaceKey(surfaceSize, aSurfaceFlags, /* aFrameNum = */ 0);
|
||||
InsertOutcome outcome =
|
||||
SurfaceCache::InsertPlaceholder(ImageKey(aImage.get()), surfaceKey);
|
||||
if (outcome != InsertOutcome::SUCCESS) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
RefPtr<IDecodingTask> task = new DecodingTask(WrapNotNull(decoder));
|
||||
return task.forget();
|
||||
}
|
||||
|
@ -147,6 +159,7 @@ DecoderFactory::CreateDecoder(DecoderType aType,
|
|||
DecoderFactory::CreateAnimationDecoder(DecoderType aType,
|
||||
NotNull<RasterImage*> aImage,
|
||||
NotNull<SourceBuffer*> aSourceBuffer,
|
||||
const IntSize& aIntrinsicSize,
|
||||
DecoderFlags aDecoderFlags,
|
||||
SurfaceFlags aSurfaceFlags)
|
||||
{
|
||||
|
@ -172,6 +185,16 @@ DecoderFactory::CreateAnimationDecoder(DecoderType aType,
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
// Add a placeholder for the first frame to the SurfaceCache so we won't
|
||||
// trigger any more decoders with the same parameters.
|
||||
SurfaceKey surfaceKey =
|
||||
RasterSurfaceKey(aIntrinsicSize, aSurfaceFlags, /* aFrameNum = */ 0);
|
||||
InsertOutcome outcome =
|
||||
SurfaceCache::InsertPlaceholder(ImageKey(aImage.get()), surfaceKey);
|
||||
if (outcome != InsertOutcome::SUCCESS) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
RefPtr<IDecodingTask> task = new DecodingTask(WrapNotNull(decoder));
|
||||
return task.forget();
|
||||
}
|
||||
|
|
|
@ -54,6 +54,8 @@ public:
|
|||
* notifications as decoding progresses.
|
||||
* @param aSourceBuffer The SourceBuffer which the decoder will read its data
|
||||
* from.
|
||||
* @param aIntrinsicSize The intrinsic size of the image, normally obtained
|
||||
* during the metadata decode.
|
||||
* @param aTargetSize If not Nothing(), the target size which the image should
|
||||
* be scaled to during decoding. It's an error to specify
|
||||
* a target size for a decoder type which doesn't support
|
||||
|
@ -68,6 +70,7 @@ public:
|
|||
CreateDecoder(DecoderType aType,
|
||||
NotNull<RasterImage*> aImage,
|
||||
NotNull<SourceBuffer*> aSourceBuffer,
|
||||
const gfx::IntSize& aIntrinsicSize,
|
||||
const Maybe<gfx::IntSize>& aTargetSize,
|
||||
DecoderFlags aDecoderFlags,
|
||||
SurfaceFlags aSurfaceFlags,
|
||||
|
@ -82,6 +85,8 @@ public:
|
|||
* notifications as decoding progresses.
|
||||
* @param aSourceBuffer The SourceBuffer which the decoder will read its data
|
||||
* from.
|
||||
* @param aIntrinsicSize The intrinsic size of the image, normally obtained
|
||||
* during the metadata decode.
|
||||
* @param aDecoderFlags Flags specifying the behavior of this decoder.
|
||||
* @param aSurfaceFlags Flags specifying the type of output this decoder
|
||||
* should produce.
|
||||
|
@ -90,6 +95,7 @@ public:
|
|||
CreateAnimationDecoder(DecoderType aType,
|
||||
NotNull<RasterImage*> aImage,
|
||||
NotNull<SourceBuffer*> aSourceBuffer,
|
||||
const gfx::IntSize& aIntrinsicSize,
|
||||
DecoderFlags aDecoderFlags,
|
||||
SurfaceFlags aSurfaceFlags);
|
||||
|
||||
|
|
|
@ -1309,12 +1309,13 @@ RasterImage::Decode(const IntSize& aSize, uint32_t aFlags)
|
|||
RefPtr<IDecodingTask> task;
|
||||
if (mAnim) {
|
||||
task = DecoderFactory::CreateAnimationDecoder(mDecoderType, WrapNotNull(this),
|
||||
mSourceBuffer, decoderFlags,
|
||||
surfaceFlags);
|
||||
mSourceBuffer, mSize,
|
||||
decoderFlags, surfaceFlags);
|
||||
} else {
|
||||
task = DecoderFactory::CreateDecoder(mDecoderType, WrapNotNull(this),
|
||||
mSourceBuffer, targetSize, decoderFlags,
|
||||
surfaceFlags, mRequestedSampleSize);
|
||||
mSourceBuffer, mSize, targetSize,
|
||||
decoderFlags, surfaceFlags,
|
||||
mRequestedSampleSize);
|
||||
}
|
||||
|
||||
// Make sure DecoderFactory was able to create a decoder successfully.
|
||||
|
@ -1322,18 +1323,6 @@ RasterImage::Decode(const IntSize& aSize, uint32_t aFlags)
|
|||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// Add a placeholder for the first frame to the SurfaceCache so we won't
|
||||
// trigger any more decoders with the same parameters.
|
||||
SurfaceKey surfaceKey =
|
||||
RasterSurfaceKey(aSize,
|
||||
task->GetDecoder()->GetSurfaceFlags(),
|
||||
/* aFrameNum = */ 0);
|
||||
InsertOutcome outcome =
|
||||
SurfaceCache::InsertPlaceholder(ImageKey(this), surfaceKey);
|
||||
if (outcome != InsertOutcome::SUCCESS) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
mDecodeCount++;
|
||||
|
||||
// We're ready to decode; start the decoder.
|
||||
|
|
Загрузка…
Ссылка в новой задаче