Try to fix problems with YUV422P10LE.
[dcpomatic.git] / src / lib / image.cc
index ac59622661d42909710dbeb933c470ff7947f6fd..ab9159d5e42a21a83e90e7ee81a02807c63dfa2f 100644 (file)
@@ -59,6 +59,7 @@ Image::lines (int n) const
                break;
        case PIX_FMT_RGB24:
        case PIX_FMT_RGBA:
+       case PIX_FMT_YUV422P10LE:
                return size().height;
        default:
                assert (false);
@@ -73,6 +74,7 @@ Image::components () const
 {
        switch (_pixel_format) {
        case PIX_FMT_YUV420P:
+       case PIX_FMT_YUV422P10LE:
                return 3;
        case PIX_FMT_RGB24:
        case PIX_FMT_RGBA:
@@ -171,10 +173,22 @@ Image::scale_and_convert_to_rgb (Size out_size, int padding, Scaler const * scal
 shared_ptr<Image>
 Image::post_process (string pp) const
 {
-       shared_ptr<Image> out (new AlignedImage (PIX_FMT_YUV420P, size ()));
-       
+       shared_ptr<Image> out (new AlignedImage (pixel_format(), size ()));
+
+       int pp_format = 0;
+       switch (pixel_format()) {
+       case PIX_FMT_YUV420P:
+               pp_format = PP_FORMAT_420;
+               break;
+       case PIX_FMT_YUV422P10LE:
+               pp_format = PP_FORMAT_422;
+               break;
+       default:
+               assert (false);
+       }
+               
        pp_mode* mode = pp_get_mode_by_name_and_quality (pp.c_str (), PP_QUALITY_MAX);
-       pp_context* context = pp_get_context (size().width, size().height, PP_FORMAT_420 | PP_CPU_CAPS_MMX2);
+       pp_context* context = pp_get_context (size().width, size().height, pp_format | PP_CPU_CAPS_MMX2);
 
        pp_postprocess (
                (const uint8_t **) data(), stride(),
@@ -194,6 +208,7 @@ Image::make_black ()
 {
        switch (_pixel_format) {
        case PIX_FMT_YUV420P:
+       case PIX_FMT_YUV422P10LE:
                memset (data()[0], 0, lines(0) * stride()[0]);
                memset (data()[1], 0x80, lines(1) * stride()[1]);
                memset (data()[2], 0x80, lines(2) * stride()[2]);
@@ -299,6 +314,10 @@ SimpleImage::SimpleImage (PixelFormat p, Size s, function<int (int)> rounder)
                _line_size[1] = s.width / 2;
                _line_size[2] = s.width / 2;
                break;
+       case PIX_FMT_YUV422P10LE:
+               _line_size[0] = s.width * 2;
+               _line_size[1] = s.width;
+               _line_size[2] = s.width;
        default:
                assert (false);
        }