Some tidying up, add channel selector to Audio dialog.
[dcpomatic.git] / src / lib / image.cc
index 0ec6bd26c7ef83cc0c004b1c370850f7ed908c4b..f38d441850fcdc211defea1d58db9f5132e764b0 100644 (file)
@@ -68,9 +68,10 @@ Image::lines (int n) const
        case PIX_FMT_RGBA:
        case PIX_FMT_YUV422P10LE:
        case PIX_FMT_YUV422P:
+       case PIX_FMT_YUV444P:
                return size().height;
        default:
-               assert (false);
+               throw PixelFormatError ("lines()", _pixel_format);
        }
 
        return 0;
@@ -84,12 +85,13 @@ Image::components () const
        case PIX_FMT_YUV420P:
        case PIX_FMT_YUV422P10LE:
        case PIX_FMT_YUV422P:
+       case PIX_FMT_YUV444P:
                return 3;
        case PIX_FMT_RGB24:
        case PIX_FMT_RGBA:
                return 1;
        default:
-               assert (false);
+               throw PixelFormatError ("components()", _pixel_format);
        }
 
        return 0;
@@ -201,8 +203,10 @@ Image::post_process (string pp, bool aligned) const
        case PIX_FMT_YUV422P:
                pp_format = PP_FORMAT_422;
                break;
+       case PIX_FMT_YUV444P:
+               pp_format = PP_FORMAT_444;
        default:
-               assert (false);
+               throw PixelFormatError ("post_process", pixel_format());
        }
                
        pp_mode* mode = pp_get_mode_by_name_and_quality (pp.c_str (), PP_QUALITY_MAX);
@@ -254,6 +258,7 @@ Image::make_black ()
        switch (_pixel_format) {
        case PIX_FMT_YUV420P:
        case PIX_FMT_YUV422P:
+       case PIX_FMT_YUV444P:
                memset (data()[0], 0, lines(0) * stride()[0]);
                memset (data()[1], 0x7f, lines(1) * stride()[1]);
                memset (data()[2], 0x7f, lines(2) * stride()[2]);
@@ -323,7 +328,7 @@ Image::read_from_socket (shared_ptr<Socket> socket)
        for (int i = 0; i < components(); ++i) {
                uint8_t* p = data()[i];
                for (int y = 0; y < lines(i); ++y) {
-                       socket->read_definite_and_consume (p, line_size()[i], 30);
+                       socket->read (p, line_size()[i]);
                        p += stride()[i];
                }
        }
@@ -335,7 +340,7 @@ Image::write_to_socket (shared_ptr<Socket> socket) const
        for (int i = 0; i < components(); ++i) {
                uint8_t* p = data()[i];
                for (int y = 0; y < lines(i); ++y) {
-                       socket->write (p, line_size()[i], 30);
+                       socket->write (p, line_size()[i]);
                        p += stride()[i];
                }
        }
@@ -375,6 +380,8 @@ Image::bytes_per_pixel (int c) const
                } else {
                        return 1;
                }
+       case PIX_FMT_YUV444P:
+               return 3;
        default:
                assert (false);
        }
@@ -503,12 +510,18 @@ FilterBufferImage::FilterBufferImage (AVPixelFormat p, AVFilterBufferRef* b)
        : Image (p)
        , _buffer (b)
 {
-
+       _line_size = (int *) av_malloc (4 * sizeof (int));
+       _line_size[0] = _line_size[1] = _line_size[2] = _line_size[3] = 0;
+       
+       for (int i = 0; i < components(); ++i) {
+               _line_size[i] = size().width * bytes_per_pixel(i);
+       }
 }
 
 FilterBufferImage::~FilterBufferImage ()
 {
        avfilter_unref_buffer (_buffer);
+       av_free (_line_size);
 }
 
 uint8_t **
@@ -520,13 +533,16 @@ FilterBufferImage::data () const
 int *
 FilterBufferImage::line_size () const
 {
-       return _buffer->linesize;
+       return _line_size;
 }
 
 int *
 FilterBufferImage::stride () const
 {
-       /* XXX? */
+       /* I've seen images where the _buffer->linesize is larger than the width
+          (by a small amount), suggesting that _buffer->linesize is what we call
+          stride.  But I'm not sure.
+       */
        return _buffer->linesize;
 }