diff --git a/video/mkv/mkvreader.cpp b/video/mkv/mkvreader.cpp deleted file mode 100644 index 6bdbfdfad25..00000000000 --- a/video/mkv/mkvreader.cpp +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright (c) 2010 The WebM project authors. All Rights Reserved. -// -// Use of this source code is governed by a BSD-style license -// that can be found in the LICENSE file in the root of the source -// tree. An additional intellectual property rights grant can be found -// in the file PATENTS. All contributing project authors may -// be found in the AUTHORS file in the root of the source tree. -#include "video/mkv/mkvreader.h" - -#include - -#include - -namespace mkvparser { - -MkvReader::MkvReader() : m_file(NULL), reader_owns_file_(true) {} - -MkvReader::MkvReader(FILE* fp) : m_file(fp), reader_owns_file_(false) { - GetFileSize(); -} - -MkvReader::~MkvReader() { - if (reader_owns_file_) - Close(); - m_file = NULL; -} - -int MkvReader::Open(const char* fileName) { - if (fileName == NULL) - return -1; - - if (m_file) - return -1; - -#ifdef _MSC_VER - const errno_t e = fopen_s(&m_file, fileName, "rb"); - - if (e) - return -1; // error -#else - m_file = fopen(fileName, "rb"); - - if (m_file == NULL) - return -1; -#endif - return !GetFileSize(); -} - -bool MkvReader::GetFileSize() { - if (m_file == NULL) - return false; -#ifdef _MSC_VER - int status = _fseeki64(m_file, 0L, SEEK_END); - - if (status) - return false; // error - - m_length = _ftelli64(m_file); -#else - fseek(m_file, 0L, SEEK_END); - m_length = ftell(m_file); -#endif - assert(m_length >= 0); - - if (m_length < 0) - return false; - -#ifdef _MSC_VER - status = _fseeki64(m_file, 0L, SEEK_SET); - - if (status) - return false; // error -#else - fseek(m_file, 0L, SEEK_SET); -#endif - - return true; -} - -void MkvReader::Close() { - if (m_file != NULL) { - fclose(m_file); - m_file = NULL; - } -} - -int MkvReader::Length(long long* total, long long* available) { - if (m_file == NULL) - return -1; - - if (total) - *total = m_length; - - if (available) - *available = m_length; - - return 0; -} - -int MkvReader::Read(long long offset, long len, unsigned char* buffer) { - if (m_file == NULL) - return -1; - - if (offset < 0) - return -1; - - if (len < 0) - return -1; - - if (len == 0) - return 0; - - if (offset >= m_length) - return -1; - -#ifdef _MSC_VER - const int status = _fseeki64(m_file, offset, SEEK_SET); - - if (status) - return -1; // error -#elif defined(_WIN32) - fseeko64(m_file, static_cast(offset), SEEK_SET); -#else - fseeko(m_file, static_cast(offset), SEEK_SET); -#endif - - const size_t size = fread(buffer, 1, len, m_file); - - if (size < size_t(len)) - return -1; // error - - return 0; // success -} - -} // namespace mkvparser diff --git a/video/mkv/mkvreader.h b/video/mkv/mkvreader.h deleted file mode 100644 index dd0b54b057c..00000000000 --- a/video/mkv/mkvreader.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2010 The WebM project authors. All Rights Reserved. -// -// Use of this source code is governed by a BSD-style license -// that can be found in the LICENSE file in the root of the source -// tree. An additional intellectual property rights grant can be found -// in the file PATENTS. All contributing project authors may -// be found in the AUTHORS file in the root of the source tree. -#ifndef MKVPARSER_MKVREADER_H_ -#define MKVPARSER_MKVREADER_H_ - -#include - -#include "video/mkv/mkvparser.h" - -namespace mkvparser { - -class MkvReader : public IMkvReader { - public: - MkvReader(); - explicit MkvReader(FILE* fp); - virtual ~MkvReader(); - - int Open(const char*); - void Close(); - - virtual int Read(long long position, long length, unsigned char* buffer); - virtual int Length(long long* total, long long* available); - - private: - MkvReader(const MkvReader&); - MkvReader& operator=(const MkvReader&); - - // Determines the size of the file. This is called either by the constructor - // or by the Open function depending on file ownership. Returns true on - // success. - bool GetFileSize(); - - long long m_length; - FILE* m_file; - bool reader_owns_file_; -}; - -} // namespace mkvparser - -#endif // MKVPARSER_MKVREADER_H_ diff --git a/video/mkv_decoder.cpp b/video/mkv_decoder.cpp index a09e69d605f..d6e08638302 100644 --- a/video/mkv_decoder.cpp +++ b/video/mkv_decoder.cpp @@ -31,8 +31,67 @@ #include "graphics/pixelformat.h" #include "graphics/yuv_to_rgb.h" +#include "video/mkv/mkvparser.h" + namespace Video { +class MkvReader : public mkvparser::IMkvReader { +public: + MkvReader() { _stream = nullptr; } + virtual ~MkvReader(); + + int Open(Common::SeekableReadStream *stream); + void Close(); + + virtual int Read(long long position, long length, unsigned char *buffer); + virtual int Length(long long *total, long long *available); + +private: + Common::SeekableReadStream *_stream; +}; + +int MkvReader::Open(Common::SeekableReadStream *stream) { + _stream = stream; + + return 0; +} + +void MkvReader::Close() { + delete _stream; + + _stream = nullptr; +} + +int MkvReader::Read(long long position, long length, unsigned char *buffer) { + if (!_stream) + return -1; + + if (position > _stream->size() || position < 0) + return -1; + + if (length <= 0) + return -1; + + _stream->seek(position); + if (_stream->read(buffer, length) < length) + return -1; + + return 0; +} + +int MkvReader::Length(long long *total, long long *available) { + if (!_stream) + return -1; + + if (*total) + *total = _stream->size(); + + if (*available) + *available = _stream->size(); + + return 0; +} + MKVDecoder::MKVDecoder() { _fileStream = 0; diff --git a/video/module.mk b/video/module.mk index d73f9af0eb1..06e1d6e7275 100644 --- a/video/module.mk +++ b/video/module.mk @@ -29,8 +29,7 @@ endif ifdef USE_VPX MODULE_OBJS += \ mkv_decoder.o \ - mkv/mkvparser.o \ - mkv/mkvreader.o + mkv/mkvparser.o endif # Include common rules