X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fimage.h;h=70dacfaee4bd9e4bcd24bdf8ba4241916b1941e4;hb=744d20add3a3be77b9424fd73e9dcd8b146fc23a;hp=69f3a883722b3f10a4c8e609ee4bf35834b8a01e;hpb=05c37b9bb09f7bfa4c2ec8ea6b3fa4a83d0fec20;p=dcpomatic.git diff --git a/src/lib/image.h b/src/lib/image.h index 69f3a8837..70dacfaee 100644 --- a/src/lib/image.h +++ b/src/lib/image.h @@ -34,7 +34,6 @@ extern "C" { #include "util.h" class Scaler; -class RGBFrameImage; class SimpleImage; /** @class Image @@ -65,14 +64,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 scale_and_convert_to_rgb (Size, int, Scaler const *) const; - boost::shared_ptr scale (Size, Scaler const *) const; - boost::shared_ptr post_process (std::string) const; - void alpha_blend (boost::shared_ptr image, Position pos); + + boost::shared_ptr scale_and_convert_to_rgb (libdcp::Size out_size, int padding, Scaler const * scaler, bool aligned) const; + boost::shared_ptr scale (libdcp::Size, Scaler const *, bool aligned) const; + boost::shared_ptr post_process (std::string, bool aligned) const; + void alpha_blend (boost::shared_ptr image, Position pos); + boost::shared_ptr crop (Crop c, bool aligned) const; void make_black (); @@ -83,26 +86,17 @@ public: return _pixel_format; } -private: - AVPixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image -}; +protected: + virtual void swap (Image &); + float bytes_per_pixel (int) const; -/** @class FilterBufferImage - * @brief An Image that is held in an AVFilterBufferRef. - */ -class FilterBufferImage : public Image -{ -public: - FilterBufferImage (AVPixelFormat, AVFilterBufferRef *); - ~FilterBufferImage (); - - uint8_t ** data () const; - int * line_size () const; - int * stride () const; - Size size () const; + friend class pixel_formats_test; private: - AVFilterBufferRef* _buffer; + 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 SimpleImage @@ -111,34 +105,43 @@ private: class SimpleImage : public Image { public: - SimpleImage (AVPixelFormat, Size, boost::function rounder); + SimpleImage (AVPixelFormat, libdcp::Size, bool); + SimpleImage (AVFrame *); + SimpleImage (SimpleImage const &); + SimpleImage (boost::shared_ptr); + 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 : public SimpleImage +class RGBPlusAlphaImage : public SimpleImage { public: - AlignedImage (AVPixelFormat, Size); - AlignedImage (boost::shared_ptr); -}; + RGBPlusAlphaImage (boost::shared_ptr); + ~RGBPlusAlphaImage (); -class CompactImage : public SimpleImage -{ -public: - CompactImage (AVPixelFormat, Size); - CompactImage (boost::shared_ptr); + uint8_t* alpha () const { + return _alpha; + } + +private: + uint8_t* _alpha; }; #endif