mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-19 16:33:50 +00:00
VIDEO: Implement ScummVM-compatible MkvReader and remove generic one
This commit is contained in:
parent
53163f427a
commit
fe62ed883d
@ -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/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;
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user