aboutsummaryrefslogtreecommitdiff
path: root/engines/sludge/libwebm/mkvreader.cpp
blob: 5ead48718b14567ea5b691d91f008213334a19e2 (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
// 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.

// Modified by Rikard Peterson 2011 to fit in the SLUDGE engine.

#include "mkvreader.hpp"
#include "../newfatal.h"
#include "../fileset.h"

#include <cassert>
#include <stdio.h>

MkvReader::MkvReader() :
    m_file(0)
{
}

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

int MkvReader::Open(int fileNumber)
{
    if (! fileNumber)
        return -1;

    if (m_file)
        return -1;

	m_file = fileNumber;

	setResourceForFatal (fileNumber);
	m_length = openFileFromNum (fileNumber);
	if (m_length == 0) {
		finishAccess();
		setResourceForFatal (-1);
		return -1;
	}
	/*
#ifdef WIN32
	m_start = _ftelli64(bigDataFile);
#else*/
    m_start = ftell(bigDataFile);
/*#endif
*/
	finishAccess();
    return 0;
}

void MkvReader::Close()
{
    if (m_file)
    {
		finishAccess();
		setResourceForFatal (-1);
        m_file = 0;
    }
}

int MkvReader::Length(long long* total, long long* available)
{
    if (! m_file)
        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)
        return -1;

    if (offset < 0)
        return -1;

    if (len < 0)
        return -1;

    if (len == 0)
        return 0;


    if (offset >= m_length)
        return -1;

	if (startAccess())
		fprintf(stderr, "Warning: Datafile already in use when playing movie!\n");
/*
#ifdef WIN32
    const int status = _fseeki64(bigDataFile, m_start+offset, SEEK_SET);

    if (status)
        return -1;  //error
#else*/
    fseek(bigDataFile, m_start+offset, SEEK_SET);
//#endif

    const size_t size = fread(buffer, 1, len, bigDataFile);

	finishAccess();

    if (size < size_t(len))
        return -1;  //error

    return 0;  //success
}