Various alignment tidying/fixups.
authorCarl Hetherington <cth@carlh.net>
Wed, 22 Sep 2021 22:09:47 +0000 (00:09 +0200)
committerCarl Hetherington <cth@carlh.net>
Mon, 27 Sep 2021 11:41:46 +0000 (13:41 +0200)
12 files changed:
src/lib/dcp_video.cc
src/lib/ffmpeg_file_encoder.cc
src/lib/player_video.cc
src/lib/player_video.h
src/lib/util.cc
src/wx/film_viewer.cc
src/wx/gl_video_view.cc
src/wx/simple_video_view.cc
src/wx/simple_video_view.h
test/dcp_playback_test.cc
test/player_test.cc
test/video_level_test.cc

index 9daeb45c8af0ce5afc46d9d7051d7335ba9b4362..3a85a5ac6acf553eb7adc8dadc66d8530671d216 100644 (file)
@@ -105,7 +105,7 @@ DCPVideo::convert_to_xyz (shared_ptr<const PlayerVideo> frame, dcp::NoteHandler
 {
        shared_ptr<dcp::OpenJPEGImage> xyz;
 
-       auto image = frame->image (bind(&PlayerVideo::keep_xyz_or_rgb, _1), VideoRange::FULL, Image::Alignment::PADDED, false);
+       auto image = frame->image (bind(&PlayerVideo::keep_xyz_or_rgb, _1), VideoRange::FULL, false);
        if (frame->colour_conversion()) {
                xyz = dcp::rgb_to_xyz (
                        image->data()[0],
index ef02f30c8f1ab17863f17e59de62131310f18caa..705557f799b3b76f434eb182fe116b4a32b03e85 100644 (file)
@@ -402,7 +402,6 @@ FFmpegFileEncoder::video (shared_ptr<PlayerVideo> video, DCPTime time)
        auto image = video->image (
                bind (&PlayerVideo::force, _1, _pixel_format),
                VideoRange::VIDEO,
-               Image::Alignment::PADDED,
                false
                );
 
index 2d60efe106af30bd6d19a7fdb630e0370ee9cff1..7c36af31b54bbbb7e8c764b9f0b3dcba89145e5e 100644 (file)
@@ -110,13 +110,13 @@ PlayerVideo::set_text (PositionImage image)
 }
 
 shared_ptr<Image>
-PlayerVideo::image (function<AVPixelFormat (AVPixelFormat)> pixel_format, VideoRange video_range, Image::Alignment alignment, bool fast) const
+PlayerVideo::image (function<AVPixelFormat (AVPixelFormat)> pixel_format, VideoRange video_range, bool fast) const
 {
        /* XXX: this assumes that image() and prepare() are only ever called with the same parameters (except crop, inter size, out size, fade) */
 
        boost::mutex::scoped_lock lm (_mutex);
        if (!_image || _crop != _image_crop || _inter_size != _image_inter_size || _out_size != _image_out_size || _fade != _image_fade) {
-               make_image (pixel_format, video_range, alignment, fast);
+               make_image (pixel_format, video_range, fast);
        }
        return _image;
 }
@@ -133,11 +133,10 @@ PlayerVideo::raw_image () const
  *  @param pixel_format Function which is called to decide what pixel format the output image should be;
  *  it is passed the pixel format of the input image from the ImageProxy, and should return the desired
  *  output pixel format.  Two functions force and keep_xyz_or_rgb are provided for use here.
- *  @param alignment PADDED if the output image should be aligned to 32-byte boundaries, otherwise COMPACT.
  *  @param fast true to be fast at the expense of quality.
  */
 void
-PlayerVideo::make_image (function<AVPixelFormat (AVPixelFormat)> pixel_format, VideoRange video_range, Image::Alignment alignment, bool fast) const
+PlayerVideo::make_image (function<AVPixelFormat (AVPixelFormat)> pixel_format, VideoRange video_range, bool fast) const
 {
        _image_crop = _crop;
        _image_inter_size = _inter_size;
@@ -180,11 +179,11 @@ PlayerVideo::make_image (function<AVPixelFormat (AVPixelFormat)> pixel_format, V
        }
 
        _image = prox.image->crop_scale_window (
-               total_crop, _inter_size, _out_size, yuv_to_rgb, _video_range, pixel_format (prox.image->pixel_format()), video_range, alignment, fast
+               total_crop, _inter_size, _out_size, yuv_to_rgb, _video_range, pixel_format (prox.image->pixel_format()), video_range, Image::Alignment::COMPACT, fast
                );
 
        if (_text) {
-               _image->alpha_blend (Image::ensure_alignment(_text->image, Image::Alignment::PADDED), _text->position);
+               _image->alpha_blend (_text->image, _text->position);
        }
 
        if (_fade) {
@@ -303,7 +302,7 @@ PlayerVideo::prepare (function<AVPixelFormat (AVPixelFormat)> pixel_format, Vide
        _in->prepare (alignment, _inter_size);
        boost::mutex::scoped_lock lm (_mutex);
        if (!_image && !proxy_only) {
-               make_image (pixel_format, video_range, alignment, fast);
+               make_image (pixel_format, video_range, fast);
        }
 }
 
index d24620c7e793b7ebbc8b345cdcedc34dd66151bb..237d2e3fe2858083d6a6d165dd0ac63999fee693 100644 (file)
@@ -76,7 +76,7 @@ public:
        }
 
        void prepare (std::function<AVPixelFormat (AVPixelFormat)> pixel_format, VideoRange video_range, Image::Alignment alignment, bool fast, bool proxy_only);
-       std::shared_ptr<Image> image (std::function<AVPixelFormat (AVPixelFormat)> pixel_format, VideoRange video_range, Image::Alignment alignment, bool fast) const;
+       std::shared_ptr<Image> image (std::function<AVPixelFormat (AVPixelFormat)> pixel_format, VideoRange video_range, bool fast) const;
        std::shared_ptr<const Image> raw_image () const;
 
        static AVPixelFormat force (AVPixelFormat, AVPixelFormat);
@@ -127,7 +127,7 @@ public:
        }
 
 private:
-       void make_image (std::function<AVPixelFormat (AVPixelFormat)> pixel_format, VideoRange video_range, Image::Alignment alignment, bool fast) const;
+       void make_image (std::function<AVPixelFormat (AVPixelFormat)> pixel_format, VideoRange video_range, bool fast) const;
 
        std::shared_ptr<const ImageProxy> _in;
        Crop _crop;
index 981cfa521eda35957eec466f8225f510f9c11506..d3af74376a3cd2349eeceafa9ab3ab35f5dc9423 100644 (file)
@@ -957,7 +957,7 @@ emit_subtitle_image (ContentTimePeriod period, dcp::SubtitleImage sub, dcp::Size
 {
        /* XXX: this is rather inefficient; decoding the image just to get its size */
        FFmpegImageProxy proxy (sub.png_image());
-       auto image = proxy.image(Image::Alignment::COMPACT).image;
+       auto image = proxy.image(Image::Alignment::PADDED).image;
        /* set up rect with height and width */
        dcpomatic::Rect<double> rect(0, 0, image->size().width / double(size.width), image->size().height / double(size.height));
 
index 5609ebf86a77a4cc05e08b2e870a44b274757bc5..0131aa294a66e9caa6fa5841eeb3003e929c268c 100644 (file)
@@ -208,6 +208,8 @@ FilmViewer::recreate_butler ()
                return;
        }
 
+       auto const j2k_gl_optimised = dynamic_pointer_cast<GLVideoView>(_video_view) && _optimise_for_j2k;
+
        _butler = std::make_shared<Butler>(
                _film,
                _player,
@@ -215,9 +217,9 @@ FilmViewer::recreate_butler ()
                _audio_channels,
                bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24),
                VideoRange::FULL,
-               _optimise_for_j2k ? Image::Alignment::COMPACT : Image::Alignment::PADDED,
+               j2k_gl_optimised ? Image::Alignment::COMPACT : Image::Alignment::PADDED,
                true,
-               dynamic_pointer_cast<GLVideoView>(_video_view) && _optimise_for_j2k
+               j2k_gl_optimised
                );
 
        if (!Config::instance()->sound() && !_audio.isStreamOpen()) {
index 0464658647fd556f86ab8885a4a342f529ad068d..04e0bac46ec373e3b731768fa00b949f5290505a 100644 (file)
@@ -497,7 +497,7 @@ GLVideoView::draw (Position<int>, dcp::Size)
 void
 GLVideoView::set_image (shared_ptr<const PlayerVideo> pv)
 {
-       shared_ptr<const Image> video = _optimise_for_j2k ? pv->raw_image() : pv->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, Image::Alignment::COMPACT, true);
+       shared_ptr<const Image> video = _optimise_for_j2k ? pv->raw_image() : pv->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, true);
 
        /* Only the player's black frames should be aligned at this stage, so this should
         * almost always have no work to do.
index e54c8390e78ea9cd56483c159c214c21a16d536d..1ac56bbfe1f0ca3af029b6840511124af242a630 100644 (file)
@@ -72,6 +72,7 @@ SimpleVideoView::paint ()
        if (!_image) {
                dc.Clear ();
        } else {
+               DCPOMATIC_ASSERT (_image->alignment() == Image::Alignment::COMPACT);
                out_size = _image->size();
                wxImage frame (out_size.width, out_size.height, _image->data()[0], true);
                wxBitmap frame_bitmap (frame);
@@ -188,7 +189,7 @@ void
 SimpleVideoView::update ()
 {
        if (!player_video().first) {
-               set_image (shared_ptr<Image>());
+               _image.reset ();
                refresh_panel ();
                return;
        }
@@ -221,9 +222,7 @@ SimpleVideoView::update ()
 
        _state_timer.set ("get image");
 
-       set_image (
-               player_video().first->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, Image::Alignment::COMPACT, true)
-               );
+       _image = player_video().first->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, true);
 
        _state_timer.set ("ImageChanged");
        _viewer->image_changed (player_video().first);
index 26d1299b1d84fda12c4acad8b7c4a545820227ee..cbb162023c29e402bb0561b0570a62cc0b8a38b7 100644 (file)
@@ -42,10 +42,6 @@ public:
        NextFrameResult display_next_frame (bool non_blocking) override;
 
 private:
-       void set_image (std::shared_ptr<const Image> image) {
-               _image = image;
-       }
-
        void refresh_panel ();
        void paint ();
        void timer ();
index 28368dc34214a34c4aa3b16c958f5f0fa0ebdde0..6c2b0447ca0edaf5b7df1d2dd09e4181750a1105 100644 (file)
@@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE (dcp_playback_test)
                }
                /* assuming DCP is 24fps/48kHz */
                butler->get_audio (audio_buffer, 2000);
-               p.first->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, Image::Alignment::COMPACT, true);
+               p.first->image(bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, true);
        }
        delete[] audio_buffer;
 }
index 2caa34753e4e8fcca0e8d7e6e3618bad1592311f..60bfee1a4490fe6dae1037075f472618e402b2ee 100644 (file)
@@ -241,7 +241,7 @@ BOOST_AUTO_TEST_CASE (player_seek_test)
                butler->seek (t, true);
                auto video = butler->get_video(true, 0);
                BOOST_CHECK_EQUAL(video.second.get(), t.get());
-               write_image(video.first->image(bind(PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, Image::Alignment::COMPACT, true), String::compose("build/test/player_seek_test_%1.png", i));
+               write_image(video.first->image(bind(PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, true), String::compose("build/test/player_seek_test_%1.png", i));
                /* This 14.08 is empirically chosen (hopefully) to accept changes in rendering between the reference and a test machine
                   (17.10 and 16.04 seem to anti-alias a little differently) but to reject gross errors e.g. missing fonts or missing
                   text altogether.
@@ -265,7 +265,7 @@ BOOST_AUTO_TEST_CASE (player_seek_test2)
        player->set_always_burn_open_subtitles ();
        player->set_play_referenced ();
 
-       auto butler = std::make_shared<Butler>(film, player, AudioMapping(), 2, bind(PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, Image::Alignment::COMPACT, true, false);
+       auto butler = std::make_shared<Butler>(film, player, AudioMapping(), 2, bind(PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, Image::Alignment::PADDED, true, false);
        butler->disable_audio();
 
        butler->seek(DCPTime::from_seconds(5), true);
@@ -276,7 +276,7 @@ BOOST_AUTO_TEST_CASE (player_seek_test2)
                auto video = butler->get_video(true, 0);
                BOOST_CHECK_EQUAL(video.second.get(), t.get());
                write_image(
-                       video.first->image(bind(PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, Image::Alignment::COMPACT, true), String::compose("build/test/player_seek_test2_%1.png", i)
+                       video.first->image(bind(PlayerVideo::force, _1, AV_PIX_FMT_RGB24), VideoRange::FULL, true), String::compose("build/test/player_seek_test2_%1.png", i)
                        );
                check_image(TestPaths::private_data() / String::compose("player_seek_test2_%1.png", i), String::compose("build/test/player_seek_test2_%1.png", i), 14.08);
        }
index 54513464cd9bdedda41e8ae4766d48cc9d98beea..ada9b602a3089ac5bfdc47e5f736ae1e5b374017 100644 (file)
@@ -127,7 +127,7 @@ BOOST_AUTO_TEST_CASE (ffmpeg_image_video_range_expanded)
                BOOST_REQUIRE (!player->pass());
        }
 
-       auto image = player_video->image ([](AVPixelFormat f) { return f; }, VideoRange::FULL, Image::Alignment::PADDED, false);
+       auto image = player_video->image ([](AVPixelFormat f) { return f; }, VideoRange::FULL, false);
 
        for (int y = 0; y < size.height; ++y) {
                uint8_t* p = image->data()[0] + y * image->stride()[0];