summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/xine.h.in18
-rw-r--r--src/input/net_buf_ctrl.c28
2 files changed, 45 insertions, 1 deletions
diff --git a/include/xine.h.in b/include/xine.h.in
index a8d8ddd5b..9cde0593e 100644
--- a/include/xine.h.in
+++ b/include/xine.h.in
@@ -1721,6 +1721,7 @@ void xine_config_reset (xine_t *self) XINE_PROTECTED;
#define XINE_EVENT_DROPPED_FRAMES 12 /* number of dropped frames is too high */
#define XINE_EVENT_MRL_REFERENCE_EXT 13 /* demuxer->frontend: MRL reference(s) for the real stream */
#define XINE_EVENT_AUDIO_AMP_LEVEL 14 /* report current audio amp level (l/r/mute) */
+#define XINE_EVENT_NBC_STATS 15 /* nbc buffer status */
/* input events coming from frontend */
@@ -1905,6 +1906,23 @@ typedef struct {
} xine_progress_data_t;
/*
+ * nbc buffer status
+ */
+typedef struct {
+ int v_percent; /* fill of video buffer */
+ int64_t v_remaining; /* remaining time in ms till underrun */
+ int64_t v_bitrate; /* current bitrate */
+ int v_in_disc; /* in discontinuity */
+ int a_percent; /* like video, but for audio */
+ int64_t a_remaining;
+ int64_t a_bitrate;
+ int a_in_disc;
+ int buffering; /* currently filling buffer */
+ int enabled; /* buffer disabled by engine */
+ int type; /* 0=buffer put, 1=buffer get */
+} xine_nbc_stats_data_t;
+
+/*
* mrl reference data is sent by demuxers when a reference stream is found.
* this stream just contains pointers (urls) to the real data, which are
* passed to frontend using this event type. (examples: .asx, .mov and .ram)
diff --git a/src/input/net_buf_ctrl.c b/src/input/net_buf_ctrl.c
index e8af1ae3f..ba17423fb 100644
--- a/src/input/net_buf_ctrl.c
+++ b/src/input/net_buf_ctrl.c
@@ -96,7 +96,6 @@ static void report_progress (xine_stream_t *stream, int p) {
xine_event_send (stream, &event);
}
-
static void nbc_set_speed_pause (nbc_t *this) {
xine_stream_t *stream = this->stream;
@@ -138,6 +137,29 @@ static void display_stats (nbc_t *this) {
fflush(stdout);
}
+static void report_stats (nbc_t *this, int type) {
+ xine_event_t event;
+ xine_nbc_stats_data_t bs;
+
+ bs.v_percent = this->video_fifo_fill;
+ bs.v_remaining = this->video_fifo_length;
+ bs.v_bitrate = this->video_br;
+ bs.v_in_disc = this->video_in_disc;
+ bs.a_percent = this->audio_fifo_fill;
+ bs.a_remaining = this->audio_fifo_length;
+ bs.a_bitrate = this->audio_br;
+ bs.a_in_disc = this->audio_in_disc;
+ bs.buffering = this->buffering;
+ bs.enabled = this->enabled;
+ bs.type = type;
+
+ event.type = XINE_EVENT_NBC_STATS;
+ event.data = &bs;
+ event.data_length = sizeof (xine_nbc_stats_data_t);
+
+ xine_event_send (this->stream, &event);
+}
+
/* Try to compute the length of the fifo in 1/1000 s
* 2 methods :
* if the bitrate is known
@@ -347,6 +369,8 @@ static void nbc_put_cb (fifo_buffer_t *fifo,
}
if(this->stream->xine->verbosity >= XINE_VERBOSITY_DEBUG)
display_stats(this);
+
+ report_stats(this, 0);
}
} else {
@@ -466,6 +490,8 @@ static void nbc_get_cb (fifo_buffer_t *fifo,
if(this->stream->xine->verbosity >= XINE_VERBOSITY_DEBUG)
display_stats(this);
+
+ report_stats(this, 1);
}
} else {
/* discontinuity management */