From: Carl Hetherington Date: Fri, 12 Jul 2013 16:12:49 +0000 (+0100) Subject: Remove unused RGBPlusAlphaImage; merge Image/SimpleImage. X-Git-Tag: v2.0.48~1337^2~258 X-Git-Url: https://git.carlh.net/gitweb/?a=commitdiff_plain;h=ad6c0bbec4f354f29fb968099ff1a0ce2e57c43a;p=dcpomatic.git Remove unused RGBPlusAlphaImage; merge Image/SimpleImage. --- diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index fddb70294..27009114c 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -412,7 +412,7 @@ FFmpegDecoder::decode_video_packet () a black frame. */ boost::shared_ptr black ( - new SimpleImage ( + new Image ( static_cast (_frame->format), libdcp::Size (video_codec_context()->width, video_codec_context()->height), true @@ -503,7 +503,7 @@ FFmpegDecoder::decode_subtitle_packet () throw DecodeError (_("non-bitmap subtitles not yet supported")); } - shared_ptr image (new SimpleImage (PIX_FMT_RGBA, libdcp::Size (rect->w, rect->h), true)); + shared_ptr image (new Image (PIX_FMT_RGBA, libdcp::Size (rect->w, rect->h), true)); /* Start of the first line in the subtitle */ uint8_t* sub_p = rect->pict.data[0]; diff --git a/src/lib/filter_graph.cc b/src/lib/filter_graph.cc index cc16b279d..3366f8d1b 100644 --- a/src/lib/filter_graph.cc +++ b/src/lib/filter_graph.cc @@ -146,7 +146,7 @@ FilterGraph::process (AVFrame* frame) break; } - images.push_back (shared_ptr (new SimpleImage (_frame))); + images.push_back (shared_ptr (new Image (_frame))); av_frame_unref (_frame); } diff --git a/src/lib/image.cc b/src/lib/image.cc index c11bcbb8d..62c26defb 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -18,43 +18,26 @@ */ /** @file src/image.cc - * @brief A set of classes to describe video images. + * @brief A class to describe a video image. */ -#include -#include #include -#include -#include -#include -#include extern "C" { -#include -#include #include -#include -#include #include #include +#include } #include "image.h" #include "exceptions.h" #include "scaler.h" -#include "i18n.h" - using std::string; using std::min; using std::cout; using boost::shared_ptr; using libdcp::Size; -void -Image::swap (Image& other) -{ - std::swap (_pixel_format, other._pixel_format); -} - int Image::line_factor (int n) const { @@ -64,7 +47,7 @@ Image::line_factor (int n) const AVPixFmtDescriptor const * d = av_pix_fmt_desc_get(_pixel_format); if (!d) { - throw PixelFormatError (N_("lines()"), _pixel_format); + throw PixelFormatError ("lines()", _pixel_format); } return pow (2.0f, d->log2_chroma_h); @@ -85,7 +68,7 @@ Image::components () const { AVPixFmtDescriptor const * d = av_pix_fmt_desc_get(_pixel_format); if (!d) { - throw PixelFormatError (N_("components()"), _pixel_format); + throw PixelFormatError ("components()", _pixel_format); } if ((d->flags & PIX_FMT_PLANAR) == 0) { @@ -104,7 +87,7 @@ Image::scale (libdcp::Size out_size, Scaler const * scaler, bool result_aligned) */ assert (aligned ()); - shared_ptr scaled (new SimpleImage (pixel_format(), out_size, result_aligned)); + shared_ptr scaled (new Image (pixel_format(), out_size, result_aligned)); struct SwsContext* scale_context = sws_getContext ( size().width, size().height, pixel_format(), @@ -137,7 +120,7 @@ Image::scale_and_convert_to_rgb (libdcp::Size out_size, Scaler const * scaler, b */ assert (aligned ()); - shared_ptr rgb (new SimpleImage (PIX_FMT_RGB24, out_size, result_aligned)); + shared_ptr rgb (new Image (PIX_FMT_RGB24, out_size, result_aligned)); struct SwsContext* scale_context = sws_getContext ( size().width, size().height, pixel_format(), @@ -165,7 +148,7 @@ Image::scale_and_convert_to_rgb (libdcp::Size out_size, Scaler const * scaler, b shared_ptr Image::post_process (string pp, bool aligned) const { - shared_ptr out (new SimpleImage (pixel_format(), size (), aligned)); + shared_ptr out (new Image (pixel_format(), size (), aligned)); int pp_format = 0; switch (pixel_format()) { @@ -184,7 +167,7 @@ Image::post_process (string pp, bool aligned) const case PIX_FMT_YUV444P10LE: pp_format = PP_FORMAT_444; default: - throw PixelFormatError (N_("post_process"), pixel_format()); + throw PixelFormatError ("post_process", pixel_format()); } pp_mode* mode = pp_get_mode_by_name_and_quality (pp.c_str (), PP_QUALITY_MAX); @@ -210,7 +193,7 @@ Image::crop (Crop crop, bool aligned) const cropped_size.width -= crop.left + crop.right; cropped_size.height -= crop.top + crop.bottom; - shared_ptr out (new SimpleImage (pixel_format(), cropped_size, aligned)); + shared_ptr out (new Image (pixel_format(), cropped_size, aligned)); for (int c = 0; c < components(); ++c) { int const crop_left_in_bytes = bytes_per_pixel(c) * crop.left; @@ -331,7 +314,7 @@ Image::make_black () } default: - throw PixelFormatError (N_("make_black()"), _pixel_format); + throw PixelFormatError ("make_black()", _pixel_format); } } @@ -416,7 +399,7 @@ Image::bytes_per_pixel (int c) const { AVPixFmtDescriptor const * d = av_pix_fmt_desc_get(_pixel_format); if (!d) { - throw PixelFormatError (N_("lines()"), _pixel_format); + throw PixelFormatError ("lines()", _pixel_format); } if (c >= components()) { @@ -444,14 +427,14 @@ Image::bytes_per_pixel (int c) const return bpp[c]; } -/** Construct a SimpleImage of a given size and format, allocating memory +/** Construct a Image of a given size and format, allocating memory * as required. * * @param p Pixel format. * @param s Size in pixels. */ -SimpleImage::SimpleImage (AVPixelFormat p, libdcp::Size s, bool aligned) - : Image (p) +Image::Image (AVPixelFormat p, libdcp::Size s, bool aligned) + : _pixel_format (p) , _size (s) , _aligned (aligned) { @@ -459,7 +442,7 @@ SimpleImage::SimpleImage (AVPixelFormat p, libdcp::Size s, bool aligned) } void -SimpleImage::allocate () +Image::allocate () { _data = (uint8_t **) av_malloc (4 * sizeof (uint8_t *)); _data[0] = _data[1] = _data[2] = _data[3] = 0; @@ -477,8 +460,8 @@ SimpleImage::allocate () } } -SimpleImage::SimpleImage (SimpleImage const & other) - : Image (other) +Image::Image (Image const & other) + : _pixel_format (other._pixel_format) , _size (other._size) , _aligned (other._aligned) { @@ -495,8 +478,8 @@ SimpleImage::SimpleImage (SimpleImage const & other) } } -SimpleImage::SimpleImage (AVFrame* frame) - : Image (static_cast (frame->format)) +Image::Image (AVFrame* frame) + : _pixel_format (static_cast (frame->format)) , _size (frame->width, frame->height) , _aligned (true) { @@ -514,8 +497,8 @@ SimpleImage::SimpleImage (AVFrame* frame) } } -SimpleImage::SimpleImage (shared_ptr other, bool aligned) - : Image (*other.get()) +Image::Image (shared_ptr other, bool aligned) + : _pixel_format (other->_pixel_format) , _size (other->size()) , _aligned (aligned) { @@ -533,23 +516,22 @@ SimpleImage::SimpleImage (shared_ptr other, bool aligned) } } -SimpleImage& -SimpleImage::operator= (SimpleImage const & other) +Image& +Image::operator= (Image const & other) { if (this == &other) { return *this; } - SimpleImage tmp (other); + Image tmp (other); swap (tmp); return *this; } void -SimpleImage::swap (SimpleImage & other) +Image::swap (Image & other) { - Image::swap (other); - + std::swap (_pixel_format, other._pixel_format); std::swap (_size, other._size); for (int i = 0; i < 4; ++i) { @@ -561,8 +543,8 @@ SimpleImage::swap (SimpleImage & other) std::swap (_aligned, other._aligned); } -/** Destroy a SimpleImage */ -SimpleImage::~SimpleImage () +/** Destroy a Image */ +Image::~Image () { for (int i = 0; i < components(); ++i) { av_free (_data[i]); @@ -574,60 +556,32 @@ SimpleImage::~SimpleImage () } uint8_t ** -SimpleImage::data () const +Image::data () const { return _data; } int * -SimpleImage::line_size () const +Image::line_size () const { return _line_size; } int * -SimpleImage::stride () const +Image::stride () const { return _stride; } libdcp::Size -SimpleImage::size () const +Image::size () const { return _size; } bool -SimpleImage::aligned () const +Image::aligned () const { return _aligned; } -RGBPlusAlphaImage::RGBPlusAlphaImage (shared_ptr im) - : SimpleImage (im->pixel_format(), im->size(), false) -{ - assert (im->pixel_format() == PIX_FMT_RGBA); - - _alpha = (uint8_t *) av_malloc (im->size().width * im->size().height); - - uint8_t* in = im->data()[0]; - uint8_t* out = data()[0]; - uint8_t* out_alpha = _alpha; - for (int y = 0; y < im->size().height; ++y) { - uint8_t* in_r = in; - for (int x = 0; x < im->size().width; ++x) { - *out++ = *in_r++; - *out++ = *in_r++; - *out++ = *in_r++; - *out_alpha++ = *in_r++; - } - - in += im->stride()[0]; - } -} - -RGBPlusAlphaImage::~RGBPlusAlphaImage () -{ - av_free (_alpha); -} - diff --git a/src/lib/image.h b/src/lib/image.h index d40ba77b4..ab809cc46 100644 --- a/src/lib/image.h +++ b/src/lib/image.h @@ -35,39 +35,22 @@ extern "C" { #include "position.h" class Scaler; -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 { public: - Image (AVPixelFormat p) - : _pixel_format (p) - {} + Image (AVPixelFormat, libdcp::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 libdcp::Size size () const = 0; - - virtual bool aligned () const = 0; + uint8_t ** data () const; + int * line_size () const; + int * stride () const; + libdcp::Size size () const; + bool aligned () const; int components () const; int line_factor (int) const; @@ -89,43 +72,16 @@ public: return _pixel_format; } -protected: - virtual void swap (Image &); - float bytes_per_pixel (int) const; - - friend class pixel_formats_test; - private: + friend class pixel_formats_test; + + void allocate (); + void swap (Image &); + float bytes_per_pixel (int) const; 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 SimpleImage - * @brief An Image for which memory is allocated using a `simple' av_malloc(). - */ -class SimpleImage : public Image -{ -public: - SimpleImage (AVPixelFormat, libdcp::Size, bool); - SimpleImage (AVFrame *); - SimpleImage (SimpleImage const &); - SimpleImage (boost::shared_ptr, bool); - SimpleImage& operator= (SimpleImage const &); - ~SimpleImage (); - - uint8_t ** data () const; - int * line_size () const; - int * stride () const; - libdcp::Size size () const; - bool aligned () const; - -protected: - void allocate (); - void swap (SimpleImage &); - -private: libdcp::Size _size; ///< size in pixels 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) @@ -133,18 +89,4 @@ private: bool _aligned; }; -class RGBPlusAlphaImage : public SimpleImage -{ -public: - RGBPlusAlphaImage (boost::shared_ptr); - ~RGBPlusAlphaImage (); - - uint8_t* alpha () const { - return _alpha; - } - -private: - uint8_t* _alpha; -}; - #endif diff --git a/src/lib/imagemagick_content.cc b/src/lib/imagemagick_content.cc index 42e3776f5..8e858d0d1 100644 --- a/src/lib/imagemagick_content.cc +++ b/src/lib/imagemagick_content.cc @@ -113,4 +113,5 @@ ImageMagickContent::identifier () const stringstream s; s << VideoContent::identifier (); s << "_" << video_length(); + return s.str (); } diff --git a/src/lib/imagemagick_decoder.cc b/src/lib/imagemagick_decoder.cc index 6178443cf..ee50f3fb1 100644 --- a/src/lib/imagemagick_decoder.cc +++ b/src/lib/imagemagick_decoder.cc @@ -55,7 +55,7 @@ ImageMagickDecoder::pass () Magick::Image* magick_image = new Magick::Image (_imagemagick_content->file().string ()); _video_size = libdcp::Size (magick_image->columns(), magick_image->rows()); - _image.reset (new SimpleImage (PIX_FMT_RGB24, _video_size.get(), false)); + _image.reset (new Image (PIX_FMT_RGB24, _video_size.get(), false)); using namespace MagickCore; diff --git a/src/lib/player.cc b/src/lib/player.cc index 61764a39d..8532b5417 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -232,7 +232,7 @@ Player::process_video (weak_ptr weak_piece, shared_ptr image if (image_size != _video_container_size) { assert (image_size.width <= _video_container_size.width); assert (image_size.height <= _video_container_size.height); - shared_ptr im (new SimpleImage (PIX_FMT_RGB24, _video_container_size, true)); + shared_ptr im (new Image (PIX_FMT_RGB24, _video_container_size, true)); im->make_black (); im->copy (work_image, Position ((_video_container_size.width - image_size.width) / 2, (_video_container_size.height - image_size.height) / 2)); work_image = im; @@ -482,7 +482,7 @@ void Player::set_video_container_size (libdcp::Size s) { _video_container_size = s; - _black_frame.reset (new SimpleImage (PIX_FMT_RGB24, _video_container_size, true)); + _black_frame.reset (new Image (PIX_FMT_RGB24, _video_container_size, true)); _black_frame->make_black (); } diff --git a/src/lib/server.cc b/src/lib/server.cc index 40d1c4c0c..b38e82a07 100644 --- a/src/lib/server.cc +++ b/src/lib/server.cc @@ -110,7 +110,7 @@ Server::process (shared_ptr socket) /* This checks that colour_lut_index is within range */ colour_lut_index_to_name (colour_lut_index); - shared_ptr image (new SimpleImage (PIX_FMT_RGB24, size, true)); + shared_ptr image (new Image (PIX_FMT_RGB24, size, true)); image->read_from_socket (socket); diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 15c23e064..2cc63aea4 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -174,7 +174,7 @@ FilmViewer::paint_panel (wxPaintEvent &) return; } - shared_ptr packed_frame (new SimpleImage (_frame, false)); + shared_ptr packed_frame (new Image (_frame, false)); wxImage frame (_out_size.width, _out_size.height, packed_frame->data()[0], true); wxBitmap frame_bitmap (frame); diff --git a/test/client_server_test.cc b/test/client_server_test.cc index 232190286..50add352f 100644 --- a/test/client_server_test.cc +++ b/test/client_server_test.cc @@ -30,7 +30,7 @@ do_remote_encode (shared_ptr frame, ServerDescription* descriptio BOOST_AUTO_TEST_CASE (client_server_test) { - shared_ptr image (new SimpleImage (PIX_FMT_RGB24, libdcp::Size (1998, 1080), true)); + shared_ptr image (new Image (PIX_FMT_RGB24, libdcp::Size (1998, 1080), true)); uint8_t* p = image->data()[0]; for (int y = 0; y < 1080; ++y) { @@ -43,7 +43,7 @@ BOOST_AUTO_TEST_CASE (client_server_test) p += image->stride()[0]; } - shared_ptr sub_image (new SimpleImage (PIX_FMT_RGBA, libdcp::Size (100, 200), true)); + shared_ptr sub_image (new Image (PIX_FMT_RGBA, libdcp::Size (100, 200), true)); p = sub_image->data()[0]; for (int y = 0; y < 200; ++y) { uint8_t* q = p; diff --git a/test/image_test.cc b/test/image_test.cc index b74531c46..8dc289602 100644 --- a/test/image_test.cc +++ b/test/image_test.cc @@ -1,7 +1,7 @@ BOOST_AUTO_TEST_CASE (aligned_image_test) { - SimpleImage* s = new SimpleImage (PIX_FMT_RGB24, libdcp::Size (50, 50), true); + Image* s = new Image (PIX_FMT_RGB24, libdcp::Size (50, 50), true); BOOST_CHECK_EQUAL (s->components(), 1); /* 160 is 150 aligned to the nearest 32 bytes */ BOOST_CHECK_EQUAL (s->stride()[0], 160); @@ -12,7 +12,7 @@ BOOST_AUTO_TEST_CASE (aligned_image_test) BOOST_CHECK (!s->data()[3]); /* copy constructor */ - SimpleImage* t = new SimpleImage (*s); + Image* t = new Image (*s); BOOST_CHECK_EQUAL (t->components(), 1); BOOST_CHECK_EQUAL (t->stride()[0], 160); BOOST_CHECK_EQUAL (t->line_size()[0], 150); @@ -28,7 +28,7 @@ BOOST_AUTO_TEST_CASE (aligned_image_test) BOOST_CHECK (t->stride()[0] == s->stride()[0]); /* assignment operator */ - SimpleImage* u = new SimpleImage (PIX_FMT_YUV422P, libdcp::Size (150, 150), false); + Image* u = new Image (PIX_FMT_YUV422P, libdcp::Size (150, 150), false); *u = *s; BOOST_CHECK_EQUAL (u->components(), 1); BOOST_CHECK_EQUAL (u->stride()[0], 160); @@ -51,7 +51,7 @@ BOOST_AUTO_TEST_CASE (aligned_image_test) BOOST_AUTO_TEST_CASE (compact_image_test) { - SimpleImage* s = new SimpleImage (PIX_FMT_RGB24, libdcp::Size (50, 50), false); + Image* s = new Image (PIX_FMT_RGB24, libdcp::Size (50, 50), false); BOOST_CHECK_EQUAL (s->components(), 1); BOOST_CHECK_EQUAL (s->stride()[0], 50 * 3); BOOST_CHECK_EQUAL (s->line_size()[0], 50 * 3); @@ -61,7 +61,7 @@ BOOST_AUTO_TEST_CASE (compact_image_test) BOOST_CHECK (!s->data()[3]); /* copy constructor */ - SimpleImage* t = new SimpleImage (*s); + Image* t = new Image (*s); BOOST_CHECK_EQUAL (t->components(), 1); BOOST_CHECK_EQUAL (t->stride()[0], 50 * 3); BOOST_CHECK_EQUAL (t->line_size()[0], 50 * 3); @@ -77,7 +77,7 @@ BOOST_AUTO_TEST_CASE (compact_image_test) BOOST_CHECK (t->stride()[0] == s->stride()[0]); /* assignment operator */ - SimpleImage* u = new SimpleImage (PIX_FMT_YUV422P, libdcp::Size (150, 150), true); + Image* u = new Image (PIX_FMT_YUV422P, libdcp::Size (150, 150), true); *u = *s; BOOST_CHECK_EQUAL (u->components(), 1); BOOST_CHECK_EQUAL (u->stride()[0], 50 * 3); @@ -101,7 +101,7 @@ BOOST_AUTO_TEST_CASE (compact_image_test) BOOST_AUTO_TEST_CASE (crop_image_test) { /* This was to check out a bug with valgrind, and is probably not very useful */ - shared_ptr image (new SimpleImage (PIX_FMT_YUV420P, libdcp::Size (16, 16), true)); + shared_ptr image (new Image (PIX_FMT_YUV420P, libdcp::Size (16, 16), true)); image->make_black (); Crop crop; crop.top = 3; @@ -114,7 +114,7 @@ BOOST_AUTO_TEST_CASE (crop_image_test) BOOST_AUTO_TEST_CASE (crop_image_test2) { /* Here's a 1998 x 1080 image which is black */ - shared_ptr image (new SimpleImage (PIX_FMT_YUV420P, libdcp::Size (1998, 1080), true)); + shared_ptr image (new Image (PIX_FMT_YUV420P, libdcp::Size (1998, 1080), true)); image->make_black (); /* Crop it by 1 pixel */ diff --git a/test/make_black_test.cc b/test/make_black_test.cc index 9bec00651..4c2822514 100644 --- a/test/make_black_test.cc +++ b/test/make_black_test.cc @@ -41,7 +41,7 @@ BOOST_AUTO_TEST_CASE (make_black_test) int N = 0; for (list::const_iterator i = pix_fmts.begin(); i != pix_fmts.end(); ++i) { - boost::shared_ptr foo (new SimpleImage (*i, in_size, true)); + boost::shared_ptr foo (new Image (*i, in_size, true)); foo->make_black (); boost::shared_ptr bar = foo->scale_and_convert_to_rgb (out_size, Scaler::from_id ("bicubic"), true); diff --git a/test/pixel_formats_test.cc b/test/pixel_formats_test.cc index fb2278fdb..ccdda3317 100644 --- a/test/pixel_formats_test.cc +++ b/test/pixel_formats_test.cc @@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE (pixel_formats_test) f->height = 480; f->format = static_cast (i->format); av_frame_get_buffer (f, true); - SimpleImage t (f); + Image t (f); BOOST_CHECK_EQUAL(t.components(), i->components); BOOST_CHECK_EQUAL(t.lines(0), i->lines[0]); BOOST_CHECK_EQUAL(t.lines(1), i->lines[1]);