summaryrefslogtreecommitdiff
path: root/third_party/libwebm/mkvreader.cpp
blob: cb3567f1ad41df36e3d7388e2eb469bb9df9c6b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// 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)
{
}

MkvReader::~MkvReader()
{
    Close();
}

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

#ifdef _MSC_VER
    int status = _fseeki64(m_file, 0L, SEEK_END);

    if (status)
        return -1;  //error

    m_length = _ftelli64(m_file);
#else
    fseek(m_file, 0L, SEEK_END);
    m_length = ftell(m_file);
#endif
    assert(m_length >= 0);

#ifdef _MSC_VER
    status = _fseeki64(m_file, 0L, SEEK_SET);

    if (status)
        return -1;  //error
#else
    fseek(m_file, 0L, SEEK_SET);
#endif

    return 0;
}

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