Home | History | Annotate | Download | only in base
      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_BASE_VIDEO_DECODER_CONFIG_H_
      6 #define MEDIA_BASE_VIDEO_DECODER_CONFIG_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "media/base/media_export.h"
     13 #include "media/base/video_frame.h"
     14 #include "ui/gfx/rect.h"
     15 #include "ui/gfx/size.h"
     16 
     17 namespace media {
     18 
     19 enum VideoCodec {
     20   // These values are histogrammed over time; do not change their ordinal
     21   // values.  When deleting a codec replace it with a dummy value; when adding a
     22   // codec, do so at the bottom (and update kVideoCodecMax).
     23   kUnknownVideoCodec = 0,
     24   kCodecH264,
     25   kCodecVC1,
     26   kCodecMPEG2,
     27   kCodecMPEG4,
     28   kCodecTheora,
     29   kCodecVP8,
     30   kCodecVP9,
     31   // DO NOT ADD RANDOM VIDEO CODECS!
     32   //
     33   // The only acceptable time to add a new codec is if there is production code
     34   // that uses said codec in the same CL.
     35 
     36   kVideoCodecMax = kCodecVP9  // Must equal the last "real" codec above.
     37 };
     38 
     39 // Video stream profile.  This *must* match PP_VideoDecoder_Profile.
     40 // (enforced in webkit/plugins/ppapi/ppb_video_decoder_impl.cc)
     41 enum VideoCodecProfile {
     42   // Keep the values in this enum unique, as they imply format (h.264 vs. VP8,
     43   // for example), and keep the values for a particular format grouped
     44   // together for clarity.
     45   VIDEO_CODEC_PROFILE_UNKNOWN = -1,
     46   VIDEO_CODEC_PROFILE_MIN = VIDEO_CODEC_PROFILE_UNKNOWN,
     47   H264PROFILE_MIN = 0,
     48   H264PROFILE_BASELINE = H264PROFILE_MIN,
     49   H264PROFILE_MAIN = 1,
     50   H264PROFILE_EXTENDED = 2,
     51   H264PROFILE_HIGH = 3,
     52   H264PROFILE_HIGH10PROFILE = 4,
     53   H264PROFILE_HIGH422PROFILE = 5,
     54   H264PROFILE_HIGH444PREDICTIVEPROFILE = 6,
     55   H264PROFILE_SCALABLEBASELINE = 7,
     56   H264PROFILE_SCALABLEHIGH = 8,
     57   H264PROFILE_STEREOHIGH = 9,
     58   H264PROFILE_MULTIVIEWHIGH = 10,
     59   H264PROFILE_MAX = H264PROFILE_MULTIVIEWHIGH,
     60   VP8PROFILE_MIN = 11,
     61   VP8PROFILE_ANY = VP8PROFILE_MIN,
     62   VP8PROFILE_MAX = VP8PROFILE_ANY,
     63   VP9PROFILE_MIN = 12,
     64   VP9PROFILE_ANY = VP9PROFILE_MIN,
     65   VP9PROFILE_MAX = VP9PROFILE_ANY,
     66   VIDEO_CODEC_PROFILE_MAX = VP9PROFILE_MAX,
     67 };
     68 
     69 class MEDIA_EXPORT VideoDecoderConfig {
     70  public:
     71   // Constructs an uninitialized object. Clients should call Initialize() with
     72   // appropriate values before using.
     73   VideoDecoderConfig();
     74 
     75   // Constructs an initialized object. It is acceptable to pass in NULL for
     76   // |extra_data|, otherwise the memory is copied.
     77   VideoDecoderConfig(VideoCodec codec,
     78                      VideoCodecProfile profile,
     79                      VideoFrame::Format format,
     80                      const gfx::Size& coded_size,
     81                      const gfx::Rect& visible_rect,
     82                      const gfx::Size& natural_size,
     83                      const uint8* extra_data, size_t extra_data_size,
     84                      bool is_encrypted);
     85 
     86   ~VideoDecoderConfig();
     87 
     88   // Resets the internal state of this object.
     89   void Initialize(VideoCodec codec,
     90                   VideoCodecProfile profile,
     91                   VideoFrame::Format format,
     92                   const gfx::Size& coded_size,
     93                   const gfx::Rect& visible_rect,
     94                   const gfx::Size& natural_size,
     95                   const uint8* extra_data, size_t extra_data_size,
     96                   bool is_encrypted,
     97                   bool record_stats);
     98 
     99   // Returns true if this object has appropriate configuration values, false
    100   // otherwise.
    101   bool IsValidConfig() const;
    102 
    103   // Returns true if all fields in |config| match this config.
    104   // Note: The contents of |extra_data_| are compared not the raw pointers.
    105   bool Matches(const VideoDecoderConfig& config) const;
    106 
    107   // Returns a human-readable string describing |*this|.  For debugging & test
    108   // output only.
    109   std::string AsHumanReadableString() const;
    110 
    111   VideoCodec codec() const;
    112   VideoCodecProfile profile() const;
    113 
    114   // Video format used to determine YUV buffer sizes.
    115   VideoFrame::Format format() const;
    116 
    117   // Width and height of video frame immediately post-decode. Not all pixels
    118   // in this region are valid.
    119   gfx::Size coded_size() const;
    120 
    121   // Region of |coded_size_| that is visible.
    122   gfx::Rect visible_rect() const;
    123 
    124   // Final visible width and height of a video frame with aspect ratio taken
    125   // into account.
    126   gfx::Size natural_size() const;
    127 
    128   // Optional byte data required to initialize video decoders, such as H.264
    129   // AAVC data.
    130   const uint8* extra_data() const;
    131   size_t extra_data_size() const;
    132 
    133   // Whether the video stream is potentially encrypted.
    134   // Note that in a potentially encrypted video stream, individual buffers
    135   // can be encrypted or not encrypted.
    136   bool is_encrypted() const;
    137 
    138  private:
    139   VideoCodec codec_;
    140   VideoCodecProfile profile_;
    141 
    142   VideoFrame::Format format_;
    143 
    144   gfx::Size coded_size_;
    145   gfx::Rect visible_rect_;
    146   gfx::Size natural_size_;
    147 
    148   std::vector<uint8> extra_data_;
    149 
    150   bool is_encrypted_;
    151 
    152   // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler
    153   // generated copy constructor and assignment operator. Since the extra data is
    154   // typically small, the performance impact is minimal.
    155 };
    156 
    157 }  // namespace media
    158 
    159 #endif  // MEDIA_BASE_VIDEO_DECODER_CONFIG_H_
    160