X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fimage.h;h=5ca3f337c82cc15df66b8779e20ece84771b5d6f;hb=d4024b9f794823a2808724ae9fae74195f1a0824;hp=d10bcae9efcaf83412ec6795c1d0c90706f50013;hpb=cc4a67b7eb8ecaed076e261960848f70e3e741af;p=dcpomatic.git diff --git a/src/lib/image.h b/src/lib/image.h index d10bcae9e..5ca3f337c 100644 --- a/src/lib/image.h +++ b/src/lib/image.h @@ -26,15 +26,17 @@ #include #include +#include extern "C" { #include #include } #include "util.h" +#include "ffmpeg_compatibility.h" class Scaler; class RGBFrameImage; -class PostProcessImage; +class SimpleImage; /** @class Image * @brief Parent class for wrappers of some image, in some format, that @@ -48,7 +50,7 @@ class PostProcessImage; class Image { public: - Image (PixelFormat p) + Image (AVPixelFormat p) : _pixel_format (p) {} @@ -57,26 +59,39 @@ public: /** @return Array of pointers to arrays of the component data */ virtual uint8_t ** data () const = 0; - /** @return Array of sizes of each line, in pixels */ + /** @return Array of sizes of the data in each line, in bytes (without any alignment padding bytes) */ virtual int * line_size () const = 0; + /** @return Array of strides for each line (including any alignment padding bytes) */ + virtual int * stride () const = 0; + /** @return Size of the image, in pixels */ - virtual Size size () const = 0; + virtual libdcp::Size size () 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; + + 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 (); + + void read_from_socket (boost::shared_ptr); + void write_to_socket (boost::shared_ptr) 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 @@ -85,14 +100,19 @@ private: class FilterBufferImage : public Image { public: - FilterBufferImage (PixelFormat, AVFilterBufferRef *); + FilterBufferImage (AVPixelFormat, AVFilterBufferRef *); ~FilterBufferImage (); uint8_t ** data () const; int * line_size () const; - Size size () const; + int * stride () const; + libdcp::Size size () const; private: + /* Not allowed */ + FilterBufferImage (FilterBufferImage const &); + FilterBufferImage& operator= (FilterBufferImage const &); + AVFilterBufferRef* _buffer; }; @@ -102,58 +122,40 @@ private: class SimpleImage : public Image { public: - SimpleImage (PixelFormat, Size); + SimpleImage (AVPixelFormat, libdcp::Size, bool); + SimpleImage (SimpleImage const &); + SimpleImage& operator= (SimpleImage const &); ~SimpleImage (); uint8_t ** data () const; int * line_size () const; - Size size () const; + int * stride () const; + libdcp::Size size () 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 widths of each line, in bytes + 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 RGBFrameImage - * @brief An RGB image that is held within an AVFrame. - */ -class RGBFrameImage : public Image +class RGBPlusAlphaImage : public SimpleImage { public: - RGBFrameImage (Size); - ~RGBFrameImage (); + RGBPlusAlphaImage (boost::shared_ptr); + ~RGBPlusAlphaImage (); - uint8_t ** data () const; - int * line_size () const; - Size size () const; - AVFrame * frame () const { - return _frame; + uint8_t* alpha () const { + return _alpha; } - -private: - Size _size; - AVFrame* _frame; - uint8_t* _data; -}; - -/** @class PostProcessImage - * @brief An image that is the result of an FFmpeg post-processing run. - */ -class PostProcessImage : public Image -{ -public: - PostProcessImage (PixelFormat, Size); - ~PostProcessImage (); - - uint8_t ** data () const; - int * line_size () const; - Size size () const; - + private: - Size _size; - uint8_t** _data; - int* _line_size; + uint8_t* _alpha; }; #endif