Home | History | Annotate | Download | only in private
      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 
      6 /* From private/pp_content_decryptor.idl modified Mon Oct 21 18:38:44 2013. */
      7 
      8 #ifndef PPAPI_C_PRIVATE_PP_CONTENT_DECRYPTOR_H_
      9 #define PPAPI_C_PRIVATE_PP_CONTENT_DECRYPTOR_H_
     10 
     11 #include "ppapi/c/pp_macros.h"
     12 #include "ppapi/c/pp_stdint.h"
     13 
     14 /**
     15  * @file
     16  * The <code>PP_DecryptTrackingInfo</code> struct contains necessary information
     17  * that can be used to associate the decrypted block with a decrypt request
     18  * and/or an input block.
     19  */
     20 
     21 
     22 /**
     23  * @addtogroup Structs
     24  * @{
     25  */
     26 struct PP_DecryptTrackingInfo {
     27   /**
     28    * Client-specified identifier for the associated decrypt request. By using
     29    * this value, the client can associate the decrypted block with a decryption
     30    * request.
     31    */
     32   uint32_t request_id;
     33   /**
     34    * A unique buffer ID to identify a PPB_Buffer_Dev. Unlike a PP_Resource,
     35    * this ID is identical at both the renderer side and the plugin side.
     36    * In <code>PPB_ContentDecryptor_Private</code> calls, this is the ID of the
     37    * buffer associated with the decrypted block/frame/samples.
     38    * In <code>PPP_ContentDecryptor_Private</code> calls, this is the ID of a
     39    * buffer that is no longer need at the renderer side, which can be released
     40    * or recycled by the plugin. This ID can be 0 if there is no buffer to be
     41    * released or recycled.
     42    */
     43   uint32_t buffer_id;
     44   /**
     45    * Timestamp in microseconds of the associated block. By using this value,
     46    * the client can associate the decrypted (and decoded) data with an input
     47    * block. This is needed because buffers may be delivered out of order and
     48    * not in response to the <code>request_id</code> they were provided with.
     49    */
     50   int64_t timestamp;
     51 };
     52 PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_DecryptTrackingInfo, 16);
     53 
     54 /**
     55  * The <code>PP_DecryptSubsampleDescription</code> struct contains information
     56  * to support subsample decryption.
     57  *
     58  * An input block can be split into several continuous subsamples.
     59  * A <code>PP_DecryptSubsampleEntry</code> specifies the number of clear and
     60  * cipher bytes in each subsample. For example, the following block has three
     61  * subsamples:
     62  *
     63  * |<----- subsample1 ----->|<----- subsample2 ----->|<----- subsample3 ----->|
     64  * |   clear1   |  cipher1  |  clear2  |   cipher2   | clear3 |    cipher3    |
     65  *
     66  * For decryption, all of the cipher bytes in a block should be treated as a
     67  * contiguous (in the subsample order) logical stream. The clear bytes should
     68  * not be considered as part of decryption.
     69  *
     70  * Logical stream to decrypt:   |  cipher1  |   cipher2   |    cipher3    |
     71  * Decrypted stream:            | decrypted1|  decrypted2 |   decrypted3  |
     72  *
     73  * After decryption, the decrypted bytes should be copied over the position
     74  * of the corresponding cipher bytes in the original block to form the output
     75  * block. Following the above example, the decrypted block should be:
     76  *
     77  * |<----- subsample1 ----->|<----- subsample2 ----->|<----- subsample3 ----->|
     78  * |   clear1   | decrypted1|  clear2  |  decrypted2 | clear3 |   decrypted3  |
     79  */
     80 struct PP_DecryptSubsampleDescription {
     81   /**
     82    * Size in bytes of clear data in a subsample entry.
     83    */
     84   uint32_t clear_bytes;
     85   /**
     86    * Size in bytes of encrypted data in a subsample entry.
     87    */
     88   uint32_t cipher_bytes;
     89 };
     90 PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_DecryptSubsampleDescription, 8);
     91 
     92 /**
     93  * The <code>PP_EncryptedBlockInfo</code> struct contains all the information
     94  * needed to decrypt an encrypted block.
     95  */
     96 struct PP_EncryptedBlockInfo {
     97   /**
     98    * Information needed by the client to track the block to be decrypted.
     99    */
    100   struct PP_DecryptTrackingInfo tracking_info;
    101   /**
    102    * Size in bytes of data to be decrypted (data_offset included).
    103    */
    104   uint32_t data_size;
    105   /**
    106    * Size in bytes of data to be discarded before applying the decryption.
    107    */
    108   uint32_t data_offset;
    109   /**
    110    * Key ID of the block to be decrypted.
    111    *
    112    * TODO(xhwang): For WebM the key ID can be as large as 2048 bytes in theory.
    113    * But it's not used in current implementations. If we really need to support
    114    * it, we should move key ID out as a separate parameter, e.g.
    115    * as a <code>PP_Var</code>, or make the whole
    116    * <code>PP_EncryptedBlockInfo</code> as a <code>PP_Resource</code>.
    117    */
    118   uint8_t key_id[64];
    119   uint32_t key_id_size;
    120   /**
    121    * Initialization vector of the block to be decrypted.
    122    */
    123   uint8_t iv[16];
    124   uint32_t iv_size;
    125   /**
    126    * Subsample information of the block to be decrypted.
    127    */
    128   struct PP_DecryptSubsampleDescription subsamples[16];
    129   uint32_t num_subsamples;
    130   /**
    131    * 4-byte padding to make the size of <code>PP_EncryptedBlockInfo</code>
    132    * a multiple of 8 bytes. The value of this field should not be used.
    133    */
    134   uint32_t padding;
    135 };
    136 PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_EncryptedBlockInfo, 248);
    137 /**
    138  * @}
    139  */
    140 
    141 /**
    142  * @addtogroup Enums
    143  * @{
    144  */
    145 /**
    146  * <code>PP_DecryptedFrameFormat</code> contains video frame formats.
    147  */
    148 typedef enum {
    149   PP_DECRYPTEDFRAMEFORMAT_UNKNOWN = 0,
    150   PP_DECRYPTEDFRAMEFORMAT_YV12 = 1,
    151   PP_DECRYPTEDFRAMEFORMAT_I420 = 2
    152 } PP_DecryptedFrameFormat;
    153 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_DecryptedFrameFormat, 4);
    154 
    155 /**
    156  * <code>PP_DecryptedSampleFormat</code> contains audio sample formats.
    157  */
    158 typedef enum {
    159   PP_DECRYPTEDSAMPLEFORMAT_UNKNOWN = 0,
    160   PP_DECRYPTEDSAMPLEFORMAT_U8 = 1,
    161   PP_DECRYPTEDSAMPLEFORMAT_S16 = 2,
    162   PP_DECRYPTEDSAMPLEFORMAT_S32 = 3,
    163   PP_DECRYPTEDSAMPLEFORMAT_F32 = 4,
    164   PP_DECRYPTEDSAMPLEFORMAT_PLANAR_S16 = 5,
    165   PP_DECRYPTEDSAMPLEFORMAT_PLANAR_F32 = 6
    166 } PP_DecryptedSampleFormat;
    167 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_DecryptedSampleFormat, 4);
    168 
    169 /**
    170  * The <code>PP_DecryptResult</code> enum contains decryption and decoding
    171  * result constants.
    172  */
    173 typedef enum {
    174   /** The decryption (and/or decoding) operation finished successfully. */
    175   PP_DECRYPTRESULT_SUCCESS = 0,
    176   /** The decryptor did not have the necessary decryption key. */
    177   PP_DECRYPTRESULT_DECRYPT_NOKEY = 1,
    178   /** The input was accepted by the decoder but no frame(s) can be produced. */
    179   PP_DECRYPTRESULT_NEEDMOREDATA = 2,
    180   /** An unexpected error happened during decryption. */
    181   PP_DECRYPTRESULT_DECRYPT_ERROR = 3,
    182   /** An unexpected error happened during decoding. */
    183   PP_DECRYPTRESULT_DECODE_ERROR = 4
    184 } PP_DecryptResult;
    185 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_DecryptResult, 4);
    186 /**
    187  * @}
    188  */
    189 
    190 /**
    191  * @addtogroup Structs
    192  * @{
    193  */
    194 /**
    195  * <code>PP_DecryptedBlockInfo</code> struct contains the decryption result and
    196  * tracking info associated with the decrypted block.
    197  */
    198 struct PP_DecryptedBlockInfo {
    199   /**
    200    * Result of the decryption (and/or decoding) operation.
    201    */
    202   PP_DecryptResult result;
    203   /**
    204    * Size in bytes of decrypted data, which may be less than the size of the
    205    * corresponding buffer.
    206    */
    207   uint32_t data_size;
    208   /**
    209    * Information needed by the client to track the block to be decrypted.
    210    */
    211   struct PP_DecryptTrackingInfo tracking_info;
    212 };
    213 PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_DecryptedBlockInfo, 24);
    214 /**
    215  * @}
    216  */
    217 
    218 /**
    219  * @addtogroup Enums
    220  * @{
    221  */
    222 /**
    223  * <code>PP_DecryptedFramePlanes</code> provides YUV plane index values for
    224  * accessing plane offsets stored in <code>PP_DecryptedFrameInfo</code>.
    225  */
    226 typedef enum {
    227   PP_DECRYPTEDFRAMEPLANES_Y = 0,
    228   PP_DECRYPTEDFRAMEPLANES_U = 1,
    229   PP_DECRYPTEDFRAMEPLANES_V = 2
    230 } PP_DecryptedFramePlanes;
    231 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_DecryptedFramePlanes, 4);
    232 /**
    233  * @}
    234  */
    235 
    236 /**
    237  * @addtogroup Structs
    238  * @{
    239  */
    240 /**
    241  * <code>PP_DecryptedFrameInfo</code> contains the result of the
    242  * decrypt and decode operation on the associated frame, information required
    243  * to access the frame data in buffer, and tracking info.
    244  */
    245 struct PP_DecryptedFrameInfo {
    246   /**
    247    * Result of the decrypt and decode operation.
    248    */
    249   PP_DecryptResult result;
    250   /**
    251    * Format of the decrypted frame.
    252    */
    253   PP_DecryptedFrameFormat format;
    254   /**
    255    * Offsets into the buffer resource for accessing video planes.
    256    */
    257   int32_t plane_offsets[3];
    258   /**
    259    * Stride of each plane.
    260    */
    261   int32_t strides[3];
    262   /**
    263    * Width of the video frame, in pixels.
    264    */
    265   int32_t width;
    266   /**
    267    * Height of the video frame, in pixels.
    268    */
    269   int32_t height;
    270   /**
    271    * Information needed by the client to track the decrypted frame.
    272    */
    273   struct PP_DecryptTrackingInfo tracking_info;
    274 };
    275 PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_DecryptedFrameInfo, 56);
    276 
    277 /**
    278  * <code>PP_DecryptedSampleInfo</code> contains the result of the
    279  * decrypt and decode operation on the associated samples, information required
    280  * to access the sample data in buffer, and tracking info.
    281  */
    282 struct PP_DecryptedSampleInfo {
    283   /**
    284    * Result of the decrypt and decode operation.
    285    */
    286   PP_DecryptResult result;
    287   /**
    288    * Format of the decrypted samples.
    289    */
    290   PP_DecryptedSampleFormat format;
    291   /**
    292    * Size in bytes of decrypted samples.
    293    */
    294   uint32_t data_size;
    295   /**
    296    * 4-byte padding to make the size of <code>PP_DecryptedSampleInfo</code>
    297    * a multiple of 8 bytes. The value of this field should not be used.
    298    */
    299   uint32_t padding;
    300   /**
    301    * Information needed by the client to track the decrypted samples.
    302    */
    303   struct PP_DecryptTrackingInfo tracking_info;
    304 };
    305 PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_DecryptedSampleInfo, 32);
    306 /**
    307  * @}
    308  */
    309 
    310 /**
    311  * @addtogroup Enums
    312  * @{
    313  */
    314 /**
    315  * <code>PP_AudioCodec</code> contains audio codec type constants.
    316  */
    317 typedef enum {
    318   PP_AUDIOCODEC_UNKNOWN = 0,
    319   PP_AUDIOCODEC_VORBIS = 1,
    320   PP_AUDIOCODEC_AAC = 2
    321 } PP_AudioCodec;
    322 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_AudioCodec, 4);
    323 /**
    324  * @}
    325  */
    326 
    327 /**
    328  * @addtogroup Structs
    329  * @{
    330  */
    331 /**
    332  * <code>PP_AudioDecoderConfig</code> contains audio decoder configuration
    333  * information required to initialize audio decoders, and a request ID
    334  * that allows clients to associate a decoder initialization request with a
    335  * status response. Note: When <code>codec</code> requires extra data for
    336  * initialization, the data is sent as a <code>PP_Resource</code> carried
    337  * alongside <code>PP_AudioDecoderConfig</code>.
    338  */
    339 struct PP_AudioDecoderConfig {
    340   /**
    341    * The audio codec to initialize.
    342    */
    343   PP_AudioCodec codec;
    344   /**
    345    * Number of audio channels.
    346    */
    347   int32_t channel_count;
    348   /**
    349    * Size of each audio channel.
    350    */
    351   int32_t bits_per_channel;
    352   /**
    353    * Audio sampling rate.
    354    */
    355   int32_t samples_per_second;
    356   /**
    357    * Client-specified identifier for the associated audio decoder initialization
    358    * request. By using this value, the client can associate a decoder
    359    * initialization status response with an initialization request.
    360    */
    361   uint32_t request_id;
    362 };
    363 PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_AudioDecoderConfig, 20);
    364 /**
    365  * @}
    366  */
    367 
    368 /**
    369  * @addtogroup Enums
    370  * @{
    371  */
    372 /**
    373  * <code>PP_VideoCodec</code> contains video codec type constants.
    374  */
    375 typedef enum {
    376   PP_VIDEOCODEC_UNKNOWN = 0,
    377   PP_VIDEOCODEC_VP8 = 1,
    378   PP_VIDEOCODEC_H264 = 2
    379 } PP_VideoCodec;
    380 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_VideoCodec, 4);
    381 
    382 /**
    383  * <code>PP_VideoCodecProfile</code> contains video codec profile type
    384  * constants required for video decoder configuration.
    385  *.
    386  */
    387 typedef enum {
    388   PP_VIDEOCODECPROFILE_UNKNOWN = 0,
    389   PP_VIDEOCODECPROFILE_VP8_MAIN = 1,
    390   PP_VIDEOCODECPROFILE_H264_BASELINE = 2,
    391   PP_VIDEOCODECPROFILE_H264_MAIN = 3,
    392   PP_VIDEOCODECPROFILE_H264_EXTENDED = 4,
    393   PP_VIDEOCODECPROFILE_H264_HIGH = 5,
    394   PP_VIDEOCODECPROFILE_H264_HIGH_10 = 6,
    395   PP_VIDEOCODECPROFILE_H264_HIGH_422 = 7,
    396   PP_VIDEOCODECPROFILE_H264_HIGH_444_PREDICTIVE = 8
    397 } PP_VideoCodecProfile;
    398 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_VideoCodecProfile, 4);
    399 /**
    400  * @}
    401  */
    402 
    403 /**
    404  * @addtogroup Structs
    405  * @{
    406  */
    407 /**
    408  * <code>PP_VideoDecoderConfig</code> contains video decoder configuration
    409  * information required to initialize video decoders, and a request ID
    410  * that allows clients to associate a decoder initialization request with a
    411  * status response. Note: When <code>codec</code> requires extra data for
    412  * initialization, the data is sent as a <code>PP_Resource</code> carried
    413  * alongside <code>PP_VideoDecoderConfig</code>.
    414  */
    415 struct PP_VideoDecoderConfig {
    416   /**
    417    * The video codec to initialize.
    418    */
    419   PP_VideoCodec codec;
    420   /**
    421    * Profile to use when initializing the video codec.
    422    */
    423   PP_VideoCodecProfile profile;
    424   /**
    425    * Output video format.
    426    */
    427   PP_DecryptedFrameFormat format;
    428   /**
    429    * Width of decoded video frames, in pixels.
    430    */
    431   int32_t width;
    432   /**
    433    * Height of decoded video frames, in pixels.
    434    */
    435   int32_t height;
    436   /**
    437    * Client-specified identifier for the associated video decoder initialization
    438    * request. By using this value, the client can associate a decoder
    439    * initialization status response with an initialization request.
    440    */
    441   uint32_t request_id;
    442 };
    443 PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_VideoDecoderConfig, 24);
    444 /**
    445  * @}
    446  */
    447 
    448 /**
    449  * @addtogroup Enums
    450  * @{
    451  */
    452 /**
    453  * <code>PP_DecryptorStreamType</code> contains stream type constants.
    454  */
    455 typedef enum {
    456   PP_DECRYPTORSTREAMTYPE_AUDIO = 0,
    457   PP_DECRYPTORSTREAMTYPE_VIDEO = 1
    458 } PP_DecryptorStreamType;
    459 PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_DecryptorStreamType, 4);
    460 /**
    461  * @}
    462  */
    463 
    464 #endif  /* PPAPI_C_PRIVATE_PP_CONTENT_DECRYPTOR_H_ */
    465 
    466