diff --git a/MdeModulePkg/Include/Library/ImageDecoderLib.h b/MdeModulePkg/Include/Library/ImageDecoderLib.h
new file mode 100644
index 0000000000..928a09483a
--- /dev/null
+++ b/MdeModulePkg/Include/Library/ImageDecoderLib.h
@@ -0,0 +1,76 @@
+/** @file
+ This library provides image decoding service by managing the different
+ image decoding libraries.
+
+Copyright (c) 2015, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+#ifndef __IMAGE_DECODER_LIB_H__
+#define __IMAGE_DECODER_LIB_H__
+#include
+
+typedef
+EFI_STATUS
+(EFIAPI *DECODE_IMAGE)(
+ IN IMAGE_FORMAT ImageFormat,
+ IN UINT8 *Image,
+ IN UINTN ImageSize,
+ OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL **GopBlt,
+ OUT UINTN *GopBltSize,
+ OUT UINTN *PixelWidth,
+ OUT UINTN *PixelHeight
+ );
+
+/**
+ Convert a graphics image to a callee allocated GOP blt buffer.
+
+ @param ImageFormat Format of the image file.
+ @param Image Pointer to image file.
+ @param ImageSize Number of bytes in Image.
+ @param GopBlt Buffer containing GOP version of Image.
+ @param GopBltSize Size of GopBlt in bytes.
+ @param PixelWidth Width of GopBlt/Image in pixels.
+ @param PixelHeight Height of GopBlt/Image in pixels.
+
+ @retval EFI_SUCCESS GopBlt and GopBltSize are returned.
+ @retval EFI_INVALID_PARAMETER GopBlt or GopBltSize is NULL.
+ @retval EFI_INVALID_PARAMETER Image is NULL or ImageSize is 0.
+ @retval EFI_UNSUPPORTED Image is not supported.
+ @retval EFI_OUT_OF_RESOURCES No enough buffer to allocate.
+
+**/
+EFI_STATUS
+EFIAPI
+DecodeImage (
+ IN IMAGE_FORMAT ImageFormat,
+ IN UINT8 *Image,
+ IN UINTN ImageSize,
+ OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL **GopBlt,
+ OUT UINTN *GopBltSize,
+ OUT UINTN *PixelWidth,
+ OUT UINTN *PixelHeight
+ );
+
+/**
+ Register an image decoder.
+
+ @param Decoder An image decoder.
+
+ @retval EFI_SUCCESS The decoder was successfully registered.
+ @retval EFI_OUT_OF_RESOURCES No enough resource to register the decoder.
+
+**/
+EFI_STATUS
+EFIAPI
+RegisterImageDecoder (
+ IN DECODE_IMAGE Decoder
+ );
+
+#endif
diff --git a/MdeModulePkg/Library/ImageDecoderLib/ImageDecoderLib.c b/MdeModulePkg/Library/ImageDecoderLib/ImageDecoderLib.c
new file mode 100644
index 0000000000..4a6219bbb1
--- /dev/null
+++ b/MdeModulePkg/Library/ImageDecoderLib/ImageDecoderLib.c
@@ -0,0 +1,121 @@
+/** @file
+ This library provides image decoding service by managing the different
+ image decoding libraries.
+
+Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+typedef struct {
+ UINT32 Signature;
+ DECODE_IMAGE Decoder;
+ LIST_ENTRY Link;
+} IMAGE_DECODER_ENTRY;
+#define IMAGE_DECODER_ENTRY_SIGNATURE SIGNATURE_32 ('i', 'm', 'g', 'd')
+#define IMAGE_DECODER_ENTRY_FROM_LINK(Link) \
+ CR (Link, IMAGE_DECODER_ENTRY, Link, IMAGE_DECODER_ENTRY_SIGNATURE)
+
+LIST_ENTRY mImageDecoderLibDecoders = INITIALIZE_LIST_HEAD_VARIABLE (mImageDecoderLibDecoders);
+
+/**
+ Convert a graphics image to a callee allocated GOP blt buffer.
+
+ @param ImageFormat Format of the image file.
+ @param Image Pointer to image file.
+ @param ImageSize Number of bytes in Image.
+ @param GopBlt Buffer containing GOP version of Image.
+ @param GopBltSize Size of GopBlt in bytes.
+ @param PixelWidth Width of GopBlt/Image in pixels.
+ @param PixelHeight Height of GopBlt/Image in pixels.
+
+ @retval EFI_SUCCESS GopBlt and GopBltSize are returned.
+ @retval EFI_INVALID_PARAMETER GopBlt or GopBltSize is NULL.
+ @retval EFI_INVALID_PARAMETER Image is NULL or ImageSize is 0.
+ @retval EFI_UNSUPPORTED Image is not supported.
+ @retval EFI_OUT_OF_RESOURCES No enough buffer to allocate.
+
+**/
+EFI_STATUS
+EFIAPI
+DecodeImage (
+ IN IMAGE_FORMAT ImageFormat,
+ IN UINT8 *Image,
+ IN UINTN ImageSize,
+ OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL **GopBlt,
+ OUT UINTN *GopBltSize,
+ OUT UINTN *PixelWidth,
+ OUT UINTN *PixelHeight
+ )
+{
+ IMAGE_DECODER_ENTRY *Entry;
+ LIST_ENTRY *Link;
+ EFI_STATUS Status;
+
+ if ((GopBlt == NULL) || (GopBltSize == NULL)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if ((Image == NULL) || (ImageSize == 0)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ for ( Link = GetFirstNode (&mImageDecoderLibDecoders)
+ ; !IsNull (&mImageDecoderLibDecoders, Link)
+ ; Link = GetNextNode (&mImageDecoderLibDecoders, Link)
+ ) {
+ Entry = IMAGE_DECODER_ENTRY_FROM_LINK (Link);
+ Status = Entry->Decoder (ImageFormat, Image, ImageSize, GopBlt, GopBltSize, PixelWidth, PixelHeight);
+ if (!EFI_ERROR (Status)) {
+ break;
+ }
+ }
+
+ if (IsNull (&mImageDecoderLibDecoders, Link)) {
+ return EFI_UNSUPPORTED;
+ } else {
+ return EFI_SUCCESS;
+ }
+}
+
+/**
+ Register an image decoder.
+
+ @param Decoder An image decoder.
+
+ @retval EFI_SUCCESS The decoder was successfully registered.
+ @retval EFI_OUT_OF_RESOURCES No enough resource to register the decoder.
+
+**/
+EFI_STATUS
+EFIAPI
+RegisterImageDecoder (
+ IN DECODE_IMAGE Decoder
+ )
+{
+ IMAGE_DECODER_ENTRY *Entry;
+
+ Entry = AllocatePool (sizeof (IMAGE_DECODER_ENTRY));
+ if (Entry == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Entry->Signature = IMAGE_DECODER_ENTRY_SIGNATURE;
+ Entry->Decoder = Decoder;
+ InsertTailList (&mImageDecoderLibDecoders, &Entry->Link);
+
+ return EFI_SUCCESS;
+}
\ No newline at end of file
diff --git a/MdeModulePkg/Library/ImageDecoderLib/ImageDecoderLib.inf b/MdeModulePkg/Library/ImageDecoderLib/ImageDecoderLib.inf
new file mode 100644
index 0000000000..5d2ee7b429
--- /dev/null
+++ b/MdeModulePkg/Library/ImageDecoderLib/ImageDecoderLib.inf
@@ -0,0 +1,42 @@
+## @file
+# This library provides image decoding service by managing the different
+# image decoding libraries.
+#
+# Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.
+# This program and the accompanying materials are licensed and made available under
+# the terms and conditions of the BSD License that accompanies this distribution.
+# The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php.
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = ImageDecoderLib
+ FILE_GUID = 5ACDA5F7-AE20-4A17-90C1-7D087F730202
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = ImageDecoderLib|DXE_DRIVER UEFI_APPLICATION
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC
+#
+
+[Sources]
+ ImageDecoderLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+ BaseLib
+ MemoryAllocationLib
+ UefiLib
+ BaseMemoryLib
+ DebugLib
\ No newline at end of file
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 08148e39d9..c35f533adc 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -131,6 +131,10 @@
#
PlatformVarCleanupLib|Include/Library/PlatformVarCleanupLib.h
+ ## @libraryclass Provides image decoding service.
+ #
+ ImageDecoderLib|Include/Library/ImageDecoderLib.h
+
[Guids]
## MdeModule package token space guid
# Include/Guid/MdeModulePkgTokenSpace.h
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index 62f596db73..20af2d442c 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -47,6 +47,7 @@
PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
SortLib|MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf
+ ImageDecoderLib|MdeModulePkg/Library/ImageDecoderLib/ImageDecoderLib.inf
#
# UEFI & PI
#
@@ -276,6 +277,7 @@
MdeModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
MdeModulePkg/Library/PlatformBootManagerLibNull/PlatformBootManagerLibNull.inf
+ MdeModulePkg/Library/ImageDecoderLib/ImageDecoderLib.inf
MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf
MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf
MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf