Merge master.
[dcpomatic.git] / src / lib / image.h
index e06a82b7f5fb647959a54791e023d5567a4e8b1a..23b88dd7601066c022bb457f116b8c252c7be256 100644 (file)
  *  @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 <string>
 #include <boost/shared_ptr.hpp>
+#include <boost/function.hpp>
 extern "C" {
 #include <libavcodec/avcodec.h>
 #include <libavfilter/avfilter.h>
 }
+#include <dcp/image.h>
 #include "util.h"
+#include "position.h"
+#include "position_image.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 (PixelFormat p)
-               : _pixel_format (p)
-       {}
+       Image (AVPixelFormat, dcp::Size, bool);
+       Image (AVFrame *);
+       Image (Image const &);
+       Image (boost::shared_ptr<const Image>, 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 each line, in pixels */
-       virtual int * line_size () 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<RGBFrameImage> scale_and_convert_to_rgb (Size, int, Scaler const *) const;
-       boost::shared_ptr<Image> scale (Size, Scaler const *) const;
-       boost::shared_ptr<SimpleImage> post_process (std::string) const;
+
+       boost::shared_ptr<Image> scale (dcp::Size, Scaler const *, AVPixelFormat, bool aligned) const;
+       boost::shared_ptr<Image> crop (Crop c, bool aligned) const;
+
+       boost::shared_ptr<Image> crop_scale_window (Crop c, dcp::Size, dcp::Size, Scaler const *, AVPixelFormat, bool aligned) const;
        
        void make_black ();
+       void make_transparent ();
+       void alpha_blend (boost::shared_ptr<const Image> image, Position<int> pos);
+       void copy (boost::shared_ptr<const Image> image, Position<int> pos);
+
+       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
-};
-
-/** @class FilterBufferImage
- *  @brief An Image that is held in an AVFilterBufferRef.
- */
-class FilterBufferImage : public Image
-{
-public:
-       FilterBufferImage (PixelFormat, AVFilterBufferRef *);
-       ~FilterBufferImage ();
-
-       uint8_t ** data () const;
-       int * line_size () 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 (PixelFormat, Size);
-       ~SimpleImage ();
-
-       uint8_t ** data () const;
-       int * line_size () const;
-       Size size () const;
+       friend class pixel_formats_test;
        
-private:
-       Size _size; ///< size in pixels
+       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);
+       
+       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 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
-{
-public:
-       RGBFrameImage (Size);
-       ~RGBFrameImage ();
-
-       uint8_t ** data () const;
-       int * line_size () const;
-       Size size () const;
-       AVFrame * frame () const {
-               return _frame;
-       }
-
-private:
-       Size _size;
-       AVFrame* _frame;
-       uint8_t* _data;
-};
+extern PositionImage merge (std::list<PositionImage> images);
 
 #endif