shithub: libvpx

ref: 53dbc7f92cf12cdc3d1fb3f7a4ec568f47bc8cce
dir: /third_party/libwebm/mkvreader.cpp/

View raw version
// 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