/* Copyright (c) 2014 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.
 */

/**
 * Video profiles.
 */
enum PP_VideoProfile {
  PP_VIDEOPROFILE_H264BASELINE = 0,
  PP_VIDEOPROFILE_H264MAIN = 1,
  PP_VIDEOPROFILE_H264EXTENDED = 2,
  PP_VIDEOPROFILE_H264HIGH = 3,
  PP_VIDEOPROFILE_H264HIGH10PROFILE = 4,
  PP_VIDEOPROFILE_H264HIGH422PROFILE = 5,
  PP_VIDEOPROFILE_H264HIGH444PREDICTIVEPROFILE = 6,
  PP_VIDEOPROFILE_H264SCALABLEBASELINE = 7,
  PP_VIDEOPROFILE_H264SCALABLEHIGH = 8,
  PP_VIDEOPROFILE_H264STEREOHIGH = 9,
  PP_VIDEOPROFILE_H264MULTIVIEWHIGH = 10,
  PP_VIDEOPROFILE_VP8_ANY = 11,
  PP_VIDEOPROFILE_VP9_ANY = 12,
  PP_VIDEOPROFILE_MAX = PP_VIDEOPROFILE_VP9_ANY
};

/**
 * Audio profiles.
 */
enum PP_AudioProfile {
  PP_AUDIOPROFILE_OPUS = 0,
  PP_AUDIOPROFILE_MAX = PP_AUDIOPROFILE_OPUS
};

/**
 * Hardware acceleration options.
 */
enum PP_HardwareAcceleration {
  /** Create a hardware accelerated resource only. */
  PP_HARDWAREACCELERATION_ONLY = 0,

  /**
   * Create a hardware accelerated resource if possible. Otherwise, fall back
   * to the software implementation.
   */
  PP_HARDWAREACCELERATION_WITHFALLBACK = 1,

  /** Create the software implementation only. */
  PP_HARDWAREACCELERATION_NONE = 2,

  PP_HARDWAREACCELERATION_LAST = PP_HARDWAREACCELERATION_NONE
};

/**
 * Struct describing a decoded video picture. The decoded picture data is stored
 * in the GL texture corresponding to |texture_id|. The plugin can determine
 * which Decode call generated the picture using |decode_id|.
 */
struct PP_VideoPicture {
  /**
   * |decode_id| parameter of the Decode call which generated this picture.
   * See the PPB_VideoDecoder function Decode() for more details.
   */
  uint32_t decode_id;

  /**
   * Texture ID in the plugin's GL context. The plugin can use this to render
   * the decoded picture.
   */
  uint32_t texture_id;

  /**
   * The GL texture target for the decoded picture. Possible values are:
   *   GL_TEXTURE_2D
   *   GL_TEXTURE_RECTANGLE_ARB
   *   GL_TEXTURE_EXTERNAL_OES
   *
   * The pixel format of the texture is GL_RGBA.
   */
  uint32_t texture_target;

  /**
   * Dimensions of the texture holding the decoded picture.
   */
  PP_Size texture_size;

  /**
   * The visible subrectangle of the picture. The plugin should display only
   * this part of the picture.
   */
  PP_Rect visible_rect;
};

/**
 * Struct describing a decoded video picture. The decoded picture data is stored
 * in the GL texture corresponding to |texture_id|. The plugin can determine
 * which Decode call generated the picture using |decode_id|.
 */
struct PP_VideoPicture_0_1 {
  /**
   * |decode_id| parameter of the Decode call which generated this picture.
   * See the PPB_VideoDecoder function Decode() for more details.
   */
  uint32_t decode_id;

  /**
   * Texture ID in the plugin's GL context. The plugin can use this to render
   * the decoded picture.
   */
  uint32_t texture_id;

  /**
   * The GL texture target for the decoded picture. Possible values are:
   *   GL_TEXTURE_2D
   *   GL_TEXTURE_RECTANGLE_ARB
   *   GL_TEXTURE_EXTERNAL_OES
   *
   * The pixel format of the texture is GL_RGBA.
   */
  uint32_t texture_target;

  /**
   * Dimensions of the texture holding the decoded picture.
   */
  PP_Size texture_size;
};

/**
 * Supported video profile information. See the PPB_VideoEncoder function
 * GetSupportedProfiles() for more details.
 */
struct PP_VideoProfileDescription {
  /**
   * The codec profile.
   */
  PP_VideoProfile profile;

  /**
   * Dimensions of the maximum resolution of video frames, in pixels.
   */
  PP_Size max_resolution;

  /**
   * The numerator of the maximum frame rate.
   */
  uint32_t max_framerate_numerator;

  /**
   * The denominator of the maximum frame rate.
   */
  uint32_t max_framerate_denominator;

  /**
   * Whether the profile is hardware accelerated.
   */
  PP_Bool hardware_accelerated;
};

/**
 * Supported video profile information. See the PPB_VideoEncoder function
 * GetSupportedProfiles() for more details.
 */
struct PP_VideoProfileDescription_0_1 {
  /**
   * The codec profile.
   */
  PP_VideoProfile profile;

  /**
   * Dimensions of the maximum resolution of video frames, in pixels.
   */
  PP_Size max_resolution;

  /**
   * The numerator of the maximum frame rate.
   */
  uint32_t max_framerate_numerator;

  /**
   * The denominator of the maximum frame rate.
   */
  uint32_t max_framerate_denominator;

  /**
   * A value indicating if the profile is available in hardware, software, or
   * both.
   */
  PP_HardwareAcceleration acceleration;
};

/**
 * Supported audio profile information. See the PPB_AudioEncoder function
 * GetSupportedProfiles() for more details.
 */
struct PP_AudioProfileDescription {
  /**
   * The codec profile.
   */
  PP_AudioProfile profile;

  /**
   * Maximum number of channels that can be encoded.
   */
  uint32_t max_channels;

  /**
   * Sample size.
   */
  uint32_t sample_size;

  /**
   * Sampling rate that can be encoded
   */
  uint32_t sample_rate;

  /**
   * Whether the profile is hardware accelerated.
   */
  PP_Bool hardware_accelerated;
};

/**
 * Struct describing a bitstream buffer.
 */
struct PP_BitstreamBuffer {
  /**
   * The size, in bytes, of the bitstream data.
   */
  uint32_t size;

  /**
   * The base address of the bitstream data.
   */
  mem_t buffer;

  /**
   * Whether the buffer represents a key frame.
   */
  PP_Bool key_frame;
};

/**
 * Struct describing an audio bitstream buffer.
 */
struct PP_AudioBitstreamBuffer {
  /**
   * The size, in bytes, of the bitstream data.
   */
  uint32_t size;

  /**
   * The base address of the bitstream data.
   */
  mem_t buffer;
};
