Fix lack of audio with trimmed DCPs.
[dcpomatic.git] / src / lib / image.h
index 30c8519e7ee8317a3cf78f4d2da8f594dc67f7d6..95e0de9dc2baa09b84d8edcb319e01e90fb25aa6 100644 (file)
@@ -49,7 +49,7 @@ class SimpleImage;
 class Image
 {
 public:
-       Image (PixelFormat p)
+       Image (AVPixelFormat p)
                : _pixel_format (p)
        {}
        
@@ -69,19 +69,28 @@ public:
 
        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 (Size out_size, int padding, Scaler const * scaler, bool aligned) const;
+       boost::shared_ptr<Image> scale (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 ();
+
+       void read_from_socket (boost::shared_ptr<Socket>);
+       void write_to_socket (boost::shared_ptr<Socket>) const;
        
-       PixelFormat pixel_format () const {
+       AVPixelFormat pixel_format () const {
                return _pixel_format;
        }
 
-private:
-       PixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image
+protected:
+       virtual void swap (Image &);
+       float bytes_per_pixel (int) const;
+
+private:       
+       AVPixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image
 };
 
 /** @class FilterBufferImage
@@ -90,7 +99,7 @@ private:
 class FilterBufferImage : public Image
 {
 public:
-       FilterBufferImage (PixelFormat, AVFilterBufferRef *);
+       FilterBufferImage (AVPixelFormat, AVFilterBufferRef *);
        ~FilterBufferImage ();
 
        uint8_t ** data () const;
@@ -99,6 +108,10 @@ public:
        Size size () const;
 
 private:
+       /* Not allowed */
+       FilterBufferImage (FilterBufferImage const &);
+       FilterBufferImage& operator= (FilterBufferImage const &);
+       
        AVFilterBufferRef* _buffer;
 };
 
@@ -108,56 +121,40 @@ private:
 class SimpleImage : public Image
 {
 public:
-       SimpleImage (PixelFormat, Size, boost::function<int (int)> rounder);
+       SimpleImage (AVPixelFormat, Size, bool);
+       SimpleImage (SimpleImage const &);
+       SimpleImage& operator= (SimpleImage const &);
        ~SimpleImage ();
 
        uint8_t ** data () const;
        int * line_size () const;
        int * stride () const;
        Size size () const;
+
+protected:
+       void allocate ();
+       void swap (SimpleImage &);
        
 private:
-       
        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 : public SimpleImage
-{
-public:
-       AlignedImage (PixelFormat, Size);
-};
-
-class CompactImage : public SimpleImage
+class RGBPlusAlphaImage : public SimpleImage
 {
 public:
-       CompactImage (PixelFormat, Size);
-       CompactImage (boost::shared_ptr<Image>);
-};
-
-/** @class RGBFrameImage
- *  @brief An RGB image that is held within an AVFrame.
- */
-class RGBFrameImage : public Image
-{
-public:
-       RGBFrameImage (Size);
-       ~RGBFrameImage ();
+       RGBPlusAlphaImage (boost::shared_ptr<const Image>);
+       ~RGBPlusAlphaImage ();
 
-       uint8_t ** data () const;
-       int * line_size () const;
-       int * stride () const;
-       Size size () const;
-       AVFrame * frame () const {
-               return _frame;
+       uint8_t* alpha () const {
+               return _alpha;
        }
-
+       
 private:
-       Size _size;
-       AVFrame* _frame;
-       uint8_t* _data;
+       uint8_t* _alpha;
 };
 
 #endif