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