diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-10-10 15:47:06 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-10-10 15:47:06 +0100 |
| commit | cc4a67b7eb8ecaed076e261960848f70e3e741af (patch) | |
| tree | a41a122341543aee630d6842785d90830298a297 /src/lib/image.cc | |
| parent | d382f34db155ddaf4bb61538c18b87c7564e00b2 (diff) | |
Subs successfully exported with thumbs.
Diffstat (limited to 'src/lib/image.cc')
| -rw-r--r-- | src/lib/image.cc | 57 |
1 files changed, 44 insertions, 13 deletions
diff --git a/src/lib/image.cc b/src/lib/image.cc index 2df7636af..8fd43093d 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -57,6 +57,7 @@ Image::lines (int n) const } break; case PIX_FMT_RGB24: + case PIX_FMT_RGBA: return size().height; default: assert (false); @@ -73,6 +74,7 @@ Image::components () const case PIX_FMT_YUV420P: return 3; case PIX_FMT_RGB24: + case PIX_FMT_RGBA: return 1; default: assert (false); @@ -81,6 +83,31 @@ Image::components () const return 0; } +shared_ptr<Image> +Image::scale (Size out_size, Scaler const * scaler) const +{ + assert (scaler); + + shared_ptr<SimpleImage> scaled (new SimpleImage (pixel_format(), out_size)); + + struct SwsContext* scale_context = sws_getContext ( + size().width, size().height, pixel_format(), + out_size.width, out_size.height, pixel_format(), + scaler->ffmpeg_id (), 0, 0, 0 + ); + + sws_scale ( + scale_context, + data(), line_size(), + 0, size().height, + scaled->data (), scaled->line_size () + ); + + sws_freeContext (scale_context); + + return scaled; +} + /** Scale this image to a given size and convert it to RGB. * @param out_size Output image size in pixels. * @param scaler Scaler to use. @@ -192,10 +219,25 @@ SimpleImage::SimpleImage (PixelFormat p, Size s) { _data = (uint8_t **) av_malloc (components() * sizeof (uint8_t *)); _line_size = (int *) av_malloc (components() * sizeof (int)); + + switch (p) { + case PIX_FMT_RGB24: + _line_size[0] = s.width * 3; + break; + case PIX_FMT_RGBA: + _line_size[0] = s.width * 4; + break; + case PIX_FMT_YUV420P: + _line_size[0] = s.width; + _line_size[1] = s.width / 2; + _line_size[2] = s.width / 2; + break; + default: + assert (false); + } for (int i = 0; i < components(); ++i) { - _data[i] = 0; - _line_size[i] = 0; + _data[i] = (uint8_t *) av_malloc (_line_size[i] * lines (i)); } } @@ -210,17 +252,6 @@ SimpleImage::~SimpleImage () av_free (_line_size); } -/** Set the size in bytes of each horizontal line of a given component. - * @param i Component index. - * @param s Size of line in bytes. - */ -void -SimpleImage::set_line_size (int i, int s) -{ - _line_size[i] = s; - _data[i] = (uint8_t *) av_malloc (s * lines (i)); -} - uint8_t ** SimpleImage::data () const { |
