#include "compose.hpp"
#include "dcpomatic_assert.h"
#include "dcpomatic_socket.h"
+#include "enum_indexed_vector.h"
#include "exceptions.h"
#include "image.h"
#include "maths_util.h"
}
DCPOMATIC_ASSERT (yuv_to_rgb < dcp::YUVToRGB::COUNT);
- int const lut[static_cast<int>(dcp::YUVToRGB::COUNT)] = {
- SWS_CS_ITU601,
- SWS_CS_ITU709
- };
+ EnumIndexedVector<int, dcp::YUVToRGB> lut;
+ lut[dcp::YUVToRGB::REC601] = SWS_CS_ITU601;
+ lut[dcp::YUVToRGB::REC709] = SWS_CS_ITU709;
+ lut[dcp::YUVToRGB::REC2020] = SWS_CS_BT2020;
/* The 3rd parameter here is:
0 -> source range MPEG (i.e. "video", 16-235)
*/
sws_setColorspaceDetails (
scale_context,
- sws_getCoefficients (lut[static_cast<int>(yuv_to_rgb)]), video_range == VideoRange::VIDEO ? 0 : 1,
- sws_getCoefficients (lut[static_cast<int>(yuv_to_rgb)]), out_video_range == VideoRange::VIDEO ? 0 : 1,
+ sws_getCoefficients(lut[yuv_to_rgb]), video_range == VideoRange::VIDEO ? 0 : 1,
+ sws_getCoefficients(lut[yuv_to_rgb]), out_video_range == VideoRange::VIDEO ? 0 : 1,
0, 1 << 16, 1 << 16
);
sws_freeContext (scale_context);
- if (corrected_crop != Crop() && cropped_size == inter_size) {
- /* We are cropping without any scaling or pixel format conversion, so FFmpeg may have left some
- data behind in our image. Clear it out. It may get to the point where we should just stop
- trying to be clever with cropping.
- */
- out->make_part_black (corner.x + cropped_size.width, out_size.width - cropped_size.width);
- }
+ /* There are some cases where there will be unwanted image data left in the image at this point:
+ *
+ * 1. When we are cropping without any scaling or pixel format conversion.
+ * 2. When we are scaling to certain sizes and placing the result into a larger
+ * black frame.
+ *
+ * Clear out the sides of the image to take care of those cases.
+ */
+ auto const pad = (out_size.width - inter_size.width) / 2;
+ out->make_part_black(0, pad);
+ out->make_part_black(corner.x + inter_size.width, pad);
if (
video_range == VideoRange::VIDEO &&
);
DCPOMATIC_ASSERT (yuv_to_rgb < dcp::YUVToRGB::COUNT);
- int const lut[static_cast<int>(dcp::YUVToRGB::COUNT)] = {
- SWS_CS_ITU601,
- SWS_CS_ITU709
- };
+ EnumIndexedVector<int, dcp::YUVToRGB> lut;
+ lut[dcp::YUVToRGB::REC601] = SWS_CS_ITU601;
+ lut[dcp::YUVToRGB::REC709] = SWS_CS_ITU709;
+ lut[dcp::YUVToRGB::REC2020] = SWS_CS_BT2020;
/* The 3rd parameter here is:
0 -> source range MPEG (i.e. "video", 16-235)
*/
sws_setColorspaceDetails (
scale_context,
- sws_getCoefficients (lut[static_cast<int>(yuv_to_rgb)]), 0,
- sws_getCoefficients (lut[static_cast<int>(yuv_to_rgb)]), 0,
+ sws_getCoefficients(lut[yuv_to_rgb]), 0,
+ sws_getCoefficients(lut[yuv_to_rgb]), 0,
0, 1 << 16, 1 << 16
);
}
break;
}
+ case AV_PIX_FMT_YUV444P10LE:
+ {
+ y_part();
+ for (int i = 1; i < 3; ++i) {
+ auto p = reinterpret_cast<int16_t*>(data()[i]);
+ int const h = sample_size(i).height;
+ for (int y = 0; y < h; ++y) {
+ for (int x = start; x < (start + width); ++x) {
+ p[x] = ten_bit_uv;
+ }
+ p += stride()[i] / 2;
+ }
+ }
+ break;
+ }
default:
throw PixelFormatError ("make_part_black()", _pixel_format);
}
double const b = lut_in[op[blue]];
/* RGB to XYZ, including Bradford transform and DCI companding */
- double const x = max (0.0, min (65535.0, r * fast_matrix[0] + g * fast_matrix[1] + b * fast_matrix[2]));
- double const y = max (0.0, min (65535.0, r * fast_matrix[3] + g * fast_matrix[4] + b * fast_matrix[5]));
- double const z = max (0.0, min (65535.0, r * fast_matrix[6] + g * fast_matrix[7] + b * fast_matrix[8]));
+ double const x = max(0.0, min(1.0, r * fast_matrix[0] + g * fast_matrix[1] + b * fast_matrix[2]));
+ double const y = max(0.0, min(1.0, r * fast_matrix[3] + g * fast_matrix[4] + b * fast_matrix[5]));
+ double const z = max(0.0, min(1.0, r * fast_matrix[6] + g * fast_matrix[7] + b * fast_matrix[8]));
/* Out gamma LUT and blend */
- tp[0] = lrint(lut_out[lrint(x)] * 65535) * alpha + tp[0] * (1 - alpha);
- tp[1] = lrint(lut_out[lrint(y)] * 65535) * alpha + tp[1] * (1 - alpha);
- tp[2] = lrint(lut_out[lrint(z)] * 65535) * alpha + tp[2] * (1 - alpha);
+ tp[0] = lrint(lut_out[lrint(x * 65535)] * 65535) * alpha + tp[0] * (1 - alpha);
+ tp[1] = lrint(lut_out[lrint(y * 65535)] * 65535) * alpha + tp[1] * (1 - alpha);
+ tp[2] = lrint(lut_out[lrint(z * 65535)] * 65535) * alpha + tp[2] * (1 - alpha);
tp += this_bpp / 2;
op += other_bpp;