X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fimage.h;h=3220a23b4adba6b42632edc4df3355898516d180;hb=a4c19a34244aeaf183c25878933b570fc5c0ee34;hp=b2b9872792a3815de37a86507203419279edb1ff;hpb=b996eb8276dc4645745540190c9a2f5e2c875c0c;p=dcpomatic.git diff --git a/src/lib/image.h b/src/lib/image.h index b2b987279..3220a23b4 100644 --- a/src/lib/image.h +++ b/src/lib/image.h @@ -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 #include @@ -31,50 +31,41 @@ extern "C" { #include #include } +#include #include "util.h" +#include "position.h" class Scaler; -class RGBFrameImage; -class SimpleImage; -/** @class Image - * @brief Parent class for wrappers of some image, in some format, that - * can present a set of components and a size in pixels. - * - * This class also has some conversion / processing methods. - * - * The main point of this class (and its subclasses) is to abstract - * details of FFmpeg's memory management and varying data formats. - */ -class Image +class Image : public dcp::Image { public: - Image (AVPixelFormat p) - : _pixel_format (p) - {} + Image (AVPixelFormat, dcp::Size, bool); + Image (AVFrame *); + Image (Image const &); + Image (boost::shared_ptr, bool); + Image& operator= (Image const &); + ~Image (); - virtual ~Image () {} - - /** @return Array of pointers to arrays of the component data */ - virtual uint8_t ** data () const = 0; - - /** @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; + uint8_t ** data () const; + int * line_size () const; + int * stride () const; + dcp::Size size () const; + bool aligned () const; int components () const; + int line_factor (int) 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 (dcp::Size, Scaler const *, AVPixelFormat, bool aligned) const; + boost::shared_ptr post_process (std::string, bool aligned) const; + boost::shared_ptr crop (Crop c, bool aligned) const; + + boost::shared_ptr crop_scale_window (Crop c, dcp::Size, dcp::Size, Scaler const *, AVPixelFormat, bool aligned) const; void make_black (); + void alpha_blend (boost::shared_ptr image, Position pos); + void copy (boost::shared_ptr image, Position pos); void read_from_socket (boost::shared_ptr); void write_to_socket (boost::shared_ptr) const; @@ -84,83 +75,19 @@ public: } private: - 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 FilterBufferImage : public Image -{ -public: - FilterBufferImage (AVPixelFormat, AVFilterBufferRef *); - ~FilterBufferImage (); - - uint8_t ** data () const; - int * line_size () const; - int * stride () const; - Size size () const; - -private: - AVFilterBufferRef* _buffer; -}; - -/** @class SimpleImage - * @brief An Image for which memory is allocated using a `simple' av_malloc(). - */ -class SimpleImage : public Image -{ -public: - SimpleImage (AVPixelFormat, Size, boost::function rounder); - ~SimpleImage (); - - uint8_t ** data () const; - int * line_size () const; - int * stride () const; - Size size () const; + friend class pixel_formats_test; -private: + void allocate (); + void swap (Image &); + float bytes_per_pixel (int) const; + void yuv_16_black (uint16_t, bool); + static uint16_t swap_16 (uint16_t); - Size _size; ///< size in pixels + AVPixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image 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 : public SimpleImage -{ -public: - AlignedImage (AVPixelFormat, Size); -}; - -class CompactImage : public SimpleImage -{ -public: - CompactImage (AVPixelFormat, Size); - CompactImage (boost::shared_ptr); -}; - -/** @class RGBFrameImage - * @brief An RGB image that is held within an AVFrame. - */ -class RGBFrameImage : public Image -{ -public: - RGBFrameImage (Size); - ~RGBFrameImage (); - - uint8_t ** data () const; - int * line_size () const; - int * stride () const; - Size size () const; - AVFrame * frame () const { - return _frame; - } - -private: - Size _size; - AVFrame* _frame; - uint8_t* _data; + bool _aligned; }; #endif