GF_Err gf_isom_set_oma_protection(GF_ISOFile *the_file, u32 trackNumber, u32 desc_index, char *contentID, char *kms_URI, u32 encryption_type, u64 plainTextLength, char *textual_headers, u32 textual_headers_len, Bool selective_encryption, u32 KI_length, u32 IV_length) { GF_ProtectionInfoBox *sinf; GF_Err e; //setup generic protection e = gf_isom_set_protected_entry(the_file, trackNumber, desc_index, 0, 0, GF_ISOM_OMADRM_SCHEME, 0x00000200, NULL, GF_FALSE, &sinf); if (e) return e; sinf->info->okms = (GF_OMADRMKMSBox *)odkm_New(); sinf->info->okms->fmt = (GF_OMADRMAUFormatBox*)gf_isom_box_new(GF_ISOM_BOX_TYPE_ODAF); sinf->info->okms->fmt->selective_encryption = selective_encryption; sinf->info->okms->fmt->key_indicator_length = KI_length; sinf->info->okms->fmt->IV_length = IV_length; sinf->info->okms->hdr = (GF_OMADRMCommonHeaderBox*)ohdr_New(); sinf->info->okms->hdr->EncryptionMethod = encryption_type; sinf->info->okms->hdr->PaddingScheme = (encryption_type==0x01) ? 1 : 0; sinf->info->okms->hdr->PlaintextLength = plainTextLength; if (contentID) sinf->info->okms->hdr->ContentID = gf_strdup(contentID); if (kms_URI) sinf->info->okms->hdr->RightsIssuerURL = gf_strdup(kms_URI); if (textual_headers) { sinf->info->okms->hdr->TextualHeaders = (char*)gf_malloc(sizeof(char)*textual_headers_len); memcpy(sinf->info->okms->hdr->TextualHeaders, textual_headers, sizeof(char)*textual_headers_len); sinf->info->okms->hdr->TextualHeadersLen = textual_headers_len; } return GF_OK; }
GF_Err gf_isom_set_oma_protection(GF_ISOFile *the_file, u32 trackNumber, u32 desc_index, char *contentID, char *kms_URI, u32 encryption_type, u64 plainTextLength, char *textual_headers, u32 textual_headers_len, Bool selective_encryption, u32 KI_length, u32 IV_length) { u32 original_format; GF_Err e; GF_SampleEntryBox *sea; GF_TrackBox *trak = gf_isom_get_track_from_file(the_file, trackNumber); if (!trak) return GF_BAD_PARAM; e = Media_GetSampleDesc(trak->Media, desc_index, &sea, NULL); if (e) return e; /* Replacing the Media Type */ switch (sea->type) { case GF_ISOM_BOX_TYPE_MP4A: case GF_ISOM_BOX_TYPE_DAMR: case GF_ISOM_BOX_TYPE_DEVC: case GF_ISOM_BOX_TYPE_DQCP: case GF_ISOM_BOX_TYPE_DSMV: original_format = sea->type; sea->type = GF_ISOM_BOX_TYPE_ENCA; break; case GF_ISOM_BOX_TYPE_MP4V: case GF_ISOM_BOX_TYPE_AVC1: case GF_ISOM_BOX_TYPE_D263: original_format = sea->type; sea->type = GF_ISOM_BOX_TYPE_ENCV; break; case GF_ISOM_BOX_TYPE_MP4S: original_format = sea->type; sea->type = GF_ISOM_BOX_TYPE_ENCS; break; default: return GF_BAD_PARAM; } sea->protection_info = (GF_ProtectionInfoBox *)sinf_New(); sea->protection_info->scheme_type = (GF_SchemeTypeBox *)schm_New(); sea->protection_info->scheme_type->scheme_type = GF_4CC('o','d','k','m'); sea->protection_info->scheme_type->scheme_version = 0x00000200; sea->protection_info->original_format = (GF_OriginalFormatBox *)frma_New(); sea->protection_info->original_format->data_format = original_format; sea->protection_info->info = (GF_SchemeInformationBox *)schi_New(); sea->protection_info->info->okms = (GF_OMADRMKMSBox *)odkm_New(); sea->protection_info->info->okms->fmt = (GF_OMADRMAUFormatBox*)gf_isom_box_new(GF_ISOM_BOX_TYPE_ODAF); sea->protection_info->info->okms->fmt->selective_encryption = selective_encryption; sea->protection_info->info->okms->fmt->key_indicator_length = KI_length; sea->protection_info->info->okms->fmt->IV_length = IV_length; sea->protection_info->info->okms->hdr = (GF_OMADRMCommonHeaderBox*)ohdr_New(); sea->protection_info->info->okms->hdr->EncryptionMethod = encryption_type; sea->protection_info->info->okms->hdr->PaddingScheme = (encryption_type==0x01) ? 1 : 0; sea->protection_info->info->okms->hdr->PlaintextLength = plainTextLength; if (contentID) sea->protection_info->info->okms->hdr->ContentID = strdup(contentID); if (kms_URI) sea->protection_info->info->okms->hdr->RightsIssuerURL = strdup(kms_URI); if (textual_headers) { sea->protection_info->info->okms->hdr->TextualHeaders = malloc(sizeof(char)*textual_headers_len); memcpy(sea->protection_info->info->okms->hdr->TextualHeaders, textual_headers, sizeof(char)*textual_headers_len); sea->protection_info->info->okms->hdr->TextualHeadersLen = textual_headers_len; } return GF_OK; }