2 Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
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.
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.
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.
21 * @brief A set of classes to describe video images.
24 #ifndef DVDOMATIC_IMAGE_H
25 #define DVDOMATIC_IMAGE_H
28 #include <boost/shared_ptr.hpp>
30 #include <libavcodec/avcodec.h>
31 #include <libavfilter/avfilter.h>
37 class PostProcessImage;
40 * @brief Parent class for wrappers of some image, in some format, that
41 * can present a set of components and a size in pixels.
43 * This class also has some conversion / processing methods.
45 * The main point of this class (and its subclasses) is to abstract
46 * details of FFmpeg's memory management and varying data formats.
57 /** @return Array of pointers to arrays of the component data */
58 virtual uint8_t ** data () const = 0;
60 /** @return Array of sizes of each line, in pixels */
61 virtual int * line_size () const = 0;
63 /** @return Size of the image, in pixels */
64 virtual Size size () const = 0;
66 int components () const;
67 int lines (int) const;
68 boost::shared_ptr<RGBFrameImage> scale_and_convert_to_rgb (Size, int, Scaler const *) const;
69 boost::shared_ptr<PostProcessImage> post_process (std::string) const;
72 void hash (std::string) const;
77 PixelFormat pixel_format () const {
82 PixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image
85 /** @class FilterBufferImage
86 * @brief An Image that is held in an AVFilterBufferRef.
88 class FilterBufferImage : public Image
91 FilterBufferImage (PixelFormat, AVFilterBufferRef *);
92 ~FilterBufferImage ();
94 uint8_t ** data () const;
95 int * line_size () const;
99 AVFilterBufferRef* _buffer;
102 /** @class SimpleImage
103 * @brief An Image for which memory is allocated using a `simple' av_malloc().
105 class SimpleImage : public Image
108 SimpleImage (PixelFormat, Size);
111 uint8_t ** data () const;
112 int * line_size () const;
115 void set_line_size (int, int);
118 Size _size; ///< size in pixels
119 uint8_t** _data; ///< array of pointers to components
120 int* _line_size; ///< array of widths of each line, in bytes
123 /** @class RGBFrameImage
124 * @brief An RGB image that is held within an AVFrame.
126 class RGBFrameImage : public Image
129 RGBFrameImage (Size);
132 uint8_t ** data () const;
133 int * line_size () const;
135 AVFrame * frame () const {
145 /** @class PostProcessImage
146 * @brief An image that is the result of an FFmpeg post-processing run.
148 class PostProcessImage : public Image
151 PostProcessImage (PixelFormat, Size);
152 ~PostProcessImage ();
154 uint8_t ** data () const;
155 int * line_size () const;