| // 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_ |