summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-01-11 19:20:51 +0000
committerCarl Hetherington <cth@carlh.net>2013-01-11 19:20:51 +0000
commitef0aa27c671f9c34b9aad79015bcc50cb10c0fc5 (patch)
tree7216d311005a1469f079006cbb17f734a21a91ea /src/lib
parentd0babb26ab341026fe227de810ed30c6c9f65cf2 (diff)
Encoded data must be copied; disambiguate second lock in encoder_thread.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/dcp_video_frame.cc26
-rw-r--r--src/lib/dcp_video_frame.h21
-rw-r--r--src/lib/encoder.cc2
3 files changed, 30 insertions, 19 deletions
diff --git a/src/lib/dcp_video_frame.cc b/src/lib/dcp_video_frame.cc
index 8b70b0aa4..f84fa8a3f 100644
--- a/src/lib/dcp_video_frame.cc
+++ b/src/lib/dcp_video_frame.cc
@@ -59,6 +59,7 @@
using std::string;
using std::stringstream;
using std::ofstream;
+using std::cout;
using boost::shared_ptr;
/** Construct a DCP video frame.
@@ -371,6 +372,18 @@ DCPVideoFrame::encode_remotely (ServerDescription const * serv)
return e;
}
+EncodedData::EncodedData (int s)
+ : _data (new uint8_t[s])
+ , _size (s)
+{
+
+}
+
+EncodedData::~EncodedData ()
+{
+ delete[] _data;
+}
+
/** Write this data to a J2K file.
* @param opt Options.
* @param frame Frame index.
@@ -413,14 +426,15 @@ EncodedData::send (shared_ptr<Socket> socket)
socket->write (_data, _size, 30);
}
-/** @param s Size of data in bytes */
-RemotelyEncodedData::RemotelyEncodedData (int s)
- : EncodedData (new uint8_t[s], s)
+LocallyEncodedData::LocallyEncodedData (uint8_t* d, int s)
+ : EncodedData (s)
{
-
+ memcpy (_data, d, s);
}
-RemotelyEncodedData::~RemotelyEncodedData ()
+/** @param s Size of data in bytes */
+RemotelyEncodedData::RemotelyEncodedData (int s)
+ : EncodedData (s)
{
- delete[] _data;
+
}
diff --git a/src/lib/dcp_video_frame.h b/src/lib/dcp_video_frame.h
index 57e7e6203..f5ffa467e 100644
--- a/src/lib/dcp_video_frame.h
+++ b/src/lib/dcp_video_frame.h
@@ -39,15 +39,11 @@ class Subtitle;
class EncodedData
{
public:
- /** @param d Data (will not be freed by this class, but may be by subclasses)
- * @param s Size of data, in bytes.
+ /** @param s Size of data, in bytes.
*/
- EncodedData (uint8_t* d, int s)
- : _data (d)
- , _size (s)
- {}
+ EncodedData (int s);
- virtual ~EncodedData () {}
+ virtual ~EncodedData ();
void send (boost::shared_ptr<Socket> socket);
void write (boost::shared_ptr<const EncodeOptions>, SourceFrame);
@@ -65,6 +61,10 @@ public:
protected:
uint8_t* _data; ///< data
int _size; ///< data size in bytes
+
+private:
+ /* No copy construction */
+ EncodedData (EncodedData const &);
};
/** @class LocallyEncodedData
@@ -75,12 +75,10 @@ protected:
class LocallyEncodedData : public EncodedData
{
public:
- /** @param d Data (which will not be freed by this class)
+ /** @param d Data (which will be copied by this class)
* @param s Size of data, in bytes.
*/
- LocallyEncodedData (uint8_t* d, int s)
- : EncodedData (d, s)
- {}
+ LocallyEncodedData (uint8_t* d, int s);
};
/** @class RemotelyEncodedData
@@ -91,7 +89,6 @@ class RemotelyEncodedData : public EncodedData
{
public:
RemotelyEncodedData (int s);
- ~RemotelyEncodedData ();
};
/** @class DCPVideoFrame
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc
index 93a364fed..f6d0cc40e 100644
--- a/src/lib/encoder.cc
+++ b/src/lib/encoder.cc
@@ -536,7 +536,7 @@ Encoder::encoder_thread (ServerDescription* server)
}
if (encoded) {
- boost::mutex::scoped_lock lock (_writer_mutex);
+ boost::mutex::scoped_lock lock2 (_writer_mutex);
_write_queue.push_back (make_pair (encoded, vf->frame ()));
_writer_condition.notify_all ();
} else {