Merge master.
[dcpomatic.git] / src / lib / image.h
1 /*
2     Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 /** @file src/image.h
21  *  @brief A set of classes to describe video images.
22  */
23
24 #ifndef DVDOMATIC_IMAGE_H
25 #define DVDOMATIC_IMAGE_H
26
27 #include <string>
28 #include <boost/shared_ptr.hpp>
29 #include <boost/function.hpp>
30 extern "C" {
31 #include <libavcodec/avcodec.h>
32 #include <libavfilter/avfilter.h>
33 }
34 #include "util.h"
35 #include "ffmpeg_compatibility.h"
36
37 class Scaler;
38 class RGBFrameImage;
39 class SimpleImage;
40
41 /** @class Image
42  *  @brief Parent class for wrappers of some image, in some format, that
43  *  can present a set of components and a size in pixels.
44  *
45  *  This class also has some conversion / processing methods.
46  *
47  *  The main point of this class (and its subclasses) is to abstract
48  *  details of FFmpeg's memory management and varying data formats.
49  */
50 class Image
51 {
52 public:
53         Image (AVPixelFormat p)
54                 : _pixel_format (p)
55         {}
56         
57         virtual ~Image () {}
58
59         /** @return Array of pointers to arrays of the component data */
60         virtual uint8_t ** data () const = 0;
61
62         /** @return Array of sizes of the data in each line, in bytes (without any alignment padding bytes) */
63         virtual int * line_size () const = 0;
64
65         /** @return Array of strides for each line (including any alignment padding bytes) */
66         virtual int * stride () const = 0;
67
68         /** @return Size of the image, in pixels */
69         virtual Size size () const = 0;
70
71         int components () const;
72         int lines (int) const;
73
74         boost::shared_ptr<Image> scale_and_convert_to_rgb (Size out_size, int padding, Scaler const * scaler, bool aligned) const;
75         boost::shared_ptr<Image> scale (Size, Scaler const *, bool aligned) const;
76         boost::shared_ptr<Image> post_process (std::string, bool aligned) const;
77         void alpha_blend (boost::shared_ptr<const Image> image, Position pos);
78         boost::shared_ptr<Image> crop (Crop c, bool aligned) const;
79         
80         void make_black ();
81
82         void read_from_socket (boost::shared_ptr<Socket>);
83         void write_to_socket (boost::shared_ptr<Socket>) const;
84         
85         AVPixelFormat pixel_format () const {
86                 return _pixel_format;
87         }
88
89 protected:
90         virtual void swap (Image &);
91         float bytes_per_pixel (int) const;
92
93 private:        
94         AVPixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image
95 };
96
97 /** @class FilterBufferImage
98  *  @brief An Image that is held in an AVFilterBufferRef.
99  */
100 class FilterBufferImage : public Image
101 {
102 public:
103         FilterBufferImage (AVPixelFormat, AVFilterBufferRef *);
104         ~FilterBufferImage ();
105
106         uint8_t ** data () const;
107         int * line_size () const;
108         int * stride () const;
109         Size size () const;
110
111 private:
112         /* Not allowed */
113         FilterBufferImage (FilterBufferImage const &);
114         FilterBufferImage& operator= (FilterBufferImage const &);
115         
116         AVFilterBufferRef* _buffer;
117 };
118
119 /** @class SimpleImage
120  *  @brief An Image for which memory is allocated using a `simple' av_malloc().
121  */
122 class SimpleImage : public Image
123 {
124 public:
125         SimpleImage (AVPixelFormat, Size, bool);
126         SimpleImage (SimpleImage const &);
127         SimpleImage& operator= (SimpleImage const &);
128         ~SimpleImage ();
129
130         uint8_t ** data () const;
131         int * line_size () const;
132         int * stride () const;
133         Size size () const;
134
135 protected:
136         void allocate ();
137         void swap (SimpleImage &);
138         
139 private:
140         Size _size; ///< size in pixels
141         uint8_t** _data; ///< array of pointers to components
142         int* _line_size; ///< array of sizes of the data in each line, in pixels (without any alignment padding bytes)
143         int* _stride; ///< array of strides for each line (including any alignment padding bytes)
144         bool _aligned;
145 };
146
147 class RGBPlusAlphaImage : public SimpleImage
148 {
149 public:
150         RGBPlusAlphaImage (boost::shared_ptr<const Image>);
151         ~RGBPlusAlphaImage ();
152
153         uint8_t* alpha () const {
154                 return _alpha;
155         }
156         
157 private:
158         uint8_t* _alpha;
159 };
160
161 #endif