From 259c976e8277879b5b8d70f66bd68591643598a5 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 20 Aug 2020 23:44:50 +0200 Subject: [PATCH] Fix encoding, perhaps. --- src/lib/j2k_encoder.cc | 4 +-- src/lib/j2k_encoder_fastvideo_backend.cc | 34 +++++++++++++++++------- src/lib/player_video.h | 4 +++ src/lib/writer.cc | 3 ++- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/lib/j2k_encoder.cc b/src/lib/j2k_encoder.cc index 8c915b567..82e9ba76c 100644 --- a/src/lib/j2k_encoder.cc +++ b/src/lib/j2k_encoder.cc @@ -284,6 +284,7 @@ try vector > video; for (int i = 0; i < backend->quantity(); ++i) { video.push_back (_queue.front()); + _queue.pop_front(); } /* We're about to commit to either encoding these frame(s) or putting them back onto the queue, @@ -294,9 +295,6 @@ try boost::this_thread::disable_interruption dis; LOG_TIMING ("encoder-pop thread=%1 frames=%2 eyes=%3", thread_id(), video.size()); - for (int i = 0; i < backend->quantity(); ++i) { - _queue.pop_front (); - } lock.unlock (); diff --git a/src/lib/j2k_encoder_fastvideo_backend.cc b/src/lib/j2k_encoder_fastvideo_backend.cc index c27b970e1..d7124e2aa 100644 --- a/src/lib/j2k_encoder_fastvideo_backend.cc +++ b/src/lib/j2k_encoder_fastvideo_backend.cc @@ -29,13 +29,14 @@ J2KEncoderFastvideoBackend::J2KEncoderFastvideoBackend () if (r != FAST_OK) { throw FastvideoError ("DecoderJ2kLibraryInit", r); } + fastTraceCreate("/home/carl/trace.log"); } J2KEncoderFastvideoBackend::~J2KEncoderFastvideoBackend () { if (_setup_done) { - delete[] _xyz_buffer; + fastFree (_xyz_buffer); fastEncoderJ2kDestroy (_encoder); fastImportFromHostDestroy (_adapter); } @@ -57,12 +58,12 @@ J2KEncoderFastvideoBackend::setup (dcp::Size size) parameters.pcrdEnabled = true; parameters.dwtLevels = 6; parameters.codeblockSize = 32; - parameters.maxQuality = 50; - parameters.compressionRatio = 0.5; + parameters.maxQuality = 0.5; + parameters.compressionRatio = 2; parameters.info = false; parameters.tier2Threads = 4; - parameters.tileWidth = size.width; - parameters.tileHeight = size.height; + parameters.tileWidth = 0;//size.width; + parameters.tileHeight = 0;//size.height; parameters.noMCT = false; parameters.ss1_x = 1; parameters.ss1_y = 1; @@ -88,7 +89,10 @@ J2KEncoderFastvideoBackend::setup (dcp::Size size) _xyz_buffer_stride = size.width * 6; _xyz_buffer_stride += 4 - (_xyz_buffer_stride % 4); - _xyz_buffer = new uint16_t[_xyz_buffer_stride * size.height]; + r = fastMalloc(reinterpret_cast(&_xyz_buffer), _xyz_buffer_stride * size.height); + if (r != FAST_OK) { + throw FastvideoError ("Malloc", r); + } } @@ -99,7 +103,7 @@ J2KEncoderFastvideoBackend::encode (vector > video) std::cout << "FV: " << video.size() << " from " << video.front()->index() << "\n"; if (!_setup_done) { - setup (video.front()->frame()->inter_size()); + setup (video.front()->frame()->out_size()); _setup_done = true; } @@ -118,7 +122,6 @@ J2KEncoderFastvideoBackend::encode (vector > video) /* XXX */ } - fastStatus_t r = fastImportFromHostCopy( _adapter, _xyz_buffer, @@ -131,7 +134,7 @@ J2KEncoderFastvideoBackend::encode (vector > video) } fastEncoderJ2kDynamicParameters_t dynamic_parameters; - dynamic_parameters.targetStreamSize = 0; + dynamic_parameters.targetStreamSize = _xyz_buffer_stride * image->size().width / 2; dynamic_parameters.quality = 0.5; dynamic_parameters.writeHeader = false; @@ -149,15 +152,26 @@ J2KEncoderFastvideoBackend::encode (vector > video) DCPOMATIC_ASSERT (free_slots == 0); fastEncoderJ2kReport_t report; + fastEncoderJ2kOutput_t output; + int const max_j2k_size = 1024 * 1024 * 2; + output.bufferSize = max_j2k_size; + dcp::Data data(output.bufferSize); + output.byteStream = data.data().get(); + fastStatus_t r = fastEncoderJ2kTransformBatch(_encoder, &output, &report); if (r != FAST_OK) { + fastTraceClose(); throw FastvideoError ("EncoderJ2KTransformBatch", r); } vector encoded; for (size_t i = 0; i < video.size(); ++i) { - encoded.push_back (Data(output.byteStream, output.streamSize)); + std::cout << "\tframe " << output.streamSize << "\n"; + data.set_size (output.streamSize); + encoded.push_back (data); + data = dcp::Data(output.bufferSize); + output.byteStream = data.data().get(); int images_left = 0; r = fastEncoderJ2kGetNextEncodedImage (_encoder, &output, &report, &images_left); } diff --git a/src/lib/player_video.h b/src/lib/player_video.h index 65d25bfd9..f05df83c4 100644 --- a/src/lib/player_video.h +++ b/src/lib/player_video.h @@ -105,6 +105,10 @@ public: return _inter_size; } + dcp::Size out_size () const { + return _out_size; + } + bool same (boost::shared_ptr other) const; size_t memory_used () const; diff --git a/src/lib/writer.cc b/src/lib/writer.cc index dc552e6cb..fc6fb83d4 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -764,7 +764,8 @@ void Writer::set_encoder_threads (int threads) { boost::mutex::scoped_lock lm (_state_mutex); - _maximum_frames_in_memory = lrint (threads * Config::instance()->frames_in_memory_multiplier()); + /* XXX: add some to cope with the FV encoder returning lots */ + _maximum_frames_in_memory = lrint (threads * Config::instance()->frames_in_memory_multiplier()) + 32; _maximum_queue_size = threads * 16; } -- 2.30.2