summaryrefslogtreecommitdiff
path: root/src/lib/image.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-10-10 15:47:06 +0100
committerCarl Hetherington <cth@carlh.net>2012-10-10 15:47:06 +0100
commitcc4a67b7eb8ecaed076e261960848f70e3e741af (patch)
treea41a122341543aee630d6842785d90830298a297 /src/lib/image.cc
parentd382f34db155ddaf4bb61538c18b87c7564e00b2 (diff)
Subs successfully exported with thumbs.
Diffstat (limited to 'src/lib/image.cc')
-rw-r--r--src/lib/image.cc57
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
{