较佳实施例的详细描述
概观
以下描述针对表示DV元数据提取工具的一组接口、数据结构和事件。DV元数据提取工具包括用于描述将从DV数据流中提取的DV元数据包的API(应用程序编程接口)。提取API被称为MFExtractDVMetadata,它支持用于指定和移除要从DV帧中提取的DV元数据包的方法。提取API也支持用于确定提取列表中的DV元数据包的格式以及确定该提取列表中给定索引处的DV元数据包的ID的方法。
DV元数据提取工具也包括用于描述一旦从DV帧中提取DV元数据之后持有该DV元数据的容器的API。容器API被称为IMFDVMetadataContainer,它支持用于对容器添加或移除DV结构以及从容器中检索数据、从容器中移除数据和迭代通过容器的方法。DV元数据提取工具也包括表示未打包DV元数据包的高层结构的集合。
DV元数据提取工具一般是在Microsoft公司的Media Foundation(媒体基础)体系结构的环境中描述的。然而,注意,此处DV元数据提取工具是按照允许在任何合适的多媒体体系结构中使用它的方式来设计和描述的。
示例性环境
图1示出了适于DV元数据提取的示例性环境100。图1的示例性环境100包括计算机102和一个或多个DV视频输入源104。
DV视频输入源104可以是能够将DV视频内容传送给计算机102的任何类型的设备或通信网络,例如包括,便携式存储介质104(1)(例如,磁盘、媒体卡(mediacard)、光盘)、DV视频录制设备104(2)(例如,数字便携式摄像放像一体机)、或诸如因特网、公司网络或家庭网络等网络104(3)。
视频录制设备104(2)可以是能够按照DV格式(即,在数字磁带上)录制活动视频和音频以供稍后经由例如DVCR、便携式摄像放像一体机或诸如计算机102等个人计算机中的数字磁带驱动器重放的各种数字录制设备中的任何一种。视频录制设备104(2)一般能够使用i.LINK(IEEE 1394)或火线数字接口直接连接至计算机102,使得DV视频内容可在计算机102上直接编辑。
计算机102可被实现为一般而言能够从各个源104接收视频内容并操纵视频内容以便通过诸如微软公司的Media Foundation体系结构等常驻多媒体体系结构编辑和回放的各种计算设备。计算机102通常另外能够执行常见的计算功能,诸如电子邮件、日程安排、任务组织、文字处理、Web浏览等。在所述实施例中,计算机102运行在开放平台操作系统上,诸如Microsoft的Windows操作系统。计算机102可被实现为,例如台式计算机、服务器计算机、膝上型计算机或其它形式的个人计算机(PC)。以下将参考图8更详细地描述计算机102的一个示例性实现。
如以下将参考示例性实施例更详细讨论的,计算机102一般被配置成具有包含允许从DV数据中提取DV元数据的DV元数据提取工具的多媒体体系结构。
示例性实施例
图2示出了适于从DV数据流中提取DV元数据的计算机102的示例性实施例。贯穿本发明,将在诸如由个人计算机执行的程序模块等计算机/处理器可执行指令的通用环境中描述多媒体体系结构及便于提取DV元数据的相关组件。一般而言,程序模块包括例程、程序、对象、组件、数据结构等,它们执行特定任务或实现特定抽象数据类型。而且,本领域技术人员可以理解,这样的程序模块可以使用其它计算机系统配置来实现,包括手持式设备、多处理器系统、基于微处理器或可编程消费者电子产品、网络PC、小型机、大型计算机等。而且,本发明也可以在分布式计算环境中实现,其中任务由通过通信网络连接的远程处理设备来执行。在分布式计算环境中,程序模块可以位于本地和远程存储器存储设备中。在图2的当前计算环境中,计算机102一般被示为含有位于本地存储器中的程序模块(未示出)。如上所述,将在以下参考图8更详细描述计算机102的示例性实现。
图2中所示的DV元数据提取工具200可在诸如微软的Media Foundation等多媒体体系结构202的环境中操作。然而,DV元数据提取工具200不限于在这样的体系结构中操作。因此,DV元数据提取工具200也可被实现为,例如独立组件或另一应用程序的子组件。在描述DV元数据提取工具200之前,将参考图2提供对多媒体体系结构202的简要描述。
如图2中所示,多媒体体系结构202包括各种组件层。另外,多媒体体系结构202一般也包括支持或相关联的媒体应用程序204。这样的应用程序204在图2中被示为与多媒体体系结构202分开,但也可被示为体系结构202的一部分。多媒体体系结构202的组件层包括控制组件层206、核心组件层208、基础组件层210、开发平台层212和定义层214。
控制组件层208的组件包括媒体处理器234、基本编辑器218、基本编码器220、媒体会话222、拓扑加载器224、媒体引擎226、源分解器228。这些组件一般组成可以是完全受控或不受控的面向任务的API(应用程序编程接口)。控制组件206一般提供执行诸如将适当的核心层组件208链接在一起以便处理媒体的任务的管理功能。例如,拓扑加载器224检查传入媒体文件的多媒体数据类型,并确定需要将核心层组件208中的哪些处理组件(即,230、232、234、236、238)链接成处理链以正确地呈现数据类型。注意,为本发明起见,该媒体数据类型是DV数据。控制层206的媒体引擎组件226管理通过由拓扑加载器224汇集的处理组件链(即,230、232、234、236、238)对数据的处理。例如,媒体引擎226将通过处理链推送数据,从而控制何时停止回放、开始回放、后退、跳至特定的时间等。
核心层组件208包括媒体源230、元数据读/写232、MUX/Dmux(多路复用/多路分解)234、变换236和媒体宿238。媒体源230通过通用de、良好定义的接口提供多媒体数据。媒体源230描述图像,包括将被访问的视频数据流。存在用于提供来自不同多媒体文件类型或设备的多媒体数据的媒体源的众多实现。然而,本发明针对DV格式的多媒体。
核心层238的多个变换236通过通用的、良好定义的接口各自在多媒体数据上执行某种类型的变换操作。变换的示例包括,编解码器、DSP、视频整形器、音频重采样器、统计处理器、色彩重采样器等。尽管在核心层208内分开示出MUX/Dmux 234(此后称为Dmux 234),但它是变换236的一种表示,它采用交错的多媒体数据作为输入,并将该数据分成多媒体数据的各个单独有用的媒体流。因此,在本发明的环境中,Dmux 234是从DV媒体源230中分离出DV帧或样本的视频和音频分量等的DV Dmux 234。
也在图2的多媒体体系结构202内将Dmux 234示为包含DV媒体元数据提取工具200。如此处将以下更详细描述的,Dmux 234支持通过DV元数据提取工具200的DV元数据提取。DV元数据提取工具200一般允许用户创建和管理将从DV数据流中提取的DV元数据包的提取列表。一旦将DV元数据包ID添加到该提取列表之后,DV Dmux 234从每一DV帧中提取相关联的DV元数据包,同时它分离出该DV帧的视频和音频分量。DV Dmux 234在容器中存储DV元数据包,并将该容器作为扩展的属性附加于输出视频样本。尽管此处结合Dmux 234或作为其一部分描述DV元数据提取工具200,但这不旨在作为对于可在核心层208或其它地方的哪里实现DV元数据提取工具200的限制。由于Dmux 234的分离功能所提供的效率的便利,在Dmux 234内实现DV元数据提取工具200是较佳的实施例。因此,DV元数据提取工具200可以仅是处于能够访问DV数据流的任何位置的媒体源230的一部分、DMO(DirectX媒体对象)或独立软件组件。以下将参考随后的附图更详细地讨论DV元数据提取过程。
媒体宿(宿)238也包含在核心层208的处理组件中。宿238一般通过通用的、良好定义的接口接受多媒体数据作为输入。存在媒体宿的多种实现用于对多媒体数据执行不同功能,诸如将多媒体数据写至给定的文件类型或写至网络,或使用显卡在视频监视器上显示多媒体数据。
多媒体体系结构202的基础组件210和开放平台212一般组成大多数不受控的API。基础组件210包括媒体容器240、连网242、DRM 244、MPEG格式支持246和音频/视频引擎248。这些组件一般执行单独的功能以支持多媒体体系结构202。开放平台212一般包括资源管理基础架构和常见的原语类型,诸如采样、时钟、事件、缓冲等。多媒体体系结构202的定义层包括与方案、协议和格式(例如,元数据、设备模型、类型等)相关的定义和策略。
图3示出了通过核心层208的多个处理组件处理的DV数据的示例,这多个组件包括如上简要所述的Dmux 234的DV元数据提取工具200。DV数据样本(DV帧)300进入Dmux 234,在那里它们被分离成视频样本302和音频样本304。视频样本302通过处理链前进至各种处理组件,诸如视频编解码器308和视频呈现器310,在此之后,它们可在视频显示器312上显示。音频样本304通过处理链前进至诸如音频呈现器314等各种处理组件,在此之后,可通过音频扬声器316播放它们。当Dmux 234对DV样本300进行分离时,它也提取根据来自提取列表(见图4)的DV元数据包ID(DVPackID)在DV样本300内定位的DV元数据包。在定位其DVPackID位于提取列表中的DV元数据包之后,Dmux 234提取DV元数据包,将其存储在容器306中,并将容器306作为扩展的属性附加于相应的输出视频样本302。
对DV元数据包的某个子集,DV元数据提取工具200也提供对被称为DV_METADATA结构(见图5)的DV包专用数据结构的扩展支持。除在容器306中存储这些扩展支持包的DV元数据包之外,Dmux 234也在容器306中存储未打包的DV_METADATA结构。因此,对某些扩展支持DV元数据包,DV元数据提取工具200将打包的数据分解成可用的DV包专用数据结构,即DV_METADATA结构。图5示出了含有一个或多个DV元数据包500以及与DV元数据包500对应的一个或多个未打包DV_METADATA结构502。
根据,IEC 61834-4,存在DV格式的256个DV元数据包。此处在以下名为“
接口定义语言”的本发明的引用章节中示出这256个DV数据包。尽管为DV元数据保存256个包,但这些包中的多个尚待定义。在
接口定义语言引用章节中示出各种DV元数据的二进制包布局。所包含的DB元数据包二进制布局用于作为未打包DV打包专用数据结构(即,DV_METADATA结构)所特别支持的那些DV元数据包。因此,
接口定义语言章节也包括用于特别支持的DB元数据包的未打包DV_METADATA结构。一般而言,每一DV元数据包包括按照该包的二进制布局的5个字节。每一DV元数据包中的第一字节是DVPackID,接下来四个字节包含二进制字段。
再次参考图3和4,DV元数据提取工具200支持通过各种方法维护提取列表404的提取API 400(应用程序编程接口)。DV元数据提取工具200也支持将在以下描述的容器API 402。图4示出了DV元数据提取工具200以及它所支持的提取API 400和容器API 402。图4中也示出提取列表404,它可包含各个DVPackID。提取API 400被称为MFExtractDVMetadata API,它所支持的方法包括AddPack(添加包)、RemovePack(移除包)、RemoveAllPacks(移除所有包)、GetCount(获取计数)以及GetPack(获取包)。
AddPack方法根据以下句法将指定的包添加到将在每一DV帧300上提取的DV包的提取列表404:
HRESULT AddPack(
BYTE DVPackID
);
DVPackID是为DV元数据包指定PackID的输入参数。这是DVPACKID枚举的成员。在所得的DV_METADATA结构中P,ackID位于DvMetadata.Pack[0]中。不能被添加到提取列表404的唯一的包是DVPAC_NO_INFO(0xFF)(见
接口定义 语言章节)。
如果AddPack方法成功,它返回S_OK。然而,如果DVPackID是DVPACK_NO_INFO,则将返回E_INVALIDARG。也可返回其它错误。
例如,从编辑应用程序204对AddPack的调用将DVPackID添加到提取列表404。即使之前已经添加过该包(即,DVPackID),该函数仍将成功。该包将不被引用计数,所以即使包被添加了两次它也仅需移除一次。
RemovePack方法根据以下句法将指定的包从将在每一DV帧300上提取的包的提取列表404中移除:
HRESULT RemovePack(
BYTE DVPackID
);
DVPackID是为DV元数据包指定PackID的输入参数。这是DVPACKID枚举的成员。在所得的DV_METADATA结构中,PackID位于DvMetadata.Pack[0]中。
如果RemovePack方法成功,它返回S_OK。如果该包不位于提取列表404中,则该函数返回E_ITEM_NOT_FOUND。也可返回其它出错代码。
例如,从编辑应用程序204对RemovePack的调用将从提取列表404移除指定的包。
RemoveAllPacks方法根据以下句法清空Dmux 234将提取的DV包的提取列表404:
HRESULT RemoveAllPacks();
RemoveAllPack方法没有任何参数输入。如果该方法成功,它返回S_OK。也可返回其它出错代码。例如,由编辑应用程序204调用RemoveAllPack将清空整个提取列表404。
GetCount方法根据以下句法返回位于提取列表404中的DV包的数量:
HRESULT GetCount(
DWORD* pCount
);
pCount参数是指定提取列表404中的包的数量的输出参数。如果该方法成功,则它返回S_OK。调用将检索提取列表404中的项(即,DVPackID)的个数。
GetPackID方法根据以下句法返回提取列表404中给定索引处的包的DVPackID:
HRESULT GetPack(
DWORD Index,
BYTE* pDVPackID
);
Index参数是输入参数,它是所期望的DVPack ID的提取列表404中的索引。pDVPackID是输出参数,它是指向对象将复制在指定的索引处找到的项的DVPackID处的字节的指针。
如果GetPackID方法成功,则它将返回S_OK。如果Index超出范围,则该方法返回出错代码MF_E_INVALIDINDEX。如果返回错误,则pDVPackID的值为DVPACK_NO_INFO(0xFF)。
GetPackID方法允许调用者(例如,应用程序204)通过反复地调用GetPackId并递增索引直到返回E_INVALIDARG来检索将要提取的项的全部列表。
如上所述,DV元数据提取工具200也支持容器API 402(见图4)。容器306(图3)被置成由Dmux 234分离的视频样本302上的样本属性。容器API 400被称为IMFDVMetadataContainer,它所支持的方法包括Add(添加)、Remove(移除)、RemoveAll(移除所有)、GetCount(获取计数)、Lock(锁定)、Unlock(解除锁定)、GetFirst(获取第一个)以及GetNext(获取下一个)。一般而言,IMFDVMetadataContainer API提供用于将属性添加列表、将属性从列表中移除、清空容器306和迭代通过容器306的通用机制。
Add方法根据以下句法将DV包专用数据结构,即DV_METADATA结构添加到容器306:
HRESULT Add(
const DV_METADATA* pMetadata,
UINT32* puIndex
);
pMetadata参数是输入参数,它是指向DV_METADATA结构的常量指针。pMetadata->cbSize用于在容器306中分配存储器,以及将整个DV_METADATA结构的副本置于新分配的存储器中。
ulIndex是输出参数,它返回新添加的DV_METADATA结构的索引。如果添加其它的结构或从容器306中删除结构,索引可能改变。
如果Add方法成功,则它返回S_OK。如果它不能为新项分配足够的空间,它也可返回E_OUTOFMEMORY。该操作将在常量时间O(k)中完成。如果容器由另一线程锁定,那么该操作将被阻断直到该锁被释放(见以下的Lock和Unlock方法)。
Remove根据以下句法从容器306中移除DV包专用数据结构,即DV_METADATA结构:
HRESULT Remove(
UINT32 uIndex
);
uIndex参数是输入参数,它指示要从容器306中移除的项的索引。当从容器306中移除项时,容器306中其余的项的索引可能改变。
如果该方法成功,则它将返回S_OK。如果不能找到具有匹配索引的项,那么它也可返回E_INVALIDARG。这包括当容器306为空的情况。该操作将在线性时间O(n)中完成,其中n是存储在列表中的项的个数。如果容器由另一线程锁定,则该操作将被阻断直到该锁被释放(见以下的Lock和Unlock方法)。
RemoveAll方法根据以下句法从容器306中清空所有的项(例如,DV元数据包和DV包专用数据结构):
HRESULT RemoveAll();
RemoveAll方法没有任何参数输入。如果该方法成功,则它将返回S_OK,且容器306中将不再存在任何项。然而,这之后并不一定释放存储器。容器306可实现轮询方案来避免重复的小型分配。该操作将在线性时间O(n)内完成,其中n为容器306中的项的个数。如果由另一线程锁定,则该操作将被阻断直到该锁被释放。(见以下的Lock和Unlock方法)。
GetCount方法根据一下句法返回容器306中的项的计数:
HRESULT GetCount(
UINT32* puCount
);
puCount参数是返回当前在容器306中的项的个数的输出参数。如果该方法成功,则它返回S_OK。
该操作将在常量时间O(k)内完成。所返回的计数仅当进行调用时才有效。可由其它线程添加或移除对象。锁定对象将防止其它线程在释放锁之前向容器添加项或从中移除项。(见以下的Lock和Unlock方法)。
Lock方法用于锁定容器306用于排他性访问。这保证了容器306可被迭代,且只要锁的所有者不添加或移除项,所返回的指向DV_METADATA结构的指针就将保持有效。该方法的句法如下:
HRESULT Lock();
Lock方法没有输入参数。如果该方法成功,则它返回S_OK。它也可返回其它出错代码。如果不可用,那么调用将被阻断直到可获取锁定。
Unlock方法可根据以下句法释放通过Lock方法获得的锁:
HRESULT Unlock()
UINT32* puIndex,
const DV_METADATA** pMetadata
);
Unlock方法不存在输入参数。如果该方法成功,则它返回S_OK。它也可返回其它出错代码。
GetFirst方法根据以下句法从容器306的开头开始迭代:
HRESULT GetFirst(
UINT32* puIndex,
Const DV_METADATA** ppMetadata
);
puIndex参数是指定从容器306中检索到的项的索引的输出参数。ppMetadata参数是指定指向包含元数据的对象内部数据结构的指针的输出参数。如果向容器306添加或从中移除项,那么该指针可能无效。
如果该方法成功,则它返回S_OK。如果索引超出范围或自从对GetFirst()的最近一次调用以来向容器306添加或从中移除项,那么该方法可返回E_INVALIDARG。如果对象没有被锁定,则该方法将返回MF_E_INVALIDREQUEST。调用Lock方法确保当迭代该列表时其它线程不会向容器306添加或从中移除项。
GetNext方法根据以下句法对容器306中的每一项迭代:
HRESULT GetNext(
UINT32* puIndex,
Const DV_METADATA** ppMetadata
);
puIndex参数是指定从容器306中检索到的项的索引的输出参数。ppMetadata参数是指定指向包含元数据的对象内部数据结构的指针的输出参数。如果向容器306添加或从中移除项,那么该指针可能无效。
如果该方法成功,则它返回S_OK。如果索引超出范围或自从对GetFirst()的最近一次调用以来向容器306添加或从中移除项,那么该方法可返回E_INVALIDARG。如果对象没有被锁定,则该方法将返回MF_E_INVALIDREQUEST。调用Lock方法确保当迭代该列表时其它线程不会向容器306添加或从中移除项。
示例性方法
现在将主要参考图6-7的流程图描述从DV数据流中提取DV元数据的示例方法。该方法一般应用于以上参考图2-5讨论的示例性实施例。所述方法的元素可由任何适当的装置来执行,包括例如,通过ASIC上的硬件逻辑块或通过在处理器可读介质上定义的处理器可读指令的执行。
如此处所使用的,“处理器可读介质”可以是可包含、存储、传递、传播或传送指令供处理器使用或执行的任何装置。处理器可读介质可以是,不作为限制,电、磁、光、电磁、红外或半导体系统、装置、设备或传播介质。处理器可读介质的更具体示例包括,具有一根或多根电线的电气连接(电)、便携式计算机磁盘(磁)、随机存取存储器(RAM)(磁)、只读存储器(ROM)(磁)、可擦除可编程只读存储器(EPROM或闪存)、光纤(光)、可重写压缩光盘(CD-RW)(光)以及便携式压缩光盘只读存储器(CDROM)(光)。
图6示出了从DV数据流中提取DV元数据的示例性方法600。在框602处,接收指定将从DV数据流中提取的附加的每一帧DV元数据。该指令由可以是计算机102上的多媒体体系结构202的一部分的DV元数据提取工具200接收。该指令通常从诸如在计算机102上执行的DV编辑应用程序等应用程序中接收。该指令以DV元数据提取工具200的提取接口400所支持的方法调用的形式被定向至提取接口400。该指令通过方法调用内包含的DVPackID来标识该DV元数据。提取接口400所支持的方法调用包括,将DVPackID添加至DV元数据提取列表404的AddPack方法调用、从提取列表404中移除DVPackID的RemovePack方法调用以及从提取列表404中移除所有DVPackID的RemoveAllPacks方法调用。提取接口400所支持的其它方法包括返回指示存在于提取列表404中的DVPackID的数量的数字的GetCount方法调用、以及返回位于提取列表404中的指定索引处的DVPackID的GetPackID方法调用。
在框604处,从DV数据流的DV帧中提取指令中指定的DV元数据。在一个实现中,多媒体体系结构202的核心层208内的Dmux 234在它将DV帧分离成分量视频302和音频304样本时提取所指定的DV元数据。该提取包括Dmux 234查看DV元数据提取列表404以确定提取哪一个DV元数据包。在框606处,在容器306中存储该DV元数据。在框608中,该容器被附加于由Dmux 234从DV帧300中分离的视频样本302。
在框610中,由DV元数据提取工具200管理该容器。DV元数据提取工具200包括支持应用程序204可用于访问和管理容器306中的数据的方法的容器接口402。容器接口402所支持的方法调用有将DV_METADATA结构添加至容器的Add方法调用、从容器中移除DV_METADATA结构的Remove方法调用、从容器中移除所有项的RemoveAll方法调用、返回指示存在于容器中的项的数量的数字的GetCount方法调用、锁定容器以供排他性访问的Lock方法调用、对容器解除锁定的Unlock方法调用、从容器中检索在容器的开始索引处的项的GetFirst方法调用以及从容器中检索在容器的下一索引处的项的GetNext方法调用。
图7示出了用于从DV数据流中提取DV元数据的另一示例性方法700。在框702处,管理DV元数据提取列表404。DV元数据提取列表404是由DV元数据提取工具200管理的。DV元数据提取工具200支持用于通过各种方法管理提取列表的提取接口400。提取接口400所支持的方法包括,将DVPackID添加至DV元数据提取列表404的AddPack方法调用、从提取列表404中移除DVPackID的RemovePack方法调用以及从提取列表404中移除所有DVPackID的RemoveAllPacks方法调用。提取接口400所支持的其它方法包括返回指示存在于提取列表404中的DVPackID的数量的数字的GetCount方法调用、以及返回位于提取列表404中的指定索引处的DVPackID的GetPackID方法调用。
在框704处,基于提取列表404中的DVPackID从DV帧300中提取DV元数据包。在一个实现中,多媒体体系结构202的核心层208内的Dmux 234在它将DV帧分离成分量视频302和音频304样本时提取所指定的DV元数据包。该提取包括Dmux 234查看DV元数据提取列表404以确定提取哪一个DV元数据包。在框706处,将DV元数据包存储在IMFDVMetadataContainer 306中。
在框708处,将DV元数据包解包成DV包专用数据结构。该DV包专用数据结构从DV元数据包中分解出打包的二进制数据,并向相应的变量名分配二进制值,使得应用程序204易于利用来自DV元数据包的数据。在框710处,将DV包专用数据结构存储在IMFDVMetadataContainer 306中,在框712处,IMFDVMetadataContainer 306被附加于由Dmux 234从DV帧300中分离的视频样本302。
在框714处,由DV元数据提取工具200管理IMFDVMetadataContainer 306。DV元数据提取工具200包括支持应用程序204可用于访问和管理容器306中的数据的方法的容器接口402。容器接口402所支持的方法调用有,将DV包专用数据结构(称为DV_METADATA结构)添加至容器的Add方法调用、从容器中移除DV_METADATA结构的Remove方法调用、从容器中移除所有项的RemoveAll方法调用、返回指示存在于容器中的项的数量的数字的GetCount方法调用、锁定容器以供排他性访问的Lock方法调用、对容器解除锁定的Unlock方法调用、从容器中检索在容器的开始索引处的项的GetFirst方法调用、以及从容器中检索在容器的下一索引处的项的GetNext方法调用。
当通过流程图以及与流程图的框相关联的文字来揭示一个或多个方法时,可以理解,这些框不必按照所呈现的顺序执行,且替换的顺序可能产生类似的优点。而且,这些方法不是详尽的,其可单独执行或彼此结合执行。
示例性计算机
图8示出了适于实现计算机102的示例性计算环境800。尽管示出了一个特定配置,但可按照其它计算配置来实现客户计算机102。
计算机环境800包括计算机802形式的通用计算系统。计算机802的组件可以包括,但不限于,一个或多个处理单元804、系统存储器806和将包括处理器804在内的各种系统组件耦合至系统存储器806的系统总线808。
系统总线808可以是若干类型的总线结构中的任一种,包括存储器总线或存储器控制器、外围总线、加速图形端口和使用各种总线体系结构中的任一种的处理器或局部总线。系统总线808的示例有外围部件互连(PCI)总线(也被称为Mezzanine总线)。
计算机802通常包括各种计算机可读介质。计算机可读介质可以是能够被计算机802访问的任何可用介质,且包括易失性和非易失性介质、可移动和不可移动介质。系统存储器806包括诸如随机存取存储器(RAM)810等易失性存储器形式的计算机可读介质,和/或诸如只读存储器(ROM)812等非易失性存储器。基本输入/输出系统(BIOS)814包含有助于诸如启动时在计算机802中元件之间传递信息的基本例程,它通常存储在ROM 812中。RAM 810通常包含处理单元804可以立即访问和/或目前正在操作的数据和/或程序模块。
计算机802也可以包括其它可移动/不可移动、易失性/非易失性计算机存储介质。作为示例,图8示出了从不可移动、非易失性磁介质(未示出)中读取或向其写入的硬盘驱动器816,从可移动、非易失性磁盘820(例如,“软盘”)中读取或向其写入的磁盘驱动器818,以及从诸如CD-ROM、DVD-ROM或其它光学介质等可移动、非易失性光盘824中读取或向其写入的光盘驱动器822。硬盘驱动器816、磁盘驱动器818和光盘驱动器822各自可由一个或多个数据媒体接口826连接至系统总线808。或者,硬盘驱动器816、磁盘驱动器818和光盘驱动器822可由SCSI接口(未示出)连接至系统总线808。
磁盘驱动器及其相关联的计算机可读介质为计算机802提供了对计算机可读指令、数据结构、程序模块和其它数据的非易失性存储。尽管示例示出了硬盘816、可移动磁盘820和可移动光盘824,可以理解,也可以使用可存储可由计算机访问的数据的其它类型的计算机可读介质,诸如盒式磁带或其它磁性存储设备,闪存卡、数字多功能盘(DVD)或其它光学存储,随机存取存储器(RAM)、只读存储器(ROM)、电可擦可编程只读存储器(EEPROM)等,来实现示例性计算系统和环境。
可在硬盘816、磁盘820、光盘824、ROM 812和/或RAM 810上存储任何数量的程序模块,作为示例,包括操作系统826、一个或多个应用程序模块828、其它程序模块830和程序数据832。这样的操作系统826、一个或多个应用程序模块828、其它程序模块830和程序数据832中的每一个(或其某种组合)可包含用于用户网络访问信息的高速缓存方案的实施例。
计算机802可包括标识为通信介质的各种计算机/处理器可读介质。通信介质通常具体化为诸如载波或其它传输机制等已调制数据信号中的计算机可读指令、数据结构、程序模块或其它数据,且包含任何信息传递介质。术语“已调制数据信号”指的是这样一种信号,其一个或多个特征以在信号中编码信息的方式被设定或更改。作为示例,而非限制,通信介质包括有线介质,诸如有线网络或直接线连接,以及无线介质,诸如声学、RF、红外线和其它无线介质。上述中任一个的组合也应包括在计算机可读介质的范围之内。
用户可以通过诸如键盘834和定点设备836(例如,“鼠标”)等输入设备向计算机系统802输入命令和信息。其它输入设备838(未明确示出)可以包括麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等。这些和其它输入设备通常由耦合至系统总线808的输入/输出接口840连接至处理单元804,但也可以由其它接口或总线结构,诸如并行端口、游戏端口或通用串行总线(USB)连接。
监视器842或其它类型的显示设备也可经由接口,诸如视频适配器844连接至系统总线807。除监视器842以外,其它外围输出设备可包括诸如扬声器(未示出)和打印机846等组件,它们可以通过输入/输出接口840连接至计算机820。
计算机802可使用至一台或多台远程计算机,诸如远程计算设备848的逻辑连接在网络化环境中操作。作为示例,远程计算设备848可以是个人计算机、服务器、便携式计算机、服务器、路由器、网络计算机、对等设备或其它常见网络节点等。远程计算设备848被示出可包括此处相对于计算机802描述的许多或所有元素和特征的便携式计算机。
计算机802与远程计算机848之间的逻辑连接被示为局域网(LAN)850和通用广域网(WAN)852。这样的网络环境在办公室、企业范围计算机网络、内联网和因特网中是常见的。当在LAN网络环境中使用时,计算机802通过网络接口或适配器854连接至局域网850。当在WAN连网环境中使用时,计算机1802通常包括调制解调器856或用于通过广域网852建立通信的其它装置。调制解调器856对计算机802可以是内置或外置的,它可以通过输入/输出接口840或其它合适的机制连接至系统总线808。可以理解,所示的网络连接是示例性的,且可以使用在计算机802与804之间建立通信链路的其它手段。
在网络化环境中,正如计算环境800所示,相对于计算机802描述的程序模块或其部分可存储在远程存储器存储设备中。作为示例,远程应用程序858驻留在远程计算机848的存储器设备上。为说明起见,应用程序和诸如操作系统等其它可执行程序组件在此处被示为离散的框,但可认识到,这样的程序和组件在不同的时刻可驻留在计算机系统802的不同存储组件中,且由计算机的数据处理器执行。
接口定义语言
如上所述,此IDL(接口定义语言)章节列出256个DV元数据包以及由DV元数据提取工具200以扩展的方式作为DV包专用数据结构(即,DV_METADATA结构)所特别支持这些包的各个二进制包布局。本章节也包括对所支持的DV_METADATA结构的未打包DV元数据的特定布局。在以下表格中标识具有扩展支持的DV元数据包:
表1
CONTROL | | |
|
CASSETTE IDTAPE LENGTHTEXT HEADERTEXTTAG |
0X000x010x080x090x0B |
TITLE | | |
|
TIME CODEBINARY GROUPTEXT HEADERTEXT |
0x130x140x180x19 |
PROGRAM | | |
|
PROGRAM RECDTIME |
0x42 |
AAUX | | |
|
SOURCESOURCECONTROLREC DATEREC TIME |
0x500x510x520x53 |
|
BINARY GROUPCLOSED CAPTIONTR |
0x540x550x56 |
VAUX |
|
|
|
SOURCESOURCECONTROLREC DATEREC TIMEBINARY GROUPCLOSED CAPTIONTR |
0x600x610x620x630x640x650x66 |
CAMERA |
|
|
|
CONSUMERCAMERA 1CONSUMERCAMERA 2CAMERASHUTTER |
0x700x710x7F |
具有DV元数据提取工具200的扩展支持的每一DV包专用数据结构(即,DV_METADATA结构)以大小和DV包开始。该大小成员包含完整的DV_METADATA结构的大小。DVPack(5字节数组)是原始的DV元数据。每一个包含有5个字节。第一字节是来自以上表1的包ID。后面的四个字节包含含有数据的位字段。扩展支持包中的每一个具有相关联的结构,其中位字段被解包并稍加处理成为更可用的形式。可在IEC 61834-4中找到DV包的完全定义。
由DV元数据提取工具200所支持的256个DV元数据包和DV包专用数据结构(即,DV_METADATA结构)如下:
typedef enum_DVPACKID
{
DVPACK_CONTROL_CASSETTE_ID= 0x00,
DVPACK_CONTROL_TAPE_LENGTH= 0x01,
DVPACK_CONTROL_TIMER_ACT_DATE= 0x02,
DVPACK_CONTROL_TIMER_ACS_S_S= 0x03,
DVPACK_CONTROL_PR_START_POINT_04= 0x04,
DVPACK_CONTROL_PR_START_POINT_05= 0x05,
DVPACK_CONTROL_TAGID_NO_GENRE= 0x06,
DVPACK_CONTROL_TOPIC_PAGE_HEADER= 0x07,
DVPACK_CONTROL_TEXT_HEADER= 0x08,
DVPACK_CONTROL_TEXT= 0x09,
DVPACK_CONTROL_TAG_0A= 0x0A,
DVPACK_CONTROL_TAG_0B= 0x0B,
DVPACK_CONTROL_TELETEXT_INFO= 0x0C,
DVPACK_CONTROL_KEY= 0x0D,
DVPACK_CONTROL_ZONE_END_0E= 0x0E,
DVPACK_CONTROL_ZONE_END_0F= 0x0F,
DVPACK_TITLE_TOTAL_TIME= 0x10,
DVPACK_TITLE_REMAIN_TIME= 0x11,
DVPACK_TITLE_CHAPTER_TOTAL_NO= 0x12,
DVPACK_TITLE_TIME_CODE= 0x13,
DVPACK_TITLE_BINARY_GROUP= 0x14,
DVPACK_TITLE_CASSETTE_NO= 0x15,
DVPACK_TITLE_SOFT_ID_16= 0x16,
DVPACK_TITLE_SOFT_ID_17= 0x17,
DVPACK_TITLE_TEXT_HEADER= 0x18,
DVPACK_TITLE_TEXT= 0x19,
DVPACK_TITLE_TITLE_START_1A= 0x1A,
DVPACK_TITLE_TITLE_START_1B= 0x1B,
DVPACK_TITLE_REEL_ID_1C= 0x1C,
DVPACK_TITLE_REEL_ID_1D= 0x1D,
DVPACK TITLE_TITLE_END_1E= 0x1E,
DVPACK_TITLE_TITLE_END_1F= 0x1F,
DVPACK_CHAPTER_TOTAL_TIME= 0x20,
DVPACK_CHAPTER_REMAIN_TIME= 0x21,
DVPACK_CHAPTER_CHAPTER_NO= 0x22,
DVPACK_CHAPTER_TIME_CODE= 0x23,
DVPACK_CHAPTER_BINARY_GROUP= 0x24,
DVPACK_CHAPTER_RESERVED_25= 0x25,
DVPACK_CHAPTER_RESERVED_26= 0x26,
DVPACK_CHAPTER_RESERVED_27= 0x27,
DVPACK_CHAPTER_TEXT_HEADER= 0x28,
DVPACK_CHAPTER_TEXT= 0x29,
DVPACK_CHAPTER_CHAPTER_START_2A= 0x2A,
DVPACK_CHAPTER_CHAPTER_START_2B= 0x2B,
DVPACK_CHAPTER_RESERVED_2C= 0x2C,
DVPACK_CHAPTER_RESERVED_2D= 0x2D,
DVPACK_CHAPTER_CHAPTER_END_2E= 0x2E,
DVPACK_CHAPTER_CHAPTER_END_2F= 0x2F,
DVPACK_PART_TOTAL_TIME= 0x30,
DVPACK_PART_REMAIN_TIME= 0x31,
DVPACK_PART_PART_NO= 0x32,
DVPACK_PART_TIME_CODE= 0x33,
DVPACK_PART_BINARY_GROUP= 0x34,
DVPACK_PART_RESERVED_35= 0x35,
DVPACK_PART_RESERVED_36= 0x36,
DVPACK_PART_RESERVED_37= 0x37,
DVPACK_PART_TEXT_HEADER= 0x38,
DVPACK_PART_TEXT= 0x39,
DVPACK_PART_START_3A= 0x3A,
DVPACK_PART_START_3B= 0x3B,
DVPACK_PART_RESERVED_3C= 0x3C,
DVPACK_PART_RESERVED_3D= 0x3D,
DVPACK_PART_PART_END_3E= 0x3E,
DVPACK_PART_PART_END_3F= 0x3F,
DVPACK_PROGRAM_TOTAL_TIME= 0x40,
DVPACK_PROGRAM_REMAIN_TIME= 0x41,
DVPACK_PROGRAM_REC_DTIME= 0x42,
DVPACK_PROGRAM_TIME_CODE= 0x43,
DVPACK_PROGRAM_BINARY_GROUP= 0x44,
DVPACK_PROGRAM_RESERVED_45= 0x45,
DVPACK_PROGRAM_RESERVED_46= 0x46,
DVPACK_PROGRAM_RESERVED_47= 0x47,
DVPACK_PROGRAM_TEXT_HEADER= 0x48,
DVPACK_PROGRAM_TEXT= 0x49,
DVPACK_PROGRAM_PROGRAM_START_4A= 0x4A,
DVPACK_PROGRAM_PROGRAM_START_4B= 0x4B,
DVPACK_PROGRAM_RESERVED_4C= 0x4C,
DVPACK_PROGRAM_RESERVED_4D= 0x4D,
DVPACK_PROGRAM_PROGRAM_END_4E= 0x4E,
DVPACK_PROGRAM_PROGRAM_END_4F= 0x4F,
DVPACK_AAUX_SOURCE= 0x50,
DVPACK_AAUX_SOURCE_CONTROL= 0x51,
DVPACK_AAUX_REC_DATE= 0x52,
DVPACK_AAUX_REC_TIME= 0x53,
DVPACK_AAUX_BINARY_GROUP= 0x54,
DVPACK_AAUX_CLOSED_CAPTION= 0x55,
DVPACK_AAUX_TR= 0x56,
DVPACK_AAUX_RESERVED_57= 0x57,
DVPACK_AAUX_TEXT_HEADER= 0x58,
DVPACK_AAUX_TEXT= 0x59,
DVPACK_AAUX_AAUX_START_5A= 0x5A,
DVPACK_AAUX_AAUX_START_5B= 0x5B,
DVPACK_AAUX_RESERVED_5C= 0x5C,
DVPACK_AAUX_RESERVED_5D= 0x5D,
DVPACK_AAUX_AAUX_END_5E= 0x5E,
DVPACK_AAUX_AAUX_END_5F= 0x5F,
DVPACK_VAUX_SOURCE= 0x60,
DVPACK_VAUX_SOURCE_CONTROL= 0x61,
DVPACK_VAUX_REC_DATE= 0x62,
DVPACK_VAUX_REC_TIME= 0x63,
DVPACK_VAUX_BINARY_GROUP= 0x64,
DVPACK_VAUX_CLOSED_CAPTION= 0x65,
DVPACK_VAUX_TR= 0x66,
DVPACK_VAUX_TELETEXT= 0x67,
DVPACK_VAUX_TEXT_HEADER= 0x68,
DVPACK_VAUX_TEXT= 0x69,
DVPACK_VAUX_VAUX_START_6A= 0x6A,
DVPACK_VAUX_VAUX_START_6B= 0x6B,
DVPACK_VAUX_MARINE_MOUNTAIN= 0x6C,
DVPACK_VAUX_LONGITUDE_LATITUDE= 0x6D,
DVPACK_VAUX_VAUXEND_6E= 0x6E,
DVPACK_VAUX_VAUX_END_6F= 0x6F,
DVPACK_CAMERA_CONSUMER_CAMERA_1= 0x70,
DVPACK_CAMERA_CONSUMER_CAMERA_2= 0x71,
DVPACK_CAMERA_RESERVED_72= 0x72,
DVPACK_CAMERA_LENS= 0x73,
DVPACK_CAMERA_GAIN= 0x74,
DVPACK_CAMERA_PEDESTAL= 0x75,
DVPACK_CAMERA_GAMMA= 0x76,
DVPACK_CAMERA_DETAIL= 0x77,
DVPACK_CAMERA_TEXT_HEADER= 0x78,
DVPACK_CAMERA_TEXT= 0x79,
DVPACK_CAMERA_RESERVED_7A= 0x7A,
DVPACK_CAMERA_CAMERA_PRESET= 0x7B,
DVPACK_CAMERA_FLARE= 0x7C,
DVPACK_CAMERA_SHADING= 0x7D,
DVPACK_CAMERA_KNEE= 0x7E,
DVPACK_CAMERA_SHUTTER= 0x7F,
DVPACK_LINE_HEADER= 0x80,
DVPACK_LINE_Y= 0x81,
DVPACK_LINE_CR= 0x82,
DVPACK_LINE_CB= 0x83,
DVPACK_LINE_RESERVED_84= 0x84,
DVPACK_LINE_RESERVED_85= 0x85,
DVPACK_LINE_RESERVED_86= 0x86,
DVPACK_LINE_RESERVED_87= 0x87,
DVPACK_LINE_TEXT_HEADER= 0x88,
DVPACK_LINE_TEXT= 0x89,
DVPACK_LINE_LINE_START_8A= 0x8A,
DVPACK_LINE_LINE_START_8B= 0x8B,
DVPACK_LINE_RESERVED_8C= 0x8C,
DVPACK_LINE_RESERVED_8D= 0x8D,
DVPACK_LINE_LINE_END_8E= 0x8E,
DVPACK_LINE_LINE_END_8F= 0x8F,
DVPACK_MPEG_SOURCE= 0x90,
DVPACK_MPEG_SOURCE_CONTROL= 0x91,
DVPACK_MPEG_REC_DATE= 0x92,
DVPACK_MPEG_REC_TIME= 0x93,
DVPACK_MPEG_BINARY_GROUP= 0x94,
DVPACK_MPEG_STREAM= 0x95,
DVPACK_MPEG_RESERVED_96= 0x96,
DVPACK_MPEG_RESERVED_97= 0x97,
DVPACK_MPEG_TEXT_HEADER= 0x98,
DVPACK_MPEG_TEXT= 0x99,
DVPACK_MPEG_SERVICE_START_9A= 0x9A,
DVPACK_MPEG_SERVICE_START_9B= 0x9B,
DVPACK_MPEG_RESERVED_9C= 0x9C,
DVPACK_MPEG_RESERVED_9D= 0x9D,
DVPACK_MPEG_SERVICE_END_9E= 0x9E,
DVPACK_MPEG_SERVICE_END_9F= 0x9F,
DVPACK_RESERVED_RESERVED_A0= 0xA0,
DVPACK_RESERVED_RESERVED_A1= 0xA1,
DVPACK_RESERVED_RESERVED_A2= 0xA2,
DVPACK_RESERVED_RESERVED_A3= 0xA3,
DVPACK_RESERVED_RESERVED_A4= 0xA4,
DVPACK_RESERVED_RESERVED_A5= 0xA5,
DVPACK_RESERVED_RESERVED_A6= 0xA6,
DVPACK_RESERVED_RESERVED_A7= 0xA7,
DVPACK_RESERVED_RESERVED_A8= 0xA8,
DVPACK_RESERVED_RESERVED_A9= 0xA9,
DVPACK_RESERVED_RESERVED_AA= 0xAA,
DVPACK_RESERVED_RESERVED_AB= 0xAB,
DVPACK_RESERVED_RESERVED_AC= 0xAC,
DVPACK_RESERVED_RESERVED_AD= 0xAD,
DVPACK_RESERVED_RESERVED_AE= 0xAE,
DVPACK_RESERVED_RESERVED_AF= 0xAF,
DVPACK_RESERVED_RESERVED_B0= 0xB0,
DVPACK_RESERVED_RESERVED_B1= 0xB1,
DVPACK_RESERVED_RESERVED_B2= 0xB2,
DVPACK_RESERVED_RESERVED_B3= 0xB3,
DVPACK_RESERVED_RESERVED_B4= 0xB4,
DVPACK_RESERVED_RESERVED_B5= 0xB5,
DVPACK_RESERVED_RESERVED_B6= 0xB6,
DVPACK_RESERVED_RESERVED_B7= 0xB7,
DVPACK_RESERVED_RESERVED_B8= 0xB8,
DVPACK_RESERVED_RESERVED_B9= 0xB9,
DVPACK_RESERVED_RESERVED_BA= 0xBA,
DVPACK_RESERVED_RESERVED_BB= 0xBB,
DVPACK_RESERVED_RESERVED_BC= 0xBC,
DVPACK_RESERVED_RESERVED_BD= 0xBD,
DVPACK_RESERVED_RESERVED_BE= 0xBE,
DVPACK_RESERVED_RESERVED_BF= 0xBF,
DVPACK_RESERVED_RESERVED_C0= 0xC0,
DVPACK_RESERVED_RESERVED_C1= 0xC1,
DVPACK_RESERVED_RESERVED_C2= 0xC2,
DVPACK_RESERVED_RESERVED_C3= 0xC3,
DVPACK_RESERVED_RESERVED_C4= 0xC4,
DVPACK_RESERVED_RESERVED_C5= 0xC5,
DVPACK_RESERVED_RESERVED_C6= 0xC6,
DVPACK_RESERVED_RESERVED_C7= 0xC7,
DVPACK_RESERVED_RESERVED_C8= 0xC8,
DVPACK_RESERVED_RESERVED_C9= 0xC9,
DVPACK_RESERVED_RESERVED_CA= 0xCA,
DVPACK_RESERVED_RESERVED_CB= 0xCB,
DVPACK_RESERVED_RESERVED_CC= 0xCC,
DVPACK_RESERVED_RESERVED_CD= 0xCD,
DVPACK_RESERVED_RESERVED_CE= 0xCE,
DVPACK_RESERVED_RESERVED_CF= 0xCF,
DVPACK_RESERVED_RESERVED_D0= 0xD0,
DVPACK_RESERVED_RESERVED_D1= 0xD1,
DVPACK_RESERVED_RESERVED_D2= 0xD2,
DVPACK_RESERVED_RESERVED_D3= 0xD3,
DVPACK_RESERVED_RESERVED_D4= 0xD4,
DVPACK_RESERVED_RESERVED_D5= 0xD5,
DVPACK_RESERVED_RESERVED_D6= 0xD6,
DVPACK_RESERVED_RESERVED_D7= 0xD7,
DVPACK_RESERVED_RESERVED_D8= 0xD8,
DVPACK_RESERVED_RESERVED_D9= 0xD9,
DVPACK_RESERVED_RESERVED_DA= 0xDA,
DVPACK_RESERVED_RESERVED_DB= 0xDB,
DVPACK_RESERVED_RESERVED_DC= 0xDC,
DVPACK_RESERVED_RESERVED_DD= 0xDD,
DVPACK_RESERVED_RESERVED_DE= 0xDE,
DVPACK_RESERVED_RESERVED_DF= 0xDF,
DVPACK_RESERVED_RESERVED_E0= 0xE0,
DVPACK_RESERVED_RESERVED_E1= 0xE1,
DVPACK_RESERVED_RESERVED_E2= 0xE2,
DVPACK_RESERVED_RESERVED_E3= 0xE3,
DVPACK_RESERVED_RESERVED_E4= 0xE4,
DVPACK_RESERVED_RESERVED_E5= 0xE5,
DVPACK_RESERVED_RESERVED_E6= 0xE6,
DVPACK_RESERVED_RESERVED_E7= 0xE7,
DVPACK_RESERVED_RESERVED_E8= 0xE8,
DVPACK_RESERVED_RESERVED_E9= 0xE9,
DVPACK_RESERVED_RESERVED_EA= 0xEA,
DVPACK_RESERVED_RESERVED_EB= 0xEB,
DVPACK_RESERVED_RESERVED_EC= 0xEC,
DVPACK_RESERVED_RESERVED_ED= 0xED,
DVPACK_RESERVED_RESERVED_EE= 0xEE,
DVPACK_RESERVED_RESERVED_EF= 0xEF,
DVPACK_SOFT_MODE_MARKER_CODE= 0xF0,
DVPACK_SOFT_MODE_OPTION_F1= 0xF1,
DVPACK_SOFT_MODE_OPTION_F2= 0xF2,
DVPACK_SOFT_MODE_OPTION_F3= 0xF3,
DVPACK_SOFT_MODE_OPTION_F4= 0xF4,
DVPACK_SOFT_MODE_OPTION_F5= 0xF5,
DVPACK_SOFT_MODE_OPTION_F6= 0xF6,
DVPACK_SOFT_MODE_OPTION_F7= 0xF7,
DVPACK_SOFT_MODE_OPTION_F8= 0xF8,
DVPACK_SOFT_MODE_OPTION_F9= 0xF9,
DVPACK_SOFT_MODE_OPTION_FA= 0xFA,
DVPACK_SOFT_MODE_OPTION_FB= 0xFB,
DVPACK_SOFT_MODE_OPTION_FC= 0xFC,
DVPACK_SOFT_MODE_OPTION_FD= 0xFD,
DVPACK_SOFT_MODE_OPTION_FE= 0xFE,
DVPACK_NO_INFO= 0xFF,
}DVPACKID;
typedef struct_DV_METADATA
{
UINT32 cbSize;
BYTE Pack[5];
} DV_METADATA;
typedef UINT32 DV_AUDIOBLOCK_ID;
//对DVSL可以是0
//对DVSD、DV25可以是0-1
//对DV50可以是0-3
//对DVH1可以是0-7
typedef struct_DV_AUDIO_METADATA
{
DV_METADATA Metadata;
DV_AUDIOBLOCK_ID AudioBlock;
} DV_AUDIO_METADATA;
//包专用结构
typedef struct_DV_METADATA_CONTROL_CASSETTE_ID
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 0 0 0 0 0 0 0
// PC1 A 1 1 B B B C C
// PC2 D D D D E E E E
// PC3 F F F F F F F F
// PC4 G G G G H H H H
//
// A:ME:Mic出错(MicError)
// B:MULTI-BYTES:在一个多重写入操作周期中可以写入的单词的最大数量(MultiBytes)
// C:MEM TYPE:存储器类型(MemoryType)
// D:空间0的存储器大小:(MemorySizeOfSpace0)
// E:空间1的最后一个空区的存储器大小(MemorySizeOfLastBankInSpace1)
// F:空间1的存储体号(MemoryBankNoOfSpace1)
// G:磁带厚度的单位(TapeThickness)
// H:1/10磁带厚度
//
BOOL MicError;
// 0:该MIC中的所有事件不总是存在于该磁带上
// 1:该MIC中的所有事件确定地存在于该磁带上
UINT32 MultiBytes;
// 0:4字节
// 1:8字节
// 2:16字节
// 3-6:保留
// 7:未限制
UINT32 MemoryType;
// 0:EEPROM
// 1:FeRAM
// 其它=保留
UINT32 MemorySizeOfSpace0;
UINT32 MemorySizeOfLastBankInSpace1;
// 0:256字节
// 1:512字节
// 2:1k字节
// 3:2k字节
// 4:4k字节
// 5:8k字节
// 6:16k字节
// 7:32k字节
// 8:64k字节
// 其它:保留
// 0xF:无信息
UINT32 MemoryBankNoOfSpace1;
UINT32 TapeThickness;
} DV_METADATA_CONTROL_CASSETTE_ID;
typedef struct_DV_METADATA_CONTROL_TAPE_LENGTH
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 0 0 0 0 0 0 1
// PC1 A A A A A A AL 1
// PC2 A A A A A A A A
// PC3 AM A A A A A A A
// PC4 1 1 1 1 1 1 1 1
//
// A:磁带长度,MSB在PC3(M)左侧,LSB位于PC1(L)右侧。
//
UINT32 TapeLength;
} DV_METADATA_CONTROL_TAPE_LENGTH;
typedef struct_DV_METADATA_TEXT_HEADER
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 0 0 0 1 0 0 0 (对控制文本头部(TEXT_HEADER))
// PC0 0 0 0 1 1 0 0 0 (对标题文本头部)
// PC1 A A A A A A A AL
// PC2 B B B B C C C AM
// PC3 D D D D D D D D
// PC4 E E E F F F F F
//
// A:TDP:文本数据的总数(见部分2中的图55)
// B:文本类型(TextType)
// C:OPN:选项数量(OptionNumber)
// D:TEXT CODE:文本代码指定特征集(TextCode)
// E:AREA NO.:区域号指示在磁带上的哪个区域存储该主题(AreaNumber)。
// F:主题标签(TopicTag)
//
UINT32 TotalTextData;
UINT32 TextType;
// 0:名称
// 1:存储器
// 2:站
// 3:模型
// 6:操作符
// 7:副标题
// 8:概要
// 9:全屏
// C:一个字节编码的字体
// D:两个字节编码的字体
// E:图形
// F:无信息
// 其它:保留
UINT32 OptionNumber;
UINT32 TextCode;
// (见IEC 61834-4的控制文本头部包)
UINT32 AreaNumber;
UINT32 TopicTag;
UINT32 cbTextPacks;
[size_is(cbTextPacks)]BYTE pTextPacks[];
// 文本包布局-每一文本包具有该布局
// PC0 0 0 0 0 1 0 0 1 (对控制文本)
// PC0 0 0 0 1 1 0 0 1 (对标题文本)
// PC1 ? ? ? ? ? ? ? ?
// PC2 ????????
// PC3 ????????
// PC4 ????????
// 根据在相关联的文本头部包(TEXT HEADER)中指定的文本类型
// 该包包含字体数据、图形数据或文本数据
} DV_METADATA_TEXT_HEADER;
typedef struct_DV_METADATA_TAG
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 0 0 0 1 0 1 1 (对控制标签)
// PC1 A A A A A A AL B
// PC2 A A A A A A A A
// PC3 AM A A A A A A A
// PC4 C D E 1 F F F F
//
// A:绝对磁道号(AbsoluteTrackNumber)
// B:空白标志(BlankFlag)
// C:文本标志(TextFlag)
// D:暂时为真(TemporaryTrue)
// E:保持标志(HoldFlag)
// F:标签ID(TagId)
UINT32 AbsoluteTrackNumber;
BOOL BlankFlag;
// 1:在该绝对磁道号之前存在不连续
// 0:在该绝对磁道号之前不存在不连续
BOOL TextFlag;
// 0:文本信息存在
// 1:没有文本信息存在
BOOL TemporaryTrue;
// 该标志仅对MIC有效
// 0:MIC中的该事件数据不总是有效
// 1:MIC中该事件数据有效
BOOL HoldFlag;
// 0:在回放或录制之后保持绝对磁道号
// 1:在回放或录制之后更新绝对磁道号
UINT32 TagId;
} DV_METADATA_TAG;
typedef struct_DV_METADATA_TITLE_TIME_CODE
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 0 0 1 0 0 1 1
// PC1 A 1 B B C C C C
// PC2 1 D D D E E E E
// PC3 1 F F F G G G G
// PC4 1 1 H H I I I I
//
// A:空白标志(Blank)
// B:帧(Frame)的十位数
// C:帧(Frame)的个位数
// D:秒(Second)的十位数
// E:秒的(Second)个位数
// F:分钟(Minute)的十位数
// G:分钟(Minute)的个位数
// H:小时(Hour)的十位数
// I:小时(Hour)的个位数
BOOL Blank;
// 0:在该绝对磁道号之前存在不连续
// 1:在该绝对磁道号之前不存在不连续
UINT32 Frame;
UINT32 Second;
UINT32 Minute;
UINT32 Hour;
} DV_METADATA_TITLE_TIME_CODE;
typedef struct_DV_METADATA_AAUX_BINARY_GROUP
{
DV_METADATA DVMetadata;
DV_AUDIOBLOCK_ID DVAudioBlockId;
// 二进制包布局
// PC0 0 0 0 1 0 1 0 0 (对标题二进制组(BINARY_GROUP))
// PC1 A A A A B B B B
// PC2 C C C C D D D D
// PC3 E E E E F F F F
// PC4 G G G G H H H H
//
// A:二进制组2(BinaryGroup2)
// B:二进制组1(BinaryGroup1)
// C:二进制组4(BinaryGroup4)
// D:二进制组3(BinaryGroup3)
// E:二进制组6(BinaryGroup6)
// F:二进制组5(BinaryGroup5)
// G:二进制组8(BinaryGroup8)
// H:二进制组7(BinaryGroup7)
UINT32 BinaryGroup1;
UINT32 BinaryGroup2;
UINT32 BinaryGroup3;
UINT32 BinaryGroup4;
UINT32 BinaryGroup5;
UINT32 BinaryGroup6;
UINT32 BinaryGroup7;
UINT32 BinaryGroup8;
} DV_METADATA_AAUX_BINARY_GROUP;
typedef struct_DV_METADATA_BINARY_GROUP
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 0 0 1 0 1 0 0 (对标题二进制组)
// PC1 A A A A B B B B
// PC2 C C C C D D D D
// PC3 E E E E F F F F
// PC4 G G G G H H H H
//
// A:二进制组2(BinaryGroup2)
//B:二进制组1(BinaryGroup1)
//C:二进制组4(BinaryGroup4)
//D:二进制组3(BinaryGroup3)
//E:二进制组6(BinaryGroup6)
//F:二进制组5(BinaryGroup5)
//G:二进制组8(BinaryGroup8)
//H:二进制组7(BinaryGroup7)
UINT32 BinaryGroup1;
UINT32 BinaryGroup2;
UINT32 BinaryGroup3;
UINT32 BinaryGroup4;
UINT32 BinaryGroup5;
UINT32 BinaryGroup6;
UINT32 BinaryGroup7;
UINT32 BinaryGroup8;
} DV_METADATA_BINARY_GROUP;
typedef struct_DV_METADATA_PROGRAM_REC_DTIME
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 1 0 0 0 0 1 0
// PC1 A A BM B B B B BL
// PC2 CM C CL DM D D D DL
// PC3 EM E E FM F F F FL
// PC4 E E E EL GM G G GL
//
// A:录制模式(RecordingMode)
// B:分钟(Minutes)
// C:周(Week)
// D:小时(Hours)
// E:年(Year)
// F:日(Day)
// G:月(Month)
UINT32 RecordingMode;
// 0:视频
// 1:音频
// 2:音视频
// 3:重复
UINT32 Minutes;
// 3F:无信息
UINT32 Hours;
// 1F:无信息
UINT32 Day;
UINT32 Month;
UINT32 Year;
// 年份的最后两位
UINT32 WeekDay;
// 0:周日
// 1:周一
// 2:周二
// 3:周三
// 4:周四
// 5:周五
// 6:周六
// 7:无信息
} DV_METADATA_PROGRAM REC_DTIME;
typedef struct_DV_METADATA_AAUX_SOURCE
{
DV_METADATA DVMetadata;
DV_AUDIOBLOCK_ID DVAudioBlockId;
// 二进制包布局
// PC0 0 1 0 1 0 0 0 0
// PC1 A 1 B B B B B B
// PC2 C D D E F F F F
// PC3 1 G H I I I I I
// PC4 J K L L L M M M
//
// A:锁定标志(LockedFlag)
// B:音频帧大小(AudioFrameSize)
// C:立体声模式(StereoMode)
// D:每个音频块的音频通道(Channel)
// E:成对位(PairBit)
// F:音频模式(AudioMode)
// G:多语言标志(Multi-LanguageFlag)
// H:50/60(FiftySixty)
// I:系统类型(SystemType)
// J:加重标志(EmphasisFlag)
// K:加重的时间常量(TimeConstant)
// L:采样频率(SamplingFrequency)
// M:量化(Quantization)
BOOL LockedFlag;
// 0:锁定模式
// 1:未锁定模式
UINT32 AudioFrameSize;
BOOL StereoMode;
// 0:多重立体声音频
// 1:集总音频
UINT32 Channel;
// 0:每个音频块一个通道
// 1:每个音频块两个通道
// 其它:保留
BOOL PairBit;
// 0:一对通道
// 1:独立通道
UINT32 AudioMode;
// 音频模式的解释取决于立体声模式,
// 通道以及处理中的音频块。见IEC 61834-4的章节8.1
BOOL MultiLanguage;
// 0:以多种语言录制
// 1:不以多种语言录制
BOOL FiftySixty;
// 0:60图场系统(NTSC)
// 1:50图场(PAL)
UINT32 SystemType;
// 结合50/60标志定义视频信号的系统类型
// 见IEC 61834-4的8.1
BOOL Emphasis;
// 0:加重开
// 1:加重关
BOOL TimeConstant;
// 1:50.15毫秒
// 0:保留
UINT32 SamplingFrequency;
UINT32 Quantization;
} DV_METADATA_AAUX_SOURCE;
typedef struct_DV_METADATA_AAUX_SOURCE_CONTROL
{
DV_METADATA DVMetadata;
DV_AUDIOBLOCK_ID_DVAudioBlockId;
// 二进制包布局
// PC0 0 1 0 1 0 0 0 1
// PC1 A A B B C C D D
// PC2 E F G G G H H H
// PC3 I J J J J J J J
// PC4 1 K K K K K K K
//
// A:复制生成管理系统(CopyGnerationManagementSystem)
// B:之前录制的输入源(InputSource)
// C:压缩的次数(Compression)
// D:源情形(SourceSituation)
// E:录制开始(RecordStart)
// F:录制结束(RecordEnd)
// G:录制模式(RecordMode)
// H:插入通道(InsertChannel)
// I:方向标志(DirectionFlag)
// J:速度(PlayBackSpeed)
// K:流派类别(GenreCategory)
UINT32 CopyGenerationManagementSystem;
// 0:允许复制而无限制
// 1:未使用
// 2:允许生成副本一次
// 3:不允许复制
UINT32 InputSource;
// 0:模拟输入
// 1:数字输入
// 2:保留
// 3:无信息
UINT32 Compression;
// 0:压缩一次
// 1:压缩两次
// 2:压缩三次或以上
// 3:无信息
UINT32 SourceSituation;
// 0:带有听众约束的扰频源
// 1:没有听众约束的扰频源
// 2:带有听众约束的源或带有听众约束的解扰源
// 3:无信息
BOOL RecordingStart;
// 0:录制起始点
// 1:不录制起始点
BOOL RecordingEnd;
// 0:录制结束点
// 1:不录制结束点
UINT32 RecordMode;
// 1:原始
// 3:插入一个通道(CH1或CH2或CH或CH4)
// 4:插入四个通道(CH1和CH2和CH2和CH4)
// 5:插入两个通道(CH1和CH2)或(CH3和CH4)
// 7:无效录制(静音)
UINT32 InsertChannel;
// 0:CH1
// 1:CH2
// 2:CH3
// 3:CH4
// 4:CH1和CH2
// 5:CH3和CH4
// 6:CH1和CH2和CH3和CH4
// 7:无信息
BOOL DirectionFlag;
// 0:后退方向
// 1:前进方向
UINT32 PlaybackSpeed;
// 见IEC 61834-4的8.2章节
UINT32 GenreCategory;
// 见IEC 61834-4的3.3章节
} DV_METADATA_AAUX_SOURCE_CONTROL;
typedef struct_DV_METADATA_AAUX_REC_DATE
{
DV_METADATA DVMetadata;
DV_AUDIOBLOCK_ID DVAudioBlockId;
// 二进制包布局
// PC0 0 1 0 1 0 0 1 0 (对AAUX录制日期(REC DATE))
// PC1 A B C C D D D D
// PC2 1 1 E E F F F F
// PC3 G G G H I I I I
// PC4 J J J J K K K K
//
// A:日光节约时间(DaylightSavingsTime)
// B:三十分钟(ThirtyMinutesFlag)
// C:时区(TimeZone)的十位数
// D:时区(TimeZone)的个位数
// E:天(Day)的十位数
// F:天(Day)的个位数
// G:周(Week)
// H:月(Month)的十位数
// I:月(Month)的个位数
// J:年(Year)的十位数
// K:年(Year)的个位数
BOOL DaylightSavingsTime;
// 0:日光节约时间
// 1:正常
BOOL ThirtyMinutesFlag;
// 0:30分钟
// 1:00分钟
UINT32 TimeZone;
UINT32 Day;
UINT32 Week;
UINT32 Month;
UINT32 LastTwoDigitsOfYear;
} DV_METADATA_AAUX_REC_DATE;
typedef struct_DV_METADATA_VAUX_REC_DATE
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 1 1 0 0 0 1 0 (对VAUX录制日期)
// PC1 A B C C D D D D
// PC2 1 1 E E F F F F
// PC3 G G G H I I I I
// PC4 J J J J K K K K
//
// A:日光节约时间(DaylightSavingsTime)
// B:三十分钟(ThirtyMinutesFlag)
// C:时区(TimeZone)的十位数
// D:时区(TimeZone)的个位数
// E:天(Day)的十位数
// F:天(Day)的个位数
// G:周(Week)
// H:月(Month)的十位数
// I:月(Month)的个位数
// J:年(Year)的十位数
// K:年(Year)的个位数
BOOL DaylightSavingsTime;
// 0:日光节约时间
// 1:正常
BOOL ThirtyMinutesFlag;
// 0:30分钟
// 1:00分钟
UINT32 TimeZone;
UINT32 Day;
UINT32 Week;
UINT32 Month;
UINT32 LastTwoDigitsOfYear;
} DV_METADATA_VAUX_REC_DATE;
typedef struct_DV_METADATA_AAUX_REC_TIME
{
DV_METADATA DVMetadata;
DV_AUDIOBLOCK_ID DVAudioBlockId;
// 二进制包布局
// PC0 0 1 0 1 0 0 1 1 (对AAUX录制时间(REC_TIME))
// PC1 1 1 A A B B B B
// PC2 1 C C C D D D D
// PC3 1 E E E F F F F
// PC4 1 1 G G H H H H
//
// A:帧(Frame)的十位数
// B:帧(Frame)的个位数
// C:秒(Second)的十位数
// D:秒(Second)的个位数
// E:分钟(Minute)的十位数
// F:分钟(Minute)的个位数
// G:小时(Hour)的十位数
// H:小时(Hour)的个位数
UINT32 Frame;
UINT32 Second:
UINT32 Minute;
UINT32 Hour;
} DV_METADATA_AAUX_REC_TIME;
typedef struct_DV_METADATA_VAUX_REC_TIME
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 1 1 0 0 0 1 1 (对VAUX录制时间)
// PC1 1 1 A A B B B B
// PC2 1 C C C D D D D
// PC3 1 E E E F F F F
// PC4 1 1 G G H H H H
//
// A:帧(Frame)的十位数
// B:帧(Frame)的个位数
// C:秒(Second)的十位数
// D:秒(Second)的个位数
// E:分钟(Minute)的十位数
// F:分钟(Minute)的个位数
// G:小时(Hour)的十位数
// H:小时(Hour)的个位数UINT32 Frame;
UINT32 Second;
UINT32 Minute;
UINT32 Hour;
} DV_METADATA_VAUX_REC_TIME;
typedef struct_DV_METADATA_AAUX_CLOSED_CAPTION
{
DV_METADATA DVMetadata;
DV_AUDIOBLOCK_ID DVAudioBlockId;
// 二进制包布局
// PC0 0 1 0 1 0 1 0 1 (对AAUX隐藏字幕(CLOSED CAPTION))
// PC1 1 1 A A A B B B
// PC2 1 1 C C C D D D
// PC3 1 1 1 1 1 1 1 1
// PC4 1 1 1 1 1 1 1 1
//
// A:主要音频语言(MainAudioLanguage)
// B:主要音频类型(MainAudioType)
// C:第二音频语言(SecondAudioLanguage)
// D:第二音频类型(SecondAudioTyPe)
UINT32 MainAudioLanguage;
// 0:未知
// 1:英语
// 2:西班牙语
// 3:法语
// 4:德语
// 5:意大利语
// 6:其它
// 7:无
UINT32 MainAudioType;
// 0:未知
// 1:单声道
// 2:模拟立体声
// 3:真立体声
// 4:立体声环绕
// 5:数据服务
// 6:其它
// 7:无
UINT32 SecondAudioLanguage;
// 0:未知
// 1:英语
// 2:西班牙语
// 3:法语
// 4:德语
// 5:意大利语
// 6:其它
// 7:无
UINT32 SecondAudioType;
// 0:未知
// 1:单声道
// 2:描述性视频服务
// 3:无节目音频
// 4:特别效果
// 5:数据服务
// 6:其它
// 7:无
} DV_METADATA_AAUX_CLOSED_CAPTION;
typedef struct_DV_METADATA_AAUX_TR
{
DV_METADATA DVMetadata;
DV_AUDIOBLOCK_ID DVAudioBlockId;
// 二进制包布局
// PC0 0 1 0 1 0 1 1 0 (对AAUX TR)
// PC1 A A A AL B B B B
// PC2 A A A A A A A A
// PC3 A A A A A A A A
// PC4 AM A A A A A A A
//
// A:数据(Data)
// B:数据类型(Datatype)
UINT32 DataType;
UINT32 Data;
}DV_METADATA_AAUX_TR;
typedef struct_DV_METADATA_VAUX_TR
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 1 1 0 0 1 1 1 (对VAUX TR)
// PC1 A A A AL B B B B
// PC2 A A A A A A A A
// PC3 A A A A A A A A
// PC4 AM A A A A A A A
//
// A:数据(Data)
// B:数据类型(Datatype)
UINT32 DataType;
UINT32 Data;
} DV_METADATA_VAUX_TR;
typedef struct_DV METADATA_VAUX_SOURCE
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 1 1 0 0 0 0 0
// PC1 A A A A B B B B
// PC2 C D E E F F F F
// PC3 G G H I I I I I
// PC4 J J J J J J J J
//
//A:TV频道(Channel)的十位数
//B:TV频道(Channel)的个位数
//C:黑白(BlackAndwhiteFlag)
//D:允许彩色(ColorFramesEnableFlag)
//E:彩色帧标识(ColorFramesId)
//F:TV频道(Channel)的百位数
//G:源代码(Sourcecode)
//H:50/60(FiftySixty)
//I:信号类型(Stype)
//J:调谐器类别(TunerCategory)
UINT32 Channel;
BOOL BlackAndWhiteFlag;
// 0:黑白
// 1:彩色
BOOL ColorFramesEnableFlag;
// 0:CLF有效
// 1:CLF无效
UINT32 ColorFramesId;
// 对525-60
// 0:彩色帧A
// 1:彩色帧B
//
// 对625-50
// 0:第1、2场(Field)
// 1:第3、4场
// 2:第5、6场
// 3:第7、8场
UINT32 SourceCode;
BOOL FiftySixty;
// 0:60图场系统(NTSC)
// 1:50图场系统(PAL)
UINT32 SType;
UINT32 TunerCategory;
} DV_METADATA_VAUX_SOURCE;
typedef struct_DV_METADATA_VAUX_SOURCE_CONTROL
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 1 1 0 0 0 0 1
// PC1 A A B B C C D D
// PC2 E 1 F F 1 G G G
// PC3 H I J K L M N N
// PC4 1 O O O O O O O
//
// A:复制生成管理系统(CopyGenerationManagementSystem)
// B:之前录制的输入源(JustPreviousInput)
// C:压缩次数(Compression)
// D:源和所录制的情形(SourceSituation)
// E:录制起始点(RecordStart)
// F:录制模式(RecordMode)
// G:显示选择模式(DisplaySelect)
// H:帧/场标志(FrameField)
// I:第一/第二标志(FirstSecond)
// J:帧改变标志(FrameChange)
// K:隔行扫描标志(Interlace)
// L:静止场画面标志(StillField)
// M:静止摄影画面标志(StillCamera)
// N:广播系统(BroadcastSystem)
// O:流派类别(GenreCategory)
UINT32 CopyGenerationManagementSystem;
// 0:允许复制而无限制
// 1:未使用
// 2:允许生成副本一次
// 3:不允许复制
UINT32 JustPreviousInput;
// 0:模拟
// 1:数字
// 2:保留
// 3:无信息
UINT32 Compression;
// 0:压缩一次
// 1:压缩两次
// 2:压缩三次或更多
// 3:无信息
UINT32 SourceSituation;
// 0:带有听众约束的扰频源和在没有解扰的情况下录制
// 1:没有听众约束的扰频源且在没有解扰的情况下录制
// 2:带有听众约束的源或带有带有听众约束的解扰的源
// 3:无信息
BOOL RecordingStart;
// 0:录制起始点
// 1:不录制起始点
// 3:无信息
UINT32 RecordMode;
// 0:原始
// 1:保留
// 2:插入
// 3:无效录制
UINT32 DisplaySelect;
BOOL FrameField;
// 0:两个场中仅一个被输出两次
// 1:两个场均按顺序输出
BOOL FirstSecond;
// 0:场2为输出
// 1:场2为输出
BOOL FrameChange;
// 0:与之前紧接的帧相同的画面
// 1:与之前紧接的帧不同的画面
BOOL Interlace;
// 0:非隔行扫描
// 1:隔行扫描或未识别
BOOL StillField;
// 0:场之间的时间区别几乎为0秒
// 1:场之间的时间区别大致为1.001/60秒或1/50秒
BOOL StillCamera;
// 0:静止摄影画面
// 1:非静止摄影画面
UINT32 BroadcastSystem;
UINT32 GenreCategory;
} DV_METADATA_VAUX_SOURCE_CONTROL;
typedef struct_DV_METADATA_VAUX_CLOSED_CAPTION
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 1 1 0 0 1 0 1 (对VAUX隐藏字幕)
// PC1 A A A A A A A A
// PC2 B B B B B B B B
// PC3 C C C C C C C C
// PC4 D D D D D D D D
//
// A:第1场21行第1字节(FirstFieldFirstByte)
// B:第1场21行第2字节(FirstFieldSecondByte)
// C:第2场21行第1字节(SecondFieldFirstByte)
// D:第2场21行第2字节(SecondFieldSecondByte)
UINT32 FirstFieldFirstByte;
UINT32 FirstFieldSecondByte;
UINT32 SecondFieldFirstByte;
UINT32 SecondFieldSecondByte;
} DV_METADATA_VAUX_CLOSED_CAPTION;
typedef struct_DV_METADATA_CAMERA_CONSUMER_CAMERA_1
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 1 1 1 0 0 0 0
// PC1 1 1 A A A A A A
// PC2 B B B B B C C C
// PC3 D D D E E E E E
// PC4 F G G G G G G G
//
// A:光圈(Iris)
// B:自动曝光模式(AEMode)
// C:自动增益控制(AGC)
// D:白平衡模式(WBMode)
// E:白平衡(WhiteBalance)
// F:对焦模式(FocusMode)
// G:焦点(FocusPosition)
UINT32 Iris;
// 按照F数的位置
// 0-60:其中光圈位置=2^(IP/8)的IP
// 61:F1.0以下
// 62:关
// 63:无信息
UINT32 AEMode;
// 0:全自动
// 1:增益优先模式
// 2:快门优先模式
// 3:光圈优先模式
// 4:手动
// 15:无信息
// 其它:保留
UINT32 AGC;
// 0-13:G
// 15:无信息
UINT32 WBMode;
// 0:自动
// 1:保持
// 2:一键式
// 3:预设
// 7:无信息
// 其它:保留
UINT32 WhiteBalance;
// 0:烛光
// 1:白炽灯
// 2:低色温的荧光灯
// 3:高色温的荧光灯
// 4:日光
// 5:阴暗
// 6:其它
// 31:无信息
// 其它:保留
BOOL FocusMode;
// 0:自动对焦
// 1:手动对焦
UINT32 FocusPosition;
// 0-126:焦点位置=Mx10^L
// 其中M是焦点的最高5位
// 而L是焦点的最低2位
// 127:无信息
} DV_METADATA_CAMERA_CONSUMER CAMERA_1;
typedef struct_DV_METADATA_CAMERA_CONSUMER_CAMERA_2
{
DV_METADATA DVMetadata;
// 二进制包布局
// PC0 0 1 1 1 0 0 0 1
// PC1 1 1 A B B B B B
// PC2 C D E E E E E E
// PC3 F F F F F F F F
// PC4 G H H H I I I I
//
// A:垂直摇摄全景方向(VerticalPanningDirection)
// B:垂直摇摄全景速度(VerticalPanningSpeed)
// C:图像稳定器(ImageStabilizer)
// D:水平摇摄全景方向(HorizontalPanningDirection)
// E:水平摇摄全景速度(HorizontalPanningSpeed)
// F:焦距(FocalLength)
// G:允许变焦标志(ZoomEnable)
// H:E-Zoom的单位(ElectricZoom)
// I:1/10的E-Zoom
BOOL VerticalPanningDirection;
// 0:与垂直扫描相同方向
// 1:与垂直扫描相反方向
UINT32 VerticalPanningSpeed;
// 0-29:摇摄全景速度
// 30:高于每场29行
// 31:无信息
BOOL ImageStabilizer;
// 0:开
// 1:关
BOOL HorizontalPanningDirection;
// 0:与水平扫描相同方向
// 1:与水平扫描相反方向
UINT32 HorizontalPanningSpeed;
// 0-30:摇摄全景速度
// 62:高于每场122像素
// 63:无信息
UINT32 FocalLength;
// 0-254:焦距
// 255:无信息
BOOL ZoomEnable;
// 0:电子变焦开
// 1:电子变焦关
UINT32 ElectricZoom;
// 0-79:0.0-7.9单位的电子变焦
// 126:大于8倍
// 127:无信息
} DV_METADATA_CAMERA_CONSUMER_CAMERA_2;
typedef struct_DV_METADATA_CAMERA_SHUTTER
{
DV_METADATA DVMetadata;
// 二进制包布局
//
// 对顾客使用
//
// PC0 0 1 1 1 1 1 1 1
// PC1 1 1 1 1 1 1 1 1
// PC2 1 1 1 1 1 1 1 1
// PC3 A A A A A A A AL
// PC4 1 AM A A A A A A
//
// 对专业使用
//
// PC0 0 1 1 1 1 1 1 1
// PC1 B B B B B B B B
// PC2 C C C C C C C C
// PC3 1 1 1 1 1 1 1 1
// PC4 1 1 1 1 1 1 1 1
//
//
// A:快门速度(ShutterSpeed)
// B:顶线快门速度(UpperLineSpeed)
// C:底线快门速度(LowerLineSpeed)
//
UINT32 ShutterSpeed;
// 0x0000-0x7FFE:快门速度
// 0x7FFF:无信息
UINT32 UpperLineSpeed;
// 0-254:快门速度
// 255:无信息
UINT32 LowerLineSpeed;
}DV_METADATA_CAMERA_SHUTTER;
结论
尽管在结构化特征和/或方法性动作专用的的语言中描述了本发明,但可理解,在所附权利要求书中定义的本发明不必限于所述的具体特征或动作。相反,这些具体特征和动作是作为实现所要求保护的本发明的示例性形式来公开的。