Home | History | Annotate | Download | only in libwebm
      1 // Copyright (c) 2012 The WebM project authors. All Rights Reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style license
      4 // that can be found in the LICENSE file in the root of the source
      5 // tree. An additional intellectual property rights grant can be found
      6 // in the file PATENTS.  All contributing project authors may
      7 // be found in the AUTHORS file in the root of the source tree.
      8 
      9 #include "mkvwriter.hpp"
     10 
     11 #ifdef _MSC_VER
     12 #include <share.h>  // for _SH_DENYWR
     13 #endif
     14 
     15 #include <new>
     16 
     17 namespace mkvmuxer {
     18 
     19 MkvWriter::MkvWriter() : file_(NULL), writer_owns_file_(true) {
     20 }
     21 
     22 MkvWriter::MkvWriter(FILE* fp): file_(fp), writer_owns_file_(false) {
     23 }
     24 
     25 MkvWriter::~MkvWriter() {
     26   Close();
     27 }
     28 
     29 int32 MkvWriter::Write(const void* buffer, uint32 length) {
     30   if (!file_)
     31     return -1;
     32 
     33   if (length == 0)
     34     return 0;
     35 
     36   if (buffer == NULL)
     37     return -1;
     38 
     39   const size_t bytes_written = fwrite(buffer, 1, length, file_);
     40 
     41   return (bytes_written == length) ? 0 : -1;
     42 }
     43 
     44 bool MkvWriter::Open(const char* filename) {
     45   if (filename == NULL)
     46     return false;
     47 
     48   if (file_)
     49     return false;
     50 
     51 #ifdef _MSC_VER
     52   file_ = _fsopen(filename, "wb", _SH_DENYWR);
     53 #else
     54   file_ = fopen(filename, "wb");
     55 #endif
     56   if (file_ == NULL)
     57     return false;
     58   return true;
     59 }
     60 
     61 void MkvWriter::Close() {
     62   if (file_ && writer_owns_file_) {
     63     fclose(file_);
     64   }
     65   file_ = NULL;
     66 }
     67 
     68 int64 MkvWriter::Position() const {
     69   if (!file_)
     70     return 0;
     71 
     72 #ifdef _MSC_VER
     73     return _ftelli64(file_);
     74 #else
     75     return ftell(file_);
     76 #endif
     77 }
     78 
     79 int32 MkvWriter::Position(int64 position) {
     80   if (!file_)
     81     return -1;
     82 
     83 #ifdef _MSC_VER
     84     return _fseeki64(file_, position, SEEK_SET);
     85 #else
     86     return fseek(file_, position, SEEK_SET);
     87 #endif
     88 }
     89 
     90 bool MkvWriter::Seekable() const {
     91   return true;
     92 }
     93 
     94 void MkvWriter::ElementStartNotify(uint64, int64) {
     95 }
     96 
     97 }  // namespace mkvmuxer
     98