本发明涉及视频处理,特别涉及一种数据编码存储方法。
背景技术:
随着信息技术的不断发展,数据日益成为人们日常生活中重要资源。爆炸式增长的数据必然带来存储设备的持续增加。目前,数据存储环境下的现代数据中心的存储节点规模少则几万多则几十万,但在规模巨大的存储环境系统中,存储节点异常或者失效已成为一种普遍现象;与此同时,因网络连接设备或者存储节点其它元器件造成的数据不可访问或者丢失现象也时有发生。对于视频编码存储而言,计算量少的编译码复杂度与数据丢失时如何利用最少的数据量进行数据恢复都具有局部的时间特性,例如存储中心网络带宽因素,cpu计算能力因素,在视频文件利用编码冗余策略进行存储时,会对文件的存储时间性能造成影响。若系统内具有高速带宽与高性能的计算能力,视频存储单位大小的文件就会消耗更短的时间。而较高的可靠性与系统内最小的数据冗余与系统消耗较少的电能具有全局的时间特性,这将会直接决定系统消耗的设备成本,管理成本及能耗成本。为了满足日益扩展的数据存储需求,人们对视频数据存储的可靠性,可用性等相关特性提出了更高的要求,如何实现数据的低冗余度高可靠性存储已经成为业界面临的一个巨大挑战。
技术实现要素:
为解决上述现有技术所存在的问题,本发明提出了一种数据编码存储方法,包括:
数据编码存储方法,用于进行视频数据存储,其特征在于,包括:
将文件数据进行编码后分块封装;
将封装后的数据存储于视频数据存储系统的镜像子集的不同节点上;
根据存储容量的需求进行镜像子集扩展。
优选地,所述视频数据存储系统包括协调服务器,当存储节点加入时,将自已的资源列表提供给协调服务器。
优选地,计算待上传文件的散列值,并将该值上传到协调服务器,协调服务器协调各个存储节点对该值进行查询,当发现存在该值时,协调服务器更新该文件的引用度。
优选地,当未检测出相同散列时,嵌入式终端接收该文件,并对文件的信息分块计算散列,并分布式存储到镜像子集的节点中。
优选地,所述计算待上传文件的散列值,还包括:将文件划分成各个分块,并计算每个分块的sha值,将整个文件的散列值作为该文件的特征签名;将每个文件的特征签名与文件路径以及其他相关信息构成元数据一起放在内存中,而其各个分块的签名放在磁盘中,只有当系统有节点异常时,才将各个分块的签名读入内存中,以便嵌入式终端对丢失数据恢复后,进行校验对比。
优选地,将分块的位置信息及其散列值、以及文件块标识统一存储在一张表中。
本发明相比现有技术,具有以下优点:
本发明提出了一种数据编码存储方法,尽可能少地利用视频存储节点集内部网络带宽及计算能力来实现数据恢复,在实现数据高可用性的同时,提高了扩展性能。
附图说明
图1是根据本发明实施例的数据编码存储方法的流程图。
具体实施方式
下文与图示本发明原理的附图一起提供对本发明一个或者多个实施例的详细描述。结合这样的实施例描述本发明,但是本发明不限于任何实施例。本发明的范围仅由权利要求书限定,并且本发明涵盖诸多替代、修改和等同物。在下文描述中阐述诸多具体细节以便提供对本发明的透彻理解。出于示例的目的而提供这些细节,并且无这些具体细节中的一些或者所有细节也可以根据权利要求书实现本发明。
本发明的一方面提供了一种数据编码存储方法。图1是根据本发明实施例的数据编码存储方法流程图。
本发明的视频数据存储系统采用了存储节点子集扩展策略。在系统软件结构上采用新的数据恢复方式,同时利用嵌入式终端的计算能力,使得系统尽可能少的利用存储节点集内部网络带宽及计算能力来实现丢失数据的恢复重建。将丢失数据块的恢复功能部分的迁移到嵌入式终端。视频数据存储系统中将单个文件的数据经过编码后分块封装,均匀地存储于镜像子集的不同节点上,系统提供一个可扩展的存储卷,卷内的数据采用层次目录结构组织,支持多机多进程的并发存取。使系统可根据存储容量的需求进行镜像子集扩展,利用各个镜像子集节点存储能力达到按需扩展的目的。
镜像子集形成一个统一的单一文件映射,每个子集间形成一致的编码存储视图。每个子集内存储节点存储的为相同文件的不同分块,系统维护同一文件的不同分块与存储节点之间的映射关系。各个镜像子集间将组合成一个具有层次结构的树状图,以建立存储文件集合与设备集合之间的映射关系。同时,各个存储节点开辟一段单独的存储空间,用于系统特殊用途的数据存储,避免造成镜像子集内的存储节点存储文件目录不一致的情况。系统中各个存储节点独立地维护子集的存储资源和文件的元数据本身,并能够独立提供文件分块读取服务。当存储节点内磁盘损坏时,磁盘所在节点对数据块进行恢复,文件恢复节点将调度分布式存储在子集中可满足重建要求的最少校验分块,对丢失数据块进行重建。若出现多个存储节点发生异常时,文件服务器将计算恢复所有文件所需要的计算量,并按照计算量的均衡负载原则,对恢复节点进行任务分配。当校验信息子集中出现节点异常时,系统将调度源文件进行二次编码,并再次部署于新加入的节点上。
存储节点间采用对等结构设计,当存储节点加入视频数据存储系统时,将自已的资源列表提供给协调服务器,任何一个组内节点既可以作为文件分块的请求者,也可以作为文件分块的提供者,视频数据存储系统根据存储数据量及存储系统利用率确定是否启动下一镜像子集。在任一镜像子集sk(a;b)(k=1,2,3...)中将存储节点分为文件分块存储节点及编码校验分块存储节点。文件分块存储节点构成信息镜像子集sk(a),其中节点ak,i∈sk(a)(k,i属于正整数),用于存储原文件的分块;而编码校验分块存储节点bk,i(k,i属于正整数)构成校验信息镜像子集s(b)。
为了降低整个系统内部文件的数据冗余度,本发明系统架构将文件级重复数据删除引入系统。并在数据源位置执行重复数据消冗的策略。嵌入式终端软件运行时,利用sha加密算法计算待上传文件的散列值,并将该值上传到协调服务器,协调服务器协调各个存储节点对该值进行查询,当发现存在该值时,协调服务器更新该文件的引用度,并通知嵌入式终端数据已存储,当未检测出相同散列时,嵌入式终端接收该文件,并对文件的信息分块计算散列,并分布式存储到镜像子集的节点中。
文件级别的相同数据检测可以检测出不同文件名的相同文件,也可以检测出不同目录下的相同文件。系统将文件划分成各个分块,并计算每个分块的sha值,将整个文件的散列值作为该文件的特征签名。系统将每个文件的特征签名与文件路径以及其他相关信息构成元数据一起放在内存中,而其各个分块的签名放在磁盘中,只有当系统有节点异常时,才将各个分块的签名读入内存中,以便嵌入式终端对丢失数据恢复后,进行校验对比。为加快分块的查找,系统将分块的位置信息、及其散列值、以及文件块标识统一存储在一张表中。
当系统出现节点异常,数据丢失而嵌入式终端却需要读取数据时,嵌入式终端通过下载部分原数据分块与部分校验数据块,通过重建的方式在嵌入式终端重建丢失数据块,恢复完成后,嵌入式终端在使用文件的同时,将已经重建出的数据分块,经过数据验证,重新发送到存储系统。
针对各个镜像子集中数据存储节点都具有相同目录信息的特点,先将镜像子集中的元文件均匀分块存储到各个存储节点中,当嵌入式终端需要元文件信息时,镜像子集的各个存储节点将查询本节点存储的元数据。这样将元数据的查询转换成各个存储节点分别对元数据子块的查询。
当嵌入式终端发出文件存储请求时,文件服务器根据子集sk(a;b)中节点的运行情况,产生元数据,并向子集sk(a;b)中的某一空闲节点发出指令,嵌入式终端将直接和该存储节点进行数据交互。该节点对文件进行分块并编码,产生校验数据,并按照数据封装格式进行封装。文件的原始分块将发送到子集sk(a),校验数据块分布式存储到子集sk(b)上。这样每个文件的数据块及校验块跨越子集中的所有存储节点,各节点间具有相同的文件存储视图。当镜像子集sk(a;b)中的存储空间即将利用完毕时,系统启动下一镜像子集sk+1(a;b)。为增加集群存储系统计算资源的利用率,子集s1(b),s2(b),...sk+1(b)中节点也可被文件服务器用来分配对后续待存储文件进行编码计算。
当有文件读取需求时,嵌入式终端向文件服务器请求源数据,文件服务器直接发送待读取文件与镜像子集及存储节点之间的映射与匹配信息给嵌入式终端。获得应答后,嵌入式终端先将所要求的文件名和字节偏移转换成文件的索引,向存储节点发送包含文件名和索引的请求,直接和目标存储节点集合建立文件读取互操作。嵌入式终端向文件镜像子集中每一个存储节点发送一个请求,请求指定的文件分块和块内数据区。如果下载镜像子集sk(b)中存储校验块,则利用数据重建的方式获取原文件。
当嵌入式终端发出文件存储请求,且存储系统中无相同数据时,协调服务器根据子集sk(b)中节点的运行情况产生元数据,并向子集sk(b)中的某一空闲节点发出指令,嵌入式终端直接和该存储节点进行文件交互。该节点对文件进行分块并编码,产生校验数据,并按照数据封装格式进行封装,同时计算出各个文件信息分块的散列值,并将散列值发送到协调服务器。存储文件的数据分块将发送到子集sk(a),校验数据块分布式存储到子集sk(b)上。这样每个文件的数据块及校验块跨越子集中的所有存储节点,各节点间具有相同的文件存储视图。当镜像子集sk(a;b)中的存储空间即将利用完毕时,系统启动下一镜像子集sk+1(a;b)。
当有文件读取需求时,嵌入式终端向文件服务器请求源数据,文件服务器直接发送待读取文件与镜像子集及存储节点之间的映射与匹配信息给嵌入式终端。获得应答后,用户先将所要求的文件名和字节偏移转换成文件的索引,向存储节点发送包含文件名和索引的请求,直接和目标存储节点集合建立文件读取互操作。协调服务器根据查询结果返回文件块的索引,包括文件所在的集群子集以及数据块的位置。嵌入式终端向文件镜像子集中每一个存储节点发送一个请求,请求指定的文件分块和块内数据区。嵌入式终端将按顺序重组文件分块获得原文件。
协调服务器负责分配集群存储任务及元数据管理,协调服务器记录存储集群中各节点信息,存储节点的子集划分信息、系统存储文件目录信息、从文件到块的映射关系信息以及各个文件分块的散列值,同时还负责对丢失文件块进行恢复时的策略确定,及恢复任务分配,文件分块的迁移管理。系统利用定期心跳和事件广播组合的方式实现系统节点状态的监测,当系统出现新的节点时,该节点将通过广播的方式将本节点的信息传播给协调服务器及各个存储节点。同时,每个存储节点定期向其对应的文件管理节点报告自已存在的状态,如果对应的文件管理节点一段时间内没有收到心跳则认为该存储节点异常。
异常节点在恢复过程中,首先检测与其余节点之间的连接情况,当恢复文件的节点与其余节点具有差别较大的网络连接时,对各个链路发送测试数据包进行数据通路测评,并进行排序,并计算出所需恢复的最少文件块个数p,从而从最优的p个网络连接中,获取文件块,对文件进行恢复。若节点k负责对文件f丢失的文件块进行恢复,节点k从与其连接的p个节点发送全部文件块读取请求,节点k获得所需文件块后,利用系统编码方法将源文件恢复后,根据标记和丢失的节点和文件块,利用系统采用的编码方法对源文件进行二次编码,获得丢失的冗余文件块,重新按照文件封装协议,依据各个丢失的文件块尺寸进行重新封装,并将重新恢复出的文件块f的l个文件块,分别均匀按顺序存储在存储节点上。各个节点开辟一个专门的分区暂时存储被重建出的数据块,当异常节点被替换后,重建出的数据将按照协调服务器的数据块放置路径统一进行放置。
本发明基于嵌入式终端的使用需求进行丢失数据块恢复。利用散布在嵌入式终端大量的计算资源参与丢失文件块的重建与集群内部集中重建相结合的方式,来实现异常节点上文件分块的重建。
若原文件为k个分块,经编码后产生n-k个校验数据块,则从这n个数据块中任意取出k个分块便可重建出原文件。集群存储系统运行时,对重建临界参数k(1<k<n-m)进行设置。当集群中异常存储节点kf<k时,集群管理器并不组织内部节点对异常存储节点上的数据块进行恢复,而是利用用户对所需求的数据块进行恢复。用户在读取某一文件时,需要同时下载集群中所剩余的n-kf个原文件数据分块和kf个校验数据块,并下载码字信息,重建出异常的kf个数据块,并将重建出的数据块与已下载的n-kf个数据块,拼接成原文件。同时,嵌入式终端对恢复出的kf个数据块按照集群系统中数据块封装的格式再次进行封装,并上传到服务器集群上。文件服务器将计算该数据块的散列值,并与已存储的原数据块的散列值进行比较,若相同,则存储该分块,若不同则拒绝该数据分块的上传请求。当计算机集群中异常的节点个数超过设置的重建临界参数值k时,协调服务器将根据未被恢复的文件分块数据量大小及集群内节点运行情况确定集群内恢复策略。协调服务器将计算重建所有剩余文件分块所需要的计算量,按照计算量的均衡负载原则,对恢复节点进行任务分配。并将恢复的文件分块再次部署于集群内存储节点上。
实现时,嵌入式终端首先计算已经重建出数据块的散列函数值,将散列值上传到协调服务器,由于协调服务器中已经存储了在最初文件存储时已经存储的散列值库,与库中的丢失文件的散列值进行比对,如果发现嵌入式终端重建出的数据块的散列值与丢失数据块的散列值相同,则允许嵌入式终端上传该数据块,若嵌入式终端重建出的数据块的散列值与丢失数据块的散列值不同,说明重建的数据块不正确,或者该数据已经被恶意篡改,不接收该数据块。对于重要数据,当数据块上传完毕时,系统内部需要对已经上传完毕的数据块进行二次检测。管理节点再次计算该数据块的散列值,并与原数据块的散列值再次比对,检测其是否在上传过程中,受到恶意攻击或者篡改。
当系统无原文件分块丢失时,嵌入式终端直接下载原文件分块来实现文件的读取。在出现网络阻塞时,嵌入式终端以重建的方式获得比直接下载原数据块更好的文件读取性能。若某文件为m,信息节点个数为k,校验节点个数为r。若某时刻信息节点可提供的数据读取速率为ma,而校验节点可提供的数据下载速率为mb,则mb>ma。若嵌入式终端重建m/k数据块的速率为md,若有
针对流媒体文件内部读取的特征,本发明首先对媒体文件进行均匀分块,然后对分块进行校验计算获取校验块,同时对流媒体文件前t个文件块进行复制,并分别存储到存储集群的各个节点上。系统对于备份分块采用单独管理的模式,存储节点将用磁盘中单独开辟的空间存储数据分块的备份数据。统计某文件的被读取次数x,若在单位时间内被读取次数大于某一设定值y,则该文件的数据块数保持复制和编码冗余共存的状态。若单位时间内被读取次数小于某一设定值z,则系统清除该文件所有的复制分块。
系统中的节点进一步分为活动存储节点和休眠存储节点。活动节点的任务是存储新的文件,以及承担用户对系统内部数据的读取任务。优选地,将存储文件信息的存储节点子集sn(a)设置为活动节点,让其磁盘处于活动状态,以满足海量用户的数据读取请求,存储校验数据的存储节点子集sn(b)中存储节点设置为静态节点,使请求仅定向到部分布式存储储节点上。系统在重复数据散列值查询时,利用该部分的节点进行分布式查询。同时,文件管理器将统计对文件的读取频率,高频率的数据将转移到活动节点,访问频度很小的数据将被转移到休眠存储节点。
在逻辑上,若存储系统共有n个存储节点,存储系统需要达到的纠删性能为系统可以容许任意r个存储节点出现异常。则当嵌入式终端提出文件存储请求时,系统首先对文件进行分块,分块的数目为k=n-r。并利用reedsolomon编码矩阵g,产生r个校验分块。并利用k个节点存储文件的原始分块,其余r个节点用于存储经过与g运算后产生的校验数据分块。其具体过程为:
步骤一:当系统接到文件存储请求时,系统直接对文件进行分块,分为m×k个文件块,若文件大小无法直接被m×k整除,则在文件末尾添加“0”。利用生成矩阵中各行向量中“0”、“1”对应的位置构造的规则,直接将编码矩阵g中的向量与分割出的m×k数据块进行运算,以获取校验数据块。
步骤二:若原文件的分块用d=(d1,d2,…dk)t表示,将di称为宏块。di由m个微块组成,而对于di中的m个数据块(di,1,di,2…di,m)t称为微块组。若生成的校验宏块组用p=(p1,p2,…pr)t表示,其中每一个校验宏块pi中包含m个校验微块。原始文件块及校验块的集合用e=(d1,d2,…dk|p1,p2,…pr)t表示。则:g·d=e。
整个文件的m×k个数据分块可表示为:d1,1,d1,2…d1,m,…,dk,1,dk,2…dk,m。原始文件分块生成的每个校验宏块pi中包含m个校验微块,则校验微块分别表示为:p1,1,p1,2…p1,m,…,pr,1,pr,2…pr,m。
将reedsolomon编码矩阵g表示为g=[i,v’]t。其中i为m×m的单位阵,v’为(m×r)×(m×k)的矩阵。微块pi,j的生成过程为:将待存储文件的m×k个数据分块d1,1,d1,2…d1,m,…,dk,1,dk,2…dk,m按顺序排列,并与矩阵v’中第(i-1)·m+j行上的m·k个元素的位置依次对应。第(i-1)·m+j行上的0-1分布情况决定着校验微块pi,j的产生规则:将(i-1)·m+j行上所有值为“1”的元素位置所对应的那些文件数据分块进行模2累加运算,得到的结果就是由该行决定的一个校验微块。如此,矩阵g中的子矩阵v’一共可以产生针对原文件的r·m个校验微块p1,1,p1,2,…,p1,m,…,pr,1,pr,2,…,pr,m,即可以产生t个校验宏块。单位矩阵i生成的数据块即为文件的原始分块。这些原始文件分块按顺序直接拼接起来就是原文件。
然后针对二进制编码矩阵进行编码优化。首先继续将编码矩阵表示为:
g=[ik×m,gr×m]t其中:gr,m=[l1,i,l2,i,…lr×m,i]t
根据生成校验位的行向量l1,i,l2,i,…lr×m,i中“1”的个数确定出根据该向量计算校验位时所需要的异或计算次数。并计算任意两向量la,j,lb,j之间不相同的位数。下面根据以上参数确定校验位计算优化方法。其优化流程如下:
1.根据编码矩阵中每一行向量中“1”的个数,确定出根据该行向量计算校验位所需要的异或次数;
2.比较编码矩阵中任意两个行向量之间的元素相同位与元素不同位的个数,记为(e/d),其中e表示两个向量中元素相同的位个数;d表示两个向量中元素不同的位个数;
3.若行向量li(1<i<r·m)所需要的异或次数小于或等于步骤2中不同位数d,则直接根据该向量计算出该行所对应的校验数据块,并将该向量记为lj;
4.利用步骤3中确定的向量lj,根据步骤2中相同位数与不同位数之比,确定下一个计算行向量。当某行向量lk与向量lj不同位数小于相同位数,且lk与向量lj不同位数与其余各个向量不同位数达到最小时,则根据向量lj已计算出的校验数据来计算由lk确定的校验数据;
5.若仍有未计算校验位,则按照步骤4中的计算规则,以lk为基础向量,寻找下一待计算向量。
6.确定是否已全部校验位计算过程,若是,则保存校验位依次计算过程,若否,则按照原始对应关系进行计算。
为详细的描述本方法,假定存储数据块d1,d2,…dr的节点出现异常,则嵌入式终端获取原文件的具体过程如下:
步骤1:根据编码矩阵g=[i,v’]t直接得到校验矩阵h=[v’t,im·r]t用于对丢失的数据块进行重建。
步骤2:从正常工作的存储节点上,任意选择k个存储节点下载k个数据块dr+1,dr+2,…dk,dk+l,…dk+r-1,dk+r。
步骤3:将丢失的宏块d1,d2,…dr分别表示为x1,x2,…xr,令β=[x1,x2,…xr,dr+1,…dk+r-1,dk+r],其中βr=[x1,x2,…xr],βk=[dr+1,…dk+r-1,dk+r]。即β=[βr,βk]。则按照关系β·h(k+r)r=0来重建出丢失的数据块。
步骤四:若矩阵h(k+r)r中与丢失数据块对应的向量矩阵表示为h’r·r,矩阵h(k+r)r中与完好数据块对应的向量矩阵表示为h”k.r;则有:
βl×r·h’r·r=βl×k·h”k·r
其中βl×r是未知的,丢失的数据块βl×r可按照上式解出丢失数据块,即:
βl×r=βl×k·h”k·r(h’r·r)-1
求出的数据块[x1,x2,…xr]即为丢失的数据块[d1,d2,…dr]。
步骤五:将数据块[d1,d2,…dr]与系统中未丢失的数据块dr+1,dr+2…,dk,按照依次顺序组合为[d1,d2,…dk],则该数据块组合即为原文件。
在存储系统网络带宽受限的环境中,如果较低的维护带宽来实现丢失数据的可靠性恢复。则采用以下基于校验矩阵的丢失数据块优化重建方法。即选择出需要最少重建带宽的恢复矩阵h(k+r)m·rm的方法。具体如下:
1.首先计算出校验矩阵h(k+r)m·rm的每一个列向量中元素“1”的个数。
2.从校验矩阵h(k+r)m·rm中抽取出丢失数据块所对应的行向量,构成矩阵hr’m·rm,则h(k+r)m·rm中剩余的行向量构成矩阵h(k+r-r’)m·rm,其下端r·m个向量构成了一个单位阵。上部表示为h(k-r’)m·rm。
3.依次确定h(k-r’)m·rm中行向量中元素“0”的个数,当该行向量中“0”的个数大于或等于r’·m时,记录每个“0”元素所在的列向量;并在所确定的列向量中进一步寻找是否存在“0”元素个数大于或等于r’·m的行向量,若无,则记录上一步所确定的列向量。若有,则确定出新的列向量。以此循环,并记录下每次循环所确定的列向量。
4.当循环检索完毕后,分别根据每一组列向量中“1”的个数,确定出“1”元素和为最小的r’·m个列向量,并确定与之对应的h(r’·m)(r’·m)的秩为满秩,即该子矩阵秩为r'·m。
在本发明的进一步方面,将地址索引表ait引入镜像子集作为扩展的寻址维度。地址索引表ait是用来描述寻址链表act属性的元数据,ait将act划分成为单个的可寻址逻辑成分,可以分别独立访问,三元动态结构的视频数据存储系统具有并行读写访问的能力。而ait的指针是直接指向act逻辑成分的目标地址单元,无需搜索比较即可快速实现随机访问。
地址索引表ait是寻址项aht集合,即ait={aht1,…,ahtm,…,ahtm};
其中ahtm有一个输入项和相对应的一个输出项。它的输入项为寻址变量值的一个组合,输出项是该组合对应的数据索引。
在视频存储系统镜像子集的ait中,每个寻址项aht的输入值是一组数据的寻址变量值,即逻辑地址la,其输出值均为与该la值相对应的一个寻址链表act的指针、一个偏移量、一个数据长度。该act指针指向该组数据所要访问的存储单元在寻址链表act中的位置;偏移量在该存储单元内确定了访问起始地址;数据长度规定了访问范围;当该数据长度缺省或为0时,表示访问直到文件的末尾。于是,对于视频数据存储系统的访问可以根据目标数据的寻址变量组合的逻辑地址la,在文件元数据寻址链表act中唯一确定一个位置,从该位置起读写访问存储节点,aht中规定了访问的数据长度。
访问视频存储系统镜像子集的地址索引表ait采用如下步骤实现:
1.根据访问目标数据的寻址变量值检索元数据地址索引表ait,由此获得一个寻址链表act指针、一个偏移量和一个数据长度;
2.通过该寻址链表指针获得该组数据所要读写的存储单元在寻址链表act中的位置,通过该偏移量获得该组数据所要读写的存储单元内的读写起始地址,通过该数据长度获得读写范围;依据该位置、该读写起始地址、该读写范围进行该组数据的读写操作;
3.当采用多个线程进行数据的读操作时,或者多个线程进行数据的写操作但不涉及修改寻址链表act指针、偏移量和数据长度,则不涉及生成新的寻址链表,则每个线程各自执行步骤(1)和(2),由此实现多组数据的并行读写操作;
4.当采用多个线程进行数据的写操作时,涉及到修改寻址链表act指针或偏移量或数据长度,访问步骤如下:
(4-1)当采用多个线程进行数据的写操作时,不涉及修改寻址链表act指针,则将数据从新给定的偏移量位置上写入存储单元,在需要更新数据长度时,计算新的数据长度并将新的偏移量和新的数据长度记入该aht输出项;
(4-2)当采用多个线程进行数据的写操作时,涉及到修改寻址链表act指针,则访问进入生成地址索引表ait的流程。
在本发明的视频数据存储结构的基础上中,视频帧数据在编码端使用快速运动估计,首先简要介绍如下:除了在整帧范围内进行块运动搜索和限定范围运动搜索之外,同时对应大范围运动搜索和对应小范围运动搜索。在大范围搜索方式中采用迭代搜索,以上次搜索结果位置作为下次搜索的起始点位置,当搜索结果满足一定条件,即当上次搜索结果与下一次搜索结果相同时,以其结果位置为起始点进行小范围搜索。将小范围搜索结果作为最终结果。
在编码端加入块分类的功能,本发明将帧内的块分为跳越块和直接块。对跳越块,运动向量为0,实际残差接近于0,因此仅传送榄式信息,不传送运动向量和残差信息。其中通过以下方式判断跳越块:
dm=σi,j∈blockm|x(i,j)-y(i,j)|/n
x(i,j)代表帧中的块位置m所中的一个像素i,j,y(i,j)代表参考帧中的对应像素,n代表块中的像素个数。当结果dm小于预设门限值时,设定该块为跳越块。仅传送模式信息到解码端。
在进行残差计算时,釆用已解码的关键帧作为参考帧。下文使用已解码的关键帧生成边信息。在帧中剩下的块中,继续确定属于直接模式的块,该类型块的残差接近于0,仅传送模式信息和运动向量信息。为了减少编码端复杂度,可以采用快速运动块搜索算法。
设定大范围运动搜索迭代次数最大值为4,小范围搜索次数为1,对应最大横向或纵向距离(0,7)或(7,0),对应定长码编码码率为3比特。如果大范围向量搜索成功收敛,再将得到的运动残差与门限值进行比较,门限值与跳越模式门限相同,当不超过门限值时,确定为直接模块,需要向解码端传送模式信息和运动向量信息。
在传送跳越块和直接块相关信息时,如果将两者合并编码,零运动向量用(0,0)表示。在传送运动向量信息时,可以用定长编码或算法,具体计算流程如下:
步骤1.对运动向量信息,分别采用定长编码和指数编码,取k中码字长度较小的值为rate1;
步骤2.将跳越模式和直接模式合并为一类,此时的码率为:
mode1=mode(跳越模式)∪mode(直接模式)
mode2=mode(普通模式)
rate2=ent(mode1,mode2)*code_length+2*num(mode(跳越模式))
其中,模式信息mode()表示块的类型对应的模式,ent()计算对应信息的熵,code_length为待编码码字长度。
步骤3.总码率为以上两个码率之和。
total_rate=ratel+rate2
在解码端,得到对应的模式信息和运动向量信息后,对跳越模块和直接模块进行重建。对跳越模块,直接将前一参考帧的相同位置的块作为最后的重建块。对于直接块,利用运动向量,将对应的运动补偿的块作为最后的重建块。而对于剩余的普通模式的块,需要在解码端生成边信息和残差信息。
所述使用已解码的关键帧生成边信息,包括以下过程:
步骤1.获得初始运动向量。首先采用平行运动估计算法,计算平行运动向量。运动匹配搜索的表示为:
(vx,vy)=argminmx,my(d(mx,my)*(1+0.05(mx2+my2)1/2)
(vx,vy)=±(vx/2,vy/2)
其中,x(i,j)代表参考块像素,y(i+mx,j+my)代表另一帧运动搜索块像素。||m||为0阶范式,代表块m的大小。最后的得到的运动估计向量为第一行计算得到的运动向量的一半。根据运动估计的原始方向取反或不变。
当得到前后帧对应位置块的运动向量后,将二者转换为同一方向的运动向量,即将其中一个运动向量取反。将此两个运动向量求平均,得到双向运动搜索估计的初始运动向量。
步骤2.对于每一个块,将第1步的平均向量作为初始向量,假定该块在短时间内做匀速直线运动。即该块在前后帧中的运动向量大小相等,方向相反。在初始向量的预定范围内进行双向运动搜索,先以初始向量为中心,设定搜索范围为-3到3,如果第一步的两个运动向量差值在任一方向大于5,则将该方向搜索范围扩展为-5到5。如果在此搜索范围内,实际搜索位置数小于门限,则继续以零向量为中心,以-6到6为搜导范围进行搜索,取二者的最小值为运动搜索结果,对运动搜索的结果进行残差计算,计算公式如下:
(vx,vy)=argminmx,myd(mx,my)
x,y代表前后参考帧。
当计算的绝对残差和达到最小时,得到双向运动估计的运动向量结果。以根据该运动向量,得到对应的边信息参考块sideblock、残差估计块residentblock和残差信息resident。
residide=min(d(mx,my))
sideblock(i,j)=(x(i-vx,j-vy)+y(i+vx,j+vy))/2
residentblock(i,j)=(x(i-vx,j-vy)-y(i+vx,j+vy))/2
步骤3.对于步骤2得到的运动向量估计的结果进行进一步处理。当运动向量幅度大于一定门限时,进行双向平行运动估计补偿。根据步骤1计算得到双向平行运动估计向量,得到四个运动补偿块,对于得到的四个运动补偿块,如果均位于图像显示范围之内,且同方向的运动向量之间的距离小于预设范围,可以通过下式计算该块对应的边信息块和残差块:
sideblock=(block1+block2+block3+block4)/4
residentblock=(block1+block2-block3-block4)/4
其中block1和block2属于当前帧的前驱帧,block3和block4属于后继帧。
步骤4.对处于运动边缘的块,如果其对应的残差值大于门限,进行如下处理:首先,对于第1步得到的两个平行运动估计向量,取任意一个运动向量,如果在初始运动估计的反方向上,该向量运动估计的位置超过了图像边界,且本方向运动向量的估计残差小于相反方向运动向量的估计残差,则其对应的运动补偿块用该估计方向上得到的平行运动补偿块表示。在此情况下,用单向搜索进行补偿。如果第1步的条件不满足,则对另一个运动向量进行处理。将得到的运动补偿块进行加权平均。
综上所述,本发明提出了一种数据编码存储方法,尽可能少地利用视频存储节点集内部网络带宽及计算能力来实现数据恢复,在实现数据高可用性的同时,提高了扩展性能。
显然,本领域的技术人员应该理解,上述的本发明的各模块或各步骤可以用通用的计算系统来实现,它们可以集中在单个的计算系统上,或者分布在多个计算系统所组成的网络上,可选地,它们可以用计算系统可执行的程序代码来实现,从而,可以将它们存储在存储系统中由计算系统来执行。这样,本发明不限制于任何特定的硬件和软件结合。
应当理解的是,本发明的上述具体实施方式仅仅用于示例性说明或解释本发明的原理,而不构成对本发明的限制。因此,在不偏离本发明的精神和范围的情况下所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。此外,本发明所附权利要求旨在涵盖落入所附权利要求范围和边界、或者这种范围和边界的等同形式内的全部变化和修改例。