在SMPTE 336M-2001的数据编码协议中描述了KLV密钥。以下部分提供了键结构的快速概述,但要获得完整的信息,您应该阅读前面提到的文档。
抵消(基于) | 长度(字节) | 内容/格式 | 描述 |
---|---|---|---|
0 | 4 | 总是0x06 0x0E 0x2B 0x34 | KLV报头(这对所有键都是一样的)。 |
4 | 1 | RegistryCategoryConstants值之一 | 注册表类别指示器:标识所描述的注册表类别(字典、组、包装器、标签)。 |
5 | 1 | 取决于注册表类别指示符的值。 | 注册表指示符:标识类别中的特定注册表。 |
6 | 1 | 结构指示符:给定注册表中结构变量的指示符。 | |
7 | 1 | 版本号。 | |
8 | 8 | 项指示符:键的标识符。 |
KLV密钥由16个字节组成,可分为3个部分:
KLV报头节(字节0…3),它总是0x06 0x0E 0x2B 0x34。现在,这并不重要,因为已定义的键的数量小于264。
一般部分(字节4…7),最初用于描述数据的格式。实际上,这些字节对于一个键的所有版本几乎是相同的,除了版本号(偏移量为7的字节)。偏移量为6的字节(结构指示符)几乎总是0x01。版本号非常重要,因为数据的格式可能会从一个版本更改到另一个版本。例如,版本1的键数据可能是16位值,而版本2的键数据可能写入32位值。
键标识符(字节8…15)。这些字节标识哪些数据与该键相关联。这是当您想要找出某个键的含义时应该搜索的数据。
LEAD在ILMMpgDmxP.h中定义了一些通用键。您将发现它们被定义为KlvKey_XXX值。例如,查找KlvKey_UserDefinedTimeStamp,您将找到LEAD已定义的键的列表。
LEAD已经定义了某些定义来帮助您访问密钥中的某些字节。查看下面的更多信息。
用于检查键的有用枚举
使用KlvOffsetConstants枚举来查找16字节键中重要关键组件的偏移量:
类型定义枚举KlvOffsetConstants
{
KLVOFFSET_REGISTRYCATEGORY = 4, /*标识所描述注册表类别的指示器(例如,字典)*/
KLVOFFSET_REGISTRYDESIGNATOR = 5, /*标识特定注册表的指示器在类别(例如元数据字典)*/
KLVOFFSET_STRUCTUREDESIGNATOR = 6, /*指定注册表中结构变量的指示符*/
KLVOFFSET_VERSIONNUMBER = 7, /*指定注册表的版本,该版本首先定义项指示符指定的项*/
KLVOFFSET_ITEMDESIGNATOR = 8, /* UL指示符上下文中特定项的唯一标识(最多8字节)*/
} KlvOffsetConstants;
使用RegistryCategoryConstants枚举来确定注册表类别指示符的可能值(偏移量为4的字节):
类型定义枚举RegistryCategoryConstants
{REGISTRYCATEGORY_DICTIONARY = 1, /*字典:下一个字节=KlvDictionaryConstants(01=元数据,02=精华,03=控制,04=类型)*/
REGISTRYCATEGORY_GROUPS = 2, /* Groups: Next byte=KlvGroupConstants (01=Universal, 02=Global, 03=Local, 04= variable length packs (默认的), 05=定长包)*/
REGISTRYCATEGORY_WRAPPERS = 3, /*包装器和容器:下一个字节=KlvWrapperConstants(01=简单,02=复杂)*/
REGISTRYCATEGORY_LABELS = 4, /*标签:下一个字节=KlvLabelConstants(01=标签字典)*/
} RegistryCategoryConstants;
如果注册表类别值指示符是REGISTRYCATEGORY_DICTIONARY,则注册表指示符(偏移量5处的字节)是以下值之一:
类型定义枚举KlvDictionaryConstants
{
KLVDICTIONARY_METADATA = 1, /* 01 =元数据字典*/
KLVDICTIONARY_ESSENCE = 2, /* 02 = Essence dictionary */
KLVDICTIONARY_CONTROL = 3, /* 03 =控件字典*/
KLVDICTIONARY_TYPES = 4, /* 04 =类型字典*/
} KlvDictionaryConstants;
如果注册表类别值指示符是REGISTRYCATEGORY_GROUP,则注册表指示符(偏移量为5的字节)是以下值之一:
类型定义枚举KlvGroupConstants
{
KLVGROUPS_UNIVERSAL= 0x01, /* 01 = Universal Groups */
KLVGROUPS_GLOBAL= 0x02, /* 02 =全局组*/
KLVGROUPS_VARIABLEPACK= 0x04, /* 04 =可变长度包(默认的) * /
KLVGROUPS_FIXEDPACK= 0x05, /* 05 =固定长度的包*/
KLVGROUPS_LOCAL_1_BER= 0x03, /* 03 =本地组(Key=1字节,Data=ASN.1 .1)的误码率短或长) * /
KLVGROUPS_LOCAL_BER_BER= 0x0B, /* 0B =本地组(Key=ASN.1 .1 .OID BER, Data=ASN.1的误码率短或长) * /
KLVGROUPS_LOCAL_2_BER= 0x13, /* 13 =本地组(Key=2字节,Data=ASN.1 .的误码率短或长* /
KLVGROUPS_LOCAL_4_BER= 0x1B, /* 1B =本地组(Key=4字节,Data=ASN.1 .的误码率短或长* /
KLVGROUPS_LOCAL_1_1= 0x23, /* 23 =本地组(Key=1字节,Data=1字节*/
KLVGROUPS_LOCAL_BER_1= 0x2B, /* 2B =本地组(Key=ASN.1 .1 .OID BER, Data=1字节*/
KLVGROUPS_LOCAL_2_1= 0x33, /* 33 =本地组(Key=2字节,Data=1字节*/
KLVGROUPS_LOCAL_4_1= 0x3B, /* 3B =本地组(Key=4字节,Data=1字节*/
KLVGROUPS_LOCAL_1_2= 0x43, /* 43 =本地组(Key=1字节,Data=2字节*/
KLVGROUPS_LOCAL_BER_2= 0x4B, /* 4B =本地组(Key=ASN.1 .1)OID BER, Data=2字节*/
KLVGROUPS_LOCAL_2_2= 0x53, /* 53 =本地组(Key=2字节,Data=2字节*/
KLVGROUPS_LOCAL_4_2= 0x5B, /* 5B =本地组(Key=4字节,Data=2字节*/
KLVGROUPS_LOCAL_1_4= 0x63, /* 63 =本地组(Key=1字节,Data=4字节*/
KLVGROUPS_LOCAL_BER_4= 0x6B, /* 6B =本地组(Key=ASN.1 .1)OID BER, Data=4字节*/
KLVGROUPS_LOCAL_2_4= 0x73, /* 73 =本地组(Key=2字节,Data=4字节*/
KLVGROUPS_LOCAL_4_4= 0x7B, /* 7B =本地组(Key=4字节,Data=4字节*/
} KlvGroupConstants;
在上面的每个KLVGROUPS_LOCAL_X_Y键中,X表示用于存储键的字节数,Y表示用于存储每个键的数据的字节数。BER表示可变长度。最常见的情况有:
KLVGROUPS_LOCAL_BER_BER(密钥和数据都使用可变长度编码存储)
KLVGROUPS_LOCAL_1_BER(键使用一个字节存储,而数据使用可变长度存储)
如果注册表类别值指示符是REGISTRYCATEGORY_WRAPPER,则注册表指示符(偏移量为5的字节)是以下值之一:
类型定义枚举KlvWrapperConstants
{
KLVWRAPPERS_SIMPLE = 1, /* 01 =简单包装*/
KLVWRAPPERS_COMPLEX = 2, /* 02 =复杂包装*/
} KlvWrapperConstants;
如果注册表类别值指示符是REGISTRYCATEGORY_LABEL,则注册表指示符(偏移量为5的字节)是以下值之一:
类型定义枚举KlvLabelConstants
{
KLVLABELS_LABEL = 4, /* 01 =标签字典*/
} KlvLabelConstants;