Merge master; fix crash on new film.
[dcpomatic.git] / src / lib / image.h
index 7c118f338c84f0c52998dda9d814871354c90677..de03d0e3f60485a8d316deb00cef21ad80bc92f7 100644 (file)
@@ -21,8 +21,8 @@
  *  @brief A set of classes to describe video images.
  */
 
-#ifndef DVDOMATIC_IMAGE_H
-#define DVDOMATIC_IMAGE_H
+#ifndef DCPOMATIC_IMAGE_H
+#define DCPOMATIC_IMAGE_H
 
 #include <string>
 #include <boost/shared_ptr.hpp>
@@ -32,6 +32,7 @@ extern "C" {
 #include <libavfilter/avfilter.h>
 }
 #include "util.h"
+#include "ffmpeg_compatibility.h"
 
 class Scaler;
 class RGBFrameImage;
@@ -65,14 +66,18 @@ public:
        virtual int * stride () const = 0;
 
        /** @return Size of the image, in pixels */
-       virtual Size size () const = 0;
+       virtual libdcp::Size size () const = 0;
+
+       virtual bool aligned () const = 0;
 
        int components () const;
        int lines (int) const;
-       boost::shared_ptr<Image> scale_and_convert_to_rgb (Size, int, Scaler const *) const;
-       boost::shared_ptr<Image> scale (Size, Scaler const *) const;
-       boost::shared_ptr<Image> post_process (std::string) const;
-       void alpha_blend (boost::shared_ptr<Image> image, Position pos);
+
+       boost::shared_ptr<Image> scale_and_convert_to_rgb (libdcp::Size out_size, int padding, Scaler const * scaler, bool aligned) const;
+       boost::shared_ptr<Image> scale (libdcp::Size, Scaler const *, bool aligned) const;
+       boost::shared_ptr<Image> post_process (std::string, bool aligned) const;
+       void alpha_blend (boost::shared_ptr<const Image> image, Position pos);
+       boost::shared_ptr<Image> crop (Crop c, bool aligned) const;
        
        void make_black ();
 
@@ -83,7 +88,14 @@ public:
                return _pixel_format;
        }
 
+protected:
+       virtual void swap (Image &);
+       float bytes_per_pixel (int) const;
+
 private:
+       void yuv_16_black (uint16_t);
+       static uint16_t swap_16 (uint16_t);
+       
        AVPixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image
 };
 
@@ -99,10 +111,16 @@ public:
        uint8_t ** data () const;
        int * line_size () const;
        int * stride () const;
-       Size size () const;
+       libdcp::Size size () const;
+       bool aligned () const;
 
 private:
+       /* Not allowed */
+       FilterBufferImage (FilterBufferImage const &);
+       FilterBufferImage& operator= (FilterBufferImage const &);
+       
        AVFilterBufferRef* _buffer;
+       int* _line_size;
 };
 
 /** @class SimpleImage
@@ -111,40 +129,42 @@ private:
 class SimpleImage : public Image
 {
 public:
-       SimpleImage (AVPixelFormat, Size, boost::function<int (int, int const *)> rounder);
+       SimpleImage (AVPixelFormat, libdcp::Size, bool);
+       SimpleImage (SimpleImage const &);
+       SimpleImage (boost::shared_ptr<const Image>);
+       SimpleImage& operator= (SimpleImage const &);
        ~SimpleImage ();
 
        uint8_t ** data () const;
        int * line_size () const;
        int * stride () const;
-       Size size () const;
+       libdcp::Size size () const;
+       bool aligned () const;
+
+protected:
+       void allocate ();
+       void swap (SimpleImage &);
        
 private:
-       
-       Size _size; ///< size in pixels
+       libdcp::Size _size; ///< size in pixels
        uint8_t** _data; ///< array of pointers to components
        int* _line_size; ///< array of sizes of the data in each line, in pixels (without any alignment padding bytes)
        int* _stride; ///< array of strides for each line (including any alignment padding bytes)
+       bool _aligned;
 };
 
-/** @class AlignedImage
- *  @brief An image whose pixel data is padded so that rows always start on 32-byte boundaries.
- */
-class AlignedImage : public SimpleImage
+class RGBPlusAlphaImage : public SimpleImage
 {
 public:
-       AlignedImage (AVPixelFormat, Size);
-       AlignedImage (boost::shared_ptr<Image>);
-};
+       RGBPlusAlphaImage (boost::shared_ptr<const Image>);
+       ~RGBPlusAlphaImage ();
 
-/** @class CompactImage
- *  @brief An image whose pixel data is not padded, so rows may start at any pixel alignment.
- */
-class CompactImage : public SimpleImage
-{
-public:
-       CompactImage (AVPixelFormat, Size);
-       CompactImage (boost::shared_ptr<Image>);
+       uint8_t* alpha () const {
+               return _alpha;
+       }
+       
+private:
+       uint8_t* _alpha;
 };
 
 #endif