diff --git a/coders/uyvy.c b/coders/uyvy.c
new file mode 100644
index 0000000..65b5c7d
--- /dev/null
+++ b/coders/uyvy.c
@@ -0,0 +1,368 @@
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% U U Y Y V V Y Y %
+% U U Y Y V V Y Y %
+% U U Y V V Y %
+% U U Y V V Y %
+% UUU Y V Y %
+% %
+% %
+% Read/Write 16bit/pixel Interleaved YUV Image Format %
+% %
+% Software Design %
+% John Cristy %
+% July 1992 %
+% %
+% %
+% Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization %
+% dedicated to making software imaging solutions freely available. %
+% %
+% You may not use this file except in compliance with the License. You may %
+% obtain a copy of the License at %
+% %
+% http://www.imagemagick.org/script/license.php %
+% %
+% Unless required by applicable law or agreed to in writing, software %
+% distributed under the License is distributed on an "AS IS" BASIS, %
+% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
+% See the License for the specific language governing permissions and %
+% limitations under the License. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+*/
+
+/*
+ Include declarations.
+*/
+#include "magick/studio.h"
+#include "magick/blob.h"
+#include "magick/blob-private.h"
+#include "magick/cache.h"
+#include "magick/color.h"
+#include "magick/colorspace.h"
+#include "magick/exception.h"
+#include "magick/exception-private.h"
+#include "magick/image.h"
+#include "magick/image-private.h"
+#include "magick/list.h"
+#include "magick/magick.h"
+#include "magick/memory_.h"
+#include "magick/monitor.h"
+#include "magick/monitor-private.h"
+#include "magick/quantum-private.h"
+#include "magick/static.h"
+#include "magick/string_.h"
+#include "magick/module.h"
+
+/*
+ Forward declarations.
+*/
+static MagickBooleanType
+ WriteUYVYImage(const ImageInfo *,Image *);
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e a d U Y V Y I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ReadUYVYImage() reads an image in the UYVY format and returns it. It
+% allocates the memory necessary for the new Image structure and returns a
+% pointer to the new image.
+%
+% The format of the ReadUYVYImage method is:
+%
+% Image *ReadUYVYImage(const ImageInfo *image_info,
+% ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image_info: the image info.
+%
+% o exception: return any errors or warnings in this structure.
+%
+%
+*/
+static Image *ReadUYVYImage(const ImageInfo *image_info,
+ ExceptionInfo *exception)
+{
+ Image
+ *image;
+
+ long
+ y;
+
+ MagickBooleanType
+ status;
+
+ register long
+ x;
+
+ register PixelPacket
+ *q;
+
+ register long
+ i;
+
+ unsigned char
+ u,
+ v,
+ y1,
+ y2;
+
+ /*
+ Open image file.
+ */
+ assert(image_info != (const ImageInfo *) NULL);
+ assert(image_info->signature == MagickSignature);
+ if (image_info->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
+ image_info->filename);
+ assert(exception != (ExceptionInfo *) NULL);
+ assert(exception->signature == MagickSignature);
+ image=AcquireImage(image_info);
+ if ((image->columns == 0) || (image->rows == 0))
+ ThrowReaderException(OptionError,"MustSpecifyImageSize");
+ if ((image->columns % 2) != 0)
+ image->columns++;
+ (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent);
+ status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
+ if (status == MagickFalse)
+ return((Image *) NULL);
+ for (i=0; i < image->offset; i++)
+ if (ReadBlobByte(image) == EOF)
+ {
+ ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+ image->filename);
+ break;
+ }
+ image->depth=8;
+ if (image_info->ping != MagickFalse)
+ {
+ (void) CloseBlob(image);
+ return(GetFirstImageInList(image));
+ }
+ /*
+ Accumulate UYVY, then unpack into two pixels.
+ */
+ for (y=0; y < (long) image->rows; y++)
+ {
+ q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
+ if (q == (PixelPacket *) NULL)
+ break;
+ for (x=0; x < (long) (image->columns >> 1); x++)
+ {
+ u=(unsigned char) ReadBlobByte(image);
+ y1=(unsigned char) ReadBlobByte(image);
+ v=(unsigned char) ReadBlobByte(image);
+ y2=(unsigned char) ReadBlobByte(image);
+ q->red=ScaleCharToQuantum(y1);
+ q->green=ScaleCharToQuantum(u);
+ q->blue=ScaleCharToQuantum(v);
+ q++;
+ q->red=ScaleCharToQuantum(y2);
+ q->green=ScaleCharToQuantum(u);
+ q->blue=ScaleCharToQuantum(v);
+ q++;
+ }
+ if (SyncAuthenticPixels(image,exception) == MagickFalse)
+ break;
+ status=SetImageProgress(image,LoadImageTag,y,image->rows);
+ if (status == MagickFalse)
+ break;
+ }
+ image->colorspace=YCbCrColorspace;
+ if (EOFBlob(image) != MagickFalse)
+ ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
+ image->filename);
+ (void) CloseBlob(image);
+ return(GetFirstImageInList(image));
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e g i s t e r U Y V Y I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% RegisterUYVYImage() adds attributes for the UYVY image format to
+% the list of supported formats. The attributes include the image format
+% tag, a method to read and/or write the format, whether the format
+% supports the saving of more than one frame to the same file or blob,
+% whether the format supports native in-memory I/O, and a brief
+% description of the format.
+%
+% The format of the RegisterUYVYImage method is:
+%
+% unsigned long RegisterUYVYImage(void)
+%
+*/
+ModuleExport unsigned long RegisterUYVYImage(void)
+{
+ MagickInfo
+ *entry;
+
+ entry=SetMagickInfo("PAL");
+ entry->decoder=(DecodeImageHandler *) ReadUYVYImage;
+ entry->encoder=(EncodeImageHandler *) WriteUYVYImage;
+ entry->adjoin=MagickFalse;
+ entry->raw=MagickTrue;
+ entry->endian_support=MagickTrue;
+ entry->description=ConstantString("16bit/pixel interleaved YUV");
+ entry->module=ConstantString("UYVY");
+ (void) RegisterMagickInfo(entry);
+ entry=SetMagickInfo("UYVY");
+ entry->decoder=(DecodeImageHandler *) ReadUYVYImage;
+ entry->encoder=(EncodeImageHandler *) WriteUYVYImage;
+ entry->adjoin=MagickFalse;
+ entry->raw=MagickTrue;
+ entry->endian_support=MagickTrue;
+ entry->description=ConstantString("16bit/pixel interleaved YUV");
+ entry->module=ConstantString("UYVY");
+ (void) RegisterMagickInfo(entry);
+ return(MagickImageCoderSignature);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% U n r e g i s t e r U Y V Y I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% UnregisterUYVYImage() removes format registrations made by the
+% UYVY module from the list of supported formats.
+%
+% The format of the UnregisterUYVYImage method is:
+%
+% UnregisterUYVYImage(void)
+%
+*/
+ModuleExport void UnregisterUYVYImage(void)
+{
+ (void) UnregisterMagickInfo("PAL");
+ (void) UnregisterMagickInfo("UYVY");
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% W r i t e U Y V Y I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% WriteUYVYImage() writes an image to a file in the digital UYVY
+% format. This format, used by AccomWSD, is not dramatically higher quality
+% than the 12bit/pixel YUV format, but has better locality.
+%
+% The format of the WriteUYVYImage method is:
+%
+% MagickBooleanType WriteUYVYImage(const ImageInfo *image_info,
+% Image *image)
+%
+% A description of each parameter follows.
+%
+% o image_info: the image info.
+%
+% o image: The image.
+% Implicit assumption: number of columns is even.
+%
+*/
+static MagickBooleanType WriteUYVYImage(const ImageInfo *image_info,
+ Image *image)
+{
+ MagickPixelPacket
+ pixel;
+
+ Image
+ *uyvy_image;
+
+ long
+ y;
+
+ MagickBooleanType
+ full,
+ status;
+
+ register const PixelPacket
+ *p;
+
+ register long
+ x;
+
+ /*
+ Open output image file.
+ */
+ assert(image_info != (const ImageInfo *) NULL);
+ assert(image_info->signature == MagickSignature);
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ if ((image->columns % 2) != 0)
+ image->columns++;
+ status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
+ if (status == MagickFalse)
+ return(status);
+ /*
+ Accumulate two pixels, then output.
+ */
+ uyvy_image=CloneImage(image,0,0,MagickTrue,&image->exception);
+ if (uyvy_image == (Image *) NULL)
+ ThrowWriterException(ResourceLimitError,image->exception.reason);
+ (void) TransformImageColorspace(uyvy_image,YCbCrColorspace);
+ full=MagickFalse;
+ (void) ResetMagickMemory(&pixel,0,sizeof(MagickPixelPacket));
+ for (y=0; y < (long) image->rows; y++)
+ {
+ p=GetVirtualPixels(uyvy_image,0,y,image->columns,1,&image->exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ for (x=0; x < (long) image->columns; x++)
+ {
+ if (full != MagickFalse)
+ {
+ pixel.green=(pixel.green+p->green)/2;
+ pixel.blue=(pixel.blue+p->blue)/2;
+ (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.green));
+ (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.red));
+ (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.blue));
+ (void) WriteBlobByte(image,ScaleQuantumToChar(p->red));
+ }
+ pixel.red=(double) p->red;
+ pixel.green=(double) p->green;
+ pixel.blue=(double) p->blue;
+ full=full == MagickFalse ? MagickTrue : MagickFalse;
+ p++;
+ }
+ status=SetImageProgress(image,LoadImageTag,y,image->rows);
+ if (status == MagickFalse)
+ break;
+ }
+ uyvy_image=DestroyImage(uyvy_image);
+ (void) CloseBlob(image);
+ return(MagickTrue);
+}