Home | History | Annotate | Download | only in chromeos
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef MEDIA_WEBM_CHROMEOS_WEBM_ENCODER_H_
      6 #define MEDIA_WEBM_CHROMEOS_WEBM_ENCODER_H_
      7 
      8 #include <stdio.h>
      9 #include <stack>
     10 
     11 #include "base/files/file_path.h"
     12 #include "media/base/media_export.h"
     13 #include "media/webm/chromeos/ebml_writer.h"
     14 
     15 extern "C" {
     16 #define VPX_CODEC_DISABLE_COMPAT 1
     17 #include "third_party/libvpx/source/libvpx/vpx/vpx_encoder.h"
     18 #include "third_party/libvpx/source/libvpx/vpx/vp8cx.h"
     19 }
     20 
     21 class SkBitmap;
     22 
     23 namespace base {
     24 class FilePath;
     25 }
     26 
     27 namespace media {
     28 
     29 namespace chromeos {
     30 
     31 // WebM encoder using libvpx. Currently only supports one-pass, constant bitrate
     32 // encoding of short files consisting of a single video track. Seek info and
     33 // cues are not supported, so generated .webm file does not strictly adhere to
     34 // WebM standard (http://www.webmproject.org/code/specs/container/).
     35 class MEDIA_EXPORT WebmEncoder {
     36  public:
     37   // Create new instance for writing to |output_path|. If |realtime| is |true|,
     38   // uses realtime deadline, otherwise - "good quality" deadline.
     39   WebmEncoder(const base::FilePath& output_path, int bitrate, bool realtime);
     40   ~WebmEncoder();
     41 
     42   // Encodes video from a Nx(N*M) sprite, having M frames of size NxN with FPS
     43   // |fps_n/fps_d|. Must be called on a thread that allows disk IO.
     44   // Returns |true| iff encoding and writing to file is successful.
     45   bool EncodeFromSprite(const SkBitmap& sprite, int fps_n, int fps_d);
     46 
     47  private:
     48   // Writes global WebM header and starts a single video track. Returns |false|
     49   // if there was an error opening file for writing.
     50   bool WriteWebmHeader();
     51 
     52   // Writes VPX packet to output file.
     53   void WriteWebmBlock(const vpx_codec_cx_pkt_t* packet);
     54 
     55   // Finishes video track and closes output file. Returns |false| if there were
     56   // any error during encoding/writing file.
     57   bool WriteWebmFooter();
     58 
     59   // Starts a new WebM sub-element of given type. Those can be nested.
     60   void StartSubElement(unsigned long class_id);
     61 
     62   // Closes current top-level sub-element.
     63   void EndSubElement();
     64 
     65   // libmkv callbacks.
     66   void EbmlWrite(const void* buffer, unsigned long len);
     67   void EbmlSerialize(const void* buffer, int buffer_size, unsigned long len);
     68 
     69   template <typename T>
     70   void EbmlSerializeHelper(const T* buffer, unsigned long len);
     71 
     72   // Video dimensions and FPS.
     73   size_t width_;
     74   size_t height_;
     75   vpx_rational_t fps_;
     76 
     77   // Number of frames in video.
     78   size_t frame_count_;
     79 
     80   // VPX config in use.
     81   vpx_codec_enc_cfg_t config_;
     82 
     83   // VPX parameters.
     84   int bitrate_;
     85   unsigned long deadline_;
     86 
     87   // EbmlWriter context.
     88   EbmlGlobal ebml_writer_;
     89 
     90   // Stack with start offsets of currently open sub-elements.
     91   std::stack<long int> ebml_sub_elements_;
     92 
     93   base::FilePath output_path_;
     94   FILE* output_;
     95 
     96   // True if an error occured while encoding/writing to file.
     97   bool has_errors_;
     98 
     99   DISALLOW_COPY_AND_ASSIGN(WebmEncoder);
    100 };
    101 
    102 }  // namespace chromeos
    103 
    104 }  // namespace media
    105 
    106 #endif  // MEDIA_WEBM_CHROMEOS_WEBM_ENCODER_H_
    107