Bump version
[dcpomatic.git] / src / lib / image.cc
1 /*
2     Copyright (C) 2012 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 <iostream>
25 #include <openssl/md5.h>
26 extern "C" {
27 #include <libswscale/swscale.h>
28 #include <libavutil/pixfmt.h>
29 #include <libavutil/pixdesc.h>
30 }
31 #include "image.h"
32 #include "exceptions.h"
33 #include "scaler.h"
34
35 #include "i18n.h"
36
37 using std::string;
38 using std::min;
39 using std::cout;
40 using std::cerr;
41 using std::stringstream;
42 using boost::shared_ptr;
43 using libdcp::Size;
44
45 int
46 Image::line_factor (int n) const
47 {
48         if (n == 0) {
49                 return 1;
50         }
51
52         AVPixFmtDescriptor const * d = av_pix_fmt_desc_get(_pixel_format);
53         if (!d) {
54                 throw PixelFormatError ("lines()", _pixel_format);
55         }
56         
57         return pow (2.0f, d->log2_chroma_h);
58 }
59
60 /** @param n Component index.
61  *  @return Number of lines in the image for the given component.
62  */
63 int
64 Image::lines (int n) const
65 {
66         return rint (ceil (static_cast<double>(size().height) / line_factor (n)));
67 }
68
69 /** @return Number of components */
70 int
71 Image::components () const
72 {
73         AVPixFmtDescriptor const * d = av_pix_fmt_desc_get(_pixel_format);
74         if (!d) {
75                 throw PixelFormatError ("components()", _pixel_format);
76         }
77
78         if ((d->flags & PIX_FMT_PLANAR) == 0) {
79                 return 1;
80         }
81         
82         return d->nb_components;
83 }
84
85 /** Crop this image, scale it to `inter_size' and then place it in a black frame of `out_size' */
86 shared_ptr<Image>
87 Image::crop_scale_window (Crop crop, libdcp::Size inter_size, libdcp::Size out_size, Scaler const * scaler, AVPixelFormat out_format, bool out_aligned) const
88 {
89         assert (scaler);
90         /* Empirical testing suggests that sws_scale() will crash if
91            the input image is not aligned.
92         */
93         assert (aligned ());
94
95         assert (out_size.width >= inter_size.width);
96         assert (out_size.height >= inter_size.height);
97
98         /* Here's an image of out_size */
99         shared_ptr<Image> out (new Image (out_format, out_size, out_aligned));
100         out->make_black ();
101
102         /* Size of the image after any crop */
103         libdcp::Size const cropped_size = crop.apply (size ());
104
105         /* Scale context for a scale from cropped_size to inter_size */
106         struct SwsContext* scale_context = sws_getContext (
107                 cropped_size.width, cropped_size.height, pixel_format(),
108                 inter_size.width, inter_size.height, out_format,
109                 scaler->ffmpeg_id (), 0, 0, 0
110                 );
111
112         if (!scale_context) {
113                 throw StringError (N_("Could not allocate SwsContext"));
114         }
115
116         /* Prepare input data pointers with crop */
117         uint8_t* scale_in_data[components()];
118         for (int c = 0; c < components(); ++c) {
119                 scale_in_data[c] = data()[c] + int (rint (bytes_per_pixel(c) * crop.left)) + stride()[c] * (crop.top / line_factor(c));
120         }
121
122         /* Corner of the image within out_size */
123         Position<int> const corner ((out_size.width - inter_size.width) / 2, (out_size.height - inter_size.height) / 2);
124
125         uint8_t* scale_out_data[out->components()];
126         for (int c = 0; c < out->components(); ++c) {
127                 scale_out_data[c] = out->data()[c] + int (rint (out->bytes_per_pixel(c) * corner.x)) + out->stride()[c] * corner.y;
128         }
129
130         sws_scale (
131                 scale_context,
132                 scale_in_data, stride(),
133                 0, cropped_size.height,
134                 scale_out_data, out->stride()
135                 );
136
137         sws_freeContext (scale_context);
138
139         return out;     
140 }
141
142 shared_ptr<Image>
143 Image::scale (libdcp::Size out_size, Scaler const * scaler, AVPixelFormat out_format, bool out_aligned) const
144 {
145         assert (scaler);
146         /* Empirical testing suggests that sws_scale() will crash if
147            the input image is not aligned.
148         */
149         assert (aligned ());
150
151         shared_ptr<Image> scaled (new Image (out_format, out_size, out_aligned));
152
153         struct SwsContext* scale_context = sws_getContext (
154                 size().width, size().height, pixel_format(),
155                 out_size.width, out_size.height, out_format,
156                 scaler->ffmpeg_id (), 0, 0, 0
157                 );
158
159         sws_scale (
160                 scale_context,
161                 data(), stride(),
162                 0, size().height,
163                 scaled->data(), scaled->stride()
164                 );
165
166         sws_freeContext (scale_context);
167
168         return scaled;
169 }
170
171 shared_ptr<Image>
172 Image::crop (Crop crop, bool aligned) const
173 {
174         libdcp::Size cropped_size = crop.apply (size ());
175         shared_ptr<Image> out (new Image (pixel_format(), cropped_size, aligned));
176
177         for (int c = 0; c < components(); ++c) {
178                 int const crop_left_in_bytes = bytes_per_pixel(c) * crop.left;
179                 /* bytes_per_pixel() could be a fraction; in this case the stride will be rounded
180                    up, and we need to make sure that we copy over the width (up to the stride)
181                    rather than short of the width; hence the ceil() here.
182                 */
183                 int const cropped_width_in_bytes = ceil (bytes_per_pixel(c) * cropped_size.width);
184
185                 /* Start of the source line, cropped from the top but not the left */
186                 uint8_t* in_p = data()[c] + (crop.top / out->line_factor(c)) * stride()[c];
187                 uint8_t* out_p = out->data()[c];
188
189                 for (int y = 0; y < out->lines(c); ++y) {
190                         memcpy (out_p, in_p + crop_left_in_bytes, cropped_width_in_bytes);
191                         in_p += stride()[c];
192                         out_p += out->stride()[c];
193                 }
194         }
195
196         return out;
197 }
198
199 /** Blacken a YUV image whose bits per pixel is rounded up to 16 */
200 void
201 Image::yuv_16_black (uint16_t v, bool alpha)
202 {
203         memset (data()[0], 0, lines(0) * stride()[0]);
204         for (int i = 1; i < 3; ++i) {
205                 int16_t* p = reinterpret_cast<int16_t*> (data()[i]);
206                 for (int y = 0; y < lines(i); ++y) {
207                         /* We divide by 2 here because we are writing 2 bytes at a time */
208                         for (int x = 0; x < line_size()[i] / 2; ++x) {
209                                 p[x] = v;
210                         }
211                         p += stride()[i] / 2;
212                 }
213         }
214
215         if (alpha) {
216                 memset (data()[3], 0, lines(3) * stride()[3]);
217         }
218 }
219
220 uint16_t
221 Image::swap_16 (uint16_t v)
222 {
223         return ((v >> 8) & 0xff) | ((v & 0xff) << 8);
224 }
225
226 void
227 Image::make_black ()
228 {
229         /* U/V black value for 8-bit colour */
230         static uint8_t const eight_bit_uv =     (1 << 7) - 1;
231         /* U/V black value for 9-bit colour */
232         static uint16_t const nine_bit_uv =     (1 << 8) - 1;
233         /* U/V black value for 10-bit colour */
234         static uint16_t const ten_bit_uv =      (1 << 9) - 1;
235         /* U/V black value for 16-bit colour */
236         static uint16_t const sixteen_bit_uv =  (1 << 15) - 1;
237         
238         switch (_pixel_format) {
239         case PIX_FMT_YUV420P:
240         case PIX_FMT_YUV422P:
241         case PIX_FMT_YUV444P:
242         case PIX_FMT_YUV411P:
243                 memset (data()[0], 0, lines(0) * stride()[0]);
244                 memset (data()[1], eight_bit_uv, lines(1) * stride()[1]);
245                 memset (data()[2], eight_bit_uv, lines(2) * stride()[2]);
246                 break;
247
248         case PIX_FMT_YUVJ420P:
249         case PIX_FMT_YUVJ422P:
250         case PIX_FMT_YUVJ444P:
251                 memset (data()[0], 0, lines(0) * stride()[0]);
252                 memset (data()[1], eight_bit_uv + 1, lines(1) * stride()[1]);
253                 memset (data()[2], eight_bit_uv + 1, lines(2) * stride()[2]);
254                 break;
255
256         case PIX_FMT_YUV422P9LE:
257         case PIX_FMT_YUV444P9LE:
258                 yuv_16_black (nine_bit_uv, false);
259                 break;
260
261         case PIX_FMT_YUV422P9BE:
262         case PIX_FMT_YUV444P9BE:
263                 yuv_16_black (swap_16 (nine_bit_uv), false);
264                 break;
265                 
266         case PIX_FMT_YUV422P10LE:
267         case PIX_FMT_YUV444P10LE:
268                 yuv_16_black (ten_bit_uv, false);
269                 break;
270
271         case PIX_FMT_YUV422P16LE:
272         case PIX_FMT_YUV444P16LE:
273                 yuv_16_black (sixteen_bit_uv, false);
274                 break;
275                 
276         case PIX_FMT_YUV444P10BE:
277         case PIX_FMT_YUV422P10BE:
278                 yuv_16_black (swap_16 (ten_bit_uv), false);
279                 break;
280
281         case AV_PIX_FMT_YUVA420P9BE:
282         case AV_PIX_FMT_YUVA422P9BE:
283         case AV_PIX_FMT_YUVA444P9BE:
284                 yuv_16_black (swap_16 (nine_bit_uv), true);
285                 break;
286                 
287         case AV_PIX_FMT_YUVA420P9LE:
288         case AV_PIX_FMT_YUVA422P9LE:
289         case AV_PIX_FMT_YUVA444P9LE:
290                 yuv_16_black (nine_bit_uv, true);
291                 break;
292                 
293         case AV_PIX_FMT_YUVA420P10BE:
294         case AV_PIX_FMT_YUVA422P10BE:
295         case AV_PIX_FMT_YUVA444P10BE:
296                 yuv_16_black (swap_16 (ten_bit_uv), true);
297                 break;
298                 
299         case AV_PIX_FMT_YUVA420P10LE:
300         case AV_PIX_FMT_YUVA422P10LE:
301         case AV_PIX_FMT_YUVA444P10LE:
302                 yuv_16_black (ten_bit_uv, true);
303                 break;
304                 
305         case AV_PIX_FMT_YUVA420P16BE:
306         case AV_PIX_FMT_YUVA422P16BE:
307         case AV_PIX_FMT_YUVA444P16BE:
308                 yuv_16_black (swap_16 (sixteen_bit_uv), true);
309                 break;
310                 
311         case AV_PIX_FMT_YUVA420P16LE:
312         case AV_PIX_FMT_YUVA422P16LE:
313         case AV_PIX_FMT_YUVA444P16LE:
314                 yuv_16_black (sixteen_bit_uv, true);
315                 break;
316
317         case PIX_FMT_RGB24:
318         case PIX_FMT_ARGB:
319         case PIX_FMT_RGBA:
320         case PIX_FMT_ABGR:
321         case PIX_FMT_BGRA:
322                 memset (data()[0], 0, lines(0) * stride()[0]);
323                 break;
324
325         case PIX_FMT_UYVY422:
326         {
327                 int const Y = lines(0);
328                 int const X = line_size()[0];
329                 uint8_t* p = data()[0];
330                 for (int y = 0; y < Y; ++y) {
331                         for (int x = 0; x < X / 4; ++x) {
332                                 *p++ = eight_bit_uv; // Cb
333                                 *p++ = 0;            // Y0
334                                 *p++ = eight_bit_uv; // Cr
335                                 *p++ = 0;            // Y1
336                         }
337                 }
338                 break;
339         }
340
341         default:
342                 throw PixelFormatError ("make_black()", _pixel_format);
343         }
344 }
345
346 void
347 Image::alpha_blend (shared_ptr<const Image> other, Position<int> position)
348 {
349         /* Only implemented for RGBA onto RGB24 so far */
350         assert (_pixel_format == PIX_FMT_RGB24 && other->pixel_format() == PIX_FMT_RGBA);
351
352         int start_tx = position.x;
353         int start_ox = 0;
354
355         if (start_tx < 0) {
356                 start_ox = -start_tx;
357                 start_tx = 0;
358         }
359
360         int start_ty = position.y;
361         int start_oy = 0;
362
363         if (start_ty < 0) {
364                 start_oy = -start_ty;
365                 start_ty = 0;
366         }
367
368         for (int ty = start_ty, oy = start_oy; ty < size().height && oy < other->size().height; ++ty, ++oy) {
369                 uint8_t* tp = data()[0] + ty * stride()[0] + position.x * 3;
370                 uint8_t* op = other->data()[0] + oy * other->stride()[0];
371                 for (int tx = start_tx, ox = start_ox; tx < size().width && ox < other->size().width; ++tx, ++ox) {
372                         float const alpha = float (op[3]) / 255;
373                         tp[0] = (tp[0] * (1 - alpha)) + op[0] * alpha;
374                         tp[1] = (tp[1] * (1 - alpha)) + op[1] * alpha;
375                         tp[2] = (tp[2] * (1 - alpha)) + op[2] * alpha;
376                         tp += 3;
377                         op += 4;
378                 }
379         }
380 }
381
382 void
383 Image::copy (shared_ptr<const Image> other, Position<int> position)
384 {
385         /* Only implemented for RGB24 onto RGB24 so far */
386         assert (_pixel_format == PIX_FMT_RGB24 && other->pixel_format() == PIX_FMT_RGB24);
387         assert (position.x >= 0 && position.y >= 0);
388
389         int const N = min (position.x + other->size().width, size().width) - position.x;
390         for (int ty = position.y, oy = 0; ty < size().height && oy < other->size().height; ++ty, ++oy) {
391                 uint8_t * const tp = data()[0] + ty * stride()[0] + position.x * 3;
392                 uint8_t * const op = other->data()[0] + oy * other->stride()[0];
393                 memcpy (tp, op, N * 3);
394         }
395 }       
396
397 void
398 Image::read_from_socket (shared_ptr<Socket> socket)
399 {
400         for (int i = 0; i < components(); ++i) {
401                 uint8_t* p = data()[i];
402                 for (int y = 0; y < lines(i); ++y) {
403                         socket->read (p, line_size()[i]);
404                         p += stride()[i];
405                 }
406         }
407 }
408
409 void
410 Image::write_to_socket (shared_ptr<Socket> socket) const
411 {
412         for (int i = 0; i < components(); ++i) {
413                 uint8_t* p = data()[i];
414                 for (int y = 0; y < lines(i); ++y) {
415                         socket->write (p, line_size()[i]);
416                         p += stride()[i];
417                 }
418         }
419 }
420
421
422 float
423 Image::bytes_per_pixel (int c) const
424 {
425         AVPixFmtDescriptor const * d = av_pix_fmt_desc_get(_pixel_format);
426         if (!d) {
427                 throw PixelFormatError ("lines()", _pixel_format);
428         }
429
430         if (c >= components()) {
431                 return 0;
432         }
433
434         float bpp[4] = { 0, 0, 0, 0 };
435
436         bpp[0] = floor ((d->comp[0].depth_minus1 + 1 + 7) / 8);
437         if (d->nb_components > 1) {
438                 bpp[1] = floor ((d->comp[1].depth_minus1 + 1 + 7) / 8) / pow (2.0f, d->log2_chroma_w);
439         }
440         if (d->nb_components > 2) {
441                 bpp[2] = floor ((d->comp[2].depth_minus1 + 1 + 7) / 8) / pow (2.0f, d->log2_chroma_w);
442         }
443         if (d->nb_components > 3) {
444                 bpp[3] = floor ((d->comp[3].depth_minus1 + 1 + 7) / 8) / pow (2.0f, d->log2_chroma_w);
445         }
446         
447         if ((d->flags & PIX_FMT_PLANAR) == 0) {
448                 /* Not planar; sum them up */
449                 return bpp[0] + bpp[1] + bpp[2] + bpp[3];
450         }
451
452         return bpp[c];
453 }
454
455 /** Construct a Image of a given size and format, allocating memory
456  *  as required.
457  *
458  *  @param p Pixel format.
459  *  @param s Size in pixels.
460  */
461 Image::Image (AVPixelFormat p, libdcp::Size s, bool aligned)
462         : libdcp::Image (s)
463         , _pixel_format (p)
464         , _aligned (aligned)
465 {
466         allocate ();
467 }
468
469 void
470 Image::allocate ()
471 {
472         _data = (uint8_t **) wrapped_av_malloc (4 * sizeof (uint8_t *));
473         _data[0] = _data[1] = _data[2] = _data[3] = 0;
474         
475         _line_size = (int *) wrapped_av_malloc (4 * sizeof (int));
476         _line_size[0] = _line_size[1] = _line_size[2] = _line_size[3] = 0;
477         
478         _stride = (int *) wrapped_av_malloc (4 * sizeof (int));
479         _stride[0] = _stride[1] = _stride[2] = _stride[3] = 0;
480
481         for (int i = 0; i < components(); ++i) {
482                 _line_size[i] = ceil (_size.width * bytes_per_pixel(i));
483                 _stride[i] = stride_round_up (i, _line_size, _aligned ? 32 : 1);
484
485                 /* The assembler function ff_rgb24ToY_avx (in libswscale/x86/input.asm)
486                    uses a 16-byte fetch to read three bytes (R/G/B) of image data.
487                    Hence on the last pixel of the last line it reads over the end of
488                    the actual data by 1 byte.  If the width of an image is a multiple
489                    of the stride alignment there will be no padding at the end of image lines.
490                    OS X crashes on this illegal read, though other operating systems don't
491                    seem to mind.  The nasty + 1 in this malloc makes sure there is always a byte
492                    for that instruction to read safely.
493                 */
494                 _data[i] = (uint8_t *) wrapped_av_malloc (_stride[i] * lines (i) + 1);
495         }
496 }
497
498 Image::Image (Image const & other)
499         : libdcp::Image (other)
500         ,  _pixel_format (other._pixel_format)
501         , _aligned (other._aligned)
502 {
503         allocate ();
504
505         for (int i = 0; i < components(); ++i) {
506                 uint8_t* p = _data[i];
507                 uint8_t* q = other._data[i];
508                 for (int j = 0; j < lines(i); ++j) {
509                         memcpy (p, q, _line_size[i]);
510                         p += stride()[i];
511                         q += other.stride()[i];
512                 }
513         }
514 }
515
516 Image::Image (AVFrame* frame)
517         : libdcp::Image (libdcp::Size (frame->width, frame->height))
518         , _pixel_format (static_cast<AVPixelFormat> (frame->format))
519         , _aligned (true)
520 {
521         allocate ();
522
523         for (int i = 0; i < components(); ++i) {
524                 uint8_t* p = _data[i];
525                 uint8_t* q = frame->data[i];
526                 for (int j = 0; j < lines(i); ++j) {
527                         memcpy (p, q, _line_size[i]);
528                         p += stride()[i];
529                         /* AVFrame's linesize is what we call `stride' */
530                         q += frame->linesize[i];
531                 }
532         }
533 }
534
535 Image::Image (shared_ptr<const Image> other, bool aligned)
536         : libdcp::Image (other)
537         , _pixel_format (other->_pixel_format)
538         , _aligned (aligned)
539 {
540         allocate ();
541
542         for (int i = 0; i < components(); ++i) {
543                 assert(line_size()[i] == other->line_size()[i]);
544                 uint8_t* p = _data[i];
545                 uint8_t* q = other->data()[i];
546                 for (int j = 0; j < lines(i); ++j) {
547                         memcpy (p, q, line_size()[i]);
548                         p += stride()[i];
549                         q += other->stride()[i];
550                 }
551         }
552 }
553
554 Image&
555 Image::operator= (Image const & other)
556 {
557         if (this == &other) {
558                 return *this;
559         }
560
561         Image tmp (other);
562         swap (tmp);
563         return *this;
564 }
565
566 void
567 Image::swap (Image & other)
568 {
569         libdcp::Image::swap (other);
570         
571         std::swap (_pixel_format, other._pixel_format);
572
573         for (int i = 0; i < 4; ++i) {
574                 std::swap (_data[i], other._data[i]);
575                 std::swap (_line_size[i], other._line_size[i]);
576                 std::swap (_stride[i], other._stride[i]);
577         }
578
579         std::swap (_aligned, other._aligned);
580 }
581
582 /** Destroy a Image */
583 Image::~Image ()
584 {
585         for (int i = 0; i < components(); ++i) {
586                 av_free (_data[i]);
587         }
588
589         av_free (_data);
590         av_free (_line_size);
591         av_free (_stride);
592 }
593
594 uint8_t **
595 Image::data () const
596 {
597         return _data;
598 }
599
600 int *
601 Image::line_size () const
602 {
603         return _line_size;
604 }
605
606 int *
607 Image::stride () const
608 {
609         return _stride;
610 }
611
612 libdcp::Size
613 Image::size () const
614 {
615         return _size;
616 }
617
618 bool
619 Image::aligned () const
620 {
621         return _aligned;
622 }
623
624 string
625 Image::digest () const
626 {
627         MD5_CTX md5_context;
628         MD5_Init (&md5_context);
629
630         for (int i = 0; i < components(); ++i) {
631                 MD5_Update (&md5_context, data()[i], line_size()[i]);
632         }
633         
634         unsigned char digest[MD5_DIGEST_LENGTH];
635         MD5_Final (digest, &md5_context);
636         
637         stringstream s;
638         for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) {
639                 s << std::hex << std::setfill('0') << std::setw(2) << ((int) digest[i]);
640         }
641
642         return s.str ();
643 }
644