Untested basic stats for player.
authorCarl Hetherington <cth@carlh.net>
Wed, 1 Jan 2014 20:08:31 +0000 (20:08 +0000)
committerCarl Hetherington <cth@carlh.net>
Wed, 1 Jan 2014 20:08:31 +0000 (20:08 +0000)
src/lib/player.cc
src/lib/player.h
src/lib/transcoder.cc
src/lib/transcoder.h

index 263998693e7887188eaf1f4d3b87f3cefa935ab6..4fe81d4b2a9e86053fb1e5c8965cd0e4bec1a90b 100644 (file)
@@ -197,11 +197,13 @@ Player::pass ()
                        if (i == _pieces.end() || !_last_incoming_video.video || !_have_valid_pieces) {
                                /* We're outside all video content */
                                emit_black ();
+                               _statistics.video.black++;
                        } else {
                                /* We're inside some video; repeat the frame */
                                _last_incoming_video.video->dcp_time = _video_position;
                                emit_video (_last_incoming_video.weak_piece, _last_incoming_video.video);
                                step_video_position (_last_incoming_video.video);
+                               _statistics.video.repeat++;
                        }
 
                        consume = false;
@@ -210,8 +212,10 @@ Player::pass ()
                        /* We're ok */
                        emit_video (earliest_piece, dv);
                        step_video_position (dv);
+                       _statistics.video.good++;
                } else {
                        /* Too far behind: skip */
+                       _statistics.video.skip++;
                }
 
                _just_did_inaccurate_seek = false;
@@ -222,11 +226,14 @@ Player::pass ()
                        /* Too far ahead */
                        emit_silence (da->dcp_time - _audio_position);
                        consume = false;
+                       _statistics.audio.silence += (da->dcp_time - _audio_position);
                } else if (abs (da->dcp_time - _audio_position) < margin) {
                        /* We're ok */
                        emit_audio (earliest_piece, da);
+                       _statistics.audio.good += da->data->frames();
                } else {
                        /* Too far behind: skip */
+                       _statistics.audio.skip += da->data->frames();
                }
                
        } else if (ds && _video) {
@@ -715,3 +722,15 @@ PlayerImage::image (AVPixelFormat format, bool aligned)
        return out;
 }
 
+void
+PlayerStatistics::dump (shared_ptr<Log> log) const
+{
+       log->log (String::compose ("Video: %1 good %2 skipped %3 black %4 repeat", video.good, video.skip, video.black, video.repeat));
+       log->log (String::compose ("Audio: %1 good %2 skipped %3 silence", audio.good, audio.skip, audio.silence));
+}
+
+PlayerStatistics const &
+Player::statistics () const
+{
+       return _statistics;
+}
index b932f41682a78da892a675b6ac1e39aae0060fcf..897c6116b5acbf7c3351e4b774b214b01ad8c7f5 100644 (file)
@@ -60,6 +60,38 @@ private:
        boost::shared_ptr<const Image> _subtitle_image;
        Position<int> _subtitle_position;
 };
+
+class PlayerStatistics
+{
+public:
+       struct Video {
+               Video ()
+                       : black (0)
+                       , repeat (0)
+                       , good (0)
+                       , skip (0)
+               {}
+               
+               int black;
+               int repeat;
+               int good;
+               int skip;
+       } video;
+
+       struct Audio {
+               Audio ()
+                       : silence (0)
+                       , good (0)
+                       , skip (0)
+               {}
+               
+               int64_t silence;
+               int64_t good;
+               int64_t skip;
+       } audio;
+
+       void dump (boost::shared_ptr<Log>) const;
+};
  
 /** @class Player
  *  @brief A class which can `play' a Playlist; emitting its audio and video.
@@ -85,6 +117,8 @@ public:
 
        bool repeat_last_video ();
 
+       PlayerStatistics const & statistics () const;
+       
        /** Emitted when a video frame is ready.
         *  First parameter is the video image.
         *  Second parameter is the eye(s) that should see this image.
@@ -168,6 +202,8 @@ private:
        bool _just_did_inaccurate_seek;
        bool _approximate_size;
 
+       PlayerStatistics _statistics;
+
        boost::signals2::scoped_connection _playlist_changed_connection;
        boost::signals2::scoped_connection _playlist_content_changed_connection;
        boost::signals2::scoped_connection _film_changed_connection;
index 1c8f7e3eb0b021d03f6c62a0076ce4cd41f56188..ba4d3b040baa432812cfe85e972ea9f6c9d052c1 100644 (file)
@@ -62,7 +62,8 @@ audio_proxy (weak_ptr<Encoder> encoder, shared_ptr<const AudioBuffers> audio)
  *  @param e Encoder to use.
  */
 Transcoder::Transcoder (shared_ptr<const Film> f, shared_ptr<Job> j)
-       : _player (f->make_player ())
+       : _film (f)
+       , _player (f->make_player ())
        , _encoder (new Encoder (f, j))
        , _finishing (false)
 {
@@ -78,6 +79,8 @@ Transcoder::go ()
 
        _finishing = true;
        _encoder->process_end ();
+
+       _player->statistics().dump (_film->log ());
 }
 
 float
index d7736d4e8e56dd3a1cdf7440e6a5872bb7a59db1..25b2ef90841c68a23dd077eb12d41d0c4a282969 100644 (file)
@@ -42,6 +42,7 @@ public:
        }
 
 private:
+       boost::shared_ptr<const Film> _film;
        boost::shared_ptr<Player> _player;
        boost::shared_ptr<Encoder> _encoder;
        bool _finishing;