VIDEO: Implement ScummVM-compatible MkvReader and remove generic one

This commit is contained in:
Eugene Sandulenko 2020-05-05 18:01:39 +02:00
parent 53163f427a
commit fe62ed883d
4 changed files with 60 additions and 182 deletions

View file

@ -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 <sys/types.h>
#include <cassert>
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<off_t>(offset), SEEK_SET);
#else
fseeko(m_file, static_cast<off_t>(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

View file

@ -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 <cstdio>
#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_

View file

@ -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;

View file

@ -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