From 4f1070f272211a4dfc8f2e19c1c7ee413bec62e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Mangano?= Date: Wed, 2 Mar 2016 15:53:21 +0100 Subject: [PATCH] ogg: checked the packetno of the OpusTags packet --- src/ogg.cc | 2 +- tests/ogg_test.cc | 14 ++++++++++++-- tests/samples/beep.ogg | Bin 0 -> 15336 bytes 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 tests/samples/beep.ogg diff --git a/src/ogg.cc b/src/ogg.cc index 0acf493..e87acb6 100644 --- a/src/ogg.cc +++ b/src/ogg.cc @@ -265,7 +265,7 @@ void ogg::Encoder::write_tags(int streamno, const Tags &tags) op.b_o_s = 0; op.e_o_s = 0; op.granulepos = 0; - op.packetno = 1; // TODO ensure it's not 2 + op.packetno = 1; // checked on a file from ffmpeg std::string data = render_opustags(tags); op.bytes = data.size(); diff --git a/tests/ogg_test.cc b/tests/ogg_test.cc index c31f855..bc2da04 100644 --- a/tests/ogg_test.cc +++ b/tests/ogg_test.cc @@ -5,7 +5,7 @@ using namespace opustags; -TEST_CASE("decoding a single-stream file", "[ogg]") +TEST_CASE("decoding a single-stream Ogg Opus file", "[ogg]") { std::ifstream src("../tests/samples/mystery.ogg"); ogg::Decoder dec(src); @@ -29,8 +29,18 @@ TEST_CASE("decoding garbage", "[ogg]") REQUIRE_THROWS(dec.read_page()); } +TEST_CASE("decoding an Ogg Vorbis file", "[ogg]") +{ + std::ifstream src("../tests/samples/beep.ogg"); + ogg::Decoder dec(src); + + std::shared_ptr s = dec.read_page(); + REQUIRE(s != nullptr); + REQUIRE(s->state == ogg::RAW_READY); + REQUIRE(s->type == ogg::UNKNOWN_STREAM); +} + // TODO decoding a multi-stream file -// TODO decoding a vorbis ogg stream // Encoding is trickier, and might as well be done in actions_test.cc, given // opustags::edit_tags covers all of Encoder's regular code. diff --git a/tests/samples/beep.ogg b/tests/samples/beep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9d56fd8c0bd207efc5f51825d241265080b8aa88 GIT binary patch literal 15336 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 literal 0 HcmV?d00001