You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
2.4 KiB
132 lines
2.4 KiB
// 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 "mkvreader.hpp" |
|
|
|
#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 |
|
#else |
|
fseek(m_file, 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 |
|
} |
|
|
|
} // end namespace mkvparser
|
|
|