Partial fix to sync according to pts.
[dcpomatic.git] / src / lib / image.cc
index 30dc4292f40cc064172ea9363198ddd7127019c4..c8303115b967f4f5c401166eff5077638927d01d 100644 (file)
@@ -59,6 +59,8 @@ Image::lines (int n) const
                break;
        case PIX_FMT_RGB24:
        case PIX_FMT_RGBA:
+       case PIX_FMT_YUV422P10LE:
+       case PIX_FMT_YUV422P:
                return size().height;
        default:
                assert (false);
@@ -73,6 +75,8 @@ Image::components () const
 {
        switch (_pixel_format) {
        case PIX_FMT_YUV420P:
+       case PIX_FMT_YUV422P10LE:
+       case PIX_FMT_YUV422P:
                return 3;
        case PIX_FMT_RGB24:
        case PIX_FMT_RGBA:
@@ -171,10 +175,23 @@ 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:
+       case PIX_FMT_YUV422P:
+               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 +211,8 @@ Image::make_black ()
 {
        switch (_pixel_format) {
        case PIX_FMT_YUV420P:
+       case PIX_FMT_YUV422P10LE:
+       case PIX_FMT_YUV422P:
                memset (data()[0], 0, lines(0) * stride()[0]);
                memset (data()[1], 0x80, lines(1) * stride()[1]);
                memset (data()[2], 0x80, lines(2) * stride()[2]);
@@ -274,17 +293,17 @@ Image::write_to_socket (shared_ptr<Socket> socket) const
  *  @param p Pixel format.
  *  @param s Size in pixels.
  */
-SimpleImage::SimpleImage (PixelFormat p, Size s, function<int (int)> rounder)
+SimpleImage::SimpleImage (AVPixelFormat p, Size s, function<int (int)> rounder)
        : Image (p)
        , _size (s)
 {
        _data = (uint8_t **) av_malloc (4 * sizeof (uint8_t *));
        _data[0] = _data[1] = _data[2] = _data[3] = 0;
        
-       _line_size = (int *) av_malloc (4);
+       _line_size = (int *) av_malloc (4 * sizeof (int));
        _line_size[0] = _line_size[1] = _line_size[2] = _line_size[3] = 0;
        
-       _stride = (int *) av_malloc (4);
+       _stride = (int *) av_malloc (4 * sizeof (int));
        _stride[0] = _stride[1] = _stride[2] = _stride[3] = 0;
 
        switch (p) {
@@ -295,10 +314,16 @@ SimpleImage::SimpleImage (PixelFormat p, Size s, function<int (int)> rounder)
                _line_size[0] = s.width * 4;
                break;
        case PIX_FMT_YUV420P:
+       case PIX_FMT_YUV422P:
                _line_size[0] = s.width;
                _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;
+               break;
        default:
                assert (false);
        }
@@ -345,13 +370,13 @@ SimpleImage::size () const
        return _size;
 }
 
-AlignedImage::AlignedImage (PixelFormat f, Size s)
+AlignedImage::AlignedImage (AVPixelFormat f, Size s)
        : SimpleImage (f, s, boost::bind (round_up, _1, 32))
 {
 
 }
 
-CompactImage::CompactImage (PixelFormat f, Size s)
+CompactImage::CompactImage (AVPixelFormat f, Size s)
        : SimpleImage (f, s, boost::bind (round_up, _1, 1))
 {
 
@@ -377,7 +402,7 @@ CompactImage::CompactImage (shared_ptr<Image> im)
        }
 }
 
-FilterBufferImage::FilterBufferImage (PixelFormat p, AVFilterBufferRef* b)
+FilterBufferImage::FilterBufferImage (AVPixelFormat p, AVFilterBufferRef* b)
        : Image (p)
        , _buffer (b)
 {