]> granicus.if.org Git - taglib/commitdiff
Add some tests about splitting/merging Ogg pages.
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Sat, 28 Nov 2015 16:57:15 +0000 (01:57 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Sat, 28 Nov 2015 16:57:15 +0000 (01:57 +0900)
tests/test_ogg.cpp
tests/test_oggflac.cpp
tests/test_opus.cpp
tests/test_speex.cpp

index 0fc7cfef72b5598003239670854f2613febc027b..6a671d48fb68e8fa7512187cadbf6d2a66a24bbb 100644 (file)
@@ -59,16 +59,31 @@ public:
     {
       Vorbis::File f(newname.c_str());
       CPPUNIT_ASSERT(f.isValid());
+      CPPUNIT_ASSERT_EQUAL(136383L, f.length());
       CPPUNIT_ASSERT_EQUAL(19, f.lastPageHeader()->pageSequenceNumber());
+      CPPUNIT_ASSERT_EQUAL(30U, f.packet(0).size());
+      CPPUNIT_ASSERT_EQUAL(131127U, f.packet(1).size());
+      CPPUNIT_ASSERT_EQUAL(3832U, f.packet(2).size());
       CPPUNIT_ASSERT_EQUAL(longText, f.tag()->title());
+
+      CPPUNIT_ASSERT(f.audioProperties());
+      CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds());
+
       f.tag()->setTitle("ABCDE");
       f.save();
     }
     {
       Vorbis::File f(newname.c_str());
       CPPUNIT_ASSERT(f.isValid());
+      CPPUNIT_ASSERT_EQUAL(4370L, f.length());
       CPPUNIT_ASSERT_EQUAL(3, f.lastPageHeader()->pageSequenceNumber());
+      CPPUNIT_ASSERT_EQUAL(30U, f.packet(0).size());
+      CPPUNIT_ASSERT_EQUAL(60U, f.packet(1).size());
+      CPPUNIT_ASSERT_EQUAL(3832U, f.packet(2).size());
       CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title());
+
+      CPPUNIT_ASSERT(f.audioProperties());
+      CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds());
     }
   }
 
index e0f5bb164c46aa2bc8a57c061e606f519dd717a5..737a7261a76f42ca5dcd1756fd24c0cad59bc685 100644 (file)
@@ -5,6 +5,7 @@
 #include <tbytevectorlist.h>
 #include <oggfile.h>
 #include <oggflacfile.h>
+#include <oggpageheader.h>
 #include <cppunit/extensions/HelperMacros.h>
 #include "utils.h"
 
@@ -16,6 +17,7 @@ class TestOggFLAC : public CppUnit::TestFixture
   CPPUNIT_TEST_SUITE(TestOggFLAC);
   CPPUNIT_TEST(testFramingBit);
   CPPUNIT_TEST(testFuzzedFile);
+  CPPUNIT_TEST(testSplitPackets);
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -45,6 +47,53 @@ public:
     CPPUNIT_ASSERT(!f.isValid());
   }
 
+  void testSplitPackets()
+  {
+    ScopedFileCopy copy("empty_flac", ".oga");
+    string newname = copy.fileName();
+
+    String longText(std::string(128 * 1024, ' ').c_str());
+    for(size_t i = 0; i < longText.length(); ++i)
+      longText[i] = static_cast<wchar>(L'A' + (i % 26));
+
+    {
+      Ogg::FLAC::File f(newname.c_str());
+      f.tag()->setTitle(longText);
+      f.save();
+    }
+    {
+      Ogg::FLAC::File f(newname.c_str());
+      CPPUNIT_ASSERT(f.isValid());
+      CPPUNIT_ASSERT_EQUAL(141141L, f.length());
+      CPPUNIT_ASSERT_EQUAL(21, f.lastPageHeader()->pageSequenceNumber());
+      CPPUNIT_ASSERT_EQUAL(51U, f.packet(0).size());
+      CPPUNIT_ASSERT_EQUAL(131126U, f.packet(1).size());
+      CPPUNIT_ASSERT_EQUAL(22U, f.packet(2).size());
+      CPPUNIT_ASSERT_EQUAL(8196U, f.packet(3).size());
+      CPPUNIT_ASSERT_EQUAL(longText, f.tag()->title());
+
+      CPPUNIT_ASSERT(f.audioProperties());
+      CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds());
+
+      f.tag()->setTitle("ABCDE");
+      f.save();
+    }
+    {
+      Ogg::FLAC::File f(newname.c_str());
+      CPPUNIT_ASSERT(f.isValid());
+      CPPUNIT_ASSERT_EQUAL(9128L, f.length());
+      CPPUNIT_ASSERT_EQUAL(5, f.lastPageHeader()->pageSequenceNumber());
+      CPPUNIT_ASSERT_EQUAL(51U, f.packet(0).size());
+      CPPUNIT_ASSERT_EQUAL(59U, f.packet(1).size());
+      CPPUNIT_ASSERT_EQUAL(22U, f.packet(2).size());
+      CPPUNIT_ASSERT_EQUAL(8196U, f.packet(3).size());
+      CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title());
+
+      CPPUNIT_ASSERT(f.audioProperties());
+      CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds());
+    }
+  }
+
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION(TestOggFLAC);
index 398e7e91877a9a38fbe61f0bed7c53582fde5b14..3113e55fb3db407a68749809b96ff7c8af45f11f 100644 (file)
@@ -3,6 +3,7 @@
 #include <tag.h>
 #include <tbytevectorlist.h>
 #include <opusfile.h>
+#include <oggpageheader.h>
 #include <cppunit/extensions/HelperMacros.h>
 #include "utils.h"
 
@@ -15,6 +16,7 @@ class TestOpus : public CppUnit::TestFixture
   CPPUNIT_TEST(testAudioProperties);
   CPPUNIT_TEST(testReadComments);
   CPPUNIT_TEST(testWriteComments);
+  CPPUNIT_TEST(testSplitPackets);
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -61,6 +63,53 @@ public:
     }
   }
 
+  void testSplitPackets()
+  {
+    ScopedFileCopy copy("correctness_gain_silent_output", ".opus");
+    string newname = copy.fileName();
+
+    String longText(std::string(128 * 1024, ' ').c_str());
+    for(size_t i = 0; i < longText.length(); ++i)
+      longText[i] = static_cast<wchar>(L'A' + (i % 26));
+
+    {
+      Ogg::Opus::File f(newname.c_str());
+      f.tag()->setTitle(longText);
+      f.save();
+    }
+    {
+      Ogg::Opus::File f(newname.c_str());
+      CPPUNIT_ASSERT(f.isValid());
+      CPPUNIT_ASSERT_EQUAL(167534L, f.length());
+      CPPUNIT_ASSERT_EQUAL(27, f.lastPageHeader()->pageSequenceNumber());
+      CPPUNIT_ASSERT_EQUAL(19U, f.packet(0).size());
+      CPPUNIT_ASSERT_EQUAL(131380U, f.packet(1).size());
+      CPPUNIT_ASSERT_EQUAL(5U, f.packet(2).size());
+      CPPUNIT_ASSERT_EQUAL(5U, f.packet(3).size());
+      CPPUNIT_ASSERT_EQUAL(longText, f.tag()->title());
+
+      CPPUNIT_ASSERT(f.audioProperties());
+      CPPUNIT_ASSERT_EQUAL(7737, f.audioProperties()->lengthInMilliseconds());
+
+      f.tag()->setTitle("ABCDE");
+      f.save();
+    }
+    {
+      Ogg::Opus::File f(newname.c_str());
+      CPPUNIT_ASSERT(f.isValid());
+      CPPUNIT_ASSERT_EQUAL(35521L, f.length());
+      CPPUNIT_ASSERT_EQUAL(11, f.lastPageHeader()->pageSequenceNumber());
+      CPPUNIT_ASSERT_EQUAL(19U, f.packet(0).size());
+      CPPUNIT_ASSERT_EQUAL(313U, f.packet(1).size());
+      CPPUNIT_ASSERT_EQUAL(5U, f.packet(2).size());
+      CPPUNIT_ASSERT_EQUAL(5U, f.packet(3).size());
+      CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title());
+
+      CPPUNIT_ASSERT(f.audioProperties());
+      CPPUNIT_ASSERT_EQUAL(7737, f.audioProperties()->lengthInMilliseconds());
+    }
+  }
+
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION(TestOpus);
index 577adb3ede5096ee468ad94615c102d3b0b1070d..258795aba6e47682f04d08f19f18edc9d10e2f3d 100644 (file)
@@ -1,4 +1,5 @@
 #include <speexfile.h>
+#include <oggpageheader.h>
 #include <cppunit/extensions/HelperMacros.h>
 #include "utils.h"
 
@@ -9,6 +10,7 @@ class TestSpeex : public CppUnit::TestFixture
 {
   CPPUNIT_TEST_SUITE(TestSpeex);
   CPPUNIT_TEST(testAudioProperties);
+  CPPUNIT_TEST(testSplitPackets);
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -26,6 +28,53 @@ public:
     CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate());
   }
 
+  void testSplitPackets()
+  {
+    ScopedFileCopy copy("empty", ".spx");
+    string newname = copy.fileName();
+
+    String longText(std::string(128 * 1024, ' ').c_str());
+    for (size_t i = 0; i < longText.length(); ++i)
+      longText[i] = static_cast<wchar>(L'A' + (i % 26));
+
+    {
+      Ogg::Speex::File f(newname.c_str());
+      f.tag()->setTitle(longText);
+      f.save();
+    }
+    {
+      Ogg::Speex::File f(newname.c_str());
+      CPPUNIT_ASSERT(f.isValid());
+      CPPUNIT_ASSERT_EQUAL(156330L, f.length());
+      CPPUNIT_ASSERT_EQUAL(23, f.lastPageHeader()->pageSequenceNumber());
+      CPPUNIT_ASSERT_EQUAL(80U, f.packet(0).size());
+      CPPUNIT_ASSERT_EQUAL(131116U, f.packet(1).size());
+      CPPUNIT_ASSERT_EQUAL(93U, f.packet(2).size());
+      CPPUNIT_ASSERT_EQUAL(93U, f.packet(3).size());
+      CPPUNIT_ASSERT_EQUAL(longText, f.tag()->title());
+
+      CPPUNIT_ASSERT(f.audioProperties());
+      CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds());
+
+      f.tag()->setTitle("ABCDE");
+      f.save();
+    }
+    {
+      Ogg::Speex::File f(newname.c_str());
+      CPPUNIT_ASSERT(f.isValid());
+      CPPUNIT_ASSERT_EQUAL(24317L, f.length());
+      CPPUNIT_ASSERT_EQUAL(7, f.lastPageHeader()->pageSequenceNumber());
+      CPPUNIT_ASSERT_EQUAL(80U, f.packet(0).size());
+      CPPUNIT_ASSERT_EQUAL(49U, f.packet(1).size());
+      CPPUNIT_ASSERT_EQUAL(93U, f.packet(2).size());
+      CPPUNIT_ASSERT_EQUAL(93U, f.packet(3).size());
+      CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title());
+
+      CPPUNIT_ASSERT(f.audioProperties());
+      CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds());
+    }
+  }
+
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION(TestSpeex);