// Copyright (c) 2012 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 MEDIA_WEBM_CHROMEOS_WEBM_ENCODER_H_
#define MEDIA_WEBM_CHROMEOS_WEBM_ENCODER_H_

#include <stack>
#include <stdio.h>

#include "base/file_path.h"
#include "media/base/media_export.h"
#include "media/webm/chromeos/ebml_writer.h"

extern "C" {
#define VPX_CODEC_DISABLE_COMPAT 1
#include "third_party/libvpx/libvpx.h"
}

class FilePath;
class SkBitmap;

namespace media {

namespace chromeos {

// WebM encoder using libvpx. Currently only supports one-pass, constant bitrate
// encoding of short files consisting of a single video track. Seek info and
// cues are not supported, so generated .webm file does not strictly adhere to
// WebM standard (http://www.webmproject.org/code/specs/container/).
class MEDIA_EXPORT WebmEncoder {
 public:
  // Create new instance for writing to |output_path|. If |realtime| is |true|,
  // uses realtime deadline, otherwise - "good quality" deadline.
  WebmEncoder(const FilePath& output_path, int bitrate, bool realtime);
  ~WebmEncoder();

  // Encodes video from a Nx(N*M) sprite, having M frames of size NxN with FPS
  // |fps_n/fps_d|. Must be called on a thread that allows disk IO.
  // Returns |true| iff encoding and writing to file is successful.
  bool EncodeFromSprite(const SkBitmap& sprite, int fps_n, int fps_d);

 private:
  // Writes global WebM header and starts a single video track. Returns |false|
  // if there was an error opening file for writing.
  bool WriteWebmHeader();

  // Writes VPX packet to output file.
  void WriteWebmBlock(const vpx_codec_cx_pkt_t* packet);

  // Finishes video track and closes output file. Returns |false| if there were
  // any error during encoding/writing file.
  bool WriteWebmFooter();

  // Starts a new WebM sub-element of given type. Those can be nested.
  void StartSubElement(unsigned long class_id);

  // Closes current top-level sub-element.
  void EndSubElement();

  // libmkv callbacks.
  void EbmlWrite(const void* buffer, unsigned long len);
  void EbmlSerialize(const void* buffer, int buffer_size, unsigned long len);

  template <typename T>
  void EbmlSerializeHelper(const T* buffer, unsigned long len);

  // Video dimensions and FPS.
  size_t width_;
  size_t height_;
  vpx_rational_t fps_;

  // Number of frames in video.
  size_t frame_count_;

  // VPX config in use.
  vpx_codec_enc_cfg_t config_;

  // VPX parameters.
  int bitrate_;
  unsigned long deadline_;

  // EbmlWriter context.
  EbmlGlobal ebml_writer_;

  // Stack with start offsets of currently open sub-elements.
  std::stack<long int> ebml_sub_elements_;

  FilePath output_path_;
  FILE* output_;

  // True if an error occured while encoding/writing to file.
  bool has_errors_;

  DISALLOW_COPY_AND_ASSIGN(WebmEncoder);
};

}  // namespace chromeos

}  // namespace media

#endif  // MEDIA_WEBM_CHROMEOS_WEBM_ENCODER_H_
