This source file includes following definitions.
- get_field_size
- write_var_size
- GF_IPMPX_GetByteArray
- GF_IPMPX_GetByteArraySize
- GF_IPMPX_WriteByteArray
- GF_IPMPX_AUTH_Delete
- GF_IPMPX_AUTH_Size
- GF_IPMPX_AUTH_FullSize
- WriteGF_IPMPX_AUTH
- GF_IPMPX_AUTH_Parse
- gf_ipmpx_data_full_size
- gf_ipmpx_data_parse
- GF_IPMPX_WriteBase
- NewGF_IPMPX_InitAuthentication
- DelGF_IPMPX_InitAuthentication
- ReadGF_IPMPX_InitAuthentication
- SizeGF_IPMPX_InitAuthentication
- WriteGF_IPMPX_InitAuthentication
- NewGF_IPMPX_MutualAuthentication
- delete_algo_list
- DelGF_IPMPX_MutualAuthentication
- ReadGF_IPMPX_MutualAuthentication
- SizeGF_IPMPX_MutualAuthentication
- WriteGF_IPMPX_MutualAuthentication
- NewGF_IPMPX_TrustSecurityMetadata
- DelGF_IPMPX_TrustSecurityMetadata
- ReadGF_IPMPX_TrustSecurityMetadata
- SizeGF_IPMPX_TrustSecurityMetadata
- WriteGF_IPMPX_TrustSecurityMetadata
- NewGF_IPMPX_SecureContainer
- DelGF_IPMPX_SecureContainer
- ReadGF_IPMPX_SecureContainer
- SizeGF_IPMPX_SecureContainer
- WriteGF_IPMPX_SecureContainer
- NewGF_IPMPX_GetToolsResponse
- DelGF_IPMPX_GetToolsResponse
- ReadGF_IPMPX_GetToolsResponse
- SizeGF_IPMPX_GetToolsResponse
- WriteGF_IPMPX_GetToolsResponse
- NewGF_IPMPX_ParametricDescription
- DelGF_IPMPX_ParametricDescription
- ReadGF_IPMPX_ParametricDescription
- SizeGF_IPMPX_ParametricDescription
- WriteGF_IPMPX_ParametricDescription
- NewGF_IPMPX_ToolParamCapabilitiesQuery
- DelGF_IPMPX_ToolParamCapabilitiesQuery
- ReadGF_IPMPX_ToolParamCapabilitiesQuery
- SizeGF_IPMPX_ToolParamCapabilitiesQuery
- WriteGF_IPMPX_ToolParamCapabilitiesQuery
- NewGF_IPMPX_ToolParamCapabilitiesResponse
- DelGF_IPMPX_ToolParamCapabilitiesResponse
- ReadGF_IPMPX_ToolParamCapabilitiesResponse
- SizeGF_IPMPX_ToolParamCapabilitiesResponse
- WriteGF_IPMPX_ToolParamCapabilitiesResponse
- NewGF_IPMPX_ConnectTool
- DelGF_IPMPX_ConnectTool
- ReadGF_IPMPX_ConnectTool
- SizeGF_IPMPX_ConnectTool
- WriteGF_IPMPX_ConnectTool
- NewGF_IPMPX_DisconnectTool
- DelGF_IPMPX_DisconnectTool
- ReadGF_IPMPX_DisconnectTool
- SizeGF_IPMPX_DisconnectTool
- WriteGF_IPMPX_DisconnectTool
- NewGF_IPMPX_GetToolContext
- DelGF_IPMPX_GetToolContext
- ReadGF_IPMPX_GetToolContext
- SizeGF_IPMPX_GetToolContext
- WriteGF_IPMPX_GetToolContext
- NewGF_IPMPX_GetToolContextResponse
- DelGF_IPMPX_GetToolContextResponse
- ReadGF_IPMPX_GetToolContextResponse
- SizeGF_IPMPX_GetToolContextResponse
- WriteGF_IPMPX_GetToolContextResponse
- NewGF_IPMPX_AddToolNotificationListener
- DelGF_IPMPX_AddToolNotificationListener
- ReadGF_IPMPX_AddToolNotificationListener
- SizeGF_IPMPX_AddToolNotificationListener
- WriteGF_IPMPX_AddToolNotificationListener
- NewGF_IPMPX_RemoveToolNotificationListener
- DelGF_IPMPX_RemoveToolNotificationListener
- ReadGF_IPMPX_RemoveToolNotificationListener
- SizeGF_IPMPX_RemoveToolNotificationListener
- WriteGF_IPMPX_RemoveToolNotificationListener
- NewGF_IPMPX_NotifyToolEvent
- DelGF_IPMPX_NotifyToolEvent
- ReadGF_IPMPX_NotifyToolEvent
- SizeGF_IPMPX_NotifyToolEvent
- WriteGF_IPMPX_NotifyToolEvent
- NewGF_IPMPX_CanProcess
- DelGF_IPMPX_CanProcess
- ReadGF_IPMPX_CanProcess
- SizeGF_IPMPX_CanProcess
- WriteGF_IPMPX_CanProcess
- NewGF_IPMPX_OpaqueData
- DelGF_IPMPX_OpaqueData
- ReadGF_IPMPX_OpaqueData
- SizeGF_IPMPX_OpaqueData
- WriteGF_IPMPX_OpaqueData
- NewGF_IPMPX_KeyData
- DelGF_IPMPX_KeyData
- ReadGF_IPMPX_KeyData
- SizeGF_IPMPX_KeyData
- WriteGF_IPMPX_KeyData
- NewGF_IPMPX_SelectiveDecryptionInit
- DelGF_IPMPX_SelectiveDecryptionInit
- ReadGF_IPMPX_SelectiveDecryptionInit
- SizeGF_IPMPX_SelectiveDecryptionInit
- WriteGF_IPMPX_SelectiveDecryptionInit
- NewGF_IPMPX_WatermarkingInit
- DelGF_IPMPX_WatermarkingInit
- ReadGF_IPMPX_WatermarkingInit
- SizeGF_IPMPX_WatermarkingInit
- WriteGF_IPMPX_WatermarkingInit
- NewGF_IPMPX_SendWatermark
- DelGF_IPMPX_SendWatermark
- ReadGF_IPMPX_SendWatermark
- SizeGF_IPMPX_SendWatermark
- WriteGF_IPMPX_SendWatermark
- NewGF_IPMPX_ToolAPI_Config
- DelGF_IPMPX_ToolAPI_Config
- ReadGF_IPMPX_ToolAPI_Config
- SizeGF_IPMPX_ToolAPI_Config
- WriteGF_IPMPX_ToolAPI_Config
- NewGF_IPMPX_ISMACryp
- DelGF_IPMPX_ISMACryp
- ReadGF_IPMPX_ISMACryp
- SizeGF_IPMPX_ISMACryp
- WriteGF_IPMPX_ISMACryp
- gf_ipmpx_data_new
- gf_ipmpx_data_del
- GF_IPMPX_ReadData
- gf_ipmpx_data_size
- gf_ipmpx_data_write
#include <gpac/internal/odf_dev.h>
#ifndef GPAC_MINIMAL_ODF
#define GF_IPMPX_DATA_ALLOC(__ptr, __stname, __tag) \
__ptr = (__stname*)gf_malloc(sizeof(__stname)); \
if (!__ptr) return NULL; \
memset(__ptr, 0, sizeof(__stname)); \
((GF_IPMPX_Data *)__ptr)->tag = __tag; \
((GF_IPMPX_Data *)__ptr)->Version = 0x01; \
#define GF_IPMPX_DELETE_ARRAY(__ar) if (__ar) { if (__ar->data) gf_free(__ar->data); gf_free(__ar); }
u32 get_field_size(u32 size_desc)
{
if (size_desc < 0x00000080) return 1;
else if (size_desc < 0x00004000) return 2;
else if (size_desc < 0x00200000) return 3;
else return 4;
}
void write_var_size(GF_BitStream *bs, u32 size)
{
unsigned char vals[4];
u32 length = size;
vals[3] = (unsigned char) (length & 0x7f);
length >>= 7;
vals[2] = (unsigned char) ((length & 0x7f) | 0x80);
length >>= 7;
vals[1] = (unsigned char) ((length & 0x7f) | 0x80);
length >>= 7;
vals[0] = (unsigned char) ((length & 0x7f) | 0x80);
if (size < 0x00000080) {
gf_bs_write_int(bs, vals[3], 8);
} else if (size < 0x00004000) {
gf_bs_write_int(bs, vals[2], 8);
gf_bs_write_int(bs, vals[3], 8);
} else if (size < 0x00200000) {
gf_bs_write_int(bs, vals[1], 8);
gf_bs_write_int(bs, vals[2], 8);
gf_bs_write_int(bs, vals[3], 8);
} else if (size < 0x10000000) {
gf_bs_write_int(bs, vals[0], 8);
gf_bs_write_int(bs, vals[1], 8);
gf_bs_write_int(bs, vals[2], 8);
gf_bs_write_int(bs, vals[3], 8);
}
}
GF_IPMPX_ByteArray *GF_IPMPX_GetByteArray(GF_BitStream *bs)
{
GF_IPMPX_ByteArray *ba;
u32 val, size;
size = 0;
do {
val = gf_bs_read_int(bs, 8);
size <<= 7;
size |= val & 0x7F;
} while ( val & 0x80 );
if (!size) return NULL;
ba = (GF_IPMPX_ByteArray*)gf_malloc(sizeof(GF_IPMPX_ByteArray));
ba->data = (char*)gf_malloc(sizeof(char)*size);
gf_bs_read_data(bs, ba->data, size);
ba->length = size;
return ba;
}
u32 GF_IPMPX_GetByteArraySize(GF_IPMPX_ByteArray *ba)
{
if (!ba) return 1;
return ba->length + get_field_size(ba->length);
}
void GF_IPMPX_WriteByteArray(GF_BitStream *bs, GF_IPMPX_ByteArray *ba)
{
if (!ba || !ba->data) {
write_var_size(bs, 0);
} else {
write_var_size(bs, ba->length);
gf_bs_write_data(bs, ba->data, ba->length);
}
}
void GF_IPMPX_AUTH_Delete(GF_IPMPX_Authentication *auth)
{
if (!auth) return;
switch (auth->tag) {
case GF_IPMPX_AUTH_AlgorithmDescr_Tag:
{
GF_IPMPX_AUTH_AlgorithmDescriptor *p = (GF_IPMPX_AUTH_AlgorithmDescriptor *)auth;
GF_IPMPX_DELETE_ARRAY(p->specAlgoID);
GF_IPMPX_DELETE_ARRAY(p->OpaqueData);
gf_free(p);
}
break;
case GF_IPMPX_AUTH_KeyDescr_Tag:
{
GF_IPMPX_AUTH_KeyDescriptor *p = (GF_IPMPX_AUTH_KeyDescriptor *)auth;
if (p->keyBody) gf_free(p->keyBody);
gf_free(p);
}
break;
}
}
u32 GF_IPMPX_AUTH_Size(GF_IPMPX_Authentication *auth)
{
u32 size;
if (!auth) return 0;
switch (auth->tag) {
case GF_IPMPX_AUTH_AlgorithmDescr_Tag:
{
GF_IPMPX_AUTH_AlgorithmDescriptor *p = (GF_IPMPX_AUTH_AlgorithmDescriptor *)auth;
size = 1 + (p->specAlgoID ? GF_IPMPX_GetByteArraySize(p->specAlgoID) : 2);
size += GF_IPMPX_GetByteArraySize(p->OpaqueData);
return size;
}
break;
case GF_IPMPX_AUTH_KeyDescr_Tag:
{
GF_IPMPX_AUTH_KeyDescriptor *p = (GF_IPMPX_AUTH_KeyDescriptor *)auth;
size = p->keyBodyLength;
return size;
}
break;
default:
return 0;
}
}
u32 GF_IPMPX_AUTH_FullSize(GF_IPMPX_Authentication *auth)
{
u32 size = GF_IPMPX_AUTH_Size(auth);
size += get_field_size(size);
size += 1;
return size;
}
GF_Err WriteGF_IPMPX_AUTH(GF_BitStream *bs, GF_IPMPX_Authentication *auth)
{
u32 size;
if (!auth) return GF_OK;
gf_bs_write_int(bs, auth->tag, 8);
size = GF_IPMPX_AUTH_Size(auth);
write_var_size(bs, size);
switch (auth->tag) {
case GF_IPMPX_AUTH_AlgorithmDescr_Tag:
{
GF_IPMPX_AUTH_AlgorithmDescriptor *p = (GF_IPMPX_AUTH_AlgorithmDescriptor *)auth;
gf_bs_write_int(bs, p->specAlgoID ? 0 : 1, 1);
gf_bs_write_int(bs, 0, 7);
if (p->specAlgoID) {
GF_IPMPX_WriteByteArray(bs, p->specAlgoID);
} else {
gf_bs_write_int(bs, p->regAlgoID, 16);
}
GF_IPMPX_WriteByteArray(bs, p->OpaqueData);
}
break;
case GF_IPMPX_AUTH_KeyDescr_Tag:
{
GF_IPMPX_AUTH_KeyDescriptor *p = (GF_IPMPX_AUTH_KeyDescriptor *)auth;
gf_bs_write_data(bs, p->keyBody, p->keyBodyLength);
}
break;
default:
break;
}
return GF_OK;
}
GF_Err GF_IPMPX_AUTH_Parse(GF_BitStream *bs, GF_IPMPX_Authentication **auth)
{
u32 val, size, tag;
tag = gf_bs_read_int(bs, 8);
size = 0;
do {
val = gf_bs_read_int(bs, 8);
size <<= 7;
size |= val & 0x7F;
} while ( val & 0x80 );
if (!size) return GF_OK;
switch (tag) {
case GF_IPMPX_AUTH_KeyDescr_Tag:
{
GF_IPMPX_AUTH_KeyDescriptor *p;
GF_SAFEALLOC(p, GF_IPMPX_AUTH_KeyDescriptor);
if (!p) return GF_OUT_OF_MEM;
p->tag = tag;
p->keyBodyLength = size;
p->keyBody = (char*)gf_malloc(sizeof(char)*size);
gf_bs_read_data(bs, p->keyBody, size);
*auth = (GF_IPMPX_Authentication *)p;
return GF_OK;
}
break;
case GF_IPMPX_AUTH_AlgorithmDescr_Tag:
{
Bool isReg;
GF_IPMPX_AUTH_AlgorithmDescriptor *p;
GF_SAFEALLOC(p, GF_IPMPX_AUTH_AlgorithmDescriptor);
if (!p) return GF_OUT_OF_MEM;
p->tag = tag;
isReg = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 7);
if (isReg) {
p->regAlgoID = gf_bs_read_int(bs, 16);
} else {
p->specAlgoID = GF_IPMPX_GetByteArray(bs);
}
p->OpaqueData = GF_IPMPX_GetByteArray(bs);
*auth = (GF_IPMPX_Authentication *)p;
return GF_OK;
}
break;
default:
break;
}
return GF_NON_COMPLIANT_BITSTREAM;
}
GF_Err GF_IPMPX_ReadData(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size);
u32 gf_ipmpx_data_full_size(GF_IPMPX_Data *p)
{
u32 size;
if (!p) return 0;
size = gf_ipmpx_data_size(p);
size += 5;
size += get_field_size(size);
size += 1;
return size;
}
GF_Err gf_ipmpx_data_parse(GF_BitStream *bs, GF_IPMPX_Data **out_data)
{
GF_Err e;
u32 val, size;
u8 tag;
GF_IPMPX_Data *p;
*out_data = NULL;
tag = gf_bs_read_int(bs, 8);
size = 0;
do {
val = gf_bs_read_int(bs, 8);
size <<= 7;
size |= val & 0x7F;
} while ( val & 0x80 );
if (!size) return GF_OK;
p = gf_ipmpx_data_new(tag);
if (!p) return GF_NON_COMPLIANT_BITSTREAM;
p->Version = gf_bs_read_int(bs, 8);
p->dataID = gf_bs_read_int(bs, 32);
e = GF_IPMPX_ReadData(bs, p, size);
if (e) {
gf_ipmpx_data_del(p);
return e;
}
*out_data = p;
return GF_OK;
}
GF_Err GF_IPMPX_WriteBase(GF_BitStream *bs, GF_IPMPX_Data *p)
{
u32 size;
if (!p) return GF_BAD_PARAM;
size = gf_ipmpx_data_size(p);
size += 5;
gf_bs_write_int(bs, p->tag, 8);
write_var_size(bs, size);
gf_bs_write_int(bs, p->Version, 8);
gf_bs_write_int(bs, p->dataID, 32);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_InitAuthentication()
{
GF_IPMPX_InitAuthentication *ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_InitAuthentication, GF_IPMPX_INIT_AUTHENTICATION_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_InitAuthentication(GF_IPMPX_Data *_p)
{
GF_IPMPX_InitAuthentication *p = (GF_IPMPX_InitAuthentication*)_p;
gf_free(p);
}
static GF_Err ReadGF_IPMPX_InitAuthentication(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
GF_IPMPX_InitAuthentication *p = (GF_IPMPX_InitAuthentication*)_p;
p->Context = gf_bs_read_int(bs, 32);
p->AuthType = gf_bs_read_int(bs, 8);
return GF_OK;
}
static u32 SizeGF_IPMPX_InitAuthentication(GF_IPMPX_Data *_p)
{
return 5;
}
static GF_Err WriteGF_IPMPX_InitAuthentication(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_InitAuthentication *p = (GF_IPMPX_InitAuthentication*)_p;
gf_bs_write_int(bs, p->Context, 32);
gf_bs_write_int(bs, p->AuthType, 8);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_MutualAuthentication()
{
GF_IPMPX_MutualAuthentication *ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_MutualAuthentication, GF_IPMPX_MUTUAL_AUTHENTICATION_TAG);
ptr->candidateAlgorithms = gf_list_new();
ptr->agreedAlgorithms = gf_list_new();
ptr->certificates = gf_list_new();
return (GF_IPMPX_Data *) ptr;
}
static void delete_algo_list(GF_List *algos)
{
u32 i;
for (i=0; i<gf_list_count(algos); i++) {
GF_IPMPX_Authentication *ip_auth = (GF_IPMPX_Authentication *)gf_list_get(algos, i);
GF_IPMPX_AUTH_Delete(ip_auth);
}
gf_list_del(algos);
}
static void DelGF_IPMPX_MutualAuthentication(GF_IPMPX_Data *_p)
{
GF_IPMPX_MutualAuthentication *p = (GF_IPMPX_MutualAuthentication *)_p;
delete_algo_list(p->candidateAlgorithms);
delete_algo_list(p->agreedAlgorithms);
GF_IPMPX_DELETE_ARRAY(p->AuthenticationData);
GF_IPMPX_DELETE_ARRAY(p->opaque);
GF_IPMPX_DELETE_ARRAY(p->authCodes);
gf_ipmpx_data_del((GF_IPMPX_Data *)p->trustData);
GF_IPMPX_AUTH_Delete((GF_IPMPX_Authentication*)p->publicKey);
while (gf_list_count(p->certificates)) {
GF_IPMPX_ByteArray *ba = (GF_IPMPX_ByteArray *)gf_list_get(p->certificates, 0);
gf_list_rem(p->certificates, 0);
GF_IPMPX_DELETE_ARRAY(ba);
}
gf_list_del(p->certificates);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_MutualAuthentication(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
GF_Err e;
u32 i, count;
Bool requestNegotiation, successNegotiation, inclAuthenticationData, inclAuthCodes;
GF_IPMPX_MutualAuthentication *p = (GF_IPMPX_MutualAuthentication *)_p;
requestNegotiation = (Bool)gf_bs_read_int(bs, 1);
successNegotiation = (Bool)gf_bs_read_int(bs, 1);
p->failedNegotiation = (Bool)gf_bs_read_int(bs, 1);
inclAuthenticationData = (Bool)gf_bs_read_int(bs, 1);
inclAuthCodes = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 3);
if (requestNegotiation) {
count = gf_bs_read_int(bs, 8);
for (i=0; i<count; i++) {
GF_IPMPX_Authentication *auth;
e = GF_IPMPX_AUTH_Parse(bs, &auth);
if (e) return e;
gf_list_add(p->candidateAlgorithms, auth);
}
}
if (successNegotiation) {
count = gf_bs_read_int(bs, 8);
for (i=0; i<count; i++) {
GF_IPMPX_Authentication *auth;
e = GF_IPMPX_AUTH_Parse(bs, &auth);
if (e) return e;
gf_list_add(p->agreedAlgorithms, auth);
}
}
if (inclAuthenticationData) p->AuthenticationData = GF_IPMPX_GetByteArray(bs);
if (inclAuthCodes) {
u32 type = gf_bs_read_int(bs, 8);
switch (type) {
case 0x01:
count = gf_bs_read_int(bs, 8);
p->certType = gf_bs_read_int(bs, 32);
for (i=0; i<count; i++) {
GF_IPMPX_ByteArray *ipd = GF_IPMPX_GetByteArray(bs);
if (ipd) gf_list_add(p->certificates, ipd);
}
break;
case 0x02:
e = GF_IPMPX_AUTH_Parse(bs, (GF_IPMPX_Authentication**) &p->publicKey);
if (e) return e;
break;
case 0xFE:
p->opaque = GF_IPMPX_GetByteArray(bs);
break;
default:
break;
}
e = gf_ipmpx_data_parse(bs, (GF_IPMPX_Data **) &p->trustData);
if (e) return e;
p->authCodes = GF_IPMPX_GetByteArray(bs);
}
return GF_OK;
}
static u32 SizeGF_IPMPX_MutualAuthentication(GF_IPMPX_Data *_p)
{
u32 size, i, count;
GF_IPMPX_MutualAuthentication *p = (GF_IPMPX_MutualAuthentication *)_p;
size = 1;
count = gf_list_count(p->candidateAlgorithms);
if (count) {
size += 1;
for (i=0; i<count; i++) {
GF_IPMPX_Authentication *ip_auth = (GF_IPMPX_Authentication *)gf_list_get(p->candidateAlgorithms, i);
size += GF_IPMPX_AUTH_FullSize(ip_auth);
}
}
count = gf_list_count(p->agreedAlgorithms);
if (count) {
size += 1;
for (i=0; i<count; i++) {
GF_IPMPX_Authentication *ip_auth = (GF_IPMPX_Authentication *)gf_list_get(p->agreedAlgorithms, i);
size += GF_IPMPX_AUTH_FullSize(ip_auth);
}
}
if (p->AuthenticationData) size += GF_IPMPX_GetByteArraySize(p->AuthenticationData);
count = gf_list_count(p->certificates);
if (count || p->opaque || p->publicKey) {
size += 1;
if (count) {
size += 1+4;
for (i=0; i<count; i++) {
GF_IPMPX_ByteArray *ba = (GF_IPMPX_ByteArray *)gf_list_get(p->certificates, i);
size += GF_IPMPX_GetByteArraySize(ba);
}
}
else if (p->publicKey) {
size += GF_IPMPX_AUTH_FullSize((GF_IPMPX_Authentication*)p->publicKey);
}
else if (p->opaque) {
size += GF_IPMPX_GetByteArraySize(p->opaque);
}
size += gf_ipmpx_data_full_size((GF_IPMPX_Data *)p->trustData);
size += GF_IPMPX_GetByteArraySize(p->authCodes);
}
return size;
}
static GF_Err WriteGF_IPMPX_MutualAuthentication(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
u32 i, count;
GF_IPMPX_MutualAuthentication *p = (GF_IPMPX_MutualAuthentication *)_p;
gf_bs_write_int(bs, gf_list_count(p->candidateAlgorithms) ? 1 : 0, 1);
gf_bs_write_int(bs, gf_list_count(p->agreedAlgorithms) ? 1 : 0, 1);
gf_bs_write_int(bs, p->failedNegotiation ? 1 : 0, 1);
gf_bs_write_int(bs, p->AuthenticationData ? 1 : 0, 1);
if (gf_list_count(p->certificates) || p->opaque || p->publicKey) {
gf_bs_write_int(bs, 1, 1);
} else {
gf_bs_write_int(bs, 0, 1);
}
gf_bs_write_int(bs, 0, 3);
count = gf_list_count(p->candidateAlgorithms);
if (count) {
gf_bs_write_int(bs, count, 8);
for (i=0; i<count; i++) {
GF_IPMPX_Authentication *ip_auth = (GF_IPMPX_Authentication *)gf_list_get(p->candidateAlgorithms, i);
WriteGF_IPMPX_AUTH(bs, ip_auth);
}
}
count = gf_list_count(p->agreedAlgorithms);
if (count) {
gf_bs_write_int(bs, count, 8);
for (i=0; i<count; i++) {
GF_IPMPX_Authentication *ip_auth = (GF_IPMPX_Authentication *)gf_list_get(p->agreedAlgorithms, i);
WriteGF_IPMPX_AUTH(bs, ip_auth);
}
}
if (p->AuthenticationData) GF_IPMPX_WriteByteArray(bs, p->AuthenticationData);
count = gf_list_count(p->certificates);
if (count || p->opaque || p->publicKey) {
if (count) {
gf_bs_write_int(bs, 0x01, 8);
gf_bs_write_int(bs, count, 8);
gf_bs_write_int(bs, p->certType, 32);
for (i=0; i<count; i++) {
GF_IPMPX_ByteArray *ipd = (GF_IPMPX_ByteArray *)gf_list_get(p->certificates, i);
if (ipd) GF_IPMPX_WriteByteArray(bs, ipd);
}
}
else if (p->publicKey) {
gf_bs_write_int(bs, 0x02, 8);
WriteGF_IPMPX_AUTH(bs, (GF_IPMPX_Authentication *) p->publicKey);
}
else if (p->opaque) {
gf_bs_write_int(bs, 0xFE, 8);
GF_IPMPX_WriteByteArray(bs, p->opaque);
}
gf_ipmpx_data_write(bs, (GF_IPMPX_Data *)p->trustData);
GF_IPMPX_WriteByteArray(bs, p->authCodes);
}
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_TrustSecurityMetadata()
{
GF_IPMPX_TrustSecurityMetadata *ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_TrustSecurityMetadata, GF_IPMPX_TRUST_SECURITY_METADATA_TAG);
ptr->TrustedTools = gf_list_new();
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_TrustSecurityMetadata(GF_IPMPX_Data *_p)
{
GF_IPMPX_TrustSecurityMetadata *p = (GF_IPMPX_TrustSecurityMetadata *)_p;
while (gf_list_count(p->TrustedTools)) {
GF_IPMPX_TrustedTool *tt = (GF_IPMPX_TrustedTool *)gf_list_get(p->TrustedTools, 0);
gf_list_rem(p->TrustedTools, 0);
while (gf_list_count(tt->trustSpecifications)) {
GF_IPMPX_TrustSpecification *tts = (GF_IPMPX_TrustSpecification *)gf_list_get(tt->trustSpecifications, 0);
gf_list_rem(tt->trustSpecifications, 0);
GF_IPMPX_DELETE_ARRAY(tts->CCTrustMetadata);
gf_free(tts);
}
gf_list_del(tt->trustSpecifications);
gf_free(tt);
}
gf_list_del(p->TrustedTools);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_TrustSecurityMetadata(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
u32 nbTools, nbSpec;
GF_IPMPX_TrustSecurityMetadata *p = (GF_IPMPX_TrustSecurityMetadata *)_p;
nbTools = gf_bs_read_int(bs, 16);
while (nbTools) {
GF_IPMPX_TrustedTool *tt = (GF_IPMPX_TrustedTool *)gf_malloc(sizeof(GF_IPMPX_TrustedTool));
if (!tt) return GF_OUT_OF_MEM;
memset(tt, 0, sizeof(GF_IPMPX_TrustedTool));
tt->tag = GF_IPMPX_TRUSTED_TOOL_TAG;
nbTools--;
gf_list_add(p->TrustedTools, tt);
gf_bs_read_data(bs, (char*)tt->toolID, 16);
gf_bs_read_data(bs, tt->AuditDate, 5);
tt->trustSpecifications = gf_list_new();
nbSpec = gf_bs_read_int(bs, 16);
while (nbSpec) {
Bool has_cc;
GF_IPMPX_TrustSpecification *tts = (GF_IPMPX_TrustSpecification *)gf_malloc(sizeof(GF_IPMPX_TrustSpecification));
if (!tts) return GF_OUT_OF_MEM;
memset(tts, 0, sizeof(GF_IPMPX_TrustSpecification));
tts->tag = GF_IPMPX_TRUST_SPECIFICATION_TAG;
nbSpec--;
gf_list_add(tt->trustSpecifications, tts);
has_cc = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 7);
if (has_cc) {
tts->CCTrustMetadata = GF_IPMPX_GetByteArray(bs);
} else {
gf_bs_read_data(bs, tts->startDate, 5);
tts->attackerProfile = gf_bs_read_int(bs, 2);
gf_bs_read_int(bs, 6);
tts->trustedDuration = gf_bs_read_int(bs, 32);
}
}
}
return GF_OK;
}
static u32 SizeGF_IPMPX_TrustSecurityMetadata(GF_IPMPX_Data *_p)
{
u32 size, i, j;
GF_IPMPX_TrustSecurityMetadata *p = (GF_IPMPX_TrustSecurityMetadata *)_p;
size = 2;
for (i=0; i<gf_list_count(p->TrustedTools); i++) {
GF_IPMPX_TrustedTool *tt = (GF_IPMPX_TrustedTool *)gf_list_get(p->TrustedTools, i);
size += 23;
for (j=0; j<gf_list_count(tt->trustSpecifications); j++) {
GF_IPMPX_TrustSpecification *tts = (GF_IPMPX_TrustSpecification *)gf_list_get(tt->trustSpecifications, j);
size += 1;
if (tts->CCTrustMetadata) size += GF_IPMPX_GetByteArraySize(tts->CCTrustMetadata);
else size += 10;
}
}
return size;
}
static GF_Err WriteGF_IPMPX_TrustSecurityMetadata(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
u32 i, j, c1, c2;
GF_IPMPX_TrustSecurityMetadata *p = (GF_IPMPX_TrustSecurityMetadata *)_p;
c1 = gf_list_count(p->TrustedTools);
gf_bs_write_int(bs, c1, 16);
for (i=0; i<c1; i++) {
GF_IPMPX_TrustedTool *tt = (GF_IPMPX_TrustedTool *)gf_list_get(p->TrustedTools, i);
gf_bs_write_data(bs, (char*)tt->toolID, 16);
gf_bs_write_data(bs, (char*)tt->AuditDate, 5);
c2 = gf_list_count(tt->trustSpecifications);
gf_bs_write_int(bs, c2, 16);
for (j=0; j<c2; j++) {
GF_IPMPX_TrustSpecification *tts = (GF_IPMPX_TrustSpecification *)gf_list_get(tt->trustSpecifications, j);
gf_bs_write_int(bs, tts->CCTrustMetadata ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 7);
if (tts->CCTrustMetadata) GF_IPMPX_WriteByteArray(bs, tts->CCTrustMetadata);
else {
gf_bs_write_data(bs, tts->startDate, 5);
gf_bs_write_int(bs, tts->attackerProfile, 2);
gf_bs_write_int(bs, 0, 6);
gf_bs_write_int(bs, tts->trustedDuration, 32);
}
}
}
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_SecureContainer()
{
GF_IPMPX_SecureContainer *ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_SecureContainer, GF_IPMPX_SECURE_CONTAINER_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_SecureContainer(GF_IPMPX_Data *_p)
{
GF_IPMPX_SecureContainer *p = (GF_IPMPX_SecureContainer *)_p;
GF_IPMPX_DELETE_ARRAY(p->encryptedData);
GF_IPMPX_DELETE_ARRAY(p->MAC);
gf_ipmpx_data_del(p->protectedMsg);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_SecureContainer(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
Bool has_enc, has_mac;
GF_IPMPX_SecureContainer *p = (GF_IPMPX_SecureContainer *)_p;
has_enc = (Bool)gf_bs_read_int(bs, 1);
has_mac = (Bool)gf_bs_read_int(bs, 1);
p->isMACEncrypted = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 5);
if (has_enc) {
p->encryptedData = GF_IPMPX_GetByteArray(bs);
if (has_mac && !p->isMACEncrypted) p->MAC = GF_IPMPX_GetByteArray(bs);
} else {
GF_Err e = gf_ipmpx_data_parse(bs, &p->protectedMsg);
if (e) return e;
if (has_mac) p->MAC = GF_IPMPX_GetByteArray(bs);
}
return GF_OK;
}
static u32 SizeGF_IPMPX_SecureContainer(GF_IPMPX_Data *_p)
{
u32 size = 1;
GF_IPMPX_SecureContainer *p = (GF_IPMPX_SecureContainer *)_p;
if (p->MAC) p->isMACEncrypted = GF_FALSE;
if (p->encryptedData) {
size += GF_IPMPX_GetByteArraySize(p->encryptedData);
if (p->MAC) size += GF_IPMPX_GetByteArraySize(p->MAC);
} else {
size += gf_ipmpx_data_full_size(p->protectedMsg);
if (p->MAC) size += GF_IPMPX_GetByteArraySize(p->MAC);
}
return size;
}
static GF_Err WriteGF_IPMPX_SecureContainer(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_SecureContainer *p = (GF_IPMPX_SecureContainer *)_p;
if (p->MAC) p->isMACEncrypted = GF_FALSE;
gf_bs_write_int(bs, p->encryptedData ? 1 : 0, 1);
gf_bs_write_int(bs, (p->MAC || p->isMACEncrypted) ? 1 : 0, 1);
gf_bs_write_int(bs, p->isMACEncrypted, 1);
gf_bs_write_int(bs, 0, 5);
if (p->encryptedData) {
GF_IPMPX_WriteByteArray(bs, p->encryptedData);
if (p->MAC) GF_IPMPX_WriteByteArray(bs, p->MAC);
} else {
GF_Err e = gf_ipmpx_data_write(bs, p->protectedMsg);
if (e) return e;
if (p->MAC) GF_IPMPX_WriteByteArray(bs, p->MAC);
}
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_GetToolsResponse()
{
GF_IPMPX_GetToolsResponse *ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_GetToolsResponse, GF_IPMPX_GET_TOOLS_RESPONSE_TAG);
ptr->ipmp_tools = gf_list_new();
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_GetToolsResponse(GF_IPMPX_Data *_p)
{
GF_IPMPX_GetToolsResponse *p = (GF_IPMPX_GetToolsResponse *)_p;
while (gf_list_count(p->ipmp_tools)) {
GF_Descriptor *d = (GF_Descriptor *)gf_list_get(p->ipmp_tools, 0);
gf_list_rem(p->ipmp_tools, 0);
gf_odf_desc_del((GF_Descriptor*)d);
}
gf_list_del(p->ipmp_tools);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_GetToolsResponse(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
u32 NbBytes = 0;
GF_IPMPX_GetToolsResponse *p = (GF_IPMPX_GetToolsResponse *)_p;
while (size>NbBytes) {
u32 desc_size, start_o;
GF_Descriptor *desc;
GF_Err e;
start_o = (u32) gf_bs_get_position(bs);
e = gf_odf_parse_descriptor(bs, &desc, &desc_size);
if (e) return e;
gf_list_add(p->ipmp_tools, desc);
NbBytes += (u32) gf_bs_get_position(bs) - start_o;
}
if (size<NbBytes) return GF_NON_COMPLIANT_BITSTREAM;
return GF_OK;
}
static u32 SizeGF_IPMPX_GetToolsResponse(GF_IPMPX_Data *_p)
{
u32 size = 0;
GF_IPMPX_GetToolsResponse *p = (GF_IPMPX_GetToolsResponse *)_p;
gf_odf_size_descriptor_list(p->ipmp_tools, &size);
return size;
}
static GF_Err WriteGF_IPMPX_GetToolsResponse(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
u32 i;
GF_IPMPX_GetToolsResponse *p = (GF_IPMPX_GetToolsResponse *)_p;
for (i=0; i<gf_list_count(p->ipmp_tools); i++) {
GF_Descriptor *desc = (GF_Descriptor *)gf_list_get(p->ipmp_tools, i);
gf_odf_write_descriptor(bs, desc);
}
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_ParametricDescription()
{
GF_IPMPX_ParametricDescription *ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_ParametricDescription, GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG);
ptr->descriptions = gf_list_new();
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_ParametricDescription(GF_IPMPX_Data *_p)
{
GF_IPMPX_ParametricDescription *p = (GF_IPMPX_ParametricDescription *)_p;
GF_IPMPX_DELETE_ARRAY(p->descriptionComment);
while (gf_list_count(p->descriptions)) {
GF_IPMPX_ParametricDescriptionItem *it = (GF_IPMPX_ParametricDescriptionItem *)gf_list_get(p->descriptions, 0);
gf_list_rem(p->descriptions, 0);
GF_IPMPX_DELETE_ARRAY(it->main_class);
GF_IPMPX_DELETE_ARRAY(it->subClass);
GF_IPMPX_DELETE_ARRAY(it->typeData);
GF_IPMPX_DELETE_ARRAY(it->type);
GF_IPMPX_DELETE_ARRAY(it->addedData);
gf_free(it);
}
gf_list_del(p->descriptions);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_ParametricDescription(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
u32 count;
GF_IPMPX_ParametricDescription *p = (GF_IPMPX_ParametricDescription *)_p;
p->descriptionComment = GF_IPMPX_GetByteArray(bs);
p->majorVersion = gf_bs_read_int(bs, 8);
p->minorVersion = gf_bs_read_int(bs, 8);
count = gf_bs_read_int(bs, 32);
while (count) {
GF_IPMPX_ParametricDescriptionItem *it = (GF_IPMPX_ParametricDescriptionItem *)gf_malloc(sizeof(GF_IPMPX_ParametricDescriptionItem));
gf_list_add(p->descriptions, it);
count--;
it->main_class = GF_IPMPX_GetByteArray(bs);
it->subClass = GF_IPMPX_GetByteArray(bs);
it->typeData = GF_IPMPX_GetByteArray(bs);
it->type = GF_IPMPX_GetByteArray(bs);
it->addedData = GF_IPMPX_GetByteArray(bs);
}
return GF_OK;
}
static u32 SizeGF_IPMPX_ParametricDescription(GF_IPMPX_Data *_p)
{
u32 size, i;
GF_IPMPX_ParametricDescription *p = (GF_IPMPX_ParametricDescription *)_p;
size = GF_IPMPX_GetByteArraySize(p->descriptionComment);
size += 6;
for (i=0; i<gf_list_count(p->descriptions); i++) {
GF_IPMPX_ParametricDescriptionItem *it = (GF_IPMPX_ParametricDescriptionItem *)gf_list_get(p->descriptions, i);
size += GF_IPMPX_GetByteArraySize(it->main_class);
size += GF_IPMPX_GetByteArraySize(it->subClass);
size += GF_IPMPX_GetByteArraySize(it->typeData);
size += GF_IPMPX_GetByteArraySize(it->type);
size += GF_IPMPX_GetByteArraySize(it->addedData);
}
return size;
}
static GF_Err WriteGF_IPMPX_ParametricDescription(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
u32 i;
GF_IPMPX_ParametricDescription *p = (GF_IPMPX_ParametricDescription *)_p;
GF_IPMPX_WriteByteArray(bs, p->descriptionComment);
gf_bs_write_int(bs, p->majorVersion, 8);
gf_bs_write_int(bs, p->minorVersion, 8);
gf_bs_write_int(bs, gf_list_count(p->descriptions), 32);
for (i=0; i<gf_list_count(p->descriptions); i++) {
GF_IPMPX_ParametricDescriptionItem *it = (GF_IPMPX_ParametricDescriptionItem *)gf_list_get(p->descriptions, i);
GF_IPMPX_WriteByteArray(bs, it->main_class);
GF_IPMPX_WriteByteArray(bs, it->subClass);
GF_IPMPX_WriteByteArray(bs, it->typeData);
GF_IPMPX_WriteByteArray(bs, it->type);
GF_IPMPX_WriteByteArray(bs, it->addedData);
}
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_ToolParamCapabilitiesQuery()
{
GF_IPMPX_ToolParamCapabilitiesQuery*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_ToolParamCapabilitiesQuery, GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_ToolParamCapabilitiesQuery(GF_IPMPX_Data *_p)
{
GF_IPMPX_ToolParamCapabilitiesQuery *p = (GF_IPMPX_ToolParamCapabilitiesQuery *)_p;
gf_ipmpx_data_del((GF_IPMPX_Data *) p->description);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_ToolParamCapabilitiesQuery(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
GF_IPMPX_ToolParamCapabilitiesQuery *p = (GF_IPMPX_ToolParamCapabilitiesQuery*)_p;
return gf_ipmpx_data_parse(bs, (GF_IPMPX_Data **) &p->description);
}
static u32 SizeGF_IPMPX_ToolParamCapabilitiesQuery(GF_IPMPX_Data *_p)
{
GF_IPMPX_ToolParamCapabilitiesQuery *p = (GF_IPMPX_ToolParamCapabilitiesQuery*)_p;
return gf_ipmpx_data_full_size((GF_IPMPX_Data *) p->description);
}
static GF_Err WriteGF_IPMPX_ToolParamCapabilitiesQuery(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_ToolParamCapabilitiesQuery *p = (GF_IPMPX_ToolParamCapabilitiesQuery*)_p;
return gf_ipmpx_data_write(bs, (GF_IPMPX_Data *) p->description);
}
static GF_IPMPX_Data *NewGF_IPMPX_ToolParamCapabilitiesResponse()
{
GF_IPMPX_ToolParamCapabilitiesResponse*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_ToolParamCapabilitiesResponse, GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_ToolParamCapabilitiesResponse(GF_IPMPX_Data *_p)
{
gf_free(_p);
}
static GF_Err ReadGF_IPMPX_ToolParamCapabilitiesResponse(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
GF_IPMPX_ToolParamCapabilitiesResponse *p = (GF_IPMPX_ToolParamCapabilitiesResponse*)_p;
p->capabilitiesSupported = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 7);
return GF_OK;
}
static u32 SizeGF_IPMPX_ToolParamCapabilitiesResponse(GF_IPMPX_Data *_p)
{
return 1;
}
static GF_Err WriteGF_IPMPX_ToolParamCapabilitiesResponse(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_ToolParamCapabilitiesResponse*p = (GF_IPMPX_ToolParamCapabilitiesResponse*)_p;
gf_bs_write_int(bs, p->capabilitiesSupported, 1);
gf_bs_write_int(bs, 0, 7);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_ConnectTool()
{
GF_IPMPX_ConnectTool*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_ConnectTool, GF_IPMPX_CONNECT_TOOL_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_ConnectTool(GF_IPMPX_Data *_p)
{
GF_IPMPX_ConnectTool *p = (GF_IPMPX_ConnectTool*)_p;
if (p->toolDescriptor) gf_odf_desc_del((GF_Descriptor *)p->toolDescriptor);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_ConnectTool(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
u32 dsize;
GF_IPMPX_ConnectTool*p = (GF_IPMPX_ConnectTool*)_p;
return gf_odf_parse_descriptor(bs, (GF_Descriptor **) &p->toolDescriptor, &dsize);
}
static u32 SizeGF_IPMPX_ConnectTool(GF_IPMPX_Data *_p)
{
u32 size;
GF_IPMPX_ConnectTool*p = (GF_IPMPX_ConnectTool*)_p;
gf_odf_size_descriptor((GF_Descriptor *)p->toolDescriptor, &size);
size += gf_odf_size_field_size(size);
return size;
}
static GF_Err WriteGF_IPMPX_ConnectTool(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_ConnectTool*p = (GF_IPMPX_ConnectTool*)_p;
gf_odf_write_descriptor(bs, (GF_Descriptor *)p->toolDescriptor);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_DisconnectTool()
{
GF_IPMPX_DisconnectTool*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_DisconnectTool, GF_IPMPX_DISCONNECT_TOOL_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_DisconnectTool(GF_IPMPX_Data *_p)
{
gf_free(_p);
}
static GF_Err ReadGF_IPMPX_DisconnectTool(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
GF_IPMPX_DisconnectTool*p = (GF_IPMPX_DisconnectTool*)_p;
p->IPMP_ToolContextID = gf_bs_read_int(bs, 32);
return GF_OK;
}
static u32 SizeGF_IPMPX_DisconnectTool(GF_IPMPX_Data *_p)
{
return 4;
}
static GF_Err WriteGF_IPMPX_DisconnectTool(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_DisconnectTool*p = (GF_IPMPX_DisconnectTool*)_p;
gf_bs_write_int(bs, p->IPMP_ToolContextID, 32);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_GetToolContext()
{
GF_IPMPX_GetToolContext*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_GetToolContext, GF_IPMPX_GET_TOOL_CONTEXT_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_GetToolContext(GF_IPMPX_Data *_p)
{
gf_free(_p);
}
static GF_Err ReadGF_IPMPX_GetToolContext(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
Bool has_idex;
GF_IPMPX_GetToolContext*p = (GF_IPMPX_GetToolContext*)_p;
p->scope = gf_bs_read_int(bs, 3);
has_idex = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 4);
if (has_idex) p->IPMP_DescriptorIDEx = gf_bs_read_int(bs, 16);
return GF_OK;
}
static u32 SizeGF_IPMPX_GetToolContext(GF_IPMPX_Data *_p)
{
GF_IPMPX_GetToolContext*p = (GF_IPMPX_GetToolContext*)_p;
return p->IPMP_DescriptorIDEx ? 3 : 1;
}
static GF_Err WriteGF_IPMPX_GetToolContext(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_GetToolContext*p = (GF_IPMPX_GetToolContext*)_p;
gf_bs_write_int(bs, p->scope, 3);
gf_bs_write_int(bs, p->IPMP_DescriptorIDEx ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 4);
if (p->IPMP_DescriptorIDEx) gf_bs_write_int(bs, p->IPMP_DescriptorIDEx, 16);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_GetToolContextResponse()
{
GF_IPMPX_GetToolContextResponse*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_GetToolContextResponse, GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_GetToolContextResponse(GF_IPMPX_Data *_p)
{
gf_free(_p);
}
static GF_Err ReadGF_IPMPX_GetToolContextResponse(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
Bool has_esid;
GF_IPMPX_GetToolContextResponse*p = (GF_IPMPX_GetToolContextResponse*)_p;
has_esid = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 5);
p->OD_ID = gf_bs_read_int(bs, 10);
if (has_esid) p->ESD_ID = gf_bs_read_int(bs, 16);
p->IPMP_ToolContextID = gf_bs_read_int(bs, 32);
return GF_OK;
}
static u32 SizeGF_IPMPX_GetToolContextResponse(GF_IPMPX_Data *_p)
{
GF_IPMPX_GetToolContextResponse*p = (GF_IPMPX_GetToolContextResponse*)_p;
return p->ESD_ID ? 8 : 6;
}
static GF_Err WriteGF_IPMPX_GetToolContextResponse(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_GetToolContextResponse*p = (GF_IPMPX_GetToolContextResponse*)_p;
gf_bs_write_int(bs, p->ESD_ID ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 5);
gf_bs_write_int(bs, p->OD_ID, 10);
if (p->ESD_ID) gf_bs_write_int(bs, p->ESD_ID, 16);
gf_bs_write_int(bs, p->IPMP_ToolContextID, 32);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_AddToolNotificationListener()
{
GF_IPMPX_AddToolNotificationListener*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_AddToolNotificationListener, GF_IPMPX_ADD_TOOL_LISTENER_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_AddToolNotificationListener(GF_IPMPX_Data *_p)
{
gf_free(_p);
}
static GF_Err ReadGF_IPMPX_AddToolNotificationListener(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
u32 i;
GF_IPMPX_AddToolNotificationListener*p = (GF_IPMPX_AddToolNotificationListener*)_p;
p->scope = gf_bs_read_int(bs, 3);
gf_bs_read_int(bs, 5);
p->eventTypeCount = gf_bs_read_int(bs, 8);
for (i=0; i<p->eventTypeCount; i++) p->eventType[i] = gf_bs_read_int(bs, 8);
return GF_OK;
}
static u32 SizeGF_IPMPX_AddToolNotificationListener(GF_IPMPX_Data *_p)
{
GF_IPMPX_AddToolNotificationListener*p = (GF_IPMPX_AddToolNotificationListener*)_p;
return p->eventTypeCount + 2;
}
static GF_Err WriteGF_IPMPX_AddToolNotificationListener(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
u32 i;
GF_IPMPX_AddToolNotificationListener*p = (GF_IPMPX_AddToolNotificationListener*)_p;
gf_bs_write_int(bs, p->scope, 3);
gf_bs_write_int(bs, 0, 5);
gf_bs_write_int(bs, p->eventTypeCount, 8);
for (i=0; i<p->eventTypeCount; i++) gf_bs_write_int(bs, p->eventType[i], 8);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_RemoveToolNotificationListener()
{
GF_IPMPX_RemoveToolNotificationListener*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_RemoveToolNotificationListener, GF_IPMPX_REMOVE_TOOL_LISTENER_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_RemoveToolNotificationListener(GF_IPMPX_Data *_p)
{
gf_free(_p);
}
static GF_Err ReadGF_IPMPX_RemoveToolNotificationListener(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
u32 i;
GF_IPMPX_RemoveToolNotificationListener*p = (GF_IPMPX_RemoveToolNotificationListener*)_p;
p->eventTypeCount = gf_bs_read_int(bs, 8);
for (i=0; i<p->eventTypeCount; i++) p->eventType[i] = gf_bs_read_int(bs, 8);
return GF_OK;
}
static u32 SizeGF_IPMPX_RemoveToolNotificationListener(GF_IPMPX_Data *_p)
{
GF_IPMPX_RemoveToolNotificationListener*p = (GF_IPMPX_RemoveToolNotificationListener*)_p;
return p->eventTypeCount + 1;
}
static GF_Err WriteGF_IPMPX_RemoveToolNotificationListener(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
u32 i;
GF_IPMPX_RemoveToolNotificationListener*p = (GF_IPMPX_RemoveToolNotificationListener*)_p;
gf_bs_write_int(bs, p->eventTypeCount, 8);
for (i=0; i<p->eventTypeCount; i++) gf_bs_write_int(bs, p->eventType[i], 8);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_NotifyToolEvent()
{
GF_IPMPX_NotifyToolEvent*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_NotifyToolEvent, GF_IPMPX_NOTIFY_TOOL_EVENT_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_NotifyToolEvent(GF_IPMPX_Data *_p)
{
gf_free(_p);
}
static GF_Err ReadGF_IPMPX_NotifyToolEvent(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
Bool has_id;
GF_IPMPX_NotifyToolEvent*p = (GF_IPMPX_NotifyToolEvent*)_p;
has_id = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 7);
if (has_id) {
p->OD_ID = gf_bs_read_int(bs, 10);
gf_bs_read_int(bs, 6);
p->ESD_ID = gf_bs_read_int(bs, 16);
}
p->eventType = gf_bs_read_int(bs, 8);
p->IPMP_ToolContextID = gf_bs_read_int(bs, 32);
return GF_OK;
}
static u32 SizeGF_IPMPX_NotifyToolEvent(GF_IPMPX_Data *_p)
{
GF_IPMPX_NotifyToolEvent*p = (GF_IPMPX_NotifyToolEvent*)_p;
return (p->OD_ID || p->ESD_ID) ? 10 : 6;
}
static GF_Err WriteGF_IPMPX_NotifyToolEvent(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_NotifyToolEvent*p = (GF_IPMPX_NotifyToolEvent*)_p;
gf_bs_write_int(bs, (p->OD_ID || p->ESD_ID) ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 7);
if (p->OD_ID || p->ESD_ID) {
gf_bs_write_int(bs, p->OD_ID, 10);
gf_bs_write_int(bs, 0, 6);
gf_bs_write_int(bs, p->ESD_ID, 16);
}
gf_bs_write_int(bs, p->eventType, 8);
gf_bs_write_int(bs, p->IPMP_ToolContextID, 32);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_CanProcess()
{
GF_IPMPX_CanProcess*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_CanProcess, GF_IPMPX_CAN_PROCESS_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_CanProcess(GF_IPMPX_Data *_p)
{
gf_free(_p);
}
static GF_Err ReadGF_IPMPX_CanProcess(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
GF_IPMPX_CanProcess*p = (GF_IPMPX_CanProcess*)_p;
p->canProcess = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 7);
return GF_OK;
}
static u32 SizeGF_IPMPX_CanProcess(GF_IPMPX_Data *_p)
{
return 1;
}
static GF_Err WriteGF_IPMPX_CanProcess(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_CanProcess*p = (GF_IPMPX_CanProcess*)_p;
gf_bs_write_int(bs, p->canProcess ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 7);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_OpaqueData(u8 tag)
{
GF_IPMPX_OpaqueData*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_OpaqueData, tag);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_OpaqueData(GF_IPMPX_Data *_p)
{
GF_IPMPX_OpaqueData *p = (GF_IPMPX_OpaqueData*)_p;
GF_IPMPX_DELETE_ARRAY(p->opaqueData);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_OpaqueData(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
GF_IPMPX_OpaqueData*p = (GF_IPMPX_OpaqueData*)_p;
p->opaqueData = GF_IPMPX_GetByteArray(bs);
return GF_OK;
}
static u32 SizeGF_IPMPX_OpaqueData(GF_IPMPX_Data *_p)
{
GF_IPMPX_OpaqueData*p = (GF_IPMPX_OpaqueData*)_p;
return GF_IPMPX_GetByteArraySize(p->opaqueData);
}
static GF_Err WriteGF_IPMPX_OpaqueData(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_OpaqueData*p = (GF_IPMPX_OpaqueData*)_p;
GF_IPMPX_WriteByteArray(bs, p->opaqueData);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_KeyData()
{
GF_IPMPX_KeyData*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_KeyData, GF_IPMPX_KEY_DATA_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_KeyData(GF_IPMPX_Data *_p)
{
GF_IPMPX_KeyData*p = (GF_IPMPX_KeyData*)_p;
GF_IPMPX_DELETE_ARRAY(p->keyBody);
GF_IPMPX_DELETE_ARRAY(p->OpaqueData);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_KeyData(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
GF_IPMPX_KeyData*p = (GF_IPMPX_KeyData*)_p;
p->keyBody = GF_IPMPX_GetByteArray(bs);
p->flags = 0;
if (gf_bs_read_int(bs, 1)) p->flags |= 1;
if (gf_bs_read_int(bs, 1)) p->flags |= 1<<1;
if (gf_bs_read_int(bs, 1)) p->flags |= 1<<2;
if (gf_bs_read_int(bs, 1)) p->flags |= 1<<3;
gf_bs_read_int(bs, 4);
if (p->flags & (1)) p->startDTS = gf_bs_read_long_int(bs, 64);
if (p->flags & (1<<1)) p->startPacketID = gf_bs_read_int(bs, 32);
if (p->flags & (1<<2)) p->expireDTS = gf_bs_read_long_int(bs, 64);
if (p->flags & (1<<3)) p->expirePacketID = gf_bs_read_int(bs, 32);
p->OpaqueData = GF_IPMPX_GetByteArray(bs);
return GF_OK;
}
static u32 SizeGF_IPMPX_KeyData(GF_IPMPX_Data *_p)
{
u32 size = 0;
GF_IPMPX_KeyData*p = (GF_IPMPX_KeyData*)_p;
size += GF_IPMPX_GetByteArraySize(p->keyBody);
size += 1;
if (p->flags & (1)) size += 8;
if (p->flags & (1<<1)) size += 4;
if (p->flags & (1<<2)) size += 8;
if (p->flags & (1<<3)) size += 4;
size += GF_IPMPX_GetByteArraySize(p->OpaqueData);
return size;
}
static GF_Err WriteGF_IPMPX_KeyData(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_KeyData*p = (GF_IPMPX_KeyData*)_p;
GF_IPMPX_WriteByteArray(bs, p->keyBody);
gf_bs_write_int(bs, (p->flags & (1)) ? 1 : 0, 1);
gf_bs_write_int(bs, (p->flags & (1<<1)) ? 1 : 0, 1);
gf_bs_write_int(bs, (p->flags & (1<<2)) ? 1 : 0, 1);
gf_bs_write_int(bs, (p->flags & (1<<3)) ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 4);
if (p->flags & (1)) gf_bs_write_long_int(bs, p->startDTS, 64);
if (p->flags & (1<<1)) gf_bs_write_int(bs, p->startPacketID, 32);
if (p->flags & (1<<2)) gf_bs_write_long_int(bs, p->expireDTS, 64);
if (p->flags & (1<<3)) gf_bs_write_int(bs, p->expirePacketID, 32);
GF_IPMPX_WriteByteArray(bs, p->OpaqueData);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_SelectiveDecryptionInit()
{
GF_IPMPX_SelectiveDecryptionInit*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_SelectiveDecryptionInit, GF_IPMPX_SEL_DEC_INIT_TAG);
ptr->SelEncBuffer = gf_list_new();
ptr->SelEncFields = gf_list_new();
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_SelectiveDecryptionInit(GF_IPMPX_Data *_p)
{
GF_IPMPX_SelectiveDecryptionInit*p = (GF_IPMPX_SelectiveDecryptionInit*)_p;
while (gf_list_count(p->SelEncBuffer)) {
GF_IPMPX_SelEncBuffer *sb = (GF_IPMPX_SelEncBuffer *)gf_list_get(p->SelEncBuffer, 0);
gf_list_rem(p->SelEncBuffer, 0);
GF_IPMPX_DELETE_ARRAY(sb->Stream_Cipher_Specific_Init_Info);
gf_free(sb);
}
gf_list_del(p->SelEncBuffer);
while (gf_list_count(p->SelEncFields)) {
GF_IPMPX_SelEncField*sf = (GF_IPMPX_SelEncField*)gf_list_get(p->SelEncFields, 0);
gf_list_rem(p->SelEncFields, 0);
GF_IPMPX_DELETE_ARRAY(sf->shuffleSpecificInfo);
if (sf->mappingTable) gf_free(sf->mappingTable);
gf_free(sf);
}
gf_list_del(p->SelEncFields);
if (p->RLE_Data) gf_free(p->RLE_Data);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_SelectiveDecryptionInit(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
u32 count, i;
Bool is_spec;
GF_IPMPX_SelectiveDecryptionInit*p = (GF_IPMPX_SelectiveDecryptionInit*)_p;
p->mediaTypeExtension = gf_bs_read_int(bs, 8);
p->mediaTypeIndication = gf_bs_read_int(bs, 8);
p->profileLevelIndication = gf_bs_read_int(bs, 8);
p->compliance = gf_bs_read_int(bs, 8);
count = gf_bs_read_int(bs, 8);
while (count) {
Bool is_block;
GF_IPMPX_SelEncBuffer *sb;
GF_SAFEALLOC(sb, GF_IPMPX_SelEncBuffer);
if (!sb) return GF_OUT_OF_MEM;
gf_list_add(p->SelEncBuffer, sb);
count--;
gf_bs_read_data(bs, (char*)sb->cipher_Id, 16);
sb->syncBoundary = gf_bs_read_int(bs, 8);
is_block = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 7);
if (is_block) {
sb->mode = gf_bs_read_int(bs, 8);
sb->blockSize = gf_bs_read_int(bs, 16);
sb->keySize = gf_bs_read_int(bs, 16);
} else {
sb->Stream_Cipher_Specific_Init_Info = GF_IPMPX_GetByteArray(bs);
}
}
is_spec = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 7);
if (is_spec) {
Bool is_map;
count = gf_bs_read_int(bs, 8);
while (count) {
GF_IPMPX_SelEncField *sf;
GF_SAFEALLOC(sf, GF_IPMPX_SelEncField);
if (!sf) return GF_OUT_OF_MEM;
gf_list_add(p->SelEncFields, sf);
count--;
sf->field_Id = gf_bs_read_int(bs, 8);
sf->field_Scope = gf_bs_read_int(bs, 3);
gf_bs_read_int(bs, 5);
sf->buf = gf_bs_read_int(bs, 8);
is_map = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 7);
if (is_map) {
Bool sendMapTable = (Bool)gf_bs_read_int(bs, 1);
Bool isShuffled = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 6);
if (sendMapTable) {
sf->mappingTableSize = gf_bs_read_int(bs, 16);
sf->mappingTable = (u16*)gf_malloc(sizeof(u16) * sf->mappingTableSize);
for (i=0; i<sf->mappingTableSize; i++) sf->mappingTable[i] = gf_bs_read_int(bs, 16);
}
if (isShuffled) sf->shuffleSpecificInfo = GF_IPMPX_GetByteArray(bs);
}
}
} else {
p->RLE_DataLength = gf_bs_read_int(bs, 16);
p->RLE_Data = (u16*)gf_malloc(sizeof(u16)*p->RLE_DataLength);
for (i=0; i<p->RLE_DataLength; i++) p->RLE_Data[i] = gf_bs_read_int(bs, 16);
}
return GF_OK;
}
static u32 SizeGF_IPMPX_SelectiveDecryptionInit(GF_IPMPX_Data *_p)
{
u32 size, i;
GF_IPMPX_SelectiveDecryptionInit*p = (GF_IPMPX_SelectiveDecryptionInit*)_p;
size = 5;
for (i=0; i<gf_list_count(p->SelEncBuffer); i++) {
GF_IPMPX_SelEncBuffer *sb = (GF_IPMPX_SelEncBuffer *)gf_list_get(p->SelEncBuffer, i);
size += 18;
if (sb->Stream_Cipher_Specific_Init_Info) {
size += GF_IPMPX_GetByteArraySize(sb->Stream_Cipher_Specific_Init_Info);
} else {
size += 5;
}
}
size += 1;
if (p->RLE_Data) {
size += 2 + 2*p->RLE_DataLength;
} else {
size += 1;
for (i=0; i<gf_list_count(p->SelEncFields); i++) {
GF_IPMPX_SelEncField *sf = (GF_IPMPX_SelEncField *)gf_list_get(p->SelEncFields, i);
size += 4;
if (sf->mappingTable || sf->shuffleSpecificInfo) {
size += 1;
if (sf->mappingTable) size += 2 + 2*sf->mappingTableSize;
if (sf->shuffleSpecificInfo) size += GF_IPMPX_GetByteArraySize(sf->shuffleSpecificInfo);
}
}
}
return size;
}
static GF_Err WriteGF_IPMPX_SelectiveDecryptionInit(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
u32 count, i, j;
GF_IPMPX_SelectiveDecryptionInit*p = (GF_IPMPX_SelectiveDecryptionInit*)_p;
gf_bs_write_int(bs, p->mediaTypeExtension, 8);
gf_bs_write_int(bs, p->mediaTypeIndication, 8);
gf_bs_write_int(bs, p->profileLevelIndication, 8);
gf_bs_write_int(bs, p->compliance, 8);
count = gf_list_count(p->SelEncBuffer);
gf_bs_write_int(bs, count, 8);
for (i=0; i<count; i++) {
GF_IPMPX_SelEncBuffer *sb = (GF_IPMPX_SelEncBuffer *)gf_list_get(p->SelEncBuffer, i);
gf_bs_write_data(bs, (char*)sb->cipher_Id, 16);
gf_bs_write_int(bs, sb->syncBoundary, 8);
gf_bs_write_int(bs, sb->Stream_Cipher_Specific_Init_Info ? 0 : 1, 1);
gf_bs_write_int(bs, 0, 7);
if (sb->Stream_Cipher_Specific_Init_Info) {
GF_IPMPX_WriteByteArray(bs, sb->Stream_Cipher_Specific_Init_Info);
} else {
gf_bs_write_int(bs, sb->mode, 8);
gf_bs_write_int(bs, sb->blockSize, 16);
gf_bs_write_int(bs, sb->keySize, 16);
}
}
gf_bs_write_int(bs, p->RLE_Data ? 0 : 1, 1);
gf_bs_write_int(bs, 0, 7);
if (p->RLE_Data) {
gf_bs_write_int(bs, p->RLE_DataLength, 16);
for (i=0; i<p->RLE_DataLength; i++) gf_bs_write_int(bs, p->RLE_Data[i], 16);
} else {
count = gf_list_count(p->SelEncFields);
gf_bs_write_int(bs, count, 8);
for (i=0; i<count; i++) {
GF_IPMPX_SelEncField *sf = (GF_IPMPX_SelEncField *)gf_list_get(p->SelEncFields, i);
gf_bs_write_int(bs, sf->field_Id, 8);
gf_bs_write_int(bs, sf->field_Scope, 3);
gf_bs_write_int(bs, 0, 5);
gf_bs_write_int(bs, sf->buf, 8);
gf_bs_write_int(bs, (sf->mappingTable || sf->shuffleSpecificInfo) ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 7);
if (sf->mappingTable || sf->shuffleSpecificInfo) {
gf_bs_write_int(bs, sf->mappingTable ? 1 : 0, 1);
gf_bs_write_int(bs, sf->shuffleSpecificInfo ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 6);
if (sf->mappingTable) {
gf_bs_write_int(bs, sf->mappingTableSize, 16);
for (j=0; j<sf->mappingTableSize; j++) gf_bs_write_int(bs, sf->mappingTable[j], 16);
}
if (sf->shuffleSpecificInfo) GF_IPMPX_WriteByteArray(bs, sf->shuffleSpecificInfo);
}
}
}
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_WatermarkingInit(u8 tag)
{
GF_IPMPX_WatermarkingInit *ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_WatermarkingInit, tag);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_WatermarkingInit(GF_IPMPX_Data *_p)
{
GF_IPMPX_WatermarkingInit *p = (GF_IPMPX_WatermarkingInit*)_p;
if (p->wmPayload) gf_free(p->wmPayload);
if (p->opaqueData) gf_free(p->opaqueData);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_WatermarkingInit(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
Bool has_opaque_data;
GF_IPMPX_WatermarkingInit *p = (GF_IPMPX_WatermarkingInit*)_p;
p->inputFormat = gf_bs_read_int(bs, 8);
p->requiredOp = gf_bs_read_int(bs, 4);
has_opaque_data = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 3);
if (p->inputFormat==0x01) {
if (p->tag == GF_IPMPX_AUDIO_WM_INIT_TAG) {
p->nChannels = gf_bs_read_int(bs, 8);
p->bitPerSample = gf_bs_read_int(bs, 8);
p->frequency = gf_bs_read_int(bs, 32);
} else {
p->frame_horizontal_size = gf_bs_read_int(bs, 16);
p->frame_vertical_size = gf_bs_read_int(bs, 16);
p->chroma_format = gf_bs_read_int(bs, 8);
}
}
switch (p->requiredOp) {
case GF_IPMPX_WM_INSERT:
case GF_IPMPX_WM_REMARK:
p->wmPayloadLen = gf_bs_read_int(bs, 16);
p->wmPayload = (char*)gf_malloc(sizeof(u8) * p->wmPayloadLen);
gf_bs_read_data(bs, p->wmPayload, p->wmPayloadLen);
break;
case GF_IPMPX_WM_EXTRACT:
case GF_IPMPX_WM_DETECT_COMPRESSION:
p->wmRecipientId = gf_bs_read_int(bs, 16);
break;
}
if (has_opaque_data) {
p->opaqueDataSize = gf_bs_read_int(bs, 16);
p->opaqueData = (char*)gf_malloc(sizeof(u8) * p->wmPayloadLen);
gf_bs_read_data(bs, p->opaqueData, p->opaqueDataSize);
}
return GF_OK;
}
static u32 SizeGF_IPMPX_WatermarkingInit(GF_IPMPX_Data *_p)
{
u32 size;
GF_IPMPX_WatermarkingInit *p = (GF_IPMPX_WatermarkingInit*)_p;
size = 2;
if (p->inputFormat==0x01) size += (p->tag == GF_IPMPX_AUDIO_WM_INIT_TAG) ? 6 : 5;
switch (p->requiredOp) {
case GF_IPMPX_WM_INSERT:
case GF_IPMPX_WM_REMARK:
size += 2+p->wmPayloadLen;
break;
case GF_IPMPX_WM_EXTRACT:
case GF_IPMPX_WM_DETECT_COMPRESSION:
size += 2;
break;
}
if (p->opaqueData) size += p->opaqueDataSize + 2;
return size;
}
static GF_Err WriteGF_IPMPX_WatermarkingInit(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_WatermarkingInit*p = (GF_IPMPX_WatermarkingInit*)_p;
gf_bs_write_int(bs, p->inputFormat, 8);
gf_bs_write_int(bs, p->requiredOp, 4);
gf_bs_write_int(bs, p->opaqueData ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 3);
if (p->inputFormat==0x01) {
if (p->tag == GF_IPMPX_AUDIO_WM_INIT_TAG) {
gf_bs_write_int(bs, p->nChannels, 8);
gf_bs_write_int(bs, p->bitPerSample, 8);
gf_bs_write_int(bs, p->frequency, 32);
} else {
gf_bs_write_int(bs, p->frame_horizontal_size, 16);
gf_bs_write_int(bs, p->frame_vertical_size, 16);
gf_bs_write_int(bs, p->chroma_format, 8);
}
}
switch (p->requiredOp) {
case GF_IPMPX_WM_INSERT:
case GF_IPMPX_WM_REMARK:
gf_bs_write_int(bs, p->wmPayloadLen, 16);
gf_bs_write_data(bs, p->wmPayload, p->wmPayloadLen);
break;
case GF_IPMPX_WM_EXTRACT:
case GF_IPMPX_WM_DETECT_COMPRESSION:
gf_bs_write_int(bs, p->wmRecipientId, 16);
break;
}
if (p->opaqueData) {
gf_bs_write_int(bs, p->opaqueDataSize, 16);
gf_bs_write_data(bs, p->opaqueData, p->opaqueDataSize);
}
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_SendWatermark(u8 tag)
{
GF_IPMPX_SendWatermark*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_SendWatermark, tag);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_SendWatermark(GF_IPMPX_Data *_p)
{
GF_IPMPX_SendWatermark*p = (GF_IPMPX_SendWatermark*)_p;
GF_IPMPX_DELETE_ARRAY(p->payload);
GF_IPMPX_DELETE_ARRAY(p->opaqueData);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_SendWatermark(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
Bool has_op_data;
GF_IPMPX_SendWatermark *p = (GF_IPMPX_SendWatermark*)_p;
p->wm_status = gf_bs_read_int(bs, 2);
p->compression_status = gf_bs_read_int(bs, 2);
has_op_data = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 3);
if (p->wm_status==GF_IPMPX_WM_PAYLOAD) p->payload = GF_IPMPX_GetByteArray(bs);
if (has_op_data) p->opaqueData = GF_IPMPX_GetByteArray(bs);
return GF_OK;
}
static u32 SizeGF_IPMPX_SendWatermark(GF_IPMPX_Data *_p)
{
u32 size;
GF_IPMPX_SendWatermark *p = (GF_IPMPX_SendWatermark*)_p;
size = 1;
if (p->payload) size += GF_IPMPX_GetByteArraySize(p->payload);
if (p->opaqueData) size += GF_IPMPX_GetByteArraySize(p->opaqueData);
return size;
}
static GF_Err WriteGF_IPMPX_SendWatermark(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_SendWatermark*p = (GF_IPMPX_SendWatermark*)_p;
if (p->payload) p->wm_status = GF_IPMPX_WM_PAYLOAD;
gf_bs_write_int(bs, p->wm_status, 2);
gf_bs_write_int(bs, p->compression_status, 2);
gf_bs_write_int(bs, p->opaqueData ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 3);
if (p->payload) GF_IPMPX_WriteByteArray(bs, p->payload);
if (p->opaqueData) GF_IPMPX_WriteByteArray(bs, p->opaqueData);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_ToolAPI_Config()
{
GF_IPMPX_ToolAPI_Config*ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_ToolAPI_Config, GF_IPMPX_TOOL_API_CONFIG_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_ToolAPI_Config(GF_IPMPX_Data *_p)
{
GF_IPMPX_ToolAPI_Config*p = (GF_IPMPX_ToolAPI_Config*)_p;
GF_IPMPX_DELETE_ARRAY(p->opaqueData);
gf_free(p);
}
static GF_Err ReadGF_IPMPX_ToolAPI_Config(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
Bool has_i, has_m;
GF_IPMPX_ToolAPI_Config*p = (GF_IPMPX_ToolAPI_Config*)_p;
has_i = (Bool)gf_bs_read_int(bs, 1);
has_m = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 6);
if (has_i) p->Instantiation_API_ID = gf_bs_read_int(bs, 32);
if (has_m) p->Messaging_API_ID = gf_bs_read_int(bs, 32);
p->opaqueData = GF_IPMPX_GetByteArray(bs);
return GF_OK;
}
static u32 SizeGF_IPMPX_ToolAPI_Config(GF_IPMPX_Data *_p)
{
u32 size;
GF_IPMPX_ToolAPI_Config *p = (GF_IPMPX_ToolAPI_Config*)_p;
size = 1;
if (p->Instantiation_API_ID) size += 4;
if (p->Messaging_API_ID ) size += 4;
size += GF_IPMPX_GetByteArraySize(p->opaqueData);
return size;
}
static GF_Err WriteGF_IPMPX_ToolAPI_Config(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_ToolAPI_Config*p = (GF_IPMPX_ToolAPI_Config*)_p;
gf_bs_write_int(bs, p->Instantiation_API_ID ? 1 : 0, 1);
gf_bs_write_int(bs, p->Messaging_API_ID ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 6);
if (p->Instantiation_API_ID) gf_bs_write_int(bs, p->Instantiation_API_ID, 32);
if (p->Messaging_API_ID) gf_bs_write_int(bs, p->Messaging_API_ID, 32);
GF_IPMPX_WriteByteArray(bs, p->opaqueData);
return GF_OK;
}
static GF_IPMPX_Data *NewGF_IPMPX_ISMACryp()
{
GF_IPMPX_ISMACryp *ptr;
GF_IPMPX_DATA_ALLOC(ptr, GF_IPMPX_ISMACryp, GF_IPMPX_ISMACRYP_TAG);
return (GF_IPMPX_Data *) ptr;
}
static void DelGF_IPMPX_ISMACryp(GF_IPMPX_Data *_p)
{
GF_IPMPX_ISMACryp*p = (GF_IPMPX_ISMACryp*)_p;
gf_free(p);
}
static GF_Err ReadGF_IPMPX_ISMACryp(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 size)
{
GF_IPMPX_ISMACryp*p = (GF_IPMPX_ISMACryp*)_p;
p->cryptoSuite = gf_bs_read_int(bs, 8);
p->IV_length = gf_bs_read_int(bs, 8);
p->use_selective_encryption = (Bool)gf_bs_read_int(bs, 1);
gf_bs_read_int(bs, 7);
p->key_indicator_length = gf_bs_read_int(bs, 8);
return GF_OK;
}
static u32 SizeGF_IPMPX_ISMACryp(GF_IPMPX_Data *_p)
{
return 4;
}
static GF_Err WriteGF_IPMPX_ISMACryp(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_IPMPX_ISMACryp*p = (GF_IPMPX_ISMACryp*)_p;
gf_bs_write_int(bs, p->cryptoSuite, 8);
gf_bs_write_int(bs, p->IV_length, 8);
gf_bs_write_int(bs, p->use_selective_encryption ? 1 : 0, 1);
gf_bs_write_int(bs, 0, 7);
gf_bs_write_int(bs, p->key_indicator_length, 8);
return GF_OK;
}
GF_IPMPX_Data *gf_ipmpx_data_new(u8 tag)
{
switch (tag) {
case GF_IPMPX_RIGHTS_DATA_TAG:
case GF_IPMPX_OPAQUE_DATA_TAG:
return NewGF_IPMPX_OpaqueData(tag);
case GF_IPMPX_KEY_DATA_TAG:
return NewGF_IPMPX_KeyData();
case GF_IPMPX_SECURE_CONTAINER_TAG:
return NewGF_IPMPX_SecureContainer();
case GF_IPMPX_ADD_TOOL_LISTENER_TAG:
return NewGF_IPMPX_AddToolNotificationListener();
case GF_IPMPX_REMOVE_TOOL_LISTENER_TAG:
return NewGF_IPMPX_RemoveToolNotificationListener();
case GF_IPMPX_INIT_AUTHENTICATION_TAG:
return NewGF_IPMPX_InitAuthentication();
case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG:
return NewGF_IPMPX_MutualAuthentication();
case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG:
return NewGF_IPMPX_ParametricDescription();
case GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG:
return NewGF_IPMPX_ToolParamCapabilitiesQuery();
case GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG:
return NewGF_IPMPX_ToolParamCapabilitiesResponse();
case GF_IPMPX_GET_TOOLS_RESPONSE_TAG:
return NewGF_IPMPX_GetToolsResponse();
case GF_IPMPX_GET_TOOL_CONTEXT_TAG:
return NewGF_IPMPX_GetToolContext();
case GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG:
return NewGF_IPMPX_GetToolContextResponse();
case GF_IPMPX_CONNECT_TOOL_TAG:
return NewGF_IPMPX_ConnectTool();
case GF_IPMPX_DISCONNECT_TOOL_TAG:
return NewGF_IPMPX_DisconnectTool();
case GF_IPMPX_NOTIFY_TOOL_EVENT_TAG:
return NewGF_IPMPX_NotifyToolEvent();
case GF_IPMPX_CAN_PROCESS_TAG:
return NewGF_IPMPX_CanProcess();
case GF_IPMPX_TRUST_SECURITY_METADATA_TAG:
return NewGF_IPMPX_TrustSecurityMetadata();
case GF_IPMPX_ISMACRYP_TAG:
return NewGF_IPMPX_ISMACryp();
case GF_IPMPX_GET_TOOLS_TAG:
{
GF_IPMPX_Data *p;
GF_IPMPX_DATA_ALLOC(p, GF_IPMPX_Data, GF_IPMPX_GET_TOOLS_TAG);
return p;
}
case GF_IPMPX_TRUSTED_TOOL_TAG:
{
GF_IPMPX_TrustedTool *p;
GF_IPMPX_DATA_ALLOC(p, GF_IPMPX_TrustedTool, GF_IPMPX_TRUSTED_TOOL_TAG);
p->trustSpecifications = gf_list_new();
return (GF_IPMPX_Data *)p;
}
case GF_IPMPX_TRUST_SPECIFICATION_TAG:
{
GF_IPMPX_TrustSpecification *p;
GF_IPMPX_DATA_ALLOC(p, GF_IPMPX_TrustSpecification, GF_IPMPX_TRUST_SPECIFICATION_TAG);
return (GF_IPMPX_Data *)p;
}
case GF_IPMPX_TOOL_API_CONFIG_TAG:
return NewGF_IPMPX_ToolAPI_Config();
case GF_IPMPX_SEL_DEC_INIT_TAG:
return NewGF_IPMPX_SelectiveDecryptionInit();
case GF_IPMPX_AUDIO_WM_INIT_TAG:
case GF_IPMPX_VIDEO_WM_INIT_TAG:
return NewGF_IPMPX_WatermarkingInit(tag);
case GF_IPMPX_AUDIO_WM_SEND_TAG:
case GF_IPMPX_VIDEO_WM_SEND_TAG:
return NewGF_IPMPX_SendWatermark(tag);
case GF_IPMPX_ALGORITHM_DESCRIPTOR_TAG:
{
GF_IPMPX_AUTH_AlgorithmDescriptor *p = (GF_IPMPX_AUTH_AlgorithmDescriptor *)gf_malloc(sizeof(GF_IPMPX_AUTH_AlgorithmDescriptor));
if (!p) return NULL;
memset(p, 0, sizeof(GF_IPMPX_AUTH_AlgorithmDescriptor));
p->tag = GF_IPMPX_ALGORITHM_DESCRIPTOR_TAG;
return (GF_IPMPX_Data *) p;
}
case GF_IPMPX_KEY_DESCRIPTOR_TAG:
{
GF_IPMPX_AUTH_KeyDescriptor *p = (GF_IPMPX_AUTH_KeyDescriptor *)gf_malloc(sizeof(GF_IPMPX_AUTH_KeyDescriptor));
if (!p) return NULL;
memset(p, 0, sizeof(GF_IPMPX_AUTH_KeyDescriptor));
p->tag = GF_IPMPX_KEY_DESCRIPTOR_TAG;
return (GF_IPMPX_Data *) p;
}
case GF_IPMPX_PARAM_DESCRIPTOR_ITEM_TAG:
{
GF_IPMPX_AUTH_KeyDescriptor *p = (GF_IPMPX_AUTH_KeyDescriptor *)gf_malloc(sizeof(GF_IPMPX_ParametricDescriptionItem));
if (!p) return NULL;
memset(p, 0, sizeof(GF_IPMPX_ParametricDescriptionItem));
p->tag = GF_IPMPX_PARAM_DESCRIPTOR_ITEM_TAG;
return (GF_IPMPX_Data *) p;
}
case GF_IPMPX_SEL_ENC_BUFFER_TAG:
{
GF_IPMPX_SelEncBuffer*p = (GF_IPMPX_SelEncBuffer*)gf_malloc(sizeof(GF_IPMPX_SelEncBuffer));
if (!p) return NULL;
memset(p, 0, sizeof(GF_IPMPX_SelEncBuffer));
p->tag = GF_IPMPX_SEL_ENC_BUFFER_TAG;
return (GF_IPMPX_Data *) p;
}
case GF_IPMPX_SEL_ENC_FIELD_TAG:
{
GF_IPMPX_SelEncField*p = (GF_IPMPX_SelEncField*)gf_malloc(sizeof(GF_IPMPX_SelEncField));
if (!p) return NULL;
memset(p, 0, sizeof(GF_IPMPX_SelEncField));
p->tag = GF_IPMPX_SEL_ENC_FIELD_TAG;
return (GF_IPMPX_Data *) p;
}
default:
return NULL;
}
}
void gf_ipmpx_data_del(GF_IPMPX_Data *_p)
{
if (!_p) return;
switch (_p->tag) {
case GF_IPMPX_RIGHTS_DATA_TAG:
case GF_IPMPX_OPAQUE_DATA_TAG:
DelGF_IPMPX_OpaqueData(_p);
return;
case GF_IPMPX_KEY_DATA_TAG:
DelGF_IPMPX_KeyData(_p);
return;
case GF_IPMPX_SECURE_CONTAINER_TAG:
DelGF_IPMPX_SecureContainer(_p);
return;
case GF_IPMPX_ADD_TOOL_LISTENER_TAG:
DelGF_IPMPX_AddToolNotificationListener(_p);
return;
case GF_IPMPX_REMOVE_TOOL_LISTENER_TAG:
DelGF_IPMPX_RemoveToolNotificationListener(_p);
return;
case GF_IPMPX_INIT_AUTHENTICATION_TAG:
DelGF_IPMPX_InitAuthentication(_p);
return;
case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG:
DelGF_IPMPX_MutualAuthentication(_p);
return;
case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG:
DelGF_IPMPX_ParametricDescription(_p);
return;
case GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG:
DelGF_IPMPX_ToolParamCapabilitiesQuery(_p);
return;
case GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG:
DelGF_IPMPX_ToolParamCapabilitiesResponse(_p);
return;
case GF_IPMPX_GET_TOOLS_RESPONSE_TAG:
DelGF_IPMPX_GetToolsResponse(_p);
return;
case GF_IPMPX_GET_TOOL_CONTEXT_TAG:
DelGF_IPMPX_GetToolContext(_p);
return;
case GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG:
DelGF_IPMPX_GetToolContextResponse(_p);
return;
case GF_IPMPX_CONNECT_TOOL_TAG:
DelGF_IPMPX_ConnectTool(_p);
return;
case GF_IPMPX_DISCONNECT_TOOL_TAG:
DelGF_IPMPX_DisconnectTool(_p);
return;
case GF_IPMPX_NOTIFY_TOOL_EVENT_TAG:
DelGF_IPMPX_NotifyToolEvent(_p);
return;
case GF_IPMPX_CAN_PROCESS_TAG:
DelGF_IPMPX_CanProcess(_p);
return;
case GF_IPMPX_TRUST_SECURITY_METADATA_TAG:
DelGF_IPMPX_TrustSecurityMetadata(_p);
return;
case GF_IPMPX_TOOL_API_CONFIG_TAG:
DelGF_IPMPX_ToolAPI_Config(_p);
return;
case GF_IPMPX_ISMACRYP_TAG:
DelGF_IPMPX_ISMACryp(_p);
return;
case GF_IPMPX_SEL_DEC_INIT_TAG:
DelGF_IPMPX_SelectiveDecryptionInit(_p);
return;
case GF_IPMPX_AUDIO_WM_INIT_TAG:
case GF_IPMPX_VIDEO_WM_INIT_TAG:
DelGF_IPMPX_WatermarkingInit(_p);
return;
case GF_IPMPX_AUDIO_WM_SEND_TAG:
case GF_IPMPX_VIDEO_WM_SEND_TAG:
DelGF_IPMPX_SendWatermark(_p);
return;
case GF_IPMPX_TRUSTED_TOOL_TAG:
{
GF_IPMPX_TrustedTool *p = (GF_IPMPX_TrustedTool *)_p;
while (gf_list_count(p->trustSpecifications)) {
GF_IPMPX_Data *ts = (GF_IPMPX_Data *)gf_list_get(p->trustSpecifications, 0);
gf_list_rem(p->trustSpecifications, 0);
gf_ipmpx_data_del(ts);
}
gf_list_del(p->trustSpecifications);
gf_free(p);
return;
}
case GF_IPMPX_TRUST_SPECIFICATION_TAG:
{
GF_IPMPX_TrustSpecification *p = (GF_IPMPX_TrustSpecification *)_p;
GF_IPMPX_DELETE_ARRAY(p->CCTrustMetadata);
gf_free(p);
return;
}
case GF_IPMPX_PARAM_DESCRIPTOR_ITEM_TAG:
{
GF_IPMPX_ParametricDescriptionItem *p = (GF_IPMPX_ParametricDescriptionItem*)_p;
GF_IPMPX_DELETE_ARRAY(p->main_class);
GF_IPMPX_DELETE_ARRAY(p->subClass);
GF_IPMPX_DELETE_ARRAY(p->typeData);
GF_IPMPX_DELETE_ARRAY(p->type);
GF_IPMPX_DELETE_ARRAY(p->addedData);
gf_free(p);
return;
}
case GF_IPMPX_ALGORITHM_DESCRIPTOR_TAG:
_p->tag = GF_IPMPX_AUTH_AlgorithmDescr_Tag;
GF_IPMPX_AUTH_Delete((GF_IPMPX_Authentication*)_p);
return;
case GF_IPMPX_KEY_DESCRIPTOR_TAG:
_p->tag = GF_IPMPX_AUTH_KeyDescr_Tag;
GF_IPMPX_AUTH_Delete((GF_IPMPX_Authentication*)_p);
return;
case GF_IPMPX_SEL_ENC_BUFFER_TAG:
{
GF_IPMPX_SelEncBuffer*p = (GF_IPMPX_SelEncBuffer*)_p;
GF_IPMPX_DELETE_ARRAY(p->Stream_Cipher_Specific_Init_Info);
gf_free(p);
return;
}
case GF_IPMPX_SEL_ENC_FIELD_TAG:
{
GF_IPMPX_SelEncField*p = (GF_IPMPX_SelEncField*)_p;
GF_IPMPX_DELETE_ARRAY(p->shuffleSpecificInfo);
if (p->mappingTable) gf_free(p->mappingTable);
gf_free(p);
return;
}
case GF_IPMPX_GET_TOOLS_TAG:
default:
gf_free(_p);
return;
}
}
GF_Err GF_IPMPX_ReadData(GF_BitStream *bs, GF_IPMPX_Data *_p, u32 read)
{
switch (_p->tag) {
case GF_IPMPX_RIGHTS_DATA_TAG:
case GF_IPMPX_OPAQUE_DATA_TAG:
return ReadGF_IPMPX_OpaqueData(bs, _p, read);
case GF_IPMPX_KEY_DATA_TAG:
return ReadGF_IPMPX_KeyData(bs, _p, read);
case GF_IPMPX_SECURE_CONTAINER_TAG:
return ReadGF_IPMPX_SecureContainer(bs, _p, read);
case GF_IPMPX_ADD_TOOL_LISTENER_TAG:
return ReadGF_IPMPX_AddToolNotificationListener(bs, _p, read);
case GF_IPMPX_REMOVE_TOOL_LISTENER_TAG:
return ReadGF_IPMPX_RemoveToolNotificationListener(bs, _p, read);
case GF_IPMPX_INIT_AUTHENTICATION_TAG:
return ReadGF_IPMPX_InitAuthentication(bs, _p, read);
case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG:
return ReadGF_IPMPX_MutualAuthentication(bs, _p, read);
case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG:
return ReadGF_IPMPX_ParametricDescription(bs, _p, read);
case GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG:
return ReadGF_IPMPX_ToolParamCapabilitiesQuery(bs, _p, read);
case GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG:
return ReadGF_IPMPX_ToolParamCapabilitiesResponse(bs, _p, read);
case GF_IPMPX_GET_TOOLS_RESPONSE_TAG:
return ReadGF_IPMPX_GetToolsResponse(bs, _p, read);
case GF_IPMPX_GET_TOOL_CONTEXT_TAG:
return ReadGF_IPMPX_GetToolContext(bs, _p, read);
case GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG:
return ReadGF_IPMPX_GetToolContextResponse(bs, _p, read);
case GF_IPMPX_CONNECT_TOOL_TAG:
return ReadGF_IPMPX_ConnectTool(bs, _p, read);
case GF_IPMPX_DISCONNECT_TOOL_TAG:
return ReadGF_IPMPX_DisconnectTool(bs, _p, read);
case GF_IPMPX_NOTIFY_TOOL_EVENT_TAG:
return ReadGF_IPMPX_NotifyToolEvent(bs, _p, read);
case GF_IPMPX_CAN_PROCESS_TAG:
return ReadGF_IPMPX_CanProcess(bs, _p, read);
case GF_IPMPX_TRUST_SECURITY_METADATA_TAG:
return ReadGF_IPMPX_TrustSecurityMetadata(bs, _p, read);
case GF_IPMPX_TOOL_API_CONFIG_TAG:
return ReadGF_IPMPX_ToolAPI_Config(bs, _p, read);
case GF_IPMPX_ISMACRYP_TAG:
return ReadGF_IPMPX_ISMACryp(bs, _p, read);
case GF_IPMPX_SEL_DEC_INIT_TAG:
return ReadGF_IPMPX_SelectiveDecryptionInit(bs, _p, read);
case GF_IPMPX_AUDIO_WM_INIT_TAG:
case GF_IPMPX_VIDEO_WM_INIT_TAG:
return ReadGF_IPMPX_WatermarkingInit(bs, _p, read);
case GF_IPMPX_AUDIO_WM_SEND_TAG:
case GF_IPMPX_VIDEO_WM_SEND_TAG:
return ReadGF_IPMPX_SendWatermark(bs, _p, read);
case GF_IPMPX_GET_TOOLS_TAG:
return GF_OK;
default:
return GF_BAD_PARAM;
}
}
u32 gf_ipmpx_data_size(GF_IPMPX_Data *_p)
{
switch (_p->tag) {
case GF_IPMPX_RIGHTS_DATA_TAG:
case GF_IPMPX_OPAQUE_DATA_TAG:
return SizeGF_IPMPX_OpaqueData(_p);
case GF_IPMPX_KEY_DATA_TAG:
return SizeGF_IPMPX_KeyData(_p);
case GF_IPMPX_SECURE_CONTAINER_TAG:
return SizeGF_IPMPX_SecureContainer(_p);
case GF_IPMPX_ADD_TOOL_LISTENER_TAG:
return SizeGF_IPMPX_AddToolNotificationListener(_p);
case GF_IPMPX_REMOVE_TOOL_LISTENER_TAG:
return SizeGF_IPMPX_RemoveToolNotificationListener(_p);
case GF_IPMPX_INIT_AUTHENTICATION_TAG:
return SizeGF_IPMPX_InitAuthentication(_p);
case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG:
return SizeGF_IPMPX_MutualAuthentication(_p);
case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG:
return SizeGF_IPMPX_ParametricDescription(_p);
case GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG:
return SizeGF_IPMPX_ToolParamCapabilitiesQuery(_p);
case GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG:
return SizeGF_IPMPX_ToolParamCapabilitiesResponse(_p);
case GF_IPMPX_GET_TOOLS_RESPONSE_TAG:
return SizeGF_IPMPX_GetToolsResponse(_p);
case GF_IPMPX_GET_TOOL_CONTEXT_TAG:
return SizeGF_IPMPX_GetToolContext(_p);
case GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG:
return SizeGF_IPMPX_GetToolContextResponse(_p);
case GF_IPMPX_CONNECT_TOOL_TAG:
return SizeGF_IPMPX_ConnectTool(_p);
case GF_IPMPX_DISCONNECT_TOOL_TAG:
return SizeGF_IPMPX_DisconnectTool(_p);
case GF_IPMPX_NOTIFY_TOOL_EVENT_TAG:
return SizeGF_IPMPX_NotifyToolEvent(_p);
case GF_IPMPX_CAN_PROCESS_TAG:
return SizeGF_IPMPX_CanProcess(_p);
case GF_IPMPX_TRUST_SECURITY_METADATA_TAG:
return SizeGF_IPMPX_TrustSecurityMetadata(_p);
case GF_IPMPX_TOOL_API_CONFIG_TAG:
return SizeGF_IPMPX_ToolAPI_Config(_p);
case GF_IPMPX_ISMACRYP_TAG:
return SizeGF_IPMPX_ISMACryp(_p);
case GF_IPMPX_SEL_DEC_INIT_TAG:
return SizeGF_IPMPX_SelectiveDecryptionInit(_p);
case GF_IPMPX_AUDIO_WM_INIT_TAG:
case GF_IPMPX_VIDEO_WM_INIT_TAG:
return SizeGF_IPMPX_WatermarkingInit(_p);
case GF_IPMPX_AUDIO_WM_SEND_TAG:
case GF_IPMPX_VIDEO_WM_SEND_TAG:
return SizeGF_IPMPX_SendWatermark(_p);
case GF_IPMPX_GET_TOOLS_TAG:
return 0;
default:
return GF_BAD_PARAM;
}
}
GF_Err gf_ipmpx_data_write(GF_BitStream *bs, GF_IPMPX_Data *_p)
{
GF_Err e;
if (!_p) return GF_OK;
e = GF_IPMPX_WriteBase(bs, _p);
if (e) return e;
switch (_p->tag) {
case GF_IPMPX_RIGHTS_DATA_TAG:
case GF_IPMPX_OPAQUE_DATA_TAG:
return WriteGF_IPMPX_OpaqueData(bs, _p);
case GF_IPMPX_KEY_DATA_TAG:
return WriteGF_IPMPX_KeyData(bs, _p);
case GF_IPMPX_SECURE_CONTAINER_TAG:
return WriteGF_IPMPX_SecureContainer(bs, _p);
case GF_IPMPX_ADD_TOOL_LISTENER_TAG:
return WriteGF_IPMPX_AddToolNotificationListener(bs, _p);
case GF_IPMPX_REMOVE_TOOL_LISTENER_TAG:
return WriteGF_IPMPX_RemoveToolNotificationListener(bs, _p);
case GF_IPMPX_INIT_AUTHENTICATION_TAG:
return WriteGF_IPMPX_InitAuthentication(bs, _p);
case GF_IPMPX_MUTUAL_AUTHENTICATION_TAG:
return WriteGF_IPMPX_MutualAuthentication(bs, _p);
case GF_IPMPX_PARAMETRIC_DESCRIPTION_TAG:
return WriteGF_IPMPX_ParametricDescription(bs, _p);
case GF_IPMPX_PARAMETRIC_CAPS_QUERY_TAG:
return WriteGF_IPMPX_ToolParamCapabilitiesQuery(bs, _p);
case GF_IPMPX_PARAMETRIC_CAPS_RESPONSE_TAG:
return WriteGF_IPMPX_ToolParamCapabilitiesResponse(bs, _p);
case GF_IPMPX_GET_TOOLS_RESPONSE_TAG:
return WriteGF_IPMPX_GetToolsResponse(bs, _p);
case GF_IPMPX_GET_TOOL_CONTEXT_TAG:
return WriteGF_IPMPX_GetToolContext(bs, _p);
case GF_IPMPX_GET_TOOL_CONTEXT_RESPONSE_TAG:
return WriteGF_IPMPX_GetToolContextResponse(bs, _p);
case GF_IPMPX_CONNECT_TOOL_TAG:
return WriteGF_IPMPX_ConnectTool(bs, _p);
case GF_IPMPX_DISCONNECT_TOOL_TAG:
return WriteGF_IPMPX_DisconnectTool(bs, _p);
case GF_IPMPX_NOTIFY_TOOL_EVENT_TAG:
return WriteGF_IPMPX_NotifyToolEvent(bs, _p);
case GF_IPMPX_CAN_PROCESS_TAG:
return WriteGF_IPMPX_CanProcess(bs, _p);
case GF_IPMPX_TRUST_SECURITY_METADATA_TAG:
return WriteGF_IPMPX_TrustSecurityMetadata(bs, _p);
case GF_IPMPX_TOOL_API_CONFIG_TAG:
return WriteGF_IPMPX_ToolAPI_Config(bs, _p);
case GF_IPMPX_ISMACRYP_TAG:
return WriteGF_IPMPX_ISMACryp(bs, _p);
case GF_IPMPX_SEL_DEC_INIT_TAG:
return WriteGF_IPMPX_SelectiveDecryptionInit(bs, _p);
case GF_IPMPX_AUDIO_WM_INIT_TAG:
case GF_IPMPX_VIDEO_WM_INIT_TAG:
return WriteGF_IPMPX_WatermarkingInit(bs, _p);
case GF_IPMPX_AUDIO_WM_SEND_TAG:
case GF_IPMPX_VIDEO_WM_SEND_TAG:
return WriteGF_IPMPX_SendWatermark(bs, _p);
case GF_IPMPX_GET_TOOLS_TAG:
return GF_OK;
default:
return GF_BAD_PARAM;
}
}
#endif