projects
/
dcpomatic.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Various fixes to make audio analysis sort-of work.
[dcpomatic.git]
/
src
/
lib
/
writer.h
diff --git
a/src/lib/writer.h
b/src/lib/writer.h
index ba989b02220e02d817195788351bbe2059c7721a..e56e12e75a2255ac95bab0b1563733f3a5521e94 100644
(file)
--- a/
src/lib/writer.h
+++ b/
src/lib/writer.h
@@
-21,10
+21,12
@@
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/thread/condition.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/thread/condition.hpp>
+#include "exceptions.h"
class Film;
class EncodedData;
class AudioBuffers;
class Film;
class EncodedData;
class AudioBuffers;
+class Job;
namespace libdcp {
class MonoPictureAsset;
namespace libdcp {
class MonoPictureAsset;
@@
-37,8
+39,14
@@
struct QueueItem
{
public:
enum Type {
{
public:
enum Type {
+ /** a normal frame with some JPEG200 data */
FULL,
FULL,
+ /** a frame whose data already exists in the MXF,
+ and we fake-write it; i.e. we update the writer's
+ state but we use the data that is already on disk.
+ */
FAKE,
FAKE,
+ /** this is a repeat of the last frame to be written */
REPEAT
} type;
REPEAT
} type;
@@
-53,10
+61,10
@@
public:
bool operator< (QueueItem const & a, QueueItem const & b);
bool operator== (QueueItem const & a, QueueItem const & b);
bool operator< (QueueItem const & a, QueueItem const & b);
bool operator== (QueueItem const & a, QueueItem const & b);
-class Writer
+class Writer
: public ExceptionStore
{
public:
{
public:
- Writer (boost::shared_ptr<
Film
>);
+ Writer (boost::shared_ptr<
const Film>, boost::shared_ptr<Job
>);
bool can_fake_write (int) const;
bool can_fake_write (int) const;
@@
-71,24
+79,44
@@
private:
void thread ();
void check_existing_picture_mxf ();
void thread ();
void check_existing_picture_mxf ();
- boost::shared_ptr<Film> _film;
+ /** our Film */
+ boost::shared_ptr<const Film> _film;
+ boost::shared_ptr<Job> _job;
+ /** the first frame index that does not already exist in our MXF */
int _first_nonexistant_frame;
int _first_nonexistant_frame;
+ /** our thread, or 0 */
boost::thread* _thread;
boost::thread* _thread;
+ /** true if our thread should finish */
bool _finish;
bool _finish;
+ /** queue of things to write to disk */
std::list<QueueItem> _queue;
std::list<QueueItem> _queue;
+ /** number of FULL frames whose JPEG200 data is currently held in RAM */
int _queued_full_in_memory;
int _queued_full_in_memory;
+ /** mutex for thread state */
mutable boost::mutex _mutex;
mutable boost::mutex _mutex;
+ /** condition to manage thread wakeups */
boost::condition _condition;
boost::condition _condition;
+ /** the data of the last written frame, or 0 if there isn't one */
boost::shared_ptr<const EncodedData> _last_written;
boost::shared_ptr<const EncodedData> _last_written;
+ /** the index of the last written frame */
int _last_written_frame;
int _last_written_frame;
+ /** maximum number of frames to hold in memory, for when we are managing
+ ordering
+ */
static const int _maximum_frames_in_memory;
static const int _maximum_frames_in_memory;
+ /** number of FULL written frames */
int _full_written;
int _full_written;
+ /** number of FAKE written frames */
int _fake_written;
int _fake_written;
+ /** number of REPEAT written frames */
int _repeat_written;
int _repeat_written;
+ /** number of frames pushed to disk and then recovered
+ due to the limit of frames to be held in memory.
+ */
int _pushed_to_disk;
int _pushed_to_disk;
-
+
boost::shared_ptr<libdcp::MonoPictureAsset> _picture_asset;
boost::shared_ptr<libdcp::MonoPictureAssetWriter> _picture_asset_writer;
boost::shared_ptr<libdcp::SoundAsset> _sound_asset;
boost::shared_ptr<libdcp::MonoPictureAsset> _picture_asset;
boost::shared_ptr<libdcp::MonoPictureAssetWriter> _picture_asset_writer;
boost::shared_ptr<libdcp::SoundAsset> _sound_asset;