Logging improvements to allow prettier displays in the server GUI.
[dcpomatic.git] / src / lib / image.cc
1 /*
2     Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 /** @file src/image.cc
21  *  @brief A class to describe a video image.
22  */
23
24 #include "image.h"
25 #include "exceptions.h"
26 #include "timer.h"
27 #include "rect.h"
28 #include "util.h"
29 #include "md5_digester.h"
30 #include "dcpomatic_socket.h"
31 extern "C" {
32 #include <libswscale/swscale.h>
33 #include <libavutil/pixfmt.h>
34 #include <libavutil/pixdesc.h>
35 #include <libavutil/frame.h>
36 }
37 #include <iostream>
38
39 #include "i18n.h"
40
41 using std::string;
42 using std::min;
43 using std::cout;
44 using std::cerr;
45 using std::list;
46 using boost::shared_ptr;
47 using dcp::Size;
48
49 int
50 Image::line_factor (int n) const
51 {
52         if (n == 0) {
53                 return 1;
54         }
55
56         AVPixFmtDescriptor const * d = av_pix_fmt_desc_get(_pixel_format);
57         if (!d) {
58                 throw PixelFormatError ("line_factor()", _pixel_format);
59         }
60
61         return pow (2.0f, d->log2_chroma_h);
62 }
63
64 /** @param n Component index.
65  *  @return Number of samples (i.e. pixels, unless sub-sampled) in each direction for this component.
66  */
67 dcp::Size
68 Image::sample_size (int n) const
69 {
70         int horizontal_factor = 1;
71         if (n > 0) {
72                 AVPixFmtDescriptor const * d = av_pix_fmt_desc_get (_pixel_format);
73                 if (!d) {
74                         throw PixelFormatError ("sample_size()", _pixel_format);
75                 }
76                 horizontal_factor = pow (2.0f, d->log2_chroma_w);
77         }
78
79         return dcp::Size (
80                 lrint (ceil (static_cast<double>(size().width) / horizontal_factor)),
81                 lrint (ceil (static_cast<double>(size().height) / line_factor (n)))
82                 );
83 }
84
85 int
86 Image::components () const
87 {
88         AVPixFmtDescriptor const * d = av_pix_fmt_desc_get(_pixel_format);
89         if (!d) {
90                 throw PixelFormatError ("components()", _pixel_format);
91         }
92
93         return d->nb_components;
94 }
95
96 /** @return Number of planes */
97 int
98 Image::planes () const
99 {
100         AVPixFmtDescriptor const * d = av_pix_fmt_desc_get(_pixel_format);
101         if (!d) {
102                 throw PixelFormatError ("planes()", _pixel_format);
103         }
104
105         if ((d->flags & PIX_FMT_PLANAR) == 0) {
106                 return 1;
107         }
108
109         return d->nb_components;
110 }
111
112 /** Crop this image, scale it to `inter_size' and then place it in a black frame of `out_size' */
113 shared_ptr<Image>
114 Image::crop_scale_window (
115         Crop crop, dcp::Size inter_size, dcp::Size out_size, dcp::YUVToRGB yuv_to_rgb, AVPixelFormat out_format, bool out_aligned
116         ) const
117 {
118         /* Empirical testing suggests that sws_scale() will crash if
119            the input image is not aligned.
120         */
121         DCPOMATIC_ASSERT (aligned ());
122
123         DCPOMATIC_ASSERT (out_size.width >= inter_size.width);
124         DCPOMATIC_ASSERT (out_size.height >= inter_size.height);
125
126         /* Here's an image of out_size */
127         shared_ptr<Image> out (new Image (out_format, out_size, out_aligned));
128         out->make_black ();
129
130         /* Size of the image after any crop */
131         dcp::Size const cropped_size = crop.apply (size ());
132
133         /* Scale context for a scale from cropped_size to inter_size */
134         struct SwsContext* scale_context = sws_getContext (
135                         cropped_size.width, cropped_size.height, pixel_format(),
136                         inter_size.width, inter_size.height, out_format,
137                         SWS_BICUBIC, 0, 0, 0
138                 );
139
140         if (!scale_context) {
141                 throw StringError (N_("Could not allocate SwsContext"));
142         }
143
144         DCPOMATIC_ASSERT (yuv_to_rgb < dcp::YUV_TO_RGB_COUNT);
145         int const lut[dcp::YUV_TO_RGB_COUNT] = {
146                 SWS_CS_ITU601,
147                 SWS_CS_ITU709
148         };
149
150         sws_setColorspaceDetails (
151                 scale_context,
152                 sws_getCoefficients (lut[yuv_to_rgb]), 0,
153                 sws_getCoefficients (lut[yuv_to_rgb]), 0,
154                 0, 1 << 16, 1 << 16
155                 );
156
157         AVPixFmtDescriptor const * desc = av_pix_fmt_desc_get (_pixel_format);
158         if (!desc) {
159                 throw PixelFormatError ("crop_scale_window()", _pixel_format);
160         }
161
162         /* Prepare input data pointers with crop */
163         uint8_t* scale_in_data[planes()];
164         for (int c = 0; c < planes(); ++c) {
165                 /* To work out the crop in bytes, start by multiplying
166                    the crop by the (average) bytes per pixel.  Then
167                    round down so that we don't crop a subsampled pixel until
168                    we've cropped all of its Y-channel pixels.
169                 */
170                 int const x = lrintf (bytes_per_pixel(c) * crop.left) & ~ ((int) desc->log2_chroma_w);
171                 scale_in_data[c] = data()[c] + x + stride()[c] * (crop.top / line_factor(c));
172         }
173
174         /* Corner of the image within out_size */
175         Position<int> const corner ((out_size.width - inter_size.width) / 2, (out_size.height - inter_size.height) / 2);
176
177         uint8_t* scale_out_data[out->planes()];
178         for (int c = 0; c < out->planes(); ++c) {
179                 scale_out_data[c] = out->data()[c] + lrintf (out->bytes_per_pixel(c) * corner.x) + out->stride()[c] * corner.y;
180         }
181
182         sws_scale (
183                 scale_context,
184                 scale_in_data, stride(),
185                 0, cropped_size.height,
186                 scale_out_data, out->stride()
187                 );
188
189         sws_freeContext (scale_context);
190
191         return out;
192 }
193
194 shared_ptr<Image>
195 Image::scale (dcp::Size out_size, dcp::YUVToRGB yuv_to_rgb, AVPixelFormat out_format, bool out_aligned) const
196 {
197         /* Empirical testing suggests that sws_scale() will crash if
198            the input image is not aligned.
199         */
200         DCPOMATIC_ASSERT (aligned ());
201
202         shared_ptr<Image> scaled (new Image (out_format, out_size, out_aligned));
203
204         struct SwsContext* scale_context = sws_getContext (
205                 size().width, size().height, pixel_format(),
206                 out_size.width, out_size.height, out_format,
207                 SWS_BICUBIC, 0, 0, 0
208                 );
209
210         DCPOMATIC_ASSERT (yuv_to_rgb < dcp::YUV_TO_RGB_COUNT);
211         int const lut[dcp::YUV_TO_RGB_COUNT] = {
212                 SWS_CS_ITU601,
213                 SWS_CS_ITU709
214         };
215
216         sws_setColorspaceDetails (
217                 scale_context,
218                 sws_getCoefficients (lut[yuv_to_rgb]), 0,
219                 sws_getCoefficients (lut[yuv_to_rgb]), 0,
220                 0, 1 << 16, 1 << 16
221                 );
222
223         sws_scale (
224                 scale_context,
225                 data(), stride(),
226                 0, size().height,
227                 scaled->data(), scaled->stride()
228                 );
229
230         sws_freeContext (scale_context);
231
232         return scaled;
233 }
234
235 /** Blacken a YUV image whose bits per pixel is rounded up to 16 */
236 void
237 Image::yuv_16_black (uint16_t v, bool alpha)
238 {
239         memset (data()[0], 0, sample_size(0).height * stride()[0]);
240         for (int i = 1; i < 3; ++i) {
241                 int16_t* p = reinterpret_cast<int16_t*> (data()[i]);
242                 int const lines = sample_size(i).height;
243                 for (int y = 0; y < lines; ++y) {
244                         /* We divide by 2 here because we are writing 2 bytes at a time */
245                         for (int x = 0; x < line_size()[i] / 2; ++x) {
246                                 p[x] = v;
247                         }
248                         p += stride()[i] / 2;
249                 }
250         }
251
252         if (alpha) {
253                 memset (data()[3], 0, sample_size(3).height * stride()[3]);
254         }
255 }
256
257 uint16_t
258 Image::swap_16 (uint16_t v)
259 {
260         return ((v >> 8) & 0xff) | ((v & 0xff) << 8);
261 }
262
263 void
264 Image::make_black ()
265 {
266         /* U/V black value for 8-bit colour */
267         static uint8_t const eight_bit_uv =     (1 << 7) - 1;
268         /* U/V black value for 9-bit colour */
269         static uint16_t const nine_bit_uv =     (1 << 8) - 1;
270         /* U/V black value for 10-bit colour */
271         static uint16_t const ten_bit_uv =      (1 << 9) - 1;
272         /* U/V black value for 16-bit colour */
273         static uint16_t const sixteen_bit_uv =  (1 << 15) - 1;
274
275         switch (_pixel_format) {
276         case PIX_FMT_YUV420P:
277         case PIX_FMT_YUV422P:
278         case PIX_FMT_YUV444P:
279         case PIX_FMT_YUV411P:
280                 memset (data()[0], 0, sample_size(0).height * stride()[0]);
281                 memset (data()[1], eight_bit_uv, sample_size(1).height * stride()[1]);
282                 memset (data()[2], eight_bit_uv, sample_size(2).height * stride()[2]);
283                 break;
284
285         case PIX_FMT_YUVJ420P:
286         case PIX_FMT_YUVJ422P:
287         case PIX_FMT_YUVJ444P:
288                 memset (data()[0], 0, sample_size(0).height * stride()[0]);
289                 memset (data()[1], eight_bit_uv + 1, sample_size(1).height * stride()[1]);
290                 memset (data()[2], eight_bit_uv + 1, sample_size(2).height * stride()[2]);
291                 break;
292
293         case PIX_FMT_YUV422P9LE:
294         case PIX_FMT_YUV444P9LE:
295                 yuv_16_black (nine_bit_uv, false);
296                 break;
297
298         case PIX_FMT_YUV422P9BE:
299         case PIX_FMT_YUV444P9BE:
300                 yuv_16_black (swap_16 (nine_bit_uv), false);
301                 break;
302
303         case PIX_FMT_YUV422P10LE:
304         case PIX_FMT_YUV444P10LE:
305                 yuv_16_black (ten_bit_uv, false);
306                 break;
307
308         case PIX_FMT_YUV422P16LE:
309         case PIX_FMT_YUV444P16LE:
310                 yuv_16_black (sixteen_bit_uv, false);
311                 break;
312
313         case PIX_FMT_YUV444P10BE:
314         case PIX_FMT_YUV422P10BE:
315                 yuv_16_black (swap_16 (ten_bit_uv), false);
316                 break;
317
318         case AV_PIX_FMT_YUVA420P9BE:
319         case AV_PIX_FMT_YUVA422P9BE:
320         case AV_PIX_FMT_YUVA444P9BE:
321                 yuv_16_black (swap_16 (nine_bit_uv), true);
322                 break;
323
324         case AV_PIX_FMT_YUVA420P9LE:
325         case AV_PIX_FMT_YUVA422P9LE:
326         case AV_PIX_FMT_YUVA444P9LE:
327                 yuv_16_black (nine_bit_uv, true);
328                 break;
329
330         case AV_PIX_FMT_YUVA420P10BE:
331         case AV_PIX_FMT_YUVA422P10BE:
332         case AV_PIX_FMT_YUVA444P10BE:
333                 yuv_16_black (swap_16 (ten_bit_uv), true);
334                 break;
335
336         case AV_PIX_FMT_YUVA420P10LE:
337         case AV_PIX_FMT_YUVA422P10LE:
338         case AV_PIX_FMT_YUVA444P10LE:
339                 yuv_16_black (ten_bit_uv, true);
340                 break;
341
342         case AV_PIX_FMT_YUVA420P16BE:
343         case AV_PIX_FMT_YUVA422P16BE:
344         case AV_PIX_FMT_YUVA444P16BE:
345                 yuv_16_black (swap_16 (sixteen_bit_uv), true);
346                 break;
347
348         case AV_PIX_FMT_YUVA420P16LE:
349         case AV_PIX_FMT_YUVA422P16LE:
350         case AV_PIX_FMT_YUVA444P16LE:
351                 yuv_16_black (sixteen_bit_uv, true);
352                 break;
353
354         case PIX_FMT_RGB24:
355         case PIX_FMT_ARGB:
356         case PIX_FMT_RGBA:
357         case PIX_FMT_ABGR:
358         case PIX_FMT_BGRA:
359         case PIX_FMT_RGB555LE:
360         case PIX_FMT_RGB48LE:
361         case PIX_FMT_RGB48BE:
362                 memset (data()[0], 0, sample_size(0).height * stride()[0]);
363                 break;
364
365         case PIX_FMT_UYVY422:
366         {
367                 int const Y = sample_size(0).height;
368                 int const X = line_size()[0];
369                 uint8_t* p = data()[0];
370                 for (int y = 0; y < Y; ++y) {
371                         for (int x = 0; x < X / 4; ++x) {
372                                 *p++ = eight_bit_uv; // Cb
373                                 *p++ = 0;            // Y0
374                                 *p++ = eight_bit_uv; // Cr
375                                 *p++ = 0;            // Y1
376                         }
377                 }
378                 break;
379         }
380
381         default:
382                 throw PixelFormatError ("make_black()", _pixel_format);
383         }
384 }
385
386 void
387 Image::make_transparent ()
388 {
389         if (_pixel_format != PIX_FMT_RGBA) {
390                 throw PixelFormatError ("make_transparent()", _pixel_format);
391         }
392
393         memset (data()[0], 0, sample_size(0).height * stride()[0]);
394 }
395
396 void
397 Image::alpha_blend (shared_ptr<const Image> other, Position<int> position)
398 {
399         DCPOMATIC_ASSERT (other->pixel_format() == PIX_FMT_RGBA);
400         int const other_bpp = 4;
401
402         int start_tx = position.x;
403         int start_ox = 0;
404
405         if (start_tx < 0) {
406                 start_ox = -start_tx;
407                 start_tx = 0;
408         }
409
410         int start_ty = position.y;
411         int start_oy = 0;
412
413         if (start_ty < 0) {
414                 start_oy = -start_ty;
415                 start_ty = 0;
416         }
417
418         switch (_pixel_format) {
419         case PIX_FMT_RGB24:
420         {
421                 int const this_bpp = 3;
422                 for (int ty = start_ty, oy = start_oy; ty < size().height && oy < other->size().height; ++ty, ++oy) {
423                         uint8_t* tp = data()[0] + ty * stride()[0] + start_tx * this_bpp;
424                         uint8_t* op = other->data()[0] + oy * other->stride()[0];
425                         for (int tx = start_tx, ox = start_ox; tx < size().width && ox < other->size().width; ++tx, ++ox) {
426                                 float const alpha = float (op[3]) / 255;
427                                 tp[0] = op[0] * alpha + tp[0] * (1 - alpha);
428                                 tp[1] = op[1] * alpha + tp[1] * (1 - alpha);
429                                 tp[2] = op[2] * alpha + tp[2] * (1 - alpha);
430
431                                 tp += this_bpp;
432                                 op += other_bpp;
433                         }
434                 }
435                 break;
436         }
437         case PIX_FMT_BGRA:
438         case PIX_FMT_RGBA:
439         {
440                 int const this_bpp = 4;
441                 for (int ty = start_ty, oy = start_oy; ty < size().height && oy < other->size().height; ++ty, ++oy) {
442                         uint8_t* tp = data()[0] + ty * stride()[0] + start_tx * this_bpp;
443                         uint8_t* op = other->data()[0] + oy * other->stride()[0];
444                         for (int tx = start_tx, ox = start_ox; tx < size().width && ox < other->size().width; ++tx, ++ox) {
445                                 float const alpha = float (op[3]) / 255;
446                                 tp[0] = op[0] * alpha + tp[0] * (1 - alpha);
447                                 tp[1] = op[1] * alpha + tp[1] * (1 - alpha);
448                                 tp[2] = op[2] * alpha + tp[2] * (1 - alpha);
449                                 tp[3] = op[3] * alpha + tp[3] * (1 - alpha);
450
451                                 tp += this_bpp;
452                                 op += other_bpp;
453                         }
454                 }
455                 break;
456         }
457         case PIX_FMT_RGB48LE:
458         {
459                 int const this_bpp = 6;
460                 for (int ty = start_ty, oy = start_oy; ty < size().height && oy < other->size().height; ++ty, ++oy) {
461                         uint8_t* tp = data()[0] + ty * stride()[0] + start_tx * this_bpp;
462                         uint8_t* op = other->data()[0] + oy * other->stride()[0];
463                         for (int tx = start_tx, ox = start_ox; tx < size().width && ox < other->size().width; ++tx, ++ox) {
464                                 float const alpha = float (op[3]) / 255;
465                                 /* Blend high bytes */
466                                 tp[1] = op[0] * alpha + tp[1] * (1 - alpha);
467                                 tp[3] = op[1] * alpha + tp[3] * (1 - alpha);
468                                 tp[5] = op[2] * alpha + tp[5] * (1 - alpha);
469
470                                 tp += this_bpp;
471                                 op += other_bpp;
472                         }
473                 }
474                 break;
475         }
476         default:
477                 DCPOMATIC_ASSERT (false);
478         }
479 }
480
481 void
482 Image::copy (shared_ptr<const Image> other, Position<int> position)
483 {
484         /* Only implemented for RGB24 onto RGB24 so far */
485         DCPOMATIC_ASSERT (_pixel_format == PIX_FMT_RGB24 && other->pixel_format() == PIX_FMT_RGB24);
486         DCPOMATIC_ASSERT (position.x >= 0 && position.y >= 0);
487
488         int const N = min (position.x + other->size().width, size().width) - position.x;
489         for (int ty = position.y, oy = 0; ty < size().height && oy < other->size().height; ++ty, ++oy) {
490                 uint8_t * const tp = data()[0] + ty * stride()[0] + position.x * 3;
491                 uint8_t * const op = other->data()[0] + oy * other->stride()[0];
492                 memcpy (tp, op, N * 3);
493         }
494 }
495
496 void
497 Image::read_from_socket (shared_ptr<Socket> socket)
498 {
499         for (int i = 0; i < planes(); ++i) {
500                 uint8_t* p = data()[i];
501                 int const lines = sample_size(i).height;
502                 for (int y = 0; y < lines; ++y) {
503                         socket->read (p, line_size()[i]);
504                         p += stride()[i];
505                 }
506         }
507 }
508
509 void
510 Image::write_to_socket (shared_ptr<Socket> socket) const
511 {
512         for (int i = 0; i < planes(); ++i) {
513                 uint8_t* p = data()[i];
514                 int const lines = sample_size(i).height;
515                 for (int y = 0; y < lines; ++y) {
516                         socket->write (p, line_size()[i]);
517                         p += stride()[i];
518                 }
519         }
520 }
521
522 float
523 Image::bytes_per_pixel (int c) const
524 {
525         AVPixFmtDescriptor const * d = av_pix_fmt_desc_get(_pixel_format);
526         if (!d) {
527                 throw PixelFormatError ("bytes_per_pixel()", _pixel_format);
528         }
529
530         if (c >= planes()) {
531                 return 0;
532         }
533
534         float bpp[4] = { 0, 0, 0, 0 };
535
536         bpp[0] = floor ((d->comp[0].depth_minus1 + 1 + 7) / 8);
537         if (d->nb_components > 1) {
538                 bpp[1] = floor ((d->comp[1].depth_minus1 + 1 + 7) / 8) / pow (2.0f, d->log2_chroma_w);
539         }
540         if (d->nb_components > 2) {
541                 bpp[2] = floor ((d->comp[2].depth_minus1 + 1 + 7) / 8) / pow (2.0f, d->log2_chroma_w);
542         }
543         if (d->nb_components > 3) {
544                 bpp[3] = floor ((d->comp[3].depth_minus1 + 1 + 7) / 8) / pow (2.0f, d->log2_chroma_w);
545         }
546
547         if ((d->flags & PIX_FMT_PLANAR) == 0) {
548                 /* Not planar; sum them up */
549                 return bpp[0] + bpp[1] + bpp[2] + bpp[3];
550         }
551
552         return bpp[c];
553 }
554
555 /** Construct a Image of a given size and format, allocating memory
556  *  as required.
557  *
558  *  @param p Pixel format.
559  *  @param s Size in pixels.
560  */
561 Image::Image (AVPixelFormat p, dcp::Size s, bool aligned)
562         : _size (s)
563         , _pixel_format (p)
564         , _aligned (aligned)
565 {
566         allocate ();
567 }
568
569 void
570 Image::allocate ()
571 {
572         _data = (uint8_t **) wrapped_av_malloc (4 * sizeof (uint8_t *));
573         _data[0] = _data[1] = _data[2] = _data[3] = 0;
574
575         _line_size = (int *) wrapped_av_malloc (4 * sizeof (int));
576         _line_size[0] = _line_size[1] = _line_size[2] = _line_size[3] = 0;
577
578         _stride = (int *) wrapped_av_malloc (4 * sizeof (int));
579         _stride[0] = _stride[1] = _stride[2] = _stride[3] = 0;
580
581         for (int i = 0; i < planes(); ++i) {
582                 _line_size[i] = ceil (_size.width * bytes_per_pixel(i));
583                 _stride[i] = stride_round_up (i, _line_size, _aligned ? 32 : 1);
584
585                 /* The assembler function ff_rgb24ToY_avx (in libswscale/x86/input.asm)
586                    uses a 16-byte fetch to read three bytes (R/G/B) of image data.
587                    Hence on the last pixel of the last line it reads over the end of
588                    the actual data by 1 byte.  If the width of an image is a multiple
589                    of the stride alignment there will be no padding at the end of image lines.
590                    OS X crashes on this illegal read, though other operating systems don't
591                    seem to mind.  The nasty + 1 in this malloc makes sure there is always a byte
592                    for that instruction to read safely.
593
594                    Further to the above, valgrind is now telling me that ff_rgb24ToY_ssse3
595                    over-reads by more then _avx.  I can't follow the code to work out how much,
596                    so I'll just over-allocate by 32 bytes and have done with it.  Empirical
597                    testing suggests that it works.
598                 */
599                 _data[i] = (uint8_t *) wrapped_av_malloc (_stride[i] * sample_size(i).height + 32);
600         }
601 }
602
603 Image::Image (Image const & other)
604         : _size (other._size)
605         , _pixel_format (other._pixel_format)
606         , _aligned (other._aligned)
607 {
608         allocate ();
609
610         for (int i = 0; i < planes(); ++i) {
611                 uint8_t* p = _data[i];
612                 uint8_t* q = other._data[i];
613                 int const lines = sample_size(i).height;
614                 for (int j = 0; j < lines; ++j) {
615                         memcpy (p, q, _line_size[i]);
616                         p += stride()[i];
617                         q += other.stride()[i];
618                 }
619         }
620 }
621
622 Image::Image (AVFrame* frame)
623         : _size (frame->width, frame->height)
624         , _pixel_format (static_cast<AVPixelFormat> (frame->format))
625         , _aligned (true)
626 {
627         allocate ();
628
629         for (int i = 0; i < planes(); ++i) {
630                 uint8_t* p = _data[i];
631                 uint8_t* q = frame->data[i];
632                 int const lines = sample_size(i).height;
633                 for (int j = 0; j < lines; ++j) {
634                         memcpy (p, q, _line_size[i]);
635                         p += stride()[i];
636                         /* AVFrame's linesize is what we call `stride' */
637                         q += frame->linesize[i];
638                 }
639         }
640 }
641
642 Image::Image (shared_ptr<const Image> other, bool aligned)
643         : _size (other->_size)
644         , _pixel_format (other->_pixel_format)
645         , _aligned (aligned)
646 {
647         allocate ();
648
649         for (int i = 0; i < planes(); ++i) {
650                 DCPOMATIC_ASSERT (line_size()[i] == other->line_size()[i]);
651                 uint8_t* p = _data[i];
652                 uint8_t* q = other->data()[i];
653                 int const lines = sample_size(i).height;
654                 for (int j = 0; j < lines; ++j) {
655                         memcpy (p, q, line_size()[i]);
656                         p += stride()[i];
657                         q += other->stride()[i];
658                 }
659         }
660 }
661
662 Image&
663 Image::operator= (Image const & other)
664 {
665         if (this == &other) {
666                 return *this;
667         }
668
669         Image tmp (other);
670         swap (tmp);
671         return *this;
672 }
673
674 void
675 Image::swap (Image & other)
676 {
677         std::swap (_size, other._size);
678         std::swap (_pixel_format, other._pixel_format);
679
680         for (int i = 0; i < 4; ++i) {
681                 std::swap (_data[i], other._data[i]);
682                 std::swap (_line_size[i], other._line_size[i]);
683                 std::swap (_stride[i], other._stride[i]);
684         }
685
686         std::swap (_aligned, other._aligned);
687 }
688
689 /** Destroy a Image */
690 Image::~Image ()
691 {
692         for (int i = 0; i < planes(); ++i) {
693                 av_free (_data[i]);
694         }
695
696         av_free (_data);
697         av_free (_line_size);
698         av_free (_stride);
699 }
700
701 uint8_t * const *
702 Image::data () const
703 {
704         return _data;
705 }
706
707 int const *
708 Image::line_size () const
709 {
710         return _line_size;
711 }
712
713 int const *
714 Image::stride () const
715 {
716         return _stride;
717 }
718
719 dcp::Size
720 Image::size () const
721 {
722         return _size;
723 }
724
725 bool
726 Image::aligned () const
727 {
728         return _aligned;
729 }
730
731 PositionImage
732 merge (list<PositionImage> images)
733 {
734         if (images.empty ()) {
735                 return PositionImage ();
736         }
737
738         if (images.size() == 1) {
739                 return images.front ();
740         }
741
742         dcpomatic::Rect<int> all (images.front().position, images.front().image->size().width, images.front().image->size().height);
743         for (list<PositionImage>::const_iterator i = images.begin(); i != images.end(); ++i) {
744                 all.extend (dcpomatic::Rect<int> (i->position, i->image->size().width, i->image->size().height));
745         }
746
747         shared_ptr<Image> merged (new Image (images.front().image->pixel_format (), dcp::Size (all.width, all.height), true));
748         merged->make_transparent ();
749         for (list<PositionImage>::const_iterator i = images.begin(); i != images.end(); ++i) {
750                 merged->alpha_blend (i->image, i->position - all.position());
751         }
752
753         return PositionImage (merged, all.position ());
754 }
755
756 bool
757 operator== (Image const & a, Image const & b)
758 {
759         if (a.planes() != b.planes() || a.pixel_format() != b.pixel_format() || a.aligned() != b.aligned()) {
760                 return false;
761         }
762
763         for (int c = 0; c < a.planes(); ++c) {
764                 if (a.sample_size(c).height != b.sample_size(c).height || a.line_size()[c] != b.line_size()[c] || a.stride()[c] != b.stride()[c]) {
765                         return false;
766                 }
767
768                 uint8_t* p = a.data()[c];
769                 uint8_t* q = b.data()[c];
770                 int const lines = a.sample_size(c).height;
771                 for (int y = 0; y < lines; ++y) {
772                         if (memcmp (p, q, a.line_size()[c]) != 0) {
773                                 return false;
774                         }
775
776                         p += a.stride()[c];
777                         q += b.stride()[c];
778                 }
779         }
780
781         return true;
782 }
783
784 /** Fade the image.
785  *  @param f Amount to fade by; 0 is black, 1 is no fade.
786  */
787 void
788 Image::fade (float f)
789 {
790         switch (_pixel_format) {
791         case PIX_FMT_YUV420P:
792         case PIX_FMT_YUV422P:
793         case PIX_FMT_YUV444P:
794         case PIX_FMT_YUV411P:
795         case PIX_FMT_YUVJ420P:
796         case PIX_FMT_YUVJ422P:
797         case PIX_FMT_YUVJ444P:
798         case PIX_FMT_RGB24:
799         case PIX_FMT_ARGB:
800         case PIX_FMT_RGBA:
801         case PIX_FMT_ABGR:
802         case PIX_FMT_BGRA:
803         case PIX_FMT_RGB555LE:
804                 /* 8-bit */
805                 for (int c = 0; c < 3; ++c) {
806                         uint8_t* p = data()[c];
807                         int const lines = sample_size(c).height;
808                         for (int y = 0; y < lines; ++y) {
809                                 uint8_t* q = p;
810                                 for (int x = 0; x < line_size()[c]; ++x) {
811                                         *q = int (float (*q) * f);
812                                         ++q;
813                                 }
814                                 p += stride()[c];
815                         }
816                 }
817                 break;
818
819         case PIX_FMT_YUV422P9LE:
820         case PIX_FMT_YUV444P9LE:
821         case PIX_FMT_YUV422P10LE:
822         case PIX_FMT_YUV444P10LE:
823         case PIX_FMT_YUV422P16LE:
824         case PIX_FMT_YUV444P16LE:
825         case AV_PIX_FMT_YUVA420P9LE:
826         case AV_PIX_FMT_YUVA422P9LE:
827         case AV_PIX_FMT_YUVA444P9LE:
828         case AV_PIX_FMT_YUVA420P10LE:
829         case AV_PIX_FMT_YUVA422P10LE:
830         case AV_PIX_FMT_YUVA444P10LE:
831         case AV_PIX_FMT_RGB48LE:
832                 /* 16-bit little-endian */
833                 for (int c = 0; c < 3; ++c) {
834                         int const stride_pixels = stride()[c] / 2;
835                         int const line_size_pixels = line_size()[c] / 2;
836                         uint16_t* p = reinterpret_cast<uint16_t*> (data()[c]);
837                         int const lines = sample_size(c).height;
838                         for (int y = 0; y < lines; ++y) {
839                                 uint16_t* q = p;
840                                 for (int x = 0; x < line_size_pixels; ++x) {
841                                         *q = int (float (*q) * f);
842                                         ++q;
843                                 }
844                                 p += stride_pixels;
845                         }
846                 }
847                 break;
848
849         case PIX_FMT_YUV422P9BE:
850         case PIX_FMT_YUV444P9BE:
851         case PIX_FMT_YUV444P10BE:
852         case PIX_FMT_YUV422P10BE:
853         case AV_PIX_FMT_YUVA420P9BE:
854         case AV_PIX_FMT_YUVA422P9BE:
855         case AV_PIX_FMT_YUVA444P9BE:
856         case AV_PIX_FMT_YUVA420P10BE:
857         case AV_PIX_FMT_YUVA422P10BE:
858         case AV_PIX_FMT_YUVA444P10BE:
859         case AV_PIX_FMT_YUVA420P16BE:
860         case AV_PIX_FMT_YUVA422P16BE:
861         case AV_PIX_FMT_YUVA444P16BE:
862         case AV_PIX_FMT_RGB48BE:
863                 /* 16-bit big-endian */
864                 for (int c = 0; c < 3; ++c) {
865                         int const stride_pixels = stride()[c] / 2;
866                         int const line_size_pixels = line_size()[c] / 2;
867                         uint16_t* p = reinterpret_cast<uint16_t*> (data()[c]);
868                         int const lines = sample_size(c).height;
869                         for (int y = 0; y < lines; ++y) {
870                                 uint16_t* q = p;
871                                 for (int x = 0; x < line_size_pixels; ++x) {
872                                         *q = swap_16 (int (float (swap_16 (*q)) * f));
873                                         ++q;
874                                 }
875                                 p += stride_pixels;
876                         }
877                 }
878                 break;
879
880         case PIX_FMT_UYVY422:
881         {
882                 int const Y = sample_size(0).height;
883                 int const X = line_size()[0];
884                 uint8_t* p = data()[0];
885                 for (int y = 0; y < Y; ++y) {
886                         for (int x = 0; x < X; ++x) {
887                                 *p = int (float (*p) * f);
888                                 ++p;
889                         }
890                 }
891                 break;
892         }
893
894         default:
895                 throw PixelFormatError ("fade()", _pixel_format);
896         }
897 }