diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-01-23 15:04:54 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-01-23 15:04:54 +0000 |
| commit | 52821965206bce3e5d47200d838e54996857d212 (patch) | |
| tree | 345a0ea61c8323b3eb413a6b8b5226cd76546c50 /src | |
| parent | d58f9adc515ac0c0193a4998fed3605f4e2c6e11 (diff) | |
Make sure inputs to sws_scale are aligned, as I think they must be.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/image.cc | 31 | ||||
| -rw-r--r-- | src/lib/image.h | 4 |
2 files changed, 30 insertions, 5 deletions
diff --git a/src/lib/image.cc b/src/lib/image.cc index 3afb6205e..0a51add00 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -96,11 +96,15 @@ Image::components () const } shared_ptr<Image> -Image::scale (Size out_size, Scaler const * scaler, bool aligned) const +Image::scale (Size out_size, Scaler const * scaler, bool result_aligned) const { assert (scaler); + /* Empirical testing suggests that sws_scale() will crash if + the input image is not aligned. + */ + assert (aligned ()); - shared_ptr<Image> scaled (new SimpleImage (pixel_format(), out_size, aligned)); + shared_ptr<Image> scaled (new SimpleImage (pixel_format(), out_size, result_aligned)); struct SwsContext* scale_context = sws_getContext ( size().width, size().height, pixel_format(), @@ -125,14 +129,18 @@ Image::scale (Size out_size, Scaler const * scaler, bool aligned) const * @param scaler Scaler to use. */ shared_ptr<Image> -Image::scale_and_convert_to_rgb (Size out_size, int padding, Scaler const * scaler, bool aligned) const +Image::scale_and_convert_to_rgb (Size out_size, int padding, Scaler const * scaler, bool result_aligned) const { assert (scaler); + /* Empirical testing suggests that sws_scale() will crash if + the input image is not aligned. + */ + assert (aligned ()); Size content_size = out_size; content_size.width -= (padding * 2); - shared_ptr<Image> rgb (new SimpleImage (PIX_FMT_RGB24, content_size, aligned)); + shared_ptr<Image> rgb (new SimpleImage (PIX_FMT_RGB24, content_size, result_aligned)); struct SwsContext* scale_context = sws_getContext ( size().width, size().height, pixel_format(), @@ -153,7 +161,7 @@ Image::scale_and_convert_to_rgb (Size out_size, int padding, Scaler const * scal scheme of things. */ if (padding > 0) { - shared_ptr<Image> padded_rgb (new SimpleImage (PIX_FMT_RGB24, out_size, aligned)); + shared_ptr<Image> padded_rgb (new SimpleImage (PIX_FMT_RGB24, out_size, result_aligned)); padded_rgb->make_black (); /* XXX: we are cheating a bit here; we know the frame is RGB so we can @@ -485,6 +493,12 @@ SimpleImage::size () const return _size; } +bool +SimpleImage::aligned () const +{ + return _aligned; +} + FilterBufferImage::FilterBufferImage (AVPixelFormat p, AVFilterBufferRef* b) : Image (p) , _buffer (b) @@ -522,6 +536,13 @@ FilterBufferImage::size () const return Size (_buffer->video->w, _buffer->video->h); } +bool +FilterBufferImage::aligned () const +{ + /* XXX? */ + return true; +} + RGBPlusAlphaImage::RGBPlusAlphaImage (shared_ptr<const Image> im) : SimpleImage (im->pixel_format(), im->size(), false) { diff --git a/src/lib/image.h b/src/lib/image.h index 5ca3f337c..23f13a648 100644 --- a/src/lib/image.h +++ b/src/lib/image.h @@ -68,6 +68,8 @@ public: /** @return Size of the image, in pixels */ virtual libdcp::Size size () const = 0; + virtual bool aligned () const = 0; + int components () const; int lines (int) const; @@ -107,6 +109,7 @@ public: int * line_size () const; int * stride () const; libdcp::Size size () const; + bool aligned () const; private: /* Not allowed */ @@ -131,6 +134,7 @@ public: int * line_size () const; int * stride () const; libdcp::Size size () const; + bool aligned () const; protected: void allocate (); |
