X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Futil.h;h=c4940a5d795b3c615d6861c15a0bc7ba804ce2f1;hb=95a27725707b2368d175f5ed51637fee88cb32b4;hp=f87328dba5b382ac5953fa0e25399b1e91755396;hpb=4fb0a5ab9eebc0f07981edc3a6813102520b8233;p=dcpomatic.git diff --git a/src/lib/util.h b/src/lib/util.h index f87328dba..c4940a5d7 100644 --- a/src/lib/util.h +++ b/src/lib/util.h @@ -29,6 +29,7 @@ #include #include #include +#include extern "C" { #include #include @@ -41,6 +42,9 @@ extern "C" { #define TIMING(...) #endif +/** The maximum number of audio channels that we can cope with */ +#define MAX_AUDIO_CHANNELS 6 + class Scaler; extern std::string seconds_to_hms (int); @@ -58,43 +62,47 @@ typedef int SourceFrame; struct DCPFrameRate { + DCPFrameRate (float); + + /** @return factor by which to multiply a source frame rate + to get the effective rate after any skip or repeat has happened. + */ + float factor () const { + if (skip) { + return 0.5; + } else if (repeat) { + return 2; + } + + return 1; + } + + /** frames per second for the DCP */ int frames_per_second; - int skip; - bool run_fast; + /** true to skip every other frame */ + bool skip; + /** true to repeat every frame once */ + bool repeat; + /** true if this DCP will run its video faster or slower than the source + * without taking into account `repeat'. + * (e.g. change_speed will be true if + * source is 29.97fps, DCP is 30fps + * source is 14.50fps, DCP is 30fps + * but not if + * source is 15.00fps, DCP is 30fps + * source is 12.50fps, DCP is 25fps) + */ + bool change_speed; }; enum ContentType { - STILL, - VIDEO + STILL, ///< content is still images + VIDEO ///< content is a video }; -/** @class Size - * @brief Representation of the size of something */ -struct Size -{ - /** Construct a zero Size */ - Size () - : width (0) - , height (0) - {} - - /** @param w Width. - * @param h Height. - */ - Size (int w, int h) - : width (w) - , height (h) - {} - - /** width */ - int width; - /** height */ - int height; -}; - -extern bool operator== (Size const & a, Size const & b); - -/** A description of the crop of an image or video. */ +/** @struct Crop + * @brief A description of the crop of an image or video. + */ struct Crop { Crop () : left (0), right (0), top (0), bottom (0) {} @@ -112,7 +120,9 @@ struct Crop extern bool operator== (Crop const & a, Crop const & b); extern bool operator!= (Crop const & a, Crop const & b); -/** A position */ +/** @struct Position + * @brief A position. + */ struct Position { Position () @@ -131,7 +141,9 @@ struct Position int y; }; -/** A rectangle */ +/** @struct Rect + * @brief A rectangle. + */ struct Rect { Rect () @@ -157,18 +169,19 @@ struct Rect return Position (x, y); } - Size size () const { - return Size (width, height); + libdcp::Size size () const { + return libdcp::Size (width, height); } Rect intersection (Rect const & other) const; }; -extern std::string crop_string (Position, Size); +extern std::string crop_string (Position, libdcp::Size); extern int dcp_audio_sample_rate (int); -extern DCPFrameRate dcp_frame_rate (float); +extern int dcp_audio_channels (int); extern std::string colour_lut_index_to_name (int index); -extern int round_up (int, int); +extern int stride_round_up (int, int const *, int); +extern int stride_lookup (int c, int const * stride); extern std::multimap read_key_value (std::istream& s); extern int get_required_int (std::multimap const & kv, std::string k); extern float get_required_float (std::multimap const & kv, std::string k); @@ -216,10 +229,14 @@ private: int _buffer_data; }; +/** @class AudioBuffers + * @brief A class to hold multi-channel audio data in float format. + */ class AudioBuffers { public: AudioBuffers (int channels, int frames); + AudioBuffers (AudioBuffers const &); ~AudioBuffers (); float** data () const { @@ -228,6 +245,10 @@ public: float* data (int) const; + int channels () const { + return _channels; + } + int frames () const { return _frames; } @@ -235,15 +256,25 @@ public: void set_frames (int f); void make_silent (); + void make_silent (int c); + + void copy_from (AudioBuffers* from, int frames_to_copy, int read_offset, int write_offset); + void move (int from, int to, int frames); private: - /* no copy construction */ - AudioBuffers (AudioBuffers const &); - + /** Number of channels */ int _channels; + /** Number of frames (where a frame is one sample across all channels) */ int _frames; + /** Number of frames that _data can hold */ + int _allocated_frames; + /** Audio data (so that, e.g. _data[2][6] is channel 2, sample 6) */ float** _data; }; +extern int64_t video_frames_to_audio_frames (SourceFrame v, float audio_sample_rate, float frames_per_second); +extern bool still_image_file (std::string); +extern std::pair cpu_info (); + #endif