]> granicus.if.org Git - imagemagick/blobdiff - coders/mpeg.c
(no commit message)
[imagemagick] / coders / mpeg.c
index 780a3e10b6e5c8b356bab1fc6d9d44759f50c962..c733d262f881a7df4708fdc9a3317ce7c22bf3d9 100644 (file)
@@ -17,7 +17,7 @@
 %                                 July 1999                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2011 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  %
 /*
   Include declarations.
 */
-#include "magick/studio.h"
-#include "magick/blob.h"
-#include "magick/blob-private.h"
-#include "magick/constitute.h"
-#include "magick/delegate.h"
-#include "magick/exception.h"
-#include "magick/exception-private.h"
-#include "magick/geometry.h"
-#include "magick/image.h"
-#include "magick/image-private.h"
-#include "magick/layer.h"
-#include "magick/list.h"
-#include "magick/log.h"
-#include "magick/magick.h"
-#include "magick/memory_.h"
-#include "magick/resource_.h"
-#include "magick/quantum-private.h"
-#include "magick/static.h"
-#include "magick/string_.h"
-#include "magick/module.h"
-#include "magick/transform.h"
-#include "magick/utility.h"
+#include "MagickCore/studio.h"
+#include "MagickCore/blob.h"
+#include "MagickCore/blob-private.h"
+#include "MagickCore/constitute.h"
+#include "MagickCore/delegate.h"
+#include "MagickCore/exception.h"
+#include "MagickCore/exception-private.h"
+#include "MagickCore/geometry.h"
+#include "MagickCore/image.h"
+#include "MagickCore/image-private.h"
+#include "MagickCore/layer.h"
+#include "MagickCore/list.h"
+#include "MagickCore/log.h"
+#include "MagickCore/magick.h"
+#include "MagickCore/memory_.h"
+#include "MagickCore/resource_.h"
+#include "MagickCore/quantum-private.h"
+#include "MagickCore/static.h"
+#include "MagickCore/string_.h"
+#include "MagickCore/module.h"
+#include "MagickCore/transform.h"
+#include "MagickCore/utility.h"
 \f
 /*
   Forward declarations.
@@ -72,6 +72,40 @@ static MagickBooleanType
 %                                                                             %
 %                                                                             %
 %                                                                             %
+%   I s A V I                                                                 %
+%                                                                             %
+%                                                                             %
+%                                                                             %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%  IsAVI() returns MagickTrue if the image format type, identified by the
+%  magick string, is Audio/Video Interleaved file format.
+%
+%  The format of the IsAVI method is:
+%
+%      size_t IsAVI(const unsigned char *magick,const size_t length)
+%
+%  A description of each parameter follows:
+%
+%    o magick: compare image format pattern against these bytes.
+%
+%    o length: Specifies the length of the magick string.
+%
+*/
+static MagickBooleanType IsAVI(const unsigned char *magick,const size_t length)
+{
+  if (length < 4)
+    return(MagickFalse);
+  if (memcmp(magick,"RIFF",4) == 0)
+    return(MagickTrue);
+  return(MagickFalse);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                                                                             %
+%                                                                             %
+%                                                                             %
 %   I s M P E G                                                               %
 %                                                                             %
 %                                                                             %
@@ -169,7 +203,7 @@ static Image *ReadMPEGImage(const ImageInfo *image_info,
   image=AcquireImage(image_info);
   (void) InvokeDelegate(read_info,image,"mpeg:decode",(char *) NULL,exception);
   image=DestroyImage(image);
-  (void) FormatMagickString(read_info->filename,MaxTextExtent,"%s.%s",
+  (void) FormatLocaleString(read_info->filename,MaxTextExtent,"%s.%s",
     read_info->unique,ReadMPEGIntermediateFormat);
   images=ReadImage(read_info,exception);
   (void) RelinquishUniqueFileResource(read_info->filename);
@@ -197,19 +231,20 @@ static Image *ReadMPEGImage(const ImageInfo *image_info,
 %
 %  The format of the RegisterMPEGImage method is:
 %
-%      unsigned long RegisterMPEGImage(void)
+%      size_t RegisterMPEGImage(void)
 %
 */
-ModuleExport unsigned long RegisterMPEGImage(void)
+ModuleExport size_t RegisterMPEGImage(void)
 {
   MagickInfo
     *entry;
 
   entry=SetMagickInfo("AVI");
-  entry->decoder=(DecodeImageHandler *) ReadAVIImage;
+  entry->decoder=(DecodeImageHandler *) ReadMPEGImage;
   entry->magick=(IsImageFormatHandler *) IsAVI;
+  entry->blob_support=MagickFalse;
   entry->description=ConstantString("Microsoft Audio/Visual Interleaved");
-  entry->module=ConstantString("AVI");
+  entry->module=ConstantString("MPEG");
   (void) RegisterMagickInfo(entry);
   entry=SetMagickInfo("MOV");
   entry->decoder=(DecodeImageHandler *) ReadMPEGImage;
@@ -444,19 +479,17 @@ static MagickBooleanType WriteMPEGImage(const ImageInfo *image_info,
   register Image
     *p;
 
-  register long
+  register ssize_t
     i;
 
   size_t
-    length;
+    count,
+    length,
+    scene;
 
   unsigned char
     *blob;
 
-  unsigned long
-    count,
-    scene;
-
   /*
     Open output image file.
   */
@@ -479,7 +512,7 @@ static MagickBooleanType WriteMPEGImage(const ImageInfo *image_info,
   file=AcquireUniqueFileResource(basename);
   if (file != -1)
     file=close(file)-1;
-  (void) FormatMagickString(coalesce_image->filename,MaxTextExtent,"%s",
+  (void) FormatLocaleString(coalesce_image->filename,MaxTextExtent,"%s",
     basename);
   count=0;
   write_info=CloneImageInfo(image_info);
@@ -492,7 +525,7 @@ static MagickBooleanType WriteMPEGImage(const ImageInfo *image_info,
     length=0;
     scene=p->scene;
     delay=100.0*p->delay/MagickMax(1.0*p->ticks_per_second,1.0);
-    for (i=0; i < (long) MagickMax((1.0*delay+1.0)/3.0,1.0); i++)
+    for (i=0; i < (ssize_t) MagickMax((1.0*delay+1.0)/3.0,1.0); i++)
     {
       p->scene=count;
       count++;
@@ -504,16 +537,17 @@ static MagickBooleanType WriteMPEGImage(const ImageInfo *image_info,
           Image
             *frame;
 
-          (void) FormatMagickString(p->filename,MaxTextExtent,"%s%lu.%s",
-            basename,p->scene,WriteMPEGIntermediateFormat);
-          (void) FormatMagickString(filename,MaxTextExtent,"%s%lu.%s",
-            basename,p->scene,WriteMPEGIntermediateFormat);
-          (void) FormatMagickString(previous_image,MaxTextExtent,
-            "%s%lu.%s",basename,p->scene,WriteMPEGIntermediateFormat);
+          (void) FormatLocaleString(p->filename,MaxTextExtent,"%s%.20g.%s",
+            basename,(double) p->scene,WriteMPEGIntermediateFormat);
+          (void) FormatLocaleString(filename,MaxTextExtent,"%s%.20g.%s",
+            basename,(double) p->scene,WriteMPEGIntermediateFormat);
+          (void) FormatLocaleString(previous_image,MaxTextExtent,
+            "%s%.20g.%s",basename,(double) p->scene,
+            WriteMPEGIntermediateFormat);
           frame=CloneImage(p,0,0,MagickTrue,&p->exception);
           if (frame == (Image *) NULL)
             break;
-          status=WriteImage(write_info,frame);
+          status=WriteImage(write_info,frame,&image->exception);
           frame=DestroyImage(frame);
           break;
         }
@@ -524,8 +558,8 @@ static MagickBooleanType WriteMPEGImage(const ImageInfo *image_info,
         }
         default:
         {
-          (void) FormatMagickString(filename,MaxTextExtent,"%s%lu.%s",
-            basename,p->scene,WriteMPEGIntermediateFormat);
+          (void) FormatLocaleString(filename,MaxTextExtent,"%s%.20g.%s",
+            basename,(double) p->scene,WriteMPEGIntermediateFormat);
           if (length > 0)
             status=BlobToFile(filename,blob,length,&image->exception);
           break;
@@ -535,14 +569,13 @@ static MagickBooleanType WriteMPEGImage(const ImageInfo *image_info,
         {
           if (status != MagickFalse)
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "%lu. Wrote %s file for scene %lu:",i,WriteMPEGIntermediateFormat,
-              p->scene);
+              "%.20g. Wrote %s file for scene %.20g:",(double) i,
+              WriteMPEGIntermediateFormat,(double) p->scene);
           else
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "%lu. Failed to write %s file for scene %lu:",i,
-              WriteMPEGIntermediateFormat,p->scene);
-          (void) LogMagickEvent(CoderEvent,GetMagickModule(),"%s",
-            filename);
+              "%.20g. Failed to write %s file for scene %.20g:",(double) i,
+              WriteMPEGIntermediateFormat,(double) p->scene);
+          (void) LogMagickEvent(CoderEvent,GetMagickModule(),"%s",filename);
         }
     }
     p->scene=scene;
@@ -562,7 +595,7 @@ static MagickBooleanType WriteMPEGImage(const ImageInfo *image_info,
     (void) CopyMagickString(coalesce_image->magick,image->magick,MaxTextExtent);
   status=InvokeDelegate(write_info,coalesce_image,(char *) NULL,"mpeg:encode",
     &image->exception);
-  (void) FormatMagickString(write_info->filename,MaxTextExtent,"%s.%s",
+  (void) FormatLocaleString(write_info->filename,MaxTextExtent,"%s.%s",
     write_info->unique,coalesce_image->magick);
   status=CopyDelegateFile(write_info->filename,image->filename);
   (void) RelinquishUniqueFileResource(write_info->filename);
@@ -574,10 +607,10 @@ static MagickBooleanType WriteMPEGImage(const ImageInfo *image_info,
   for (p=coalesce_image; p != (Image *) NULL; p=GetNextImageInList(p))
   {
     delay=100.0*p->delay/MagickMax(1.0*p->ticks_per_second,1.0);
-    for (i=0; i < (long) MagickMax((1.0*delay+1.0)/3.0,1.0); i++)
+    for (i=0; i < (ssize_t) MagickMax((1.0*delay+1.0)/3.0,1.0); i++)
     {
-      (void) FormatMagickString(p->filename,MaxTextExtent,"%s%lu.%s",
-        basename,count++,WriteMPEGIntermediateFormat);
+      (void) FormatLocaleString(p->filename,MaxTextExtent,"%s%.20g.%s",
+        basename,(double) count++,WriteMPEGIntermediateFormat);
       (void) RelinquishUniqueFileResource(p->filename);
     }
     (void) CopyMagickString(p->filename,image_info->filename,MaxTextExtent);