Rearrange encoder threading.
[dcpomatic.git] / src / lib / j2k_sync_encoder_thread.cc
1 /*
2     Copyright (C) 2023 Carl Hetherington <cth@carlh.net>
3
4     This file is part of DCP-o-matic.
5
6     DCP-o-matic is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     DCP-o-matic is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21
22 #include "dcp_video.h"
23 #include "dcpomatic_log.h"
24 #include "j2k_encoder.h"
25 #include "j2k_sync_encoder_thread.h"
26 #include <dcp/scope_guard.h>
27
28
29 J2KSyncEncoderThread::J2KSyncEncoderThread(J2KEncoder& encoder)
30         : J2KEncoderThread(encoder)
31 {
32
33 }
34
35
36 void
37 J2KSyncEncoderThread::run()
38 try
39 {
40         log_thread_start();
41
42         while (true) {
43                 LOG_TIMING("encoder-sleep thread=%1", thread_id());
44                 auto frame = _encoder.pop();
45
46                 dcp::ScopeGuard frame_guard([this, &frame]() {
47                         boost::this_thread::disable_interruption dis;
48                         _encoder.retry(frame);
49                 });
50
51                 LOG_TIMING("encoder-pop thread=%1 frame=%2 eyes=%3", thread_id(), frame.index(), static_cast<int>(frame.eyes()));
52
53                 auto encoded = encode(frame);
54
55                 if (encoded) {
56                         boost::this_thread::disable_interruption dis;
57                         frame_guard.cancel();
58                         _encoder.write(encoded, frame.index(), frame.eyes());
59                 }
60         }
61 } catch (boost::thread_interrupted& e) {
62 } catch (...) {
63         store_current();
64 }
65