VIDEO: Implement ScummVM-compatible MkvReader and remove generic one
This commit is contained in:
parent
53163f427a
commit
fe62ed883d
4 changed files with 60 additions and 182 deletions
|
@ -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
|
|
|
@ -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_
|
|
|
@ -31,8 +31,67 @@
|
||||||
#include "graphics/pixelformat.h"
|
#include "graphics/pixelformat.h"
|
||||||
#include "graphics/yuv_to_rgb.h"
|
#include "graphics/yuv_to_rgb.h"
|
||||||
|
|
||||||
|
#include "video/mkv/mkvparser.h"
|
||||||
|
|
||||||
namespace Video {
|
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() {
|
MKVDecoder::MKVDecoder() {
|
||||||
_fileStream = 0;
|
_fileStream = 0;
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,7 @@ endif
|
||||||
ifdef USE_VPX
|
ifdef USE_VPX
|
||||||
MODULE_OBJS += \
|
MODULE_OBJS += \
|
||||||
mkv_decoder.o \
|
mkv_decoder.o \
|
||||||
mkv/mkvparser.o \
|
mkv/mkvparser.o
|
||||||
mkv/mkvreader.o
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Include common rules
|
# Include common rules
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue