aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-05-20 20:14:45 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-05-20 20:14:45 +0000
commit9d12276bc2f11c0140f0d30a2f108bae7fd51ea9 (patch)
treebec365e82b5572703ee626c758af21567181200b /src/plugins/Input
parentba6d239f2bc533cbed1d1cb3ec85e0c15acd03f1 (diff)
downloadqmmp-9d12276bc2f11c0140f0d30a2f108bae7fd51ea9.tar.gz
qmmp-9d12276bc2f11c0140f0d30a2f108bae7fd51ea9.tar.bz2
qmmp-9d12276bc2f11c0140f0d30a2f108bae7fd51ea9.zip
flac: fixed bitrate calculation (#916)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7186 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input')
-rw-r--r--src/plugins/Input/flac/decoder_flac.cpp22
-rw-r--r--src/plugins/Input/flac/decoder_flac.h4
2 files changed, 17 insertions, 9 deletions
diff --git a/src/plugins/Input/flac/decoder_flac.cpp b/src/plugins/Input/flac/decoder_flac.cpp
index 8e4b8bb5f..43124ec5f 100644
--- a/src/plugins/Input/flac/decoder_flac.cpp
+++ b/src/plugins/Input/flac/decoder_flac.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2016 by Ilya Kotov *
+ * Copyright (C) 2006-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -122,7 +122,6 @@ static FLAC__StreamDecoderReadStatus flac_callback_read (const FLAC__StreamDecod
{
DecoderFLAC *dflac = (DecoderFLAC *) client_data;
qint64 res = dflac->data()->input->read((char *)buffer, *bytes);
- dflac->data()->last_bytes += res;
if (res > 0)
{
@@ -139,7 +138,7 @@ static FLAC__StreamDecoderReadStatus flac_callback_read (const FLAC__StreamDecod
}
-static FLAC__StreamDecoderWriteStatus flac_callback_write (const FLAC__StreamDecoder *,
+static FLAC__StreamDecoderWriteStatus flac_callback_write (const FLAC__StreamDecoder *d,
const FLAC__Frame *frame,
const FLAC__int32* const buffer[],
void *client_data)
@@ -150,9 +149,16 @@ static FLAC__StreamDecoderWriteStatus flac_callback_write (const FLAC__StreamDec
if (dflac->data()->abort)
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
- dflac->data()->bitrate = dflac->data()->last_bytes * 8.0 * frame->header.sample_rate /
- frame->header.blocksize / 1000.0;
- dflac->data()->last_bytes = 0;
+ //bitrate calculation
+ FLAC__uint64 decode_position = 0;
+ if(FLAC__stream_decoder_get_decode_position(d, &decode_position) &&
+ decode_position > dflac->data()->last_decode_position)
+ {
+ dflac->data()->bitrate = (decode_position - dflac->data()->last_decode_position) * 8.0 * frame->header.sample_rate /
+ frame->header.blocksize / 1000.0;
+ }
+
+ dflac->data()->last_decode_position = decode_position;
dflac->data()->sample_buffer_fill = pack_pcm_signed (
dflac->data()->sample_buffer,
@@ -210,6 +216,8 @@ static void flac_callback_metadata (const FLAC__StreamDecoder *,
dflac->data()->channels = metadata->data.stream_info.channels;
dflac->data()->sample_rate = metadata->data.stream_info.sample_rate;
dflac->data()->length = dflac->data()->total_samples * 1000 / dflac->data()->sample_rate;
+ dflac->data()->bitrate = dflac->data()->input->size() * 8 * metadata->data.stream_info.sample_rate /
+ metadata->data.stream_info.total_samples / 1000;
}
}
@@ -319,7 +327,7 @@ bool DecoderFLAC::initialize()
m_data->bitrate = -1;
m_data->abort = 0;
m_data->sample_buffer_fill = 0;
- m_data->last_bytes = 0;
+ m_data->last_decode_position = 0;
if (!m_data->decoder)
{
qDebug("DecoderFLAC: creating FLAC__StreamDecoder");
diff --git a/src/plugins/Input/flac/decoder_flac.h b/src/plugins/Input/flac/decoder_flac.h
index 5502001dc..ad0203f66 100644
--- a/src/plugins/Input/flac/decoder_flac.h
+++ b/src/plugins/Input/flac/decoder_flac.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006-2016 by Ilya Kotov *
+ * Copyright (C) 2006-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -50,7 +50,7 @@ struct flac_data
unsigned sample_rate;
unsigned channels;
- FLAC__uint64 last_bytes;
+ FLAC__uint64 last_decode_position;
int ok; /* was this stream successfully opened? */
//struct decoder_error error;