#include <libswscale/swscale.h>
#include <libavutil/pixfmt.h>
#include <libavutil/pixdesc.h>
+#include <libavutil/frame.h>
}
#include <iostream>
using std::cout;
using std::cerr;
using std::list;
+using std::runtime_error;
using boost::shared_ptr;
using dcp::Size;
throw PixelFormatError ("planes()", _pixel_format);
}
- if ((d->flags & PIX_FMT_PLANAR) == 0) {
+ if ((d->flags & AV_PIX_FMT_FLAG_PLANAR) == 0) {
return 1;
}
);
if (!scale_context) {
- throw StringError (N_("Could not allocate SwsContext"));
+ throw runtime_error (N_("Could not allocate SwsContext"));
}
DCPOMATIC_ASSERT (yuv_to_rgb < dcp::YUV_TO_RGB_COUNT);
static uint16_t const sixteen_bit_uv = (1 << 15) - 1;
switch (_pixel_format) {
- case PIX_FMT_YUV420P:
- case PIX_FMT_YUV422P:
- case PIX_FMT_YUV444P:
- case PIX_FMT_YUV411P:
+ case AV_PIX_FMT_YUV420P:
+ case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUV444P:
+ case AV_PIX_FMT_YUV411P:
memset (data()[0], 0, sample_size(0).height * stride()[0]);
memset (data()[1], eight_bit_uv, sample_size(1).height * stride()[1]);
memset (data()[2], eight_bit_uv, sample_size(2).height * stride()[2]);
break;
- case PIX_FMT_YUVJ420P:
- case PIX_FMT_YUVJ422P:
- case PIX_FMT_YUVJ444P:
+ case AV_PIX_FMT_YUVJ420P:
+ case AV_PIX_FMT_YUVJ422P:
+ case AV_PIX_FMT_YUVJ444P:
memset (data()[0], 0, sample_size(0).height * stride()[0]);
memset (data()[1], eight_bit_uv + 1, sample_size(1).height * stride()[1]);
memset (data()[2], eight_bit_uv + 1, sample_size(2).height * stride()[2]);
break;
- case PIX_FMT_YUV422P9LE:
- case PIX_FMT_YUV444P9LE:
+ case AV_PIX_FMT_YUV422P9LE:
+ case AV_PIX_FMT_YUV444P9LE:
yuv_16_black (nine_bit_uv, false);
break;
- case PIX_FMT_YUV422P9BE:
- case PIX_FMT_YUV444P9BE:
+ case AV_PIX_FMT_YUV422P9BE:
+ case AV_PIX_FMT_YUV444P9BE:
yuv_16_black (swap_16 (nine_bit_uv), false);
break;
- case PIX_FMT_YUV422P10LE:
- case PIX_FMT_YUV444P10LE:
+ case AV_PIX_FMT_YUV422P10LE:
+ case AV_PIX_FMT_YUV444P10LE:
yuv_16_black (ten_bit_uv, false);
break;
- case PIX_FMT_YUV422P16LE:
- case PIX_FMT_YUV444P16LE:
+ case AV_PIX_FMT_YUV422P16LE:
+ case AV_PIX_FMT_YUV444P16LE:
yuv_16_black (sixteen_bit_uv, false);
break;
- case PIX_FMT_YUV444P10BE:
- case PIX_FMT_YUV422P10BE:
+ case AV_PIX_FMT_YUV444P10BE:
+ case AV_PIX_FMT_YUV422P10BE:
yuv_16_black (swap_16 (ten_bit_uv), false);
break;
yuv_16_black (sixteen_bit_uv, true);
break;
- case PIX_FMT_RGB24:
- case PIX_FMT_ARGB:
- case PIX_FMT_RGBA:
- case PIX_FMT_ABGR:
- case PIX_FMT_BGRA:
- case PIX_FMT_RGB555LE:
- case PIX_FMT_RGB48LE:
- case PIX_FMT_RGB48BE:
+ case AV_PIX_FMT_RGB24:
+ case AV_PIX_FMT_ARGB:
+ case AV_PIX_FMT_RGBA:
+ case AV_PIX_FMT_ABGR:
+ case AV_PIX_FMT_BGRA:
+ case AV_PIX_FMT_RGB555LE:
+ case AV_PIX_FMT_RGB48LE:
+ case AV_PIX_FMT_RGB48BE:
+ case AV_PIX_FMT_XYZ12LE:
memset (data()[0], 0, sample_size(0).height * stride()[0]);
break;
- case PIX_FMT_UYVY422:
+ case AV_PIX_FMT_UYVY422:
{
int const Y = sample_size(0).height;
int const X = line_size()[0];
void
Image::make_transparent ()
{
- if (_pixel_format != PIX_FMT_RGBA) {
+ if (_pixel_format != AV_PIX_FMT_RGBA) {
throw PixelFormatError ("make_transparent()", _pixel_format);
}
void
Image::alpha_blend (shared_ptr<const Image> other, Position<int> position)
{
- DCPOMATIC_ASSERT (other->pixel_format() == PIX_FMT_RGBA);
+ DCPOMATIC_ASSERT (other->pixel_format() == AV_PIX_FMT_RGBA);
int const other_bpp = 4;
int start_tx = position.x;
}
switch (_pixel_format) {
- case PIX_FMT_RGB24:
+ case AV_PIX_FMT_RGB24:
{
int const this_bpp = 3;
for (int ty = start_ty, oy = start_oy; ty < size().height && oy < other->size().height; ++ty, ++oy) {
}
break;
}
- case PIX_FMT_BGRA:
- case PIX_FMT_RGBA:
+ case AV_PIX_FMT_BGRA:
+ case AV_PIX_FMT_RGBA:
{
int const this_bpp = 4;
for (int ty = start_ty, oy = start_oy; ty < size().height && oy < other->size().height; ++ty, ++oy) {
}
break;
}
- case PIX_FMT_RGB48LE:
+ case AV_PIX_FMT_RGB48LE:
{
int const this_bpp = 6;
for (int ty = start_ty, oy = start_oy; ty < size().height && oy < other->size().height; ++ty, ++oy) {
uint8_t* op = other->data()[0] + oy * other->stride()[0];
for (int tx = start_tx, ox = start_ox; tx < size().width && ox < other->size().width; ++tx, ++ox) {
float const alpha = float (op[3]) / 255;
- /* Blend high bytes */
- tp[1] = op[0] * alpha + tp[1] * (1 - alpha);
+ /* Blend high bytes; the RGBA in op appears to be BGRA */
+ tp[1] = op[2] * alpha + tp[1] * (1 - alpha);
tp[3] = op[1] * alpha + tp[3] * (1 - alpha);
- tp[5] = op[2] * alpha + tp[5] * (1 - alpha);
+ tp[5] = op[0] * alpha + tp[5] * (1 - alpha);
+
+ tp += this_bpp;
+ op += other_bpp;
+ }
+ }
+ break;
+ }
+ case AV_PIX_FMT_XYZ12LE:
+ {
+ int const this_bpp = 6;
+ for (int ty = start_ty, oy = start_oy; ty < size().height && oy < other->size().height; ++ty, ++oy) {
+ uint8_t* tp = data()[0] + ty * stride()[0] + start_tx * this_bpp;
+ uint8_t* op = other->data()[0] + oy * other->stride()[0];
+ for (int tx = start_tx, ox = start_ox; tx < size().width && ox < other->size().width; ++tx, ++ox) {
+ float const alpha = float (op[3]) / 255;
+
+ /* Convert sRGB to XYZ; op is BGRA */
+ int const x = 0.4124564 + op[2] + 0.3575761 * op[1] + 0.1804375 * op[0];
+ int const y = 0.2126729 + op[2] + 0.7151522 * op[1] + 0.0721750 * op[0];
+ int const z = 0.0193339 + op[2] + 0.1191920 * op[1] + 0.9503041 * op[0];
+
+ /* Blend high bytes */
+ tp[1] = min (x, 255) * alpha + tp[1] * (1 - alpha);
+ tp[3] = min (y, 255) * alpha + tp[3] * (1 - alpha);
+ tp[5] = min (z, 255) * alpha + tp[5] * (1 - alpha);
tp += this_bpp;
op += other_bpp;
Image::copy (shared_ptr<const Image> other, Position<int> position)
{
/* Only implemented for RGB24 onto RGB24 so far */
- DCPOMATIC_ASSERT (_pixel_format == PIX_FMT_RGB24 && other->pixel_format() == PIX_FMT_RGB24);
+ DCPOMATIC_ASSERT (_pixel_format == AV_PIX_FMT_RGB24 && other->pixel_format() == AV_PIX_FMT_RGB24);
DCPOMATIC_ASSERT (position.x >= 0 && position.y >= 0);
int const N = min (position.x + other->size().width, size().width) - position.x;
bpp[3] = floor ((d->comp[3].depth_minus1 + 1 + 7) / 8) / pow (2.0f, d->log2_chroma_w);
}
- if ((d->flags & PIX_FMT_PLANAR) == 0) {
+ if ((d->flags & AV_PIX_FMT_FLAG_PLANAR) == 0) {
/* Not planar; sum them up */
return bpp[0] + bpp[1] + bpp[2] + bpp[3];
}
Image::fade (float f)
{
switch (_pixel_format) {
- case PIX_FMT_YUV420P:
- case PIX_FMT_YUV422P:
- case PIX_FMT_YUV444P:
- case PIX_FMT_YUV411P:
- case PIX_FMT_YUVJ420P:
- case PIX_FMT_YUVJ422P:
- case PIX_FMT_YUVJ444P:
- case PIX_FMT_RGB24:
- case PIX_FMT_ARGB:
- case PIX_FMT_RGBA:
- case PIX_FMT_ABGR:
- case PIX_FMT_BGRA:
- case PIX_FMT_RGB555LE:
+ case AV_PIX_FMT_YUV420P:
+ case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUV444P:
+ case AV_PIX_FMT_YUV411P:
+ case AV_PIX_FMT_YUVJ420P:
+ case AV_PIX_FMT_YUVJ422P:
+ case AV_PIX_FMT_YUVJ444P:
+ case AV_PIX_FMT_RGB24:
+ case AV_PIX_FMT_ARGB:
+ case AV_PIX_FMT_RGBA:
+ case AV_PIX_FMT_ABGR:
+ case AV_PIX_FMT_BGRA:
+ case AV_PIX_FMT_RGB555LE:
/* 8-bit */
for (int c = 0; c < 3; ++c) {
uint8_t* p = data()[c];
}
break;
- case PIX_FMT_YUV422P9LE:
- case PIX_FMT_YUV444P9LE:
- case PIX_FMT_YUV422P10LE:
- case PIX_FMT_YUV444P10LE:
- case PIX_FMT_YUV422P16LE:
- case PIX_FMT_YUV444P16LE:
+ case AV_PIX_FMT_YUV422P9LE:
+ case AV_PIX_FMT_YUV444P9LE:
+ case AV_PIX_FMT_YUV422P10LE:
+ case AV_PIX_FMT_YUV444P10LE:
+ case AV_PIX_FMT_YUV422P16LE:
+ case AV_PIX_FMT_YUV444P16LE:
case AV_PIX_FMT_YUVA420P9LE:
case AV_PIX_FMT_YUVA422P9LE:
case AV_PIX_FMT_YUVA444P9LE:
case AV_PIX_FMT_YUVA422P10LE:
case AV_PIX_FMT_YUVA444P10LE:
case AV_PIX_FMT_RGB48LE:
+ case AV_PIX_FMT_XYZ12LE:
/* 16-bit little-endian */
for (int c = 0; c < 3; ++c) {
int const stride_pixels = stride()[c] / 2;
}
break;
- case PIX_FMT_YUV422P9BE:
- case PIX_FMT_YUV444P9BE:
- case PIX_FMT_YUV444P10BE:
- case PIX_FMT_YUV422P10BE:
+ case AV_PIX_FMT_YUV422P9BE:
+ case AV_PIX_FMT_YUV444P9BE:
+ case AV_PIX_FMT_YUV444P10BE:
+ case AV_PIX_FMT_YUV422P10BE:
case AV_PIX_FMT_YUVA420P9BE:
case AV_PIX_FMT_YUVA422P9BE:
case AV_PIX_FMT_YUVA444P9BE:
}
break;
- case PIX_FMT_UYVY422:
+ case AV_PIX_FMT_UYVY422:
{
int const Y = sample_size(0).height;
int const X = line_size()[0];