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