13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                        U   U  Y   Y  V   V  Y   Y                           %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                        U   U   Y Y   V   V   Y Y                            %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                        U   U    Y    V   V    Y                             %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                        U   U    Y     V V     Y                             %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                         UUU     Y      V      Y                             %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%            Read/Write 16bit/pixel Interleaved YUV Image Format              %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Software Design                                %
16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                   Cristy                                    %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                 July 1992                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colorspace.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h"
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
673a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  WriteUYVYImage(const ImageInfo *,Image *,ExceptionInfo *);
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d U Y V Y I m a g e                                                 %
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadUYVYImage() reads an image in the UYVY format and returns it.  It
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  allocates the memory necessary for the new Image structure and returns a
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pointer to the new image.
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadUYVYImage method is:
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *ReadUYVYImage(const ImageInfo *image_info,
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadUYVYImage(const ImageInfo *image_info,
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image;
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
105bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1084c08aed51c5899665ade97263692328eea4af106cristy  register Quantum
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
111c6da28e61bb609d2b2cfdcc7752106c973415edbcristy  ssize_t
112c6da28e61bb609d2b2cfdcc7752106c973415edbcristy    y;
113c6da28e61bb609d2b2cfdcc7752106c973415edbcristy
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    u,
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    v,
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y1,
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y2;
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open image file.
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
124e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
129e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
1309950d57e1124b73f684fb5946e206994cefda628cristy  image=AcquireImage(image_info,exception);
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((image->columns == 0) || (image->rows == 0))
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(OptionError,"MustSpecifyImageSize");
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((image->columns % 2) != 0)
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image->columns++;
135151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(image->filename,image_info->filename,MagickPathExtent);
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Image *) NULL);
139d4297029a6faeb030aa4da519db921992dda664fcristy  if (DiscardBlobBytes(image,image->offset) == MagickFalse)
140d4297029a6faeb030aa4da519db921992dda664fcristy    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
141d4297029a6faeb030aa4da519db921992dda664fcristy      image->filename);
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->depth=8;
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->ping != MagickFalse)
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CloseBlob(image);
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(GetFirstImageInList(image));
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
148acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  status=SetImageExtent(image,image->columns,image->rows,exception);
149acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  if (status == MagickFalse)
150acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy    return(DestroyImageList(image));
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Accumulate UYVY, then unpack into two pixels.
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
154bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; y++)
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
157acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
159bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) (image->columns >> 1); x++)
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      u=(unsigned char) ReadBlobByte(image);
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y1=(unsigned char) ReadBlobByte(image);
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      v=(unsigned char) ReadBlobByte(image);
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      y2=(unsigned char) ReadBlobByte(image);
1654c08aed51c5899665ade97263692328eea4af106cristy      SetPixelRed(image,ScaleCharToQuantum(y1),q);
1664c08aed51c5899665ade97263692328eea4af106cristy      SetPixelGreen(image,ScaleCharToQuantum(u),q);
1674c08aed51c5899665ade97263692328eea4af106cristy      SetPixelBlue(image,ScaleCharToQuantum(v),q);
168ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
1694c08aed51c5899665ade97263692328eea4af106cristy      SetPixelRed(image,ScaleCharToQuantum(y2),q);
1704c08aed51c5899665ade97263692328eea4af106cristy      SetPixelGreen(image,ScaleCharToQuantum(u),q);
1714c08aed51c5899665ade97263692328eea4af106cristy      SetPixelBlue(image,ScaleCharToQuantum(v),q);
172ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
176cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
177c6da28e61bb609d2b2cfdcc7752106c973415edbcristy      image->rows);
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
181e2c4f18a7274c0c5c6231a2f3d73741a87d583facristy  SetImageColorspace(image,YCbCrColorspace,exception);
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (EOFBlob(image) != MagickFalse)
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->filename);
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetFirstImageInList(image));
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r U Y V Y I m a g e                                         %
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterUYVYImage() adds attributes for the UYVY image format to
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The attributes include the image format
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterUYVYImage method is:
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
209bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t RegisterUYVYImage(void)
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
212bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterUYVYImage(void)
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21706b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("UYVY","PAL","16bit/pixel interleaved YUV");
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadUYVYImage;
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WriteUYVYImage;
22008e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
22108e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags|=CoderRawSupportFlag;
22208e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags|=CoderEndianSupportFlag;
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
22406b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("UYVY","UYVY","16bit/pixel interleaved YUV");
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadUYVYImage;
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WriteUYVYImage;
22708e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
22808e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags|=CoderRawSupportFlag;
22908e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags|=CoderEndianSupportFlag;
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r U Y V Y I m a g e                                     %
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterUYVYImage() removes format registrations made by the
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UYVY module from the list of supported formats.
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterUYVYImage method is:
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterUYVYImage(void)
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterUYVYImage(void)
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("PAL");
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("UYVY");
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   W r i t e U Y V Y I m a g e                                               %
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WriteUYVYImage() writes an image to a file in the digital UYVY
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  format.  This format, used by AccomWSD, is not dramatically higher quality
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  than the 12bit/pixel YUV format, but has better locality.
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the WriteUYVYImage method is:
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType WriteUYVYImage(const ImageInfo *image_info,
2773a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy%        Image *image,ExceptionInfo *exception)
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2833a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy%    o image:  The image.  Implicit assumption: number of columns is even.
2843a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy%
2853a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy%    o exception: return any errors or warnings in this structure.
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteUYVYImage(const ImageInfo *image_info,
2893a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  Image *image,ExceptionInfo *exception)
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2914c08aed51c5899665ade97263692328eea4af106cristy  PixelInfo
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pixel;
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *uyvy_image;
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    full,
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3014c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
304bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
307c6da28e61bb609d2b2cfdcc7752106c973415edbcristy  ssize_t
308c6da28e61bb609d2b2cfdcc7752106c973415edbcristy    y;
309c6da28e61bb609d2b2cfdcc7752106c973415edbcristy
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open output image file.
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
314e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
316e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((image->columns % 2) != 0)
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image->columns++;
3213a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  assert(exception != (ExceptionInfo *) NULL);
322e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
3233a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(status);
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Accumulate two pixels, then output.
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3293a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  uyvy_image=CloneImage(image,0,0,MagickTrue,exception);
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (uyvy_image == (Image *) NULL)
3313a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy    return(MagickFalse);
332e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy  (void) TransformImageColorspace(uyvy_image,YCbCrColorspace,exception);
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  full=MagickFalse;
3344c08aed51c5899665ade97263692328eea4af106cristy  (void) ResetMagickMemory(&pixel,0,sizeof(PixelInfo));
335bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; y++)
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3373a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy    p=GetVirtualPixels(uyvy_image,0,y,image->columns,1,exception);
3384c08aed51c5899665ade97263692328eea4af106cristy    if (p == (const Quantum *) NULL)
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
340bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) image->columns; x++)
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (full != MagickFalse)
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3444c08aed51c5899665ade97263692328eea4af106cristy          pixel.green=(pixel.green+GetPixelGreen(uyvy_image,p))/2;
3454c08aed51c5899665ade97263692328eea4af106cristy          pixel.blue=(pixel.blue+GetPixelBlue(uyvy_image,p))/2;
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.green));
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.red));
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobByte(image,ScaleQuantumToChar((Quantum) pixel.blue));
349c6da28e61bb609d2b2cfdcc7752106c973415edbcristy          (void) WriteBlobByte(image,ScaleQuantumToChar(
3504c08aed51c5899665ade97263692328eea4af106cristy            GetPixelRed(uyvy_image,p)));
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3524c08aed51c5899665ade97263692328eea4af106cristy      pixel.red=(double) GetPixelRed(uyvy_image,p);
3534c08aed51c5899665ade97263692328eea4af106cristy      pixel.green=(double) GetPixelGreen(uyvy_image,p);
3544c08aed51c5899665ade97263692328eea4af106cristy      pixel.blue=(double) GetPixelBlue(uyvy_image,p);
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      full=full == MagickFalse ? MagickTrue : MagickFalse;
356ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      p+=GetPixelChannels(uyvy_image);
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
358cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
359c6da28e61bb609d2b2cfdcc7752106c973415edbcristy      image->rows);
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  uyvy_image=DestroyImage(uyvy_image);
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
367