diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | src/lib/xiph/OggPage.hxx | 51 | ||||
-rw-r--r-- | src/lib/xiph/OggStream.hxx | 21 |
3 files changed, 55 insertions, 18 deletions
diff --git a/Makefile.am b/Makefile.am index 4ef0c7047..c9daf87a4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -596,6 +596,7 @@ libxiph_a_SOURCES += \ src/lib/xiph/OggSerial.cxx src/lib/xiph/OggSerial.hxx \ src/lib/xiph/OggUtil.cxx src/lib/xiph/OggUtil.hxx \ src/lib/xiph/OggSyncState.hxx \ + src/lib/xiph/OggPage.hxx \ src/lib/xiph/OggStream.hxx endif diff --git a/src/lib/xiph/OggPage.hxx b/src/lib/xiph/OggPage.hxx new file mode 100644 index 000000000..e5892a51a --- /dev/null +++ b/src/lib/xiph/OggPage.hxx @@ -0,0 +1,51 @@ +/* + * Copyright 2003-2016 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_OGG_PAGE_HXX +#define MPD_OGG_PAGE_HXX + +#include "check.h" + +#include <ogg/ogg.h> + +#include <assert.h> +#include <string.h> +#include <stdint.h> + +static size_t +ReadPage(const ogg_page &page, void *_buffer, size_t size) +{ + assert(page.header_len > 0 || page.body_len > 0); + + size_t header_len = (size_t)page.header_len; + size_t body_len = (size_t)page.body_len; + assert(header_len <= size); + + if (header_len + body_len > size) + /* TODO: better overflow handling */ + body_len = size - header_len; + + uint8_t *buffer = (uint8_t *)_buffer; + memcpy(buffer, page.header, header_len); + memcpy(buffer + header_len, page.body, body_len); + + return header_len + body_len; +} + +#endif diff --git a/src/lib/xiph/OggStream.hxx b/src/lib/xiph/OggStream.hxx index b99de301a..70d0ad6cd 100644 --- a/src/lib/xiph/OggStream.hxx +++ b/src/lib/xiph/OggStream.hxx @@ -21,12 +21,11 @@ #define MPD_OGG_STREAM_HXX #include "check.h" +#include "OggPage.hxx" #include <ogg/ogg.h> #include <assert.h> -#include <string.h> -#include <stdint.h> class OggStream { ogg_stream_state state; @@ -101,26 +100,12 @@ public: return result != 0; } - size_t PageOut(void *_buffer, size_t size) { + size_t PageOut(void *buffer, size_t size) { ogg_page page; if (!PageOut(page)) return 0; - assert(page.header_len > 0 || page.body_len > 0); - - size_t header_len = (size_t)page.header_len; - size_t body_len = (size_t)page.body_len; - assert(header_len <= size); - - if (header_len + body_len > size) - /* TODO: better overflow handling */ - body_len = size - header_len; - - uint8_t *buffer = (uint8_t *)_buffer; - memcpy(buffer, page.header, header_len); - memcpy(buffer + header_len, page.body, body_len); - - return header_len + body_len; + return ReadPage(page, buffer, size); } }; |