summaryrefslogtreecommitdiff
path: root/src/lib/image.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-03-04 16:44:20 +0000
committerCarl Hetherington <cth@carlh.net>2014-03-04 16:44:20 +0000
commit3753cb8685e1755b067676345a5871db24149d0f (patch)
tree96dbcc8bd10583fcb1ee23823855b0e8ea7aa0fd /src/lib/image.cc
parentf0738a22fc7555c306d49bcd1c356ce210e2c0e2 (diff)
Add support for no-scale of the input video.
Requested-by: Gérald Maruccia
Diffstat (limited to 'src/lib/image.cc')
-rw-r--r--src/lib/image.cc23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/lib/image.cc b/src/lib/image.cc
index 4722563c4..c7dfc91cb 100644
--- a/src/lib/image.cc
+++ b/src/lib/image.cc
@@ -32,9 +32,12 @@ extern "C" {
#include "exceptions.h"
#include "scaler.h"
+#include "i18n.h"
+
using std::string;
using std::min;
using std::cout;
+using std::cerr;
using boost::shared_ptr;
using libdcp::Size;
@@ -88,26 +91,38 @@ Image::crop_scale_window (Crop crop, libdcp::Size inter_size, libdcp::Size out_s
*/
assert (aligned ());
+ assert (out_size.width >= inter_size.width);
+ assert (out_size.height >= inter_size.height);
+
+ /* Here's an image of out_size */
shared_ptr<Image> out (new Image (out_format, out_size, out_aligned));
out->make_black ();
-
- libdcp::Size cropped_size = crop.apply (size ());
+ /* Size of the image after any crop */
+ libdcp::Size const cropped_size = crop.apply (size ());
+
+ /* Scale context for a scale from cropped_size to inter_size */
struct SwsContext* scale_context = sws_getContext (
cropped_size.width, cropped_size.height, pixel_format(),
inter_size.width, inter_size.height, out_format,
scaler->ffmpeg_id (), 0, 0, 0
);
+ if (!scale_context) {
+ throw StringError (N_("Could not allocate SwsContext"));
+ }
+
+ /* Prepare input data pointers with crop */
uint8_t* scale_in_data[components()];
for (int c = 0; c < components(); ++c) {
scale_in_data[c] = data()[c] + int (rint (bytes_per_pixel(c) * crop.left)) + stride()[c] * (crop.top / line_factor(c));
}
+ /* Corner of the image within out_size */
Position<int> const corner ((out_size.width - inter_size.width) / 2, (out_size.height - inter_size.height) / 2);
- uint8_t* scale_out_data[components()];
- for (int c = 0; c < components(); ++c) {
+ uint8_t* scale_out_data[out->components()];
+ for (int c = 0; c < out->components(); ++c) {
scale_out_data[c] = out->data()[c] + int (rint (out->bytes_per_pixel(c) * corner.x)) + out->stride()[c] * corner.y;
}