]> granicus.if.org Git - imagemagick/blobdiff - coders/yuv.c
...
[imagemagick] / coders / yuv.c
index a0dc1aff178de211b85b583b567c3999d7d7dff5..6ba57ecefe73114db39e54d86f60ddb86d1dbfe6 100644 (file)
 %            Read/Write Raw CCIR 601 4:1:1 or 4:2:2 Image Format              %
 %                                                                             %
 %                              Software Design                                %
-%                                John Cristy                                  %
+%                                   Cristy                                    %
 %                                 July 1992                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2017 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  %
@@ -135,15 +135,18 @@ static Image *ReadYUVImage(const ImageInfo *image_info,ExceptionInfo *exception)
     Allocate image structure.
   */
   assert(image_info != (const ImageInfo *) NULL);
-  assert(image_info->signature == MagickSignature);
+  assert(image_info->signature == MagickCoreSignature);
   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);
+  assert(exception->signature == MagickCoreSignature);
+  image=AcquireImage(image_info,exception);
   if ((image->columns == 0) || (image->rows == 0))
     ThrowReaderException(OptionError,"MustSpecifyImageSize");
+  status=SetImageExtent(image,image->columns,image->rows,exception);
+  if (status == MagickFalse)
+    return(DestroyImageList(image));
   quantum=image->depth <= 8 ? 1 : 2;
   interlace=image_info->interlace;
   horizontal_factor=2;
@@ -194,14 +197,15 @@ static Image *ReadYUVImage(const ImageInfo *image_info,ExceptionInfo *exception)
     scanline=(unsigned char *) AcquireQuantumMemory((size_t) 2UL*
       image->columns+2UL,quantum*sizeof(*scanline));
   else
-    scanline=(unsigned char *) AcquireQuantumMemory((size_t) image->columns,
+    scanline=(unsigned char *) AcquireQuantumMemory(image->columns,
       quantum*sizeof(*scanline));
   if (scanline == (unsigned char *) NULL)
     ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
   do
   {
-    chroma_image=CloneImage(image,image->columns/horizontal_factor,
-      image->rows/vertical_factor,MagickTrue,exception);
+    chroma_image=CloneImage(image,(image->columns+horizontal_factor-1)/
+      horizontal_factor,(image->rows+vertical_factor-1)/vertical_factor,
+      MagickTrue,exception);
     if (chroma_image == (Image *) NULL)
       ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
     /*
@@ -210,6 +214,9 @@ static Image *ReadYUVImage(const ImageInfo *image_info,ExceptionInfo *exception)
     if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0))
       if (image->scene >= (image_info->scene+image_info->number_scenes-1))
         break;
+    status=SetImageExtent(image,image->columns,image->rows,exception);
+    if (status == MagickFalse)
+      return(DestroyImageList(image));
     if (interlace == PartitionInterlace)
       {
         AppendImageFormat("Y",image->filename);
@@ -391,7 +398,7 @@ static Image *ReadYUVImage(const ImageInfo *image_info,ExceptionInfo *exception)
       Scale image.
     */
     resize_image=ResizeImage(chroma_image,image->columns,image->rows,
-      TriangleFilter,1.0,exception);
+      TriangleFilter,exception);
     chroma_image=DestroyImage(chroma_image);
     if (resize_image == (Image *) NULL)
       ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
@@ -399,7 +406,7 @@ static Image *ReadYUVImage(const ImageInfo *image_info,ExceptionInfo *exception)
     {
       q=GetAuthenticPixels(image,0,y,image->columns,1,exception);
       chroma_pixels=GetVirtualPixels(resize_image,0,y,resize_image->columns,1,
-        &resize_image->exception);
+        exception);
       if ((q == (Quantum *) NULL) ||
           (chroma_pixels == (const Quantum *) NULL))
         break;
@@ -414,10 +421,10 @@ static Image *ReadYUVImage(const ImageInfo *image_info,ExceptionInfo *exception)
         break;
     }
     resize_image=DestroyImage(resize_image);
-    image->colorspace=YCbCrColorspace;
+    SetImageColorspace(image,YCbCrColorspace,exception);
     if (interlace == PartitionInterlace)
       (void) CopyMagickString(image->filename,image_info->filename,
-        MaxTextExtent);
+        MagickPathExtent);
     if (EOFBlob(image) != MagickFalse)
       {
         ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
@@ -439,7 +446,7 @@ static Image *ReadYUVImage(const ImageInfo *image_info,ExceptionInfo *exception)
         /*
           Allocate next image structure.
         */
-        AcquireNextImage(image_info,image);
+        AcquireNextImage(image_info,image,exception);
         if (GetNextImageInList(image) == (Image *) NULL)
           {
             image=DestroyImageList(image);
@@ -485,13 +492,11 @@ ModuleExport size_t RegisterYUVImage(void)
   MagickInfo
     *entry;
 
-  entry=SetMagickInfo("YUV");
+  entry=AcquireMagickInfo("YUV","YUV","CCIR 601 4:1:1 or 4:2:2");
   entry->decoder=(DecodeImageHandler *) ReadYUVImage;
   entry->encoder=(EncodeImageHandler *) WriteYUVImage;
-  entry->adjoin=MagickFalse;
-  entry->raw=MagickTrue;
-  entry->description=ConstantString("CCIR 601 4:1:1 or 4:2:2");
-  entry->module=ConstantString("YUV");
+  entry->flags^=CoderAdjoinFlag;
+  entry->flags|=CoderRawSupportFlag;
   (void) RegisterMagickInfo(entry);
   return(MagickImageCoderSignature);
 }
@@ -583,12 +588,12 @@ static MagickBooleanType WriteYUVImage(const ImageInfo *image_info,Image *image,
     y;
 
   assert(image_info != (const ImageInfo *) NULL);
-  assert(image_info->signature == MagickSignature);
+  assert(image_info->signature == MagickCoreSignature);
   assert(image != (Image *) NULL);
-  assert(image->signature == MagickSignature);
+  assert(image->signature == MagickCoreSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  quantum=image->depth <= 8 ? 1 : 2;
+  quantum=(size_t) (image->depth <= 8 ? 1 : 2);
   interlace=image->interlace;
   horizontal_factor=2;
   vertical_factor=2;
@@ -638,27 +643,27 @@ static MagickBooleanType WriteYUVImage(const ImageInfo *image_info,Image *image,
     /*
       Sample image to an even width and height, if necessary.
     */
-    image->depth=quantum == 1 ? 8 : 16;
+    image->depth=(size_t) (quantum == 1 ? 8 : 16);
     width=image->columns+(image->columns & (horizontal_factor-1));
     height=image->rows+(image->rows & (vertical_factor-1));
-    yuv_image=ResizeImage(image,width,height,TriangleFilter,1.0,exception);
+    yuv_image=ResizeImage(image,width,height,TriangleFilter,exception);
     if (yuv_image == (Image *) NULL)
       {
         (void) CloseBlob(image);
         return(MagickFalse);
       }
-    (void) TransformImageColorspace(yuv_image,YCbCrColorspace);
+    (void) TransformImageColorspace(yuv_image,YCbCrColorspace,exception);
     /*
       Downsample image.
     */
     chroma_image=ResizeImage(image,width/horizontal_factor,
-      height/vertical_factor,TriangleFilter,1.0,exception);
+      height/vertical_factor,TriangleFilter,exception);
     if (chroma_image == (Image *) NULL)
       {
         (void) CloseBlob(image);
         return(MagickFalse);
       }
-    (void) TransformImageColorspace(chroma_image,YCbCrColorspace);
+    (void) TransformImageColorspace(chroma_image,YCbCrColorspace,exception);
     if (interlace == NoInterlace)
       {
         /*
@@ -673,7 +678,7 @@ static MagickBooleanType WriteYUVImage(const ImageInfo *image_info,Image *image,
             exception);
           if (s == (const Quantum *) NULL)
             break;
-          for (x=0; x < (ssize_t) yuv_image->columns; x++)
+          for (x=0; x < (ssize_t) yuv_image->columns; x+=2)
           {
             if (quantum == 1)
               {
@@ -701,7 +706,6 @@ static MagickBooleanType WriteYUVImage(const ImageInfo *image_info,Image *image,
               }
             p+=GetPixelChannels(yuv_image);
             s++;
-            x++;
           }
           if (image->previous == (Image *) NULL)
             {
@@ -820,7 +824,7 @@ static MagickBooleanType WriteYUVImage(const ImageInfo *image_info,Image *image,
     chroma_image=DestroyImage(chroma_image);
     if (interlace == PartitionInterlace)
       (void) CopyMagickString(image->filename,image_info->filename,
-        MaxTextExtent);
+        MagickPathExtent);
     if (GetNextImageInList(image) == (Image *) NULL)
       break;
     image=SyncNextImageInList(image);