From a6c2aa6cad5872d27654553d447cb34185317974 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 1 Jul 2014 18:56:20 +0100 Subject: [PATCH] Split EncodedData classes into their own file. --- src/lib/dcp_video.cc | 88 +--------------------------- src/lib/dcp_video.h | 57 +----------------- src/lib/encoded_data.cc | 115 +++++++++++++++++++++++++++++++++++++ src/lib/encoded_data.h | 82 ++++++++++++++++++++++++++ src/lib/server.cc | 1 + src/lib/writer.cc | 2 +- src/lib/wscript | 1 + src/tools/server_test.cc | 1 + test/client_server_test.cc | 1 + 9 files changed, 204 insertions(+), 144 deletions(-) create mode 100644 src/lib/encoded_data.cc create mode 100644 src/lib/encoded_data.h diff --git a/src/lib/dcp_video.cc b/src/lib/dcp_video.cc index b6b7ab296..9b1c8c33e 100644 --- a/src/lib/dcp_video.cc +++ b/src/lib/dcp_video.cc @@ -60,6 +60,7 @@ #include "log.h" #include "cross.h" #include "player_video.h" +#include "encoded_data.h" #define LOG_GENERAL(...) _log->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL); @@ -317,90 +318,3 @@ DCPVideo::eyes () const return _frame->eyes (); } -EncodedData::EncodedData (int s) - : _data (new uint8_t[s]) - , _size (s) -{ - -} - -EncodedData::EncodedData (boost::filesystem::path file) -{ - _size = boost::filesystem::file_size (file); - _data = new uint8_t[_size]; - - FILE* f = fopen_boost (file, "rb"); - if (!f) { - throw FileError (_("could not open file for reading"), file); - } - - size_t const r = fread (_data, 1, _size, f); - if (r != size_t (_size)) { - fclose (f); - throw FileError (_("could not read encoded data"), file); - } - - fclose (f); -} - - -EncodedData::~EncodedData () -{ - delete[] _data; -} - -/** Write this data to a J2K file. - * @param Film Film. - * @param frame DCP frame index. - */ -void -EncodedData::write (shared_ptr film, int frame, Eyes eyes) const -{ - boost::filesystem::path const tmp_j2c = film->j2c_path (frame, eyes, true); - - FILE* f = fopen_boost (tmp_j2c, "wb"); - - if (!f) { - throw WriteFileError (tmp_j2c, errno); - } - - fwrite (_data, 1, _size, f); - fclose (f); - - boost::filesystem::path const real_j2c = film->j2c_path (frame, eyes, false); - - /* Rename the file from foo.j2c.tmp to foo.j2c now that it is complete */ - boost::filesystem::rename (tmp_j2c, real_j2c); -} - -void -EncodedData::write_info (shared_ptr film, int frame, Eyes eyes, dcp::FrameInfo fin) const -{ - boost::filesystem::path const info = film->info_path (frame, eyes); - FILE* h = fopen_boost (info, "w"); - fin.write (h); - fclose (h); -} - -/** Send this data to a socket. - * @param socket Socket - */ -void -EncodedData::send (shared_ptr socket) -{ - socket->write (_size); - socket->write (_data, _size); -} - -LocallyEncodedData::LocallyEncodedData (uint8_t* d, int s) - : EncodedData (s) -{ - memcpy (_data, d, s); -} - -/** @param s Size of data in bytes */ -RemotelyEncodedData::RemotelyEncodedData (int s) - : EncodedData (s) -{ - -} diff --git a/src/lib/dcp_video.h b/src/lib/dcp_video.h index 05a0b4ce3..e8e90260c 100644 --- a/src/lib/dcp_video.h +++ b/src/lib/dcp_video.h @@ -32,62 +32,7 @@ class Image; class Log; class Subtitle; class PlayerVideo; - -/** @class EncodedData - * @brief Container for J2K-encoded data. - */ -class EncodedData : public boost::noncopyable -{ -public: - /** @param s Size of data, in bytes */ - EncodedData (int s); - - EncodedData (boost::filesystem::path); - - virtual ~EncodedData (); - - void send (boost::shared_ptr socket); - void write (boost::shared_ptr, int, Eyes) const; - void write_info (boost::shared_ptr, int, Eyes, dcp::FrameInfo) const; - - /** @return data */ - uint8_t* data () const { - return _data; - } - - /** @return data size, in bytes */ - int size () const { - return _size; - } - -protected: - uint8_t* _data; ///< data - int _size; ///< data size in bytes -}; - -/** @class LocallyEncodedData - * @brief EncodedData that was encoded locally; this class - * just keeps a pointer to the data, but does no memory - * management. - */ -class LocallyEncodedData : public EncodedData -{ -public: - /** @param d Data (which will be copied by this class) - * @param s Size of data, in bytes. - */ - LocallyEncodedData (uint8_t* d, int s); -}; - -/** @class RemotelyEncodedData - * @brief EncodedData that is being read from a remote server; - * this class allocates and manages memory for the data. - */ -class RemotelyEncodedData : public EncodedData -{ -public: - RemotelyEncodedData (int s); -}; +class EncodedData; /** @class DCPVideo * @brief A single frame of video destined for a DCP. diff --git a/src/lib/encoded_data.cc b/src/lib/encoded_data.cc new file mode 100644 index 000000000..fffc4d91f --- /dev/null +++ b/src/lib/encoded_data.cc @@ -0,0 +1,115 @@ +/* + Copyright (C) 2012-2014 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "encoded_data.h" +#include "cross.h" +#include "exceptions.h" +#include "film.h" + +#include "i18n.h" + +using boost::shared_ptr; + +EncodedData::EncodedData (int s) + : _data (new uint8_t[s]) + , _size (s) +{ + +} + +EncodedData::EncodedData (boost::filesystem::path file) +{ + _size = boost::filesystem::file_size (file); + _data = new uint8_t[_size]; + + FILE* f = fopen_boost (file, "rb"); + if (!f) { + throw FileError (_("could not open file for reading"), file); + } + + size_t const r = fread (_data, 1, _size, f); + if (r != size_t (_size)) { + fclose (f); + throw FileError (_("could not read encoded data"), file); + } + + fclose (f); +} + + +EncodedData::~EncodedData () +{ + delete[] _data; +} + +/** Write this data to a J2K file. + * @param Film Film. + * @param frame DCP frame index. + */ +void +EncodedData::write (shared_ptr film, int frame, Eyes eyes) const +{ + boost::filesystem::path const tmp_j2c = film->j2c_path (frame, eyes, true); + + FILE* f = fopen_boost (tmp_j2c, "wb"); + + if (!f) { + throw WriteFileError (tmp_j2c, errno); + } + + fwrite (_data, 1, _size, f); + fclose (f); + + boost::filesystem::path const real_j2c = film->j2c_path (frame, eyes, false); + + /* Rename the file from foo.j2c.tmp to foo.j2c now that it is complete */ + boost::filesystem::rename (tmp_j2c, real_j2c); +} + +void +EncodedData::write_info (shared_ptr film, int frame, Eyes eyes, dcp::FrameInfo fin) const +{ + boost::filesystem::path const info = film->info_path (frame, eyes); + FILE* h = fopen_boost (info, "w"); + fin.write (h); + fclose (h); +} + +/** Send this data to a socket. + * @param socket Socket + */ +void +EncodedData::send (shared_ptr socket) +{ + socket->write (_size); + socket->write (_data, _size); +} + +LocallyEncodedData::LocallyEncodedData (uint8_t* d, int s) + : EncodedData (s) +{ + memcpy (_data, d, s); +} + +/** @param s Size of data in bytes */ +RemotelyEncodedData::RemotelyEncodedData (int s) + : EncodedData (s) +{ + +} diff --git a/src/lib/encoded_data.h b/src/lib/encoded_data.h new file mode 100644 index 000000000..9064cc929 --- /dev/null +++ b/src/lib/encoded_data.h @@ -0,0 +1,82 @@ +/* + Copyright (C) 2012-2014 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include +#include +#include "types.h" + +class Socket; +class Film; + +/** @class EncodedData + * @brief Container for J2K-encoded data. + */ +class EncodedData : public boost::noncopyable +{ +public: + /** @param s Size of data, in bytes */ + EncodedData (int s); + + EncodedData (boost::filesystem::path); + + virtual ~EncodedData (); + + void send (boost::shared_ptr socket); + void write (boost::shared_ptr, int, Eyes) const; + void write_info (boost::shared_ptr, int, Eyes, dcp::FrameInfo) const; + + /** @return data */ + uint8_t* data () const { + return _data; + } + + /** @return data size, in bytes */ + int size () const { + return _size; + } + +protected: + uint8_t* _data; ///< data + int _size; ///< data size in bytes +}; + +/** @class LocallyEncodedData + * @brief EncodedData that was encoded locally; this class + * just keeps a pointer to the data, but does no memory + * management. + */ +class LocallyEncodedData : public EncodedData +{ +public: + /** @param d Data (which will be copied by this class) + * @param s Size of data, in bytes. + */ + LocallyEncodedData (uint8_t* d, int s); +}; + +/** @class RemotelyEncodedData + * @brief EncodedData that is being read from a remote server; + * this class allocates and manages memory for the data. + */ +class RemotelyEncodedData : public EncodedData +{ +public: + RemotelyEncodedData (int s); +}; diff --git a/src/lib/server.cc b/src/lib/server.cc index 2469d4151..5598ef69f 100644 --- a/src/lib/server.cc +++ b/src/lib/server.cc @@ -38,6 +38,7 @@ #include "config.h" #include "cross.h" #include "player_video.h" +#include "encoded_data.h" #include "i18n.h" diff --git a/src/lib/writer.cc b/src/lib/writer.cc index ca9b63df4..04eac854c 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -36,13 +36,13 @@ #include "log.h" #include "dcp_video.h" #include "dcp_content_type.h" -#include "player.h" #include "audio_mapping.h" #include "config.h" #include "job.h" #include "cross.h" #include "audio_buffers.h" #include "md5_digester.h" +#include "encoded_data.h" #include "i18n.h" diff --git a/src/lib/wscript b/src/lib/wscript index 1f6a2aa4f..9937133ec 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -20,6 +20,7 @@ sources = """ dcpomatic_time.cc dolby_cp750.cc encoder.cc + encoded_data.cc examine_content_job.cc exceptions.cc file_group.cc diff --git a/src/tools/server_test.cc b/src/tools/server_test.cc index 0e19a36ac..9223efb3e 100644 --- a/src/tools/server_test.cc +++ b/src/tools/server_test.cc @@ -35,6 +35,7 @@ #include "lib/video_decoder.h" #include "lib/player.h" #include "lib/player_video.h" +#include "lib/encoded_data.h" using std::cout; using std::cerr; diff --git a/test/client_server_test.cc b/test/client_server_test.cc index 19c827c2f..184dde9b8 100644 --- a/test/client_server_test.cc +++ b/test/client_server_test.cc @@ -34,6 +34,7 @@ #include "lib/scaler.h" #include "lib/player_video.h" #include "lib/image_proxy.h" +#include "lib/encoded_data.h" using std::list; using boost::shared_ptr; -- 2.30.2