1*fb1b10abSAndroid Build Coastguard Worker // Copyright (c) 2012 The WebM project authors. All Rights Reserved.
2*fb1b10abSAndroid Build Coastguard Worker //
3*fb1b10abSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license
4*fb1b10abSAndroid Build Coastguard Worker // that can be found in the LICENSE file in the root of the source
5*fb1b10abSAndroid Build Coastguard Worker // tree. An additional intellectual property rights grant can be found
6*fb1b10abSAndroid Build Coastguard Worker // in the file PATENTS. All contributing project authors may
7*fb1b10abSAndroid Build Coastguard Worker // be found in the AUTHORS file in the root of the source tree.
8*fb1b10abSAndroid Build Coastguard Worker
9*fb1b10abSAndroid Build Coastguard Worker #include "mkvmuxer/mkvwriter.h"
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include <sys/types.h>
12*fb1b10abSAndroid Build Coastguard Worker
13*fb1b10abSAndroid Build Coastguard Worker #ifdef _MSC_VER
14*fb1b10abSAndroid Build Coastguard Worker #include <share.h> // for _SH_DENYWR
15*fb1b10abSAndroid Build Coastguard Worker #endif
16*fb1b10abSAndroid Build Coastguard Worker
17*fb1b10abSAndroid Build Coastguard Worker namespace mkvmuxer {
18*fb1b10abSAndroid Build Coastguard Worker
MkvWriter()19*fb1b10abSAndroid Build Coastguard Worker MkvWriter::MkvWriter() : file_(NULL), writer_owns_file_(true) {}
20*fb1b10abSAndroid Build Coastguard Worker
MkvWriter(FILE * fp)21*fb1b10abSAndroid Build Coastguard Worker MkvWriter::MkvWriter(FILE* fp) : file_(fp), writer_owns_file_(false) {}
22*fb1b10abSAndroid Build Coastguard Worker
~MkvWriter()23*fb1b10abSAndroid Build Coastguard Worker MkvWriter::~MkvWriter() { Close(); }
24*fb1b10abSAndroid Build Coastguard Worker
Write(const void * buffer,uint32 length)25*fb1b10abSAndroid Build Coastguard Worker int32 MkvWriter::Write(const void* buffer, uint32 length) {
26*fb1b10abSAndroid Build Coastguard Worker if (!file_)
27*fb1b10abSAndroid Build Coastguard Worker return -1;
28*fb1b10abSAndroid Build Coastguard Worker
29*fb1b10abSAndroid Build Coastguard Worker if (length == 0)
30*fb1b10abSAndroid Build Coastguard Worker return 0;
31*fb1b10abSAndroid Build Coastguard Worker
32*fb1b10abSAndroid Build Coastguard Worker if (buffer == NULL)
33*fb1b10abSAndroid Build Coastguard Worker return -1;
34*fb1b10abSAndroid Build Coastguard Worker
35*fb1b10abSAndroid Build Coastguard Worker const size_t bytes_written = fwrite(buffer, 1, length, file_);
36*fb1b10abSAndroid Build Coastguard Worker
37*fb1b10abSAndroid Build Coastguard Worker return (bytes_written == length) ? 0 : -1;
38*fb1b10abSAndroid Build Coastguard Worker }
39*fb1b10abSAndroid Build Coastguard Worker
Open(const char * filename)40*fb1b10abSAndroid Build Coastguard Worker bool MkvWriter::Open(const char* filename) {
41*fb1b10abSAndroid Build Coastguard Worker if (filename == NULL)
42*fb1b10abSAndroid Build Coastguard Worker return false;
43*fb1b10abSAndroid Build Coastguard Worker
44*fb1b10abSAndroid Build Coastguard Worker if (file_)
45*fb1b10abSAndroid Build Coastguard Worker return false;
46*fb1b10abSAndroid Build Coastguard Worker
47*fb1b10abSAndroid Build Coastguard Worker #ifdef _MSC_VER
48*fb1b10abSAndroid Build Coastguard Worker file_ = _fsopen(filename, "wb", _SH_DENYWR);
49*fb1b10abSAndroid Build Coastguard Worker #else
50*fb1b10abSAndroid Build Coastguard Worker file_ = fopen(filename, "wb");
51*fb1b10abSAndroid Build Coastguard Worker #endif
52*fb1b10abSAndroid Build Coastguard Worker if (file_ == NULL)
53*fb1b10abSAndroid Build Coastguard Worker return false;
54*fb1b10abSAndroid Build Coastguard Worker return true;
55*fb1b10abSAndroid Build Coastguard Worker }
56*fb1b10abSAndroid Build Coastguard Worker
Close()57*fb1b10abSAndroid Build Coastguard Worker void MkvWriter::Close() {
58*fb1b10abSAndroid Build Coastguard Worker if (file_ && writer_owns_file_) {
59*fb1b10abSAndroid Build Coastguard Worker fclose(file_);
60*fb1b10abSAndroid Build Coastguard Worker }
61*fb1b10abSAndroid Build Coastguard Worker file_ = NULL;
62*fb1b10abSAndroid Build Coastguard Worker }
63*fb1b10abSAndroid Build Coastguard Worker
Position() const64*fb1b10abSAndroid Build Coastguard Worker int64 MkvWriter::Position() const {
65*fb1b10abSAndroid Build Coastguard Worker if (!file_)
66*fb1b10abSAndroid Build Coastguard Worker return 0;
67*fb1b10abSAndroid Build Coastguard Worker
68*fb1b10abSAndroid Build Coastguard Worker #ifdef _MSC_VER
69*fb1b10abSAndroid Build Coastguard Worker return _ftelli64(file_);
70*fb1b10abSAndroid Build Coastguard Worker #else
71*fb1b10abSAndroid Build Coastguard Worker return ftell(file_);
72*fb1b10abSAndroid Build Coastguard Worker #endif
73*fb1b10abSAndroid Build Coastguard Worker }
74*fb1b10abSAndroid Build Coastguard Worker
Position(int64 position)75*fb1b10abSAndroid Build Coastguard Worker int32 MkvWriter::Position(int64 position) {
76*fb1b10abSAndroid Build Coastguard Worker if (!file_)
77*fb1b10abSAndroid Build Coastguard Worker return -1;
78*fb1b10abSAndroid Build Coastguard Worker
79*fb1b10abSAndroid Build Coastguard Worker #ifdef _MSC_VER
80*fb1b10abSAndroid Build Coastguard Worker return _fseeki64(file_, position, SEEK_SET);
81*fb1b10abSAndroid Build Coastguard Worker #elif defined(_WIN32)
82*fb1b10abSAndroid Build Coastguard Worker return fseeko64(file_, static_cast<off_t>(position), SEEK_SET);
83*fb1b10abSAndroid Build Coastguard Worker #elif !(defined(__ANDROID__) && __ANDROID_API__ < 24 && !defined(__LP64__) && \
84*fb1b10abSAndroid Build Coastguard Worker defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64)
85*fb1b10abSAndroid Build Coastguard Worker // POSIX.1 has fseeko and ftello. fseeko and ftello are not available before
86*fb1b10abSAndroid Build Coastguard Worker // Android API level 24. See
87*fb1b10abSAndroid Build Coastguard Worker // https://android.googlesource.com/platform/bionic/+/main/docs/32-bit-abi.md
88*fb1b10abSAndroid Build Coastguard Worker return fseeko(file_, static_cast<off_t>(position), SEEK_SET);
89*fb1b10abSAndroid Build Coastguard Worker #else
90*fb1b10abSAndroid Build Coastguard Worker return fseek(file_, static_cast<long>(position), SEEK_SET);
91*fb1b10abSAndroid Build Coastguard Worker #endif
92*fb1b10abSAndroid Build Coastguard Worker }
93*fb1b10abSAndroid Build Coastguard Worker
Seekable() const94*fb1b10abSAndroid Build Coastguard Worker bool MkvWriter::Seekable() const { return true; }
95*fb1b10abSAndroid Build Coastguard Worker
ElementStartNotify(uint64,int64)96*fb1b10abSAndroid Build Coastguard Worker void MkvWriter::ElementStartNotify(uint64, int64) {}
97*fb1b10abSAndroid Build Coastguard Worker
98*fb1b10abSAndroid Build Coastguard Worker } // namespace mkvmuxer
99