// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COBALT_MEDIA_FORMATS_WEBM_CLUSTER_BUILDER_H_
#define COBALT_MEDIA_FORMATS_WEBM_CLUSTER_BUILDER_H_

#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "starboard/types.h"

namespace cobalt {
namespace media {

class Cluster {
 public:
  Cluster(scoped_array<uint8_t> data, int size);
  ~Cluster();

  const uint8_t* data() const { return data_.get(); }
  int size() const { return size_; }

 private:
  scoped_array<uint8_t> data_;
  int size_;

  DISALLOW_IMPLICIT_CONSTRUCTORS(Cluster);
};

class ClusterBuilder {
 public:
  ClusterBuilder();
  ~ClusterBuilder();

  void SetClusterTimecode(int64_t cluster_timecode);
  void AddSimpleBlock(int track_num, int64_t timecode, int flags,
                      const uint8_t* data, int size);
  void AddBlockGroup(int track_num, int64_t timecode, int duration, int flags,
                     bool is_key_frame, const uint8_t* data, int size);
  void AddBlockGroupWithoutBlockDuration(int track_num, int64_t timecode,
                                         int flags, bool is_key_frame,
                                         const uint8_t* data, int size);

  scoped_ptr<Cluster> Finish();
  scoped_ptr<Cluster> FinishWithUnknownSize();

 private:
  void AddBlockGroupInternal(int track_num, int64_t timecode,
                             bool include_block_duration, int duration,
                             int flags, bool is_key_frame, const uint8_t* data,
                             int size);
  void Reset();
  void ExtendBuffer(int bytes_needed);
  void UpdateUInt64(int offset, int64_t value);
  void WriteBlock(uint8_t* buf, int track_num, int64_t timecode, int flags,
                  const uint8_t* data, int size);

  scoped_array<uint8_t> buffer_;
  int buffer_size_;
  int bytes_used_;
  int64_t cluster_timecode_;

  DISALLOW_COPY_AND_ASSIGN(ClusterBuilder);
};

}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_FORMATS_WEBM_CLUSTER_BUILDER_H_
