* @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 "util.h"
+#include "ffmpeg_compatibility.h"
class Scaler;
class RGBFrameImage;
class Image
{
public:
- Image (PixelFormat p)
+ Image (AVPixelFormat p)
: _pixel_format (p)
{}
/** @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;
+
+ virtual bool aligned () const = 0;
int components () const;
int lines (int) const;
- boost::shared_ptr<Image> scale_and_convert_to_rgb (Size, int, Scaler const *) const;
- boost::shared_ptr<Image> scale (Size, Scaler const *) const;
- boost::shared_ptr<Image> post_process (std::string) const;
- void alpha_blend (boost::shared_ptr<Image> image, Position pos);
+
+ boost::shared_ptr<Image> scale_and_convert_to_rgb (libdcp::Size out_size, int padding, Scaler const * scaler, bool aligned) const;
+ boost::shared_ptr<Image> scale (libdcp::Size, Scaler const *, bool aligned) const;
+ boost::shared_ptr<Image> post_process (std::string, bool aligned) const;
+ void alpha_blend (boost::shared_ptr<const Image> image, Position pos);
+ boost::shared_ptr<Image> crop (Crop c, bool aligned) const;
void make_black ();
+
+ 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;
}
+protected:
+ virtual void swap (Image &);
+ float bytes_per_pixel (int) const;
+
private:
- PixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image
+ void yuv_16_black (uint16_t);
+ static uint16_t swap_16 (uint16_t);
+
+ AVPixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image
};
/** @class FilterBufferImage
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;
+ bool aligned () const;
private:
+ /* Not allowed */
+ FilterBufferImage (FilterBufferImage const &);
+ FilterBufferImage& operator= (FilterBufferImage const &);
+
AVFilterBufferRef* _buffer;
+ int* _line_size;
};
/** @class SimpleImage
class SimpleImage : public Image
{
public:
- SimpleImage (PixelFormat, Size);
+ SimpleImage (AVPixelFormat, libdcp::Size, bool);
+ SimpleImage (SimpleImage const &);
+ SimpleImage (boost::shared_ptr<const Image>);
+ SimpleImage& operator= (SimpleImage const &);
~SimpleImage ();
uint8_t ** data () const;
int * line_size () const;
- Size size () const;
+ int * stride () const;
+ libdcp::Size size () const;
+ bool aligned () 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<const Image>);
+ ~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;
+ uint8_t* _alpha;
};
#endif