Home | History | Annotate | Download | only in videocodec
      1 /*
      2 * Copyright (c) 2014 Intel Corporation.  All rights reserved.
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 * http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */
     16 
     17 #ifndef PROTECTED_DATA_BUFFER_H
     18 #define PROTECTED_DATA_BUFFER_H
     19 
     20 #include <stdint.h>
     21 #include <stdbool.h>
     22 #include <stddef.h>
     23 
     24 #ifdef __cplusplus
     25 extern "C" {
     26 #endif
     27 
     28 // NOTE: this size takes into account the space used by DRM
     29 // schemes with full sample encryption (e.g., WV Classic) or
     30 // subsample encryption (e.g., WV Modular, which uses 2KB for
     31 // frame info data).
     32 #define NALU_BUFFER_SIZE        (4 * 1024)
     33 
     34 // Either start code + type (00 00 00 01 <type byte>) or 4 byte length + type.
     35 #define NALU_HEADER_SIZE        5
     36 
     37 // This should be able to fit compressed 1080p video I-frame, use half
     38 // of NV12 1080p frame, which on average uses 12 bits per pixel.
     39 #define MAX_COMPRESSED_FRAME_SIZE   (1920 * 1080 * 3 / 4)
     40 
     41 #define MAX_PROT_BUFFER_DATA_SIZE  (MAX_COMPRESSED_FRAME_SIZE + NALU_BUFFER_SIZE)
     42 
     43 #define MAX_PES_BUFFER_SIZE     (64*1024)
     44 
     45 // TODO: it's not clear, how to calculate this value, since PES packet may contain
     46 // less than 64KB worth of data.
     47 #define MAX_PES_PACKETS_PER_FRAME   64
     48 
     49 // Video decoder defines maximum number of NALUs per frame as 16.
     50 // (At least, as of June of 2014.) Use the same value here.
     51 #define MAX_NALUS_IN_FRAME      16
     52 
     53 // Integer, which "PDBF", but no 0 terminator
     54 #define PROTECTED_DATA_BUFFER_MAGIC   (0UL | ('F' << 24) | ('B' << 16) | ('D' << 8) | 'P')
     55 
     56 #define DRM_SCHEME_NONE             0
     57 #define DRM_SCHEME_WV_CLASSIC       1
     58 #define DRM_SCHEME_WV_MODULAR       2
     59 #define DRM_SCHEME_MCAST_SINK       3
     60 #define DRM_SCHEME_PLAYREADY_ASF    4
     61 
     62 // Flag to indicate if Last Subsample flag is received for MDRM
     63 #define PDB_FLAG_COMPLETE_FRAME   0x1000
     64 
     65 #pragma pack(push, 4)
     66 
     67 typedef struct ProtectedPESBuffer_tag {
     68 
     69     // AES CTR stream counter, needed for HDCP decryption.
     70     // If ProtectedDataBuffer::clear is 1, streamCounter is ignored.
     71     uint32_t streamCounter ;
     72 
     73     // AES CTR input counter, needed for HDCP decryption
     74     // If ProtectedDataBuffer::clear is 1, inputCounter is ignored.
     75     uint64_t inputCounter ;
     76 
     77     // Offset within ProtectedDataBuffer::data buffer, to the start
     78     // of this PES packet's data.
     79     //
     80     // IMPORTANT: for protected content (ProtectedDataBuffer::clear is 0),
     81     // this offset must be divisible by 16 (AES block size).  This is to allow
     82     // for in-place transcryption from AES CTR to IED (AES ECB).  OMX will
     83     // check that the offset is divisible by 16, and will abort
     84     // playback, if the offset is NOT divisible by 16.  For this reason,
     85     // the offset is used and not a byte pointer.
     86     uint32_t pesDataOffset ;
     87 
     88     // Size of the PES data, pointed to by pesData
     89     uint32_t pesSize ;
     90 }
     91 ProtectedPESBuffer ;
     92 
     93 typedef struct ProtectedDataBuffer_tag {
     94 
     95     // Must be set to PROTECTED_DATA_BUFFER_MAGIC.  Must be the first
     96     // member of ProtectedDataBuffer structure.
     97     uint32_t magic;
     98 
     99     // See DRM_SCHEME_* defines above
    100     uint32_t drmScheme;
    101 
    102     // 1 if clear, 0 if encrypted
    103     uint32_t  clear;
    104 
    105     // Session ID, used by some DRM schemes (e.g. PlayReady)
    106     uint32_t session_id ;
    107 
    108     // Flags, used by some DRM schemes
    109     // MDRM uses it to indicate Complete Frame received
    110     // Miracast Sink uses it to indicate if Transcription is required
    111     uint32_t flags ;
    112 
    113     // Information about the PES data buffers.  Used for DRM_SCHEME_MCAST_SINK.
    114     // Reserve space for one more PES data buffer for sentinel value, for
    115     // ease of implementation.
    116     //
    117     ProtectedPESBuffer pesBuffers[MAX_PES_PACKETS_PER_FRAME + 1] ;
    118 
    119     // Number of filled-out entries in pesBuffers array.
    120     // Used for DRM_SCHEME_MCAST_SINK.  If data buffer is not partitioned
    121     // into PES packet buffers, set numPesBuffers must be 0.
    122     //
    123     uint32_t numPesBuffers ;
    124 
    125     // Size of the data buffer.
    126     uint32_t size ;
    127 
    128     // For clear content, this is the space for clear data.
    129     // For encrypted content, this space is occupied by IED encrypted
    130     // data or HDCP encrypted data (payloads only, no PES headers),
    131     // depending on the DRM scheme.
    132     //
    133     // A space is made at the end of encrypted data for
    134     // decrypted SPS/PPS headers.
    135     //
    136     // NOTE: data must be last, to allow for flexibility not
    137     // to copy the whole ProtectedDataBuffer, if not whole data
    138     // buffer is filled.
    139     //
    140     uint8_t data[MAX_PROT_BUFFER_DATA_SIZE];
    141 }
    142 ProtectedDataBuffer;
    143 
    144 #pragma pack(pop)
    145 
    146 #define PDBUFFER_DATA_OFFSET     offsetof(ProtectedDataBuffer, data)
    147 
    148 static inline void Init_ProtectedDataBuffer(ProtectedDataBuffer* buf)
    149 {
    150     // This is internal helper function.  If you pass invalid (e.g. NULL)
    151     // pointer to it, you deserve to crash.
    152 
    153     // Perform initialization of certain members, ignore the data
    154     // areas, which will be overwritten in the course of the
    155     // normal usage.
    156 
    157     buf->magic = PROTECTED_DATA_BUFFER_MAGIC ;
    158     buf->drmScheme = DRM_SCHEME_NONE ;
    159     buf->clear = 0 ;
    160     buf->size = 0 ;
    161     buf->numPesBuffers = 0 ;
    162     buf->session_id = 0 ;
    163     buf->flags = 0 ;
    164 }
    165 // End of Init_ProtectedDataBuffer()
    166 
    167 #ifdef __cplusplus
    168 }
    169 #endif // __cplusplus
    170 
    171 #endif // PROTECTED_DATA_BUFFER_H
    172