15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_BASE_VIDEO_DECODER_CONFIG_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_VIDEO_DECODER_CONFIG_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_frame.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum VideoCodec {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These values are histogrammed over time; do not change their ordinal
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // values.  When deleting a codec replace it with a dummy value; when adding a
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // codec, do so at the bottom (and update kVideoCodecMax).
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kUnknownVideoCodec = 0,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kCodecH264,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kCodecVC1,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kCodecMPEG2,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kCodecMPEG4,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kCodecTheora,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kCodecVP8,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kCodecVP9,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DO NOT ADD RANDOM VIDEO CODECS!
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The only acceptable time to add a new codec is if there is production code
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that uses said codec in the same CL.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kVideoCodecMax = kCodecVP9  // Must equal the last "real" codec above.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Video stream profile.  This *must* match PP_VideoDecoder_Profile.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (enforced in webkit/plugins/ppapi/ppb_video_decoder_impl.cc)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum VideoCodecProfile {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep the values in this enum unique, as they imply format (h.264 vs. VP8,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for example), and keep the values for a particular format grouped
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // together for clarity.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VIDEO_CODEC_PROFILE_UNKNOWN = -1,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_MIN = 0,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_BASELINE = H264PROFILE_MIN,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_MAIN = 1,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_EXTENDED = 2,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_HIGH = 3,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_HIGH10PROFILE = 4,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_HIGH422PROFILE = 5,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_HIGH444PREDICTIVEPROFILE = 6,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_SCALABLEBASELINE = 7,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_SCALABLEHIGH = 8,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_STEREOHIGH = 9,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_MULTIVIEWHIGH = 10,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  H264PROFILE_MAX = H264PROFILE_MULTIVIEWHIGH,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8PROFILE_MIN = 11,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8PROFILE_MAIN = VP8PROFILE_MIN,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8PROFILE_MAX = VP8PROFILE_MAIN,
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VP9PROFILE_MIN = 12,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VP9PROFILE_MAIN = VP9PROFILE_MIN,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VP9PROFILE_MAX = VP9PROFILE_MAIN,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VIDEO_CODEC_PROFILE_MAX = VP9PROFILE_MAX,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT VideoDecoderConfig {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs an uninitialized object. Clients should call Initialize() with
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // appropriate values before using.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoDecoderConfig();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs an initialized object. It is acceptable to pass in NULL for
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |extra_data|, otherwise the memory is copied.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoDecoderConfig(VideoCodec codec,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     VideoCodecProfile profile,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     VideoFrame::Format format,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const gfx::Size& coded_size,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const gfx::Rect& visible_rect,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const gfx::Size& natural_size,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const uint8* extra_data, size_t extra_data_size,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     bool is_encrypted);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~VideoDecoderConfig();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resets the internal state of this object.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Initialize(VideoCodec codec,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  VideoCodecProfile profile,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  VideoFrame::Format format,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const gfx::Size& coded_size,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const gfx::Rect& visible_rect,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const gfx::Size& natural_size,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const uint8* extra_data, size_t extra_data_size,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool is_encrypted,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool record_stats);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if this object has appropriate configuration values, false
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsValidConfig() const;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if all fields in |config| match this config.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: The contents of |extra_data_| are compared not the raw pointers.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Matches(const VideoDecoderConfig& config) const;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a human-readable string describing |*this|.  For debugging & test
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // output only.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string AsHumanReadableString() const;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoCodec codec() const;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoCodecProfile profile() const;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Video format used to determine YUV buffer sizes.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoFrame::Format format() const;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Width and height of video frame immediately post-decode. Not all pixels
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in this region are valid.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size coded_size() const;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Region of |coded_size_| that is visible.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect visible_rect() const;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Final visible width and height of a video frame with aspect ratio taken
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // into account.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size natural_size() const;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Optional byte data required to initialize video decoders, such as H.264
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AAVC data.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const uint8* extra_data() const;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t extra_data_size() const;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the video stream is potentially encrypted.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that in a potentially encrypted video stream, individual buffers
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // can be encrypted or not encrypted.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_encrypted() const;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoCodec codec_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoCodecProfile profile_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VideoFrame::Format format_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size coded_size_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect visible_rect_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size natural_size_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<uint8> extra_data_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_encrypted_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // generated copy constructor and assignment operator. Since the extra data is
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // typically small, the performance impact is minimal.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_BASE_VIDEO_DECODER_CONFIG_H_
159