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;
+
+ 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 ();
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
};
-/** @class FilterBufferImage
- * @brief An Image that is held in an AVFilterBufferRef.
+/** @class FrameImage
+ * @brief An Image that is held in an AVFrame.
*/
-class FilterBufferImage : public Image
+class FrameImage : public Image
{
public:
- FilterBufferImage (AVPixelFormat, AVFilterBufferRef *);
- ~FilterBufferImage ();
+ FrameImage (AVFrame *);
+ ~FrameImage ();
uint8_t ** data () const;
int * line_size () const;
int * stride () const;
- Size size () const;
+ libdcp::Size size () const;
+ bool aligned () const;
private:
- AVFilterBufferRef* _buffer;
+ /* Not allowed */
+ FrameImage (FrameImage const &);
+ FrameImage& operator= (FrameImage const &);
+
+ AVFrame* _frame;
+ int* _line_size;
};
/** @class SimpleImage
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)
-};
-
-/** @class AlignedImage
- * @brief An image whose pixel data is padded so that rows always start on 32-byte boundaries.
- */
-class AlignedImage : public SimpleImage
-{
-public:
- AlignedImage (AVPixelFormat, Size);
- AlignedImage (boost::shared_ptr<const Image>);
-};
-
-/** @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<const Image>);
+ bool _aligned;
};
class RGBPlusAlphaImage : public SimpleImage