]> granicus.if.org Git - taglib/commitdiff
opus: Estimate the bitrate if possible
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Mon, 10 Mar 2014 00:27:04 +0000 (09:27 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Mon, 10 Mar 2014 00:37:10 +0000 (09:37 +0900)
taglib/ogg/opus/opusproperties.cpp
tests/test_opus.cpp

index 7bdcd39dff200edc478d558831f323fe96dc0120..f098921b907b68b8fa7b3ac9b63807b3bbc22778 100644 (file)
@@ -45,6 +45,7 @@ public:
     file(f),
     style(s),
     length(0),
+    bitrate(0),
     inputSampleRate(0),
     channels(0),
     opusVersion(0) {}
@@ -52,6 +53,7 @@ public:
   File *file;
   ReadStyle style;
   int length;
+  int bitrate;
   int inputSampleRate;
   int channels;
   int opusVersion;
@@ -79,7 +81,7 @@ int Opus::Properties::length() const
 
 int Opus::Properties::bitrate() const
 {
-  return 0;
+  return d->bitrate;
 }
 
 int Opus::Properties::sampleRate() const
@@ -143,14 +145,16 @@ void Opus::Properties::read()
   pos += 1;
 
   const Ogg::PageHeader *first = d->file->firstPageHeader();
-  const Ogg::PageHeader *last = d->file->lastPageHeader();
+  const Ogg::PageHeader *last  = d->file->lastPageHeader();
 
   if(first && last) {
-    long long start = first->absoluteGranularPosition();
-    long long end = last->absoluteGranularPosition();
+    const long long start = first->absoluteGranularPosition();
+    const long long end   = last->absoluteGranularPosition();
 
-    if(start >= 0 && end >= 0)
-      d->length = (int) ((end - start - preSkip) / 48000);
+    if(start >= 0 && end >= 0) {
+      d->length  = (int)((end - start - preSkip) / 48000);
+      d->bitrate = (int)(d->file->length() * 8.0 / (1000.0 * d->length) + 0.5);
+    }
     else {
       debug("Opus::Properties::read() -- The PCM values for the start or "
             "end of this file was incorrect.");
index 769d3985dc01367ea07eecc4ff726a74ac6962b6..18556241f58748f298d200002a37efc5a0cf33d3 100644 (file)
@@ -23,7 +23,7 @@ public:
   {
     Ogg::Opus::File f(TEST_FILE_PATH_C("correctness_gain_silent_output.opus"));
     CPPUNIT_ASSERT_EQUAL(7, f.audioProperties()->length());
-    CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate());
+    CPPUNIT_ASSERT_EQUAL(41, f.audioProperties()->bitrate());
     CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels());
     CPPUNIT_ASSERT_EQUAL(48000, f.audioProperties()->sampleRate());
     CPPUNIT_ASSERT_EQUAL(48000, ((Ogg::Opus::Properties *)f.audioProperties())->inputSampleRate());