f749905d0a
git log --no-merges --oneline 9732ae9..a97c484 9096786 mkvparser: fix float conversion warning 84e8257 disable -Wdeprecated-declarations in legacy code a98f495 AddGenericFrame: fix memory leak on failure da131dd AddCuePoint: fix memory leak on failure b0cea9c Add(Audio|Video)Track: fix memory leak on failure 5261a67 webm_info: check vp9 ParseUncompressedHeader return 85f7e2e webm_info,PrintVP9Info: validate alt ref sizes 9b97ca1 vp9_header_parser_tests: check parser return 300d6d8 CuePoint::Find: check Track pointer 50c44bb webm_info,OutputCues: fix indexing of tracks a0d27f0 mkvparser,Block::Parse: remove incorrect assert 784fc1b vttdemux,CloseFiles: check file pointer before closing b4522c1 .gitattributes: force mkv/webm to be treated as binary a118f3d Add test for projection parse failures. d398479 Add test for primary chromaticity parse failures. 9bbec4c Fix permissions on test file. 2cef4d5 mkvparser:Parse: s/FLT_MIN/-FLT_MAX/ 35a3c88 mkvmuxer: Turn off estimate_file_duration_ by default 5a41830 mkvparser: Avoid double free when Chromaticity parse fails. 67e3ffa mkvparser: Avoid casts of values too large for float in Projection elements. 87bcddf vttdemux::ChapterAtomParser: check for NULL display string a534a24 Update .gitignore a0d67d0 mkvmuxer: Fix hard-coded data size in EbmlElementSize c36112c mkvparser: #include sys/type.h 686664e Fix cmake generation warnings on Windows. 2b2c196 cmake: Fix required flag check. 166e40f Cmake refactor. 9fb774a Add missing include in webm2pes.cc. 4956b2d mkvmuxer: Force new clusters when audio queue gets too long. 54f1559 cmake: Cache results of CXX flag tests. 81c73fc mkvparser: Avoid alloc failures in SeekHead::Parse. Change-Id: Ib81b1772ec81e7af3852dcfef2d312416f6db53d
134 lines
2.4 KiB
C++
134 lines
2.4 KiB
C++
// 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 "mkvparser/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
|
|
#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
|