Shaka Packager SDK
Loading...
Searching...
No Matches
mkv_writer.cc
1// Copyright 2015 Google LLC. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file or at
5// https://developers.google.com/open-source/licenses/bsd
6
7#include <packager/media/formats/webm/mkv_writer.h>
8
9#include <cstdint>
10#include <string>
11
12#include <absl/log/check.h>
13#include <mkvmuxer/mkvmuxertypes.h>
14
15#include <packager/file.h>
16#include <packager/status.h>
17
18namespace shaka {
19namespace media {
20
21MkvWriter::MkvWriter() : position_(0) {}
22
23MkvWriter::~MkvWriter() {}
24
25Status MkvWriter::Open(const std::string& name) {
26 DCHECK(!file_);
27 file_.reset(File::Open(name.c_str(), "w"));
28 if (!file_)
29 return Status(error::FILE_FAILURE, "Unable to open file for writing.");
30
31 // This may produce an error message; however there isn't a seekable method
32 // on File.
33 seekable_ = file_->Seek(0);
34 position_ = 0;
35 return Status::OK;
36}
37
38Status MkvWriter::Close() {
39 const std::string file_name = file_->file_name();
40 if (!file_.release()->Close()) {
41 return Status(
42 error::FILE_FAILURE,
43 "Cannot close file " + file_name +
44 ", possibly file permission issue or running out of disk space.");
45 }
46 return Status::OK;
47}
48
49mkvmuxer::int32 MkvWriter::Write(const void* buf, mkvmuxer::uint32 len) {
50 DCHECK(file_);
51
52 const char* data = reinterpret_cast<const char*>(buf);
53 int64_t total_bytes_written = 0;
54 while (total_bytes_written < len) {
55 const int64_t written =
56 file_->Write(data + total_bytes_written, len - total_bytes_written);
57 if (written < 0)
58 return written;
59
60 total_bytes_written += written;
61 }
62
63 DCHECK_EQ(total_bytes_written, len);
64 position_ += len;
65 return 0;
66}
67
68int64_t MkvWriter::WriteFromFile(File* source) {
69 return WriteFromFile(source, kWholeFile);
70}
71
72int64_t MkvWriter::WriteFromFile(File* source, int64_t max_copy) {
73 DCHECK(file_);
74
75 const int64_t size = File::Copy(source, file_.get(), max_copy);
76 if (size < 0)
77 return size;
78
79 position_ += size;
80 return size;
81}
82
83mkvmuxer::int64 MkvWriter::Position() const {
84 return position_;
85}
86
87mkvmuxer::int32 MkvWriter::Position(mkvmuxer::int64 position) {
88 DCHECK(file_);
89
90 if (file_->Seek(position)) {
91 position_ = position;
92 return 0;
93 } else {
94 return -1;
95 }
96}
97
98bool MkvWriter::Seekable() const {
99 return seekable_;
100}
101
102void MkvWriter::ElementStartNotify(mkvmuxer::uint64 /*element_id*/,
103 mkvmuxer::int64 /*position*/) {}
104
105} // namespace media
106} // namespace shaka
All the methods that are virtual are virtual for mocking.