| Index: source/libvpx/third_party/libwebm/mkvreader.cpp
|
| ===================================================================
|
| --- source/libvpx/third_party/libwebm/mkvreader.cpp (revision 0)
|
| +++ source/libvpx/third_party/libwebm/mkvreader.cpp (revision 0)
|
| @@ -0,0 +1,143 @@
|
| +// 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
|
|
|