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/lib/image.cc | |
| parent | d58f9adc515ac0c0193a4998fed3605f4e2c6e11 (diff) | |
Make sure inputs to sws_scale are aligned, as I think they must be.
Diffstat (limited to 'src/lib/image.cc')
| -rw-r--r-- | src/lib/image.cc | 31 |
1 files changed, 26 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) { |
