-
- _broadcast.io_service.stop ();
- _broadcast.thread->join ();
-}
-
-/** @param after_read Filled in with gettimeofday() after reading the input from the network.
- * @param after_encode Filled in with gettimeofday() after encoding the image.
- */
-int
-Server::process (shared_ptr<Socket> socket, struct timeval& after_read, struct timeval& after_encode)
-{
- uint32_t length = socket->read_uint32 ();
- scoped_array<char> buffer (new char[length]);
- socket->read (reinterpret_cast<uint8_t*> (buffer.get()), length);
-
- string s (buffer.get());
- shared_ptr<cxml::Document> xml (new cxml::Document ("EncodingRequest"));
- xml->read_string (s);
- if (xml->number_child<int> ("Version") != SERVER_LINK_VERSION) {
- cerr << "Mismatched server/client versions\n";
- LOG_ERROR_NC ("Mismatched server/client versions");
- return -1;
- }
-
- shared_ptr<PlayerVideo> pvf (new PlayerVideo (xml, socket, _log));
-
- DCPVideo dcp_video_frame (pvf, xml, _log);
-
- gettimeofday (&after_read, 0);
-
- shared_ptr<EncodedData> encoded = dcp_video_frame.encode_locally ();
-
- gettimeofday (&after_encode, 0);
-
- try {
- encoded->send (socket);
- } catch (std::exception& e) {
- cerr << "Send failed; frame " << dcp_video_frame.index() << "\n";
- LOG_ERROR ("Send failed; frame %1", dcp_video_frame.index());
- throw;
- }
-
- return dcp_video_frame.index ();
-}
-
-void
-Server::worker_thread ()
-{
- while (true) {
- boost::mutex::scoped_lock lock (_worker_mutex);
- while (_queue.empty () && !_terminate) {
- _empty_condition.wait (lock);
- }
-
- if (_terminate) {
- return;
- }
-
- shared_ptr<Socket> socket = _queue.front ();
- _queue.pop_front ();
-
- lock.unlock ();
-
- int frame = -1;
- string ip;
-
- struct timeval start;
- struct timeval after_read;
- struct timeval after_encode;
- struct timeval end;
-
- gettimeofday (&start, 0);
-
- try {
- frame = process (socket, after_read, after_encode);
- ip = socket->socket().remote_endpoint().address().to_string();
- } catch (std::exception& e) {
- cerr << "Error: " << e.what() << "\n";
- LOG_ERROR ("Error: %1", e.what());
- }
-
- gettimeofday (&end, 0);
-
- socket.reset ();
-
- lock.lock ();
-
- if (frame >= 0) {
- struct timeval end;
- gettimeofday (&end, 0);
-
- SafeStringStream message;
- message.precision (2);
- message << fixed
- << "Encoded frame " << frame << " from " << ip << ": "
- << "receive " << (seconds(after_read) - seconds(start)) << "s "
- << "encode " << (seconds(after_encode) - seconds(after_read)) << "s "
- << "send " << (seconds(end) - seconds(after_encode)) << "s.";
-
- if (_verbose) {
- cout << message.str() << "\n";
- }
-
- LOG_GENERAL_NC (message.str ());
- }
-
- _full_condition.notify_all ();
- }