CN116405694A - 一种编码、解码方法、装置及其设备 - Google Patents

一种编码、解码方法、装置及其设备 Download PDF

Info

Publication number
CN116405694A
CN116405694A CN202310494035.4A CN202310494035A CN116405694A CN 116405694 A CN116405694 A CN 116405694A CN 202310494035 A CN202310494035 A CN 202310494035A CN 116405694 A CN116405694 A CN 116405694A
Authority
CN
China
Prior art keywords
code stream
segment
stripe
fragments
strips
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202310494035.4A
Other languages
English (en)
Inventor
曹小强
孙煜程
陈方栋
王莉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hangzhou Hikvision Digital Technology Co Ltd
Original Assignee
Hangzhou Hikvision Digital Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hangzhou Hikvision Digital Technology Co Ltd filed Critical Hangzhou Hikvision Digital Technology Co Ltd
Priority to CN202310494035.4A priority Critical patent/CN116405694A/zh
Publication of CN116405694A publication Critical patent/CN116405694A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/42Methods or arrangements for coding, decoding, compressing or decompressing digital video signals characterised by implementation details or hardware specially adapted for video compression or decompression, e.g. dedicated software implementation
    • H04N19/423Methods or arrangements for coding, decoding, compressing or decompressing digital video signals characterised by implementation details or hardware specially adapted for video compression or decompression, e.g. dedicated software implementation characterised by memory arrangements
    • H04N19/426Methods or arrangements for coding, decoding, compressing or decompressing digital video signals characterised by implementation details or hardware specially adapted for video compression or decompression, e.g. dedicated software implementation characterised by memory arrangements using memory downsizing methods
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/169Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the coding unit, i.e. the structural portion or semantic portion of the video signal being the object or the subject of the adaptive coding
    • H04N19/17Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the coding unit, i.e. the structural portion or semantic portion of the video signal being the object or the subject of the adaptive coding the unit being an image region, e.g. an object
    • H04N19/174Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the coding unit, i.e. the structural portion or semantic portion of the video signal being the object or the subject of the adaptive coding the unit being an image region, e.g. an object the region being a slice, e.g. a line of blocks or a group of blocks
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/42Methods or arrangements for coding, decoding, compressing or decompressing digital video signals characterised by implementation details or hardware specially adapted for video compression or decompression, e.g. dedicated software implementation
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/42Methods or arrangements for coding, decoding, compressing or decompressing digital video signals characterised by implementation details or hardware specially adapted for video compression or decompression, e.g. dedicated software implementation
    • H04N19/436Methods or arrangements for coding, decoding, compressing or decompressing digital video signals characterised by implementation details or hardware specially adapted for video compression or decompression, e.g. dedicated software implementation using parallelised computational arrangements
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/85Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using pre-processing or post-processing specially adapted for video compression
    • H04N19/88Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using pre-processing or post-processing specially adapted for video compression involving rearrangement of data among different coding units, e.g. shuffling, interleaving, scrambling or permutation of pixel data or permutation of transform coefficient data among different blocks

Landscapes

  • Engineering & Computer Science (AREA)
  • Multimedia (AREA)
  • Signal Processing (AREA)
  • Computing Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Compression Or Coding Systems Of Tv Signals (AREA)

Abstract

本申请提供一种编码、解码方法、装置及其设备,该解码方法包括:将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;确定每个条带内的码流片段数量;对目标码流中同一条带行的水平方向的X个条带对应的码流片段进行解交织,得到每个条带对应的所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;基于同一条带行的水平方向的X个条带对应的比特流缓冲区对所述X个条带进行解码;其中,每个条带对应的比特流缓冲区包括该条带对应的码流片段。通过本申请节约存储资源。

Description

一种编码、解码方法、装置及其设备
技术领域
本申请涉及编解码技术领域,尤其是涉及一种编码、解码方法、装置及其设备。
背景技术
为了达到节约空间的目的,视频图像是经过编码后才传输的,完整的视频编码方法可以包括预测、变换、量化、熵编码、滤波等过程。预测编码可以包括帧内编码和帧间编码。帧间编码是利用视频时间域的相关性,使用邻近已编码图像的像素预测当前图像的像素,达到去除视频时域冗余的目的。帧内编码是考虑到相邻块之间存在很强的空域相关性,利用周围已经重建的像素作为参考像素,对当前未编码块进行预测,只需要对残差值进行后续编码处理,而不是对原始值进行编码,有效去除空域上的冗余,大大提高了压缩效率。
在视频编码过程中,对于每个编码块而言,原始输入信号经过预测后生成残差信号,去除了时间和空间冗余,然后残差信号经过变换使得残差信号的能量更一步集中,接下来通过调整量化步长进行量化,对高频信号采用更大的量化步长,而对于低频信号使用更小的量化步长,保证图像基本信息没有损失。最后是熵编码过程,将非二进制编码信息编码为二进制信息,去除编码冗余,最后输出二进制码流,即传输的是熵编码后的二进制码流。
在视频编码过程中,需要将一副图像划分成若干个互不重叠的条带,对每个条带进行编码,依次将每个条带的码流(即熵编码后的二进制码流)发送给解码端。在视频解码过程中,解码端接收码流,基于该码流依次对每个条带进行解码得到重建图像。
对于大分辨率的图像,编码端需要对多个条带并行编码来提高编码端的吞吐率,解码端需要对多个条带并行解码来提高解码端的吞吐率。为了达到这个目的,就需要缓存整个图像的所有条带的码流,需要占用大量存储资源。而且,解码端需要缓存所有条带的码流之后才能够对多个条带并行解码,即需要较长时间完成缓存,无法满足低延时场景的时延需求。
发明内容
本申请提供一种编码方法,所述方法包括:将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;确定每个条带内的码流片段数量;对同一条带行的水平方向的X个条带进行编码,得到X个条带对应的X个比特流缓冲区;针对每个比特流缓冲区,将该比特流缓冲区划分为所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;将同一条带行的水平方向的X个条带对应的码流片段交织得到目标码流;将所述目标码流发送给解码端。
本申请提供一种解码方法,所述方法包括:将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;确定每个条带内的码流片段数量;对目标码流中同一条带行的水平方向的X个条带对应的码流片段进行解交织,得到每个条带对应的所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;基于同一条带行的水平方向的X个条带对应的比特流缓冲区对所述X个条带进行解码;其中,每个条带对应的比特流缓冲区包括该条带对应的码流片段。
本申请提供一种编码装置,所述编码装置包括:存储器,其经配置以存储视频数据;编码器,其经配置以实现:
将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;确定每个条带内的码流片段数量;对同一条带行的水平方向的X个条带进行编码,得到X个条带对应的X个比特流缓冲区;针对每个比特流缓冲区,将该比特流缓冲区划分为所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;将同一条带行的水平方向的X个条带对应的码流片段交织得到目标码流;将所述目标码流发送给解码端。
本申请提供一种解码装置,所述解码装置包括:存储器,其经配置以存储视频数据;解码器,其经配置以实现:
将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;确定每个条带内的码流片段数量;对目标码流中同一条带行的水平方向的X个条带对应的码流片段进行解交织,得到每个条带对应的所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;基于同一条带行的水平方向的X个条带对应的比特流缓冲区对所述X个条带进行解码;其中,每个条带对应的比特流缓冲区包括该条带对应的码流片段。
本申请提供一种编码端设备,包括:处理器和机器可读存储介质,所述机器可读存储介质存储有能够被所述处理器执行的机器可执行指令;
所述处理器用于执行机器可执行指令,以实现上述示例的编码方法。
本申请提供一种解码端设备,包括:处理器和机器可读存储介质,所述机器可读存储介质存储有能够被所述处理器执行的机器可执行指令;
所述处理器用于执行机器可执行指令,以实现上述示例的解码方法。
由以上技术方案可见,本申请实施例中,针对每个条带,可以将该条带划分为多个码流片段,编码端将所有码流片段交织到目标码流,并将目标码流发送给解码端,解码端对目标码流中的码流片段进行解交织,得到每个条带对应的码流片段,并对码流片段进行解码,从而避免缓存整个图像的所有条带的码流,节约存储资源,且解码端不需要缓存所有码流就能够对多个条带并行解码,能够满足低延时场景的时延需求。比如说,编码端的码流片段交织过程:编码端先将条带a的码流片段a1添加到目标码流,然后将条带b的码流片段b1添加到目标码流,然后将条带a的码流片段a2添加到目标码流,然后将条带b的码流片段b2添加到目标码流,以此类推。解码端的码流片段解交织过程:解码端从目标码流中解交织码流片段a1和码流片段b1,将码流片段a1缓存到条带a的比特流缓冲区,将码流片段b1缓存到条带b的比特流缓冲区,从目标码流中解交织码流片段a2和码流片段b2,将码流片段a2缓存到条带a的比特流缓冲区,将码流片段b2缓存到条带b的比特流缓冲区,以此类推。在将码流片段a1和码流片段b1缓存到各自对应的比特流缓冲区之后,不需要等到将后续码流片段(如码流片段a2和码流片段b2)缓存到各自对应的比特流缓冲区,就可以对码流片段a1和码流片段b1并行解码,从而能够减少等待时间,满足低延时场景的时延需求,在码流片段a1和码流片段b1并行解码之后,可以从各自对应的比特流缓冲区中删除码流片段a1和码流片段b1,以节约存储资源,即不需要同时缓存所有条带的所有码流片段。
附图说明
图1A-图1F是本申请一种实施方式中的编码和解码的示意图;
图2A和图2B是本申请一种实施方式中的编码方法和解码方法的流程图;
图3A和图3B是本申请一种实施方式中的条带的示意图;
图4A-图4D是本申请一种实施方式中的片段尺寸的示意图;
图5A-图5C是本申请一种实施方式中的片段尺寸的示意图;
图6A-图6C是本申请一种实施方式中的片段尺寸的示意图;
图7A和图7B是本申请一种实施方式中的片段尺寸的示意图;
图8A和图8B是本申请一种实施方式中的片段尺寸的示意图;
图9A是本申请一种实施方式中的解码端设备的硬件结构图;
图9B是本申请一种实施方式中的编码端设备的硬件结构图。
具体实施方式
在本申请实施例中所使用的术语仅仅是出于描述特定实施例的目的,而非用于限制本申请。本申请实施例和权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其它含义。还应当理解,本文中使用的术语“和/或”是指包含一个或多个相关联的列出项目的任何或所有可能组合。应当理解,尽管在本申请实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息,可以取决于语境,此外,所使用的词语“如果”可以被解释成为“在……时”,或“当……时”,或“响应于确定”。
为了使本领域技术人员更好地理解本申请技术方案,下面对技术术语进行简单说明。
图像宽度(image_width):16位无符号整数,是图像亮度分量的宽度,即水平方向样本数,image_width的单位是图像每行样本数,可显示区域的左上角样本与图像左上角样本对齐,ImageWidth的值等于image_width的值,ImageWidth的值不为0且为16的整数倍。
图像高度(image_height):16位无符号整数,是图像亮度分量的高度,即垂直方向扫描行数,image_height的单位是图像样本的行数,ImageHeight的值可以等于image_height的值,ImageHeight的值不为0,且ImageHeight的值可以为2的整数倍。
real_width和real_height是真实宽度和真实高度,real_width和real_height与图像边界的关系参见图1A所示。在图1A中,实线表示图像可显示区域边界,可显示区域边界的宽度和高度分别由real_width和real_height决定,虚线表示图像边界,图像边界的宽度和高度分别由image_width和image_height决定,在后续实施例中,以image_width和image_height为例。
条带(slice):条带是图像中的固定矩形区域,包含若干个编码单元(即编码块),条带之间不重叠。参见图1B所示,示出了几个条带的结构关系,每个条带可以包括多个编码单元,图1B中以条带A、条带B、条带C、条带D、条带E、条带F、条带G、条带H和条带I为例。参见图1C所示,示出了3种条带结构关系,左上图示出了4个条带的结构关系,右上图示出了2个条带的结构关系,下图示出了8个条带的结构关系。
条带宽度(slice_width)和条带高度(slice_height):条带宽度和条带高度是编码端设定的参数,是条带的宽度和高度,以编码单元CU为单位,设SliceNumX表示一副图像水平方向上条带(slice)的个数,SliceNumY表示一幅图像垂直方向上条带(slice)的个数。参见图1D所示,示出了条带与条带之间的分布关系,条带宽度和条带高度可以参见图1D所示。
示例性的,SlicenumX和SlicenumY的计算方式为:SliceNumX=(ImageWidth+SliceWidth–1)/SliceWidth;SliceNumY=(ImageHeight+SliceHeight–1)/SliceHeight。
bpp(bit per pixel,每像素占用比特数):表示平均表达每一个像素点需要的比特数,例如,对于10比特YUV444格式的原始图像,每个像素点的bpp为30。
目标bpp(target bit per pixel,目标每像素占用比特数):编码端规定的参数,表示经过压缩后平均表达每一个像素点需要的比特数,例如,对于10比特YUV444格式的原始图像,每个像素点的目标bpp为5。显然,在每个像素点的bpp为30时,表示压缩了6倍。
本申请适用的视频编码框架:参见图1E所示,可以使用视频编码框架实现本申请实施例的编码端处理流程,视频解码框架的示意图与图1E类似,在此不再重复赘述,可以使用视频解码框架实现本申请实施例的解码端处理流程。在视频编码框架和视频解码框架中,可以包括但不限于:帧内预测、运动估计/运动补偿、参考图像缓冲器、环内滤波、重建、变换、量化、反变换、反量化、熵编码器等模块。在编码端,通过这些模块之间的配合,可以实现编码端的处理流程,在解码端,通过这些模块之间的配合,可以实现解码端的处理流程。
示例性的,预测分为帧内预测和帧间预测,帧内预测是考虑到图像中相邻块之间存在很强的空域相关性,可以利用周围已重建的像素作为参考像素对当前未编码块进行预测,只需要对残差信号(原始信号-预测信号)进行后续编码处理,而不是对原始信号进行编码,有效去除空域上的冗余,大大提高了视频信号的压缩效率。帧间预测是指利用视频信号时间域上的相关性,使用邻近已编码图像像素预测当前图像的像素,达到去除视频时域冗余的目的。
示例性的,在视频编码过程中,变换是指将以空间域中像素形式描述的图像转换至变换域的图像,并以变换系数的形式来表示。由于绝大多数图像都含有较多平坦区域和缓慢变化的区域,因此,适当的变换过程,可以使图像能量在空间域的分散分布,转换为在变换域的相对集中分布,从而能够去除信号之间的频域相关性,配合量化过程,可以有效压缩码流。
示例性的,熵编码是指按照信息熵的原理进行无损编码的方式,处于视频压缩的最后一个处理模块,将一系列用来表示视频序列的元素符号,转变为一个用来传输或存储的二进制码流,输入的符号可能包括量化后的变换系数,运动矢量信息,预测模式信息,变换量化相关语法等,熵编码模块的输出数据即原始视频压缩后的最终码流。熵编码可以有效地去除这些视频元素符号的统计冗余,是保证视频编码压缩效率的重要工具之一。
参见图1F所示,在视频编码过程中,每个图像块(即编码块)的编码过程一般包括预测、变换、量化、熵编码等模块,对于每个编码块而言,原始输入信号经过预测后生成残差信号,去除了时间和空间冗余,然后残差信号经过变换使得残差信号的能量更一步集中,接下来通过调整量化步长进行量化,对高频信号采用更大的量化步长,而对于低频信号使用更小的量化步长,保证图像基本信息没有损失。最后是熵编码过程,将非二进制编码信息编码为二进制信息,去除编码冗余,最后输出二进制码流,即传输的是熵编码后的二进制码流。
在视频编码过程中,需要将一副图像划分成若干个互不重叠的矩形条带,每个条带内包含整数个互不重叠的编码块,依次对每个条带进行独立编码,编码过程参见图1F所示,依次经过预测、变换、量化、熵编码等模块后生成二进制码流,然后依次将每个条带的码流(即熵编码后的二进制码流)拼接在一起形成最终的码流发送给解码端。与编码端对应的,在视频解码过程中,首先将图像划分为与编码端一致的多个矩形条带,解码端接收码流,依次解码每个条带,每个条带中每个编码块的解码包括:熵解码、反量化、反变换、预测等过程,得到每个矩形条带的重建像素,将每个条带的重建像素拼接在一起得到重建图像。
对于大分辨率的图像,编码端需要对多个条带并行编码来提高编码端的吞吐率,解码端需要对多个条带并行解码来提高解码端的吞吐率。为了达到这个目的,就需要缓存整个图像的所有条带的码流,需要占用大量存储资源。而且,解码端需要缓存所有条带的码流之后才能够对多个条带并行解码,即需要较长时间完成缓存,无法满足低延时场景的时延需求。
针对上述发现,本申请实施例中,为了尽可能降低解码端的缓存,设计一种码流分组方法,编码端将每个条带分成多个码流片段(chunk),每个码流片段由多个字节的码流组成,然后对于一个条带行内的每个条带的码流片段进行码流交织编码,这样相当于只要缓存若干个码流片段就可以实现并行解码,大大降低解码的时延,满足低延时需求,并减少了解码端码流的缓存大小,节省了硬件成本。比如说,针对每个条带,可以将该条带划分为多个码流片段,编码端将所有码流片段交织到目标码流,并将目标码流发送给解码端,解码端对目标码流中的码流片段进行解交织,得到每个条带对应的码流片段,并对码流片段进行解码,从而避免缓存整个图像的所有条带的码流,节约存储资源,且解码端不需要缓存所有码流就能够对多个条带并行解码,能够满足低延时场景的时延需求,在低延时场景下也可以并行解码。
以下结合几个具体实施例,对本申请实施例的编码方法、解码方法进行详细说明。
实施例1:在一种可能的实施方式中,参见图2A所示,为本申请实施例中提出的编码方法的流程示意图,该方法可以应用于编码端(如视频编码器),该方法可以包括:
步骤211、将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X可以为大于1的正整数,Y可以为大于或等于1的正整数。
示例性的,X可以是SliceNumX,表示一副图像水平方向上条带(slice)的个数,Y可以是SliceNumY,表示一幅图像垂直方向上条带(slice)的个数。参见图1B所示,X可以是3,Y可以是3,参见图1C的左上图所示,X可以是2,Y可以是2,参见图1C的右上图所示,X可以是2,Y可以是1,参见图1C的下图所示,X可以是4,Y可以是2。
步骤212、确定每个条带内的码流片段数量。
在一种可能的实施方式中,可以根据目标传输比特数(也可以称为总资源)确定每个条带内的码流片段数量,比如说,根据条带宽度、条带高度和目标每像素占用比特数确定目标传输比特数,并根据目标传输比特数和已配置的片段尺寸值确定码流片段数量。
目标传输比特数是一个条带内所有像素的占用比特数之和,因此,可以基于条带宽度和条带高度确定出条带内的像素总数量,基于像素总数量和目标每像素占用比特数(即目标bpp,表示经过压缩后平均表达每一个像素点需要的比特数)就可以确定目标传输比特数。
已配置的片段尺寸值可以是根据经验配置的预设数值,也可以是语法参数(如图像级语法参数、序列级语法参数等)指示的数值,对此片段尺寸值不做限制,片段尺寸值用于表示码流片段的长度。显然,目标传输比特数表示所有码流片段的长度,而片段尺寸值表示一个码流片段的长度,因此,基于目标传输比特数和片段尺寸值就可以确定码流片段数量。
在另一种可能的实施方式中,可以根据条带高度确定码流片段数量。比如说,条带的尺寸是slice_width*slice_height,即一共存在slice_width*slice_height个像素,每行有slice_width个像素,一共有slice_height个条带行。若码流片段的长度基于slice_width确定,那么,就可以根据条带高度(即slice_height)确定码流片段数量。比如说,若码流片段的长度是slice_width,那么,码流片段数量就可以是slice_height,或者,若码流片段的长度是slice_width/2,那么,码流片段数量就可以是2*slice_height,或者,若码流片段的长度是2*slice_width,那么,码流片段数量就可以是slice_height/2。当然,上述方式只是示例,对此不做限制。
步骤213、对同一条带行的水平方向的X个条带进行编码,得到X个条带对应的X个比特流缓冲区。由于每个条带行的处理过程相同,后续以一个条带行的处理过程为例。
比如说,针对每个条带行,可以对该条带行的X个条带进行编码,得到X个条带对应的X个比特流缓冲区。参见图1B所示,先针对第一条带行进行编码,即对条带A、条带B、条带C进行编码,如并行对条带A、条带B、条带C进行编码,得到条带A对应的比特流缓冲区A1、条带B对应的比特流缓冲区B1、条带C对应的比特流缓冲区C1。
在第一条带行的编码完成后,针对第二条带行进行编码,即对条带D、条带E、条带F进行编码,如并行对条带D、条带E、条带F进行编码,得到条带D对应的比特流缓冲区D1、条带E对应的比特流缓冲区E1、条带F对应的比特流缓冲区F1。
在第二条带行的编码完成后,针对第三条带行进行编码,即对条带G、条带H、条带I进行编码,如并行对条带G、条带H、条带I进行编码,得到条带G对应的比特流缓冲区G1、条带H对应的比特流缓冲区H1、条带I对应的比特流缓冲区I1。
步骤214、针对X个条带对应的每个比特流缓冲区,将该比特流缓冲区划分为码流片段数量个码流片段;其中,在码流片段数量个码流片段中,至少存在两种尺寸的码流片段。
示例性的,针对存在两种尺寸的码流片段,该尺寸可以是码长。
比如说,在第一条带行的编码完成后,可以得到条带A对应的比特流缓冲区A1、条带B对应的比特流缓冲区B1、条带C对应的比特流缓冲区C1,在此基础上,可以将比特流缓冲区A1划分为码流片段数量个码流片段,记为码流片段A11、码流片段A12、…,可以将比特流缓冲区B1划分为码流片段数量个码流片段,记为码流片段B11、码流片段B12、…,可以将比特流缓冲区C1划分为码流片段数量个码流片段,记为码流片段C11、码流片段C12、…。
在比特流缓冲区A1对应的码流片段数量个码流片段中,至少存在两种尺寸的码流片段,在比特流缓冲区B1对应的码流片段数量个码流片段中,至少存在两种尺寸的码流片段,在比特流缓冲区C1对应的码流片段数量个码流片段中,至少存在两种尺寸的码流片段。
步骤215、将同一条带行的水平方向的X个条带对应的码流片段交织得到目标码流。
示例性的,将同一条带行的水平方向的X个条带对应的码流片段交织是指:先将条带A对应的码流片段A11添加到当前码流,然后将条带B对应的码流片段B11添加到当前码流,然后将条带C对应的码流片段C11添加到当前码流,然后将条带A对应的码流片段A12添加到当前码流,然后将条带B对应的码流片段B12添加到当前码流,然后将条带C对应的码流片段C12添加到当前码流,以此类推,最终得到目标码流。显然,在目标码流中,一个条带对应的码流片段与另一个条带对应的码流片段对接,一个条带对应的码流片段与该条带对应的另一码流片段不对接,也就是,不同条带对应的码流片段交织在一起形成目标码流。
显然,在目标码流中,一个条带最后一个码流片段添加到目标码流之前,需要添加另外一个条带的码流片段到目标码流中,例如:条带A的最后一个码流片段添加到目标码流之前,需要添加条带B的码流片段到目标码流中,条带B的最后一个码流片段添加到目标码流之前,也需要添加条带A的码流片段到目标码流中。
在一种可能的实施方式中,基于同一条带行的水平方向的X个条带的顺序,依次将每个条带对应的一个码流片段(在实际应用中,也可以是至少两个码流片段,对此不做限制,本实施例中以一个码流片段为例)添加到当前码流,并判断是否已将所有码流片段均添加到当前码流;若是,则停止添加码流片段,并将当前码流作为目标码流;若否,则继续将每个条带对应的一个码流片段添加到当前码流,并返回执行判断是否已将所有码流片段均添加到当前码流的操作。
比如说,对于水平方向的条带A、条带B、条带C,这些条带的顺序依次是条带A、条带B、条带C,因此,依次将条带A对应的一个码流片段A11、条带B对应的一个码流片段B11、条带C对应的一个码流片段C11添加到当前码流,并判断是否已将所有码流片段(即条带A、条带B、条带C的所有码流片段)均添加到当前码流。若是,则停止添加码流片段,即完成当前条带行的处理,得到当前条带行的目标码流,即将当前码流作为目标码流。
若否,则继续将条带A对应的一个码流片段、条带B对应的一个码流片段、条带C对应的一个码流片段添加到当前码流,并判断是否已将所有码流片段均添加到当前码流,以此类推,一直到将所有码流片段均添加到当前码流,完成当前条带行的处理,得到目标码流。
在一种可能的实施方式中,将同一条带行的水平方向的X个条带对应的码流片段交织得到目标码流,可以包括但不限于:在已得到X个条带对应的码流片段时,开始将X个条带对应的码流片段交织得到目标码流;其中,已得到X个条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
例如,在第一条带行的编码完成后,得到条带A对应的比特流缓冲区A1、条带B对应的比特流缓冲区B1、条带C对应的比特流缓冲区C1,从比特流缓冲区A1划分码流片段A11,从比特流缓冲区B1划分码流片段B11,从比特流缓冲区C1划分码流片段C11,然后,从比特流缓冲区A1划分码流片段A12,从比特流缓冲区B1划分码流片段B12,从比特流缓冲区C1划分码流片段C12,然后,从比特流缓冲区A1划分码流片段A13,从比特流缓冲区B1划分码流片段B13,从比特流缓冲区C1划分码流片段C13,以此类推。
在此基础上,在得到码流片段A11、码流片段B11、码流片段C11时,就可以开始将这些码流片段交织得到目标码流;或者,在得到码流片段A11、码流片段B11、码流片段C11、码流片段A12、码流片段B12、码流片段C12时,才开始将这些码流片段交织得到目标码流;或者,在得到码流片段A11、码流片段B11、码流片段C11、码流片段A12、码流片段B12、码流片段C12、码流片段A13、码流片段B13、码流片段C13时,才开始将这些码流片段交织得到目标码流,以此类推。显然,在已得到每个条带对应的S个码流片段时,可以开始将X个条带对应的码流片段交织得到目标码流,S大于或等于1,且S小于码流片段数量即可。
步骤216、将目标码流发送给解码端,目标码流包括水平方向的X个条带的码流片段。
在一种可能的实施方式中,参见图2B所示,为本申请实施例中提出的解码方法的流程示意图,该方法可以应用于解码端(如视频解码器),该方法可以包括以下步骤:
步骤221、将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X可以为大于1的正整数,Y可以为大于或等于1的正整数。
示例性的,X可以是SliceNumX,表示一副图像水平方向上条带(slice)的个数,Y可以是SliceNumY,表示一幅图像垂直方向上条带(slice)的个数,即与编码端参数一致。
步骤222、确定每个条带内的码流片段数量。
在一种可能的实施方式中,可以根据目标传输比特数(也可以称为总资源)确定每个条带内的码流片段数量,比如说,根据条带宽度、条带高度和目标每像素占用比特数确定目标传输比特数,并根据目标传输比特数和已配置的片段尺寸值确定码流片段数量。
在另一种可能的实施方式中,可以根据条带高度确定码流片段数量。
示例性的,步骤221-步骤222可以参见步骤211-步骤212,在此不再赘述。
步骤223、对目标码流中的水平方向同一条带行的X个条带对应的码流片段进行解交织,得到每个条带对应的码流片段数量个码流片段;其中,在码流片段数量个码流片段中,至少存在两种尺寸的码流片段。比如说,解码端可以从编码端接收目标码流,该目标码流可以包括同一条带行的水平方向的X个条带的码流片段,因此,解码端可以对目标码流中同一条带行的水平方向的X个条带对应的码流片段进行解交织,得到每个条带对应的码流片段数量个码流片段。由于每个条带行的处理过程相同,后续以一个条带行的处理过程为例。
示例性的,对目标码流中的同一条带行的水平方向的X个条带对应的码流片段进行解交织是指:假设一个条带行的X个条带为条带A、条带B、条带C,先从目标码流中解析出条带A对应的码流片段A11,然后从目标码流中解析出条带B对应的码流片段B11,然后从目标码流中解析出条带C对应的码流片段C11,然后从目标码流中解析出条带A对应的码流片段A12,然后从目标码流中解析出条带B对应的码流片段B12,然后从目标码流中解析出条带C对应的码流片段C12,以此类推,最终得到每个条带对应的码流片段数量个码流片段。
显然,在从目标码流中解析一个条带的最后一个码流片段,需要从目标码流中解析另外一个条带的码流片段,例如:在解析条带A的最后一个码流片段之前,需要解析条带B的码流片段,在解析条带B的最后一个码流片段之前,也需要解析条带A的码流片段。
在一种可能的实施方式中,基于同一条带行的水平方向的X个条带的顺序,依次解析每个条带对应的一个码流片段(在实际应用中,也可以是至少两个码流片段,对此不做限制,以一个码流片段为例)到该条带对应的比特流缓冲区,并判断是否已解析所有码流片段;若是,则完成X个条带的解交织,得到每个条带对应的所有码流片段;若否,则返回执行基于同一条带行的水平方向的X个条带的顺序,依次解析每个条带对应的一个码流片段到该条带对应的比特流缓冲区的操作。
比如说,对于水平方向的条带A、条带B、条带C,这些条带的顺序依次是条带A、条带B、条带C,因此,依次解析条带A对应的一个码流片段A11到条带A对应的比特流缓冲区A1、解析条带B对应的一个码流片段B11到条带B对应的比特流缓冲区B1、解析条带C对应的一个码流片段C11到条带C对应的比特流缓冲区C1,并判断是否已解析所有码流片段(即条带A、条带B、条带C的所有码流片段)。若是,则完成X个条带的解交织,得到每个条带对应的所有码流片段。若否,则继续解析条带A对应的一个码流片段到条带A对应的比特流缓冲区A1、解析条带B对应的一个码流片段到条带B对应的比特流缓冲区B1、解析条带C对应的一个码流片段到条带C对应的比特流缓冲区C1,以此类推,一直到已解析所有码流片段,完成X个条带的解交织,得到每个条带对应的所有码流片段。
综上所述,可以得到条带A对应的码流片段数量个码流片段,在码流片段数量个码流片段中,至少存在两种尺寸的码流片段;可以得到条带B对应的码流片段数量个码流片段,在码流片段数量个码流片段中,至少存在两种尺寸的码流片段;可以得到条带C对应的码流片段数量个码流片段,在码流片段数量个码流片段中,至少存在两种尺寸的码流片段。
步骤224、基于同一条带行的水平方向的X个条带对应的比特流缓冲区对X个条带进行解码;每个条带对应的比特流缓冲区包括该条带对应的码流片段,如至少一个码流片段。
比如说,条带A对应的比特流缓冲区A1可以包括条带A对应的码流片段A11、A12、A13、…,条带B对应的比特流缓冲区B1可以包括条带B对应的码流片段B11、B12、B13、…,条带C对应的比特流缓冲区C1可以包括条带C对应的码流片段C11、C12、C13、…,在此基础上,可以对码流片段A11、码流片段B11和码流片段C11进行解码,如并行解码,对此解码过程不做限制。然后,可以对码流片段A12、码流片段B12和码流片段C12进行解码,如并行解码,然后,可以对码流片段A13、码流片段B13和码流片段C13进行解码,如并行解码,以此类推,一直到完成水平方向的X个条带的所有码流片段的解码过程。
在一种可能的实施方式中,在X个条带对应的比特流缓冲区中存在X个条带对应的码流片段时,开始对X个条带对应的码流片段进行解码。其中,X个条带对应的比特流缓冲区中存在X个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
显然,由于比特流缓冲区存在T个码流片段时,就开始对X个条带对应的码流片段进行解码,且T小于码流片段数量,因此,在解交织最后一组码流片段之前,就可以基于水平方向的X个条带对应的比特流缓冲区对X个条带进行解码。在实际应用中,也可以在解交织最后一组码流片段后,才基于水平方向的X个条带对应的比特流缓冲区对X个条带进行解码。
比如说,解码端先从目标码流中解析出码流片段A11、码流片段B11、码流片段C11,将码流片段A11缓存到比特流缓冲区A1、将码流片段B11缓存到比特流缓冲区B1、将码流片段C11缓存到比特流缓冲区C1;然后,从目标码流中解析出码流片段A12、码流片段B12、码流片段C12,将码流片段A12缓存到比特流缓冲区A1、将码流片段B12缓存到比特流缓冲区B1、将码流片段C12缓存到比特流缓冲区C1;然后,从目标码流中解析出码流片段A13、码流片段B13、码流片段C13,将码流片段A13缓存到比特流缓冲区A1、将码流片段B13缓存到比特流缓冲区B1、将码流片段C13缓存到比特流缓冲区C1,以此类推。
示例性的,编码端每次交织的多个码流片段的尺寸相同,且解码端每次解交织的多个码流片段的尺寸相同,比如说,码流片段A11、码流片段B11、码流片段C11的尺寸相同,码流片段A12、码流片段B12、码流片段C12的尺寸也相同,但是码流片段A11的尺寸与码流片段A12的尺寸可能相同,也可能不同,关于不同码流片段的尺寸关系参见后续实施例。
在此基础上,在这些比特流缓冲区中存在码流片段A11、码流片段B11、码流片段C11时,就可以对这些码流片段进行解码;或者,在这些比特流缓冲区中存在码流片段A11、码流片段B11、码流片段C11、码流片段A12、码流片段B12、码流片段C12时,才开始对这些码流片段进行解码;或者,在这些比特流缓冲区中存在码流片段A11、码流片段B11、码流片段C11、码流片段A12、码流片段B12、码流片段C12、码流片段A13、码流片段B13、码流片段C13时,才开始对这些码流片段进行解码,以此类推。显然,在比特流缓冲区中存在每个条带对应的T个码流片段时,可以开始基于水平方向的X个条带对应的比特流缓冲区对X个条带进行解码,T大于或等于1,且T小于码流片段数量即可。
在一种可能的实施方式中,关于至少两种尺寸的码流片段,这至少两种尺寸有以下情况:
情况1、在实际编码比特数的长度固定时,针对码流片段数量个码流片段,除第k个码流片段之外的剩余码流片段的长度均为第一尺寸,第k个码流片段的长度为第二尺寸。
针对编码端来说,第一尺寸基于已配置的片段尺寸值确定,第二尺寸基于目标传输比特数、片段尺寸值和码流片段数量确定。针对解码端来说,第一尺寸基于已配置的片段尺寸值确定,第二尺寸基于目标传输比特数、片段尺寸值和码流片段数量确定。
在上述实施例中,第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
情况2、在实际编码比特数的长度固定时,针对码流片段数量个码流片段,除第k个码流片段之外的剩余码流片段的长度均为第一尺寸,第k个码流片段的长度为第二尺寸。
针对编码端来说,第一尺寸基于条带宽度和每像素占用比特数确定,第二尺寸基于目标传输比特数、第一尺寸和码流片段数量确定。针对解码端来说,第一尺寸基于条带宽度和每像素占用比特数确定,第二尺寸基于目标传输比特数、第一尺寸和码流片段数量确定。
在上述实施例中,第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
情况3、在实际编码比特数的长度固定时,针对码流片段数量个码流片段,码流片段集合包括除第k个码流片段之外的剩余码流片段,码流片段集合中的奇数个码流片段的长度均为第一尺寸,而偶数个码流片段的长度均为第二尺寸,第k个码流片段的长度为第三尺寸。
针对编码端来说,第一尺寸基于片段尺寸值与预设数值之和确定,第二尺寸基于片段尺寸值与预设数值之差确定,第三尺寸基于目标传输比特数、片段尺寸值和码流片段数量确定。针对解码端来说,第一尺寸基于片段尺寸值与预设数值之和确定,第二尺寸基于片段尺寸值与预设数值之差确定,第三尺寸基于目标传输比特数、片段尺寸值和码流片段数量确定。
在上述实施例中,第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
情况4、在实际编码比特数的长度固定时,针对码流片段数量个码流片段,码流片段集合包括除第k个码流片段之外的剩余码流片段,码流片段集合中的奇数个码流片段的长度均为第一尺寸,而偶数个码流片段的长度均为第二尺寸,第k个码流片段的长度为第三尺寸。
针对编码端来说,第一尺寸基于条带行像素数目与预设数值之和确定,第二尺寸基于条带行像素数目与预设数值之差确定,第三尺寸基于目标传输比特数、条带行像素数目和码流片段数量确定;其中,该条带行像素数目可以基于条带宽度和每像素占用比特数确定。
针对解码端来说,第一尺寸基于条带行像素数目与预设数值之和确定,第二尺寸基于条带行像素数目与预设数值之差确定,第三尺寸基于目标传输比特数、条带行像素数目和码流片段数量确定;其中,该条带行像素数目可以基于条带宽度和每像素占用比特数确定。
在上述实施例中,第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
情况5、在实际编码比特数的长度固定时,针对码流片段数量个码流片段,奇数个码流片段的长度均为第一尺寸,偶数个码流片段的长度均为第二尺寸。
针对编码端来说,第一尺寸基于已配置的片段尺寸值与预设数值之和确定;第二尺寸基于片段尺寸值与预设数值之差确定。针对解码端来说,第一尺寸基于已配置的片段尺寸值与预设数值之和确定;第二尺寸基于片段尺寸值与预设数值之差确定。
情况6、在实际编码比特数的长度固定时,针对码流片段数量个码流片段,奇数个码流片段的长度均为第一尺寸,偶数个码流片段的长度均为第二尺寸。
针对编码端来说,第一尺寸基于条带行像素数目与预设数值之和确定;第二尺寸基于条带行像素数目与预设数值之差确定;条带行像素数目基于条带宽度和每像素占用比特数确定。
针对解码端来说,第一尺寸基于条带行像素数目与预设数值之和确定;第二尺寸基于条带行像素数目与预设数值之差确定;条带行像素数目基于条带宽度和每像素占用比特数确定。
情况7、在实际编码比特数的长度不固定时,针对码流片段数量个码流片段,除第k个码流片段之外的剩余码流片段的长度均为第一尺寸,第k个码流片段的长度为第二尺寸。
针对编码端来说,第一尺寸基于已配置的片段尺寸值确定,第二尺寸基于比特流缓冲区的实际编码比特数、片段尺寸值和码流片段数量确定。编码端向解码端发送目标码流时,目标码流还可以包括针对第二尺寸的片段长度指示信息,即用于指示第二尺寸的长度。
针对解码端来说,第一尺寸基于已配置的片段尺寸值确定,第二尺寸基于片段长度指示信息确定,该片段长度指示信息用于指示第二尺寸的长度值。比如说,目标码流包括针对第二尺寸的片段长度指示信息,解码端可以从目标码流中解析出针对第二尺寸的片段长度指示信息,并根据该片段长度指示信息确定第二尺寸的长度值,即得到第二尺寸。
在上述实施例中,第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
情况8、在实际编码比特数的长度不固定时,针对码流片段数量个码流片段,除第k个码流片段之外的剩余码流片段的长度均为第一尺寸,第k个码流片段的长度为第二尺寸。
针对编码端来说,第一尺寸基于条带宽度和每像素占用比特数确定;第二尺寸基于比特流缓冲区的实际编码比特数、第一尺寸和码流片段数量确定。编码端向解码端发送目标码流时,目标码流还可以包括针对第二尺寸的片段长度指示信息,即用于指示第二尺寸的长度。
针对解码端来说,第一尺寸基于条带宽度和每像素占用比特数确定,第二尺寸基于片段长度指示信息确定,该片段长度指示信息用于指示第二尺寸的长度值。比如说,目标码流包括针对第二尺寸的片段长度指示信息,解码端可以从目标码流中解析出针对第二尺寸的片段长度指示信息,并根据该片段长度指示信息确定第二尺寸的长度值,即得到第二尺寸。
在上述实施例中,第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
情况9、在实际编码比特数的长度固定时,针对码流片段数量个码流片段,除第k个码流片段之外的剩余码流片段的长度均为第一尺寸,第k个码流片段的长度为第二尺寸。
针对编码端来说,第一尺寸基于已配置的片段尺寸值确定,第二尺寸基于目标传输比特数、片段尺寸值和码流片段数量确定。编码端向解码端发送目标码流时,目标码流还可以包括针对第二尺寸的片段长度指示信息,即用于指示第二尺寸的长度。
针对解码端来说,第一尺寸基于已配置的片段尺寸值确定,第二尺寸基于片段长度指示信息确定,该片段长度指示信息用于指示第二尺寸的长度值。比如说,目标码流包括针对第二尺寸的片段长度指示信息,解码端可以从目标码流中解析出针对第二尺寸的片段长度指示信息,并根据该片段长度指示信息确定第二尺寸的长度值,即得到第二尺寸。
在上述实施例中,第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
情况10、在实际编码比特数的长度固定时,针对码流片段数量个码流片段,除第k个码流片段之外的剩余码流片段的长度均为第一尺寸,第k个码流片段的长度为第二尺寸。
针对编码端来说,第一尺寸基于条带宽度和每像素占用比特数确定,第二尺寸基于目标传输比特数、第一尺寸和码流片段数量确定。编码端向解码端发送目标码流时,目标码流还可以包括针对第二尺寸的片段长度指示信息,即用于指示第二尺寸的长度。
针对解码端来说,第一尺寸基于条带宽度和每像素占用比特数确定,第二尺寸基于片段长度指示信息确定,该片段长度指示信息用于指示第二尺寸的长度值。比如说,目标码流包括针对第二尺寸的片段长度指示信息,解码端可以从目标码流中解析出针对第二尺寸的片段长度指示信息,并根据该片段长度指示信息确定第二尺寸的长度值,即得到第二尺寸。
在上述实施例中,第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
在上述情况1-情况10中,不同情况下的第一尺寸没有关系,这里只是用第一尺寸表示码流片段的长度,而不表示情况1和情况2的第一尺寸相同,即情况1和情况2的第一尺寸可以相同,也可以不同。同理,不同情况下的第二尺寸没有关系,这里只是用第二尺寸表示码流片段的长度,而不表示情况1和情况2的第二尺寸相同。
在一种可能的实施方式中,针对编码端和解码端来说,每个条带内的chunkNum是固定的,即所有条带内的码流片段数量均相同,从而确保能够并行解码。
由以上技术方案可见,本申请实施例中,针对每个条带,可以将该条带划分为多个码流片段,编码端将所有码流片段交织到目标码流,并将目标码流发送给解码端,解码端对目标码流中的码流片段进行解交织,得到每个条带对应的码流片段,并对码流片段进行解码,从而避免缓存整个图像的所有条带的码流,节约存储资源,且解码端不需要缓存所有码流就能够对多个条带并行解码,能够满足低延时场景的时延需求。比如说,编码端的码流片段交织过程:编码端先将条带a的码流片段a1添加到目标码流,然后将条带b的码流片段b1添加到目标码流,然后将条带a的码流片段a2添加到目标码流,然后将条带b的码流片段b2添加到目标码流,以此类推。解码端的码流片段解交织过程:解码端从目标码流中解交织码流片段a1和码流片段b1,将码流片段a1缓存到条带a的比特流缓冲区,将码流片段b1缓存到条带b的比特流缓冲区,从目标码流中解交织码流片段a2和码流片段b2,将码流片段a2缓存到条带a的比特流缓冲区,将码流片段b2缓存到条带b的比特流缓冲区,以此类推。在将码流片段a1和码流片段b1缓存到各自对应的比特流缓冲区之后,不需要等到将后续码流片段(如码流片段a2和码流片段b2)缓存到各自对应的比特流缓冲区,就可以对码流片段a1和码流片段b1并行解码,从而能够减少等待时间,满足低延时场景的时延需求,在码流片段a1和码流片段b1并行解码之后,可以从各自对应的比特流缓冲区中删除码流片段a1和码流片段b1,以节约存储资源,即不需要同时缓存所有条带的所有码流片段。
实施例2:本申请实施例中提出一种编码方法,可以应用于编码端,该方法可以包括:
第一步、将图像水平和垂直分割为多个矩形条带。
第二步、计算总资源(即目标传输比特数),根据总资源确定码流片段数量chunkNum。
第三步、依次编码每个条带行内的多个条带,得到多个比特流缓冲区。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段(chunk片段)。
示例性的,在chunkNum个码流片段中,至少存在两种尺寸的码流片段。
第五步、对于一个条带行内的所有条带(slice),依次编码chunkNum次,每次将每个条带的一个码流片段交织在一起形成最终码流。由于每个条带存在chunkNum个码流片段,因此,通过编码chunkNum次就可以将每个条带的所有码流片段交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的所有条带(slice),依次编码chunkNum次,每次将每个条带的一个码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到X个条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断所有条带行是否编码结束,如果没有结束,则返回第三步,编码下一个条带行,如果结束,则完成当前图像的编码过程,可以编码下一个图像。
本申请实施例中提出一种解码方法,可以应用于解码端,该方法可以包括:
第一步、将图像水平和垂直分割为多个矩形条带。
第二步、计算总资源(即目标传输比特数),根据总资源确定码流片段数量chunkNum。
第三步、接收码流,对于每个条带行内的SliceNumX个条带,依次解析chunkNum次,每次解析SliceNumX个码流片段(chunk片段)解交织到每个条带的比特流缓冲区。
示例性的,SliceNumX表示一副图像水平方向上条带的个数,即水平方向的条带数量。
示例性的,由于每个条带存在chunkNum个码流片段,因此,在解析chunkNum次,每次解析该条带的一个码流片段(SliceNumX个条带就是一次解析SliceNumX个码流片段)时,就可以解析到该条带的chunkNum个码流片段,也就是得到该条带的所有码流片段。
示例性的,在该条带的chunkNum个码流片段中,至少存在两种尺寸的码流片段。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
在一种可能的实施方式中,针对编码端来说,可以将每个条带的比特流缓冲区划分成多个码流片段,且一个条带行内的每个条带的码流片段交织在一起。针对编码端和解码端来说,每个条带内的chunkNum是固定的,即所有条带内的码流片段数量均相同,从而确保能够并行解码。码流片段的尺寸(即码流片段的大小)不固定,如前面chunkNum-1个码流片段的尺寸(chunksize)为已配置的片段尺寸值,如8192等,最后一个码流片段的尺寸为剩余比特数。针对编码端来说,可以对每个条带进行填零和比特对齐,确保每个条带的码流大小一致。
以条带行内的SliceNumX个条带是2个条带为例,即sliceNumX等于2,参见图3A所示,是SliceNumX=2时的码流缓冲区(即上述比特流缓冲区)的示例,可以将条带1的码流缓冲区划分为chunkNum个码流片段,将条带2的码流缓冲区划分为chunkNum个码流片段。
又例如,以条带行内的SliceNumX个条带是3个条带为例,即sliceNumX等于3,参见图3B所示,是SliceNumX=3时的码流缓冲区(即上述比特流缓冲区)的示例,可以将条带1的码流缓冲区划分为chunkNum个码流片段,并将条带2的码流缓冲区划分为chunkNum个码流片段,并将条带3的码流缓冲区划分为chunkNum个码流片段。
实施例3:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,前面chunkNum-1个码流片段的长度固定,记为第一尺寸,最后一个码流片段的长度不固定,记为第二尺寸。
在实施例3中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源(即目标传输比特数,总资源可以记为total_resource),并根据总资源确定码流片段(码流片段可以记为chunk)的码流片段数量chunkNum。
在一种可能的实施方式中,可以采用如下公式计算总资源:
total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。
在上述公式中,total_resourec就是总资源,也即上述目标传输比特数,slice_width用于表示条带宽度,slice_height用于表示条带高度,target_bpp用于表示目标每像素占用比特数,RC_BUFFER_LENGTH表示比特流缓冲区额外缓存的码流长度。显然,对于slice_width、slice_height、target_bpp和RC_BUFFER_LENGTH均是已知值,因此可以计算总资源。
在一种可能的实施方式中,根据总资源total_resource,可以采用如下公式计算码流片段数量chunkNum:chunknum=total_resoure>>s+n。在上述公式中,s为预设数值,可以是根据经验配置的预设数值,也可以是语法参数(如图像级语法参数、序列级语法参数等)指示的数值,对此不做限制,可选的,2的s次方可以是码流片段的长度。在上述公式中,关于n的取值,可以采用如下方式:n=total_resoure%(1<<s)==0?0:1,也就是说,若total_resoure%(1<<s)为0成立,则n的取值可以为0,若total_resoure%(1<<s)为0不成立,则n的取值可以为1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:前chunkNum-1个码流片段的长度为size1,最后一个码流片段的长度为size2。比如说,size1=1<<s,size2=total_resouce–((chunknum-1)<<s))。在上述公式中,s为预设数值,即已配置的片段尺寸值,可以是根据经验配置的预设数值,也可以是语法参数(如图像级语法参数、序列级语法参数等)指示的数值,对此不做限制,片段尺寸值用于表示码流片段的长度,total_resouce用于表示目标传输比特数。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
示例性的,sliceNumX等于2时的码流片段的交织示意图,可以参见图4A所示,可以先编码第一个条带的片段1,然后编码第二个条带的片段1,然后编码第一个条带的片段2,然后编码第二个条带的片段2,以此类推,一直到编码第一个条带的片段N,然后编码第二个条带的片段N,图4A中以chunkNum个码流片段是N个片段为例。参见图4B所示,是码流片段的长度的示意图,片段1-片段(N-1)的长度均是尺寸1,片段N的长度均是尺寸2。
sliceNumX等于3时的码流片段的交织示意图,可以参见图4C所示,可以先编码第一个条带的片段1,然后编码第二个条带的片段1,然后编码第三个条带的片段1,然后编码第一个条带的片段2,然后编码第二个条带的片段2,然后编码第三个条带的片段2,以此类推,一直到编码第一个条带的片段N,然后编码第二个条带的片段N,然后编码第三个条带的片段N,图4A中以chunkNum个码流片段是N个片段为例。参见图4D所示,是码流片段的长度的示意图,片段1-片段(N-1)中每个片段的长度均是尺寸1,片段N的长度均是尺寸2。
在实施例3中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源(即目标传输比特数,记为total_resource),并根据总资源确定码流片段的码流片段数量chunkNum。采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。以及,根据总资源total_resource,可以采用如下公式计算码流片段数量chunkNum:chunknum=total_resoure>>s+n。s为预设数值,n=total_resoure%(1<<s)==0?0:1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:前chunkNum-1个码流片段的长度为size1,最后一个码流片段的长度为size2。比如说,size1=1<<s,size2=total_resouce–((chunknum-1)<<s))。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例4:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,后面chunkNum-1个码流片段的长度固定,记为第一尺寸,第一个码流片段的长度不固定,记为第二尺寸。
在实施例4中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=total_resoure>>s+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第一个码流片段的长度为size1,后面chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1=total_resouce–((chunknum-1)<<s))。在上述公式中,s为预设数值,即已配置的片段尺寸值。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
示例性的,sliceNumX等于2时的码流片段的交织示意图,可以参见图5A所示,可以先编码第一个条带的片段1,然后编码第二个条带的片段1,然后编码第一个条带的片段2,然后编码第二个条带的片段2,以此类推,一直到编码第一个条带的片段N,然后编码第二个条带的片段N,图5A中以chunkNum个码流片段是N个片段为例。参见图5B所示,是码流片段的长度的示意图,片段1的长度是尺寸1,片段2-片段N中每个片段的长度均是尺寸2。
示例性的,针对sliceNumX等于3时的码流片段的交织过程,先编码第一个条带的片段1,然后编码第二个条带的片段1,然后编码第三个条带的片段1,然后编码第一个条带的片段2,编码第二个条带的片段2,编码第三个条带的片段2,以此类推,一直到编码第一个条带的片段N,编码第二个条带的片段N,编码第三个条带的片段N。参见图5C所示,是码流片段的长度的示意图,片段1的长度是尺寸1,片段2-片段N的长度均是尺寸2。
在实施例4中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。以及,根据总资源total_resource,可以采用如下公式计算码流片段数量chunkNum:chunknum=total_resoure>>s+n。s为预设数值,n=total_resoure%(1<<s)==0?0:1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第一个码流片段的长度为size1,后面chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1=total_resouce–((chunknum-1)<<s))。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例5:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度固定,记为第一尺寸,第k个码流片段的长度不固定,记为第二尺寸。第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
在实施例5中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=total_resoure>>s+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1=total_resouce–((chunknum-1)<<s))。在上述公式中,s为预设数值,k的取值范围是1~chunknum。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
在实施例5中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。以及,根据总资源total_resource,可以采用如下公式计算码流片段数量chunkNum:chunknum=total_resoure>>s+n。s为预设数值,n=total_resoure%(1<<s)==0?0:1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1=total_resouce–((chunknum-1)<<s))。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例6:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度固定,记为第一尺寸,第k个码流片段的长度不固定,记为第二尺寸。第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
在实施例6中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据条带高度slice_height,采用如下公式计算码流片段数量chunkNum:chunknum=slice_height。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。比如说,size2=((slice_width*bpp+7)<<3)>>3,size1=total_resouce–((chunknum-1)*size2),k的取值范围是1~chunknum。在上述公式中,slice_width用于表示条带宽度,bpp用于表示每像素占用比特数,total_resouce表示目标传输比特数,chunknum表示码流片段数量。综上,size2是基于条带宽度和每像素占用比特数确定,size1是基于目标传输比特数、size2和码流片段数量确定。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
在实施例6中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据条带高度slice_height,采用如下公式计算码流片段数量chunkNum:chunknum=slice_height。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。比如说,size2=((slice_width*bpp+7)<<3)>>3,size1=total_resouce–((chunknum-1)*size2),k的取值范围是1~chunknum。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例7:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,前面chunkNum-1个码流片段的长度以两种固定数值奇偶切换,奇数个码流片段的长度均为第一尺寸,偶数个码流片段的长度均为第二尺寸,最后一个码流片段的长度不固定,记为第三尺寸。
在实施例7中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure>>s)<<1+n。s为预设数值,关于n的取值,n=n=total_resoure%(1<<s)==0?0:1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:前面chunkNum-1个码流片段的长度以两种固定数值奇偶切换,即依次在size1和size2之间进行切换,即奇数个码流片段的长度是size1,偶数个码流片段的长度是size2,或者,奇数个码流片段的长度是size2,偶数个码流片段的长度是size1,此外,最后一个码流片段的长度为size3。
比如说,size1=(1<<s)+x,size2=(1<<s)-x,size3=total_resouce–((chunknum-1)<<s)。在上述公式中,s为预设数值,即已配置的片段尺寸值,可由图像级语法参数指示。x为预设数值,可以根据经验配置,如1、2、3或-1、-2、-3等,可由图像级语法参数指示。从上述公式可以看出,size1基于片段尺寸值s与预设数值x之和确定,size2基于片段尺寸值s与预设数值x之差确定,size3基于目标传输比特数total_resouce、片段尺寸值s和码流片段数量chunknum确定。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
示例性的,sliceNumX等于2时的码流片段的交织过程,可以先编码第一个条带的片段1,然后编码第二个条带的片段1,然后编码第一个条带的片段2,然后编码第二个条带的片段2,以此类推,一直到编码第一个条带的片段N,然后编码第二个条带的片段N。参见图6A所示,是码流片段的长度的示意图,各条带的片段1、片段3、片段5等奇数个码流片段,这些片段的长度是尺寸1,各条带的片段2、片段4、片段6等偶数个码流片段,这些片段的长度是尺寸2,此外,最后一个码流片段(即片段N)的长度是尺寸3。
在实施例7中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure>>s)<<1+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:前面chunkNum-1个码流片段的长度以两种固定数值奇偶切换,即依次在size1和size2之间进行切换,即奇数个码流片段的长度是size1,偶数个码流片段的长度是size2,或者,奇数个码流片段的长度是size2,偶数个码流片段的长度是size1,此外,最后一个码流片段的长度为size3。比如说,size1=(1<<s)+x,size2=(1<<s)-x,size3=total_resouce–((chunknum-1)<<s),x为预设数值。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例8:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,后面chunkNum-1个码流片段的长度以两种固定数值奇偶切换,奇数个码流片段的长度均为第一尺寸,偶数个码流片段的长度均为第二尺寸,第一个码流片段的长度不固定,记为第三尺寸。
在实施例8中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure>>s)<<1+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第一个码流片段的长度是size1,后面chunkNum-1个码流片段的长度以两种固定数值奇偶切换,即依次在size2和size3之间进行切换,即奇数个码流片段的长度是size2,偶数个码流片段的长度是size3,或者,奇数个码流片段的长度是size3,偶数个码流片段的长度是size2。比如说,size2=(1<<s)+x,size3=(1<<s)-x,size1=total_resouce–((chunknum-1)<<s),x为预设数值。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
示例性的,sliceNumX等于2时的码流片段的交织过程,可以先编码第一个条带的片段1,然后编码第二个条带的片段1,然后编码第一个条带的片段2,然后编码第二个条带的片段2,以此类推,一直到编码第一个条带的片段N,然后编码第二个条带的片段N。参见图6B所示,是码流片段的长度的示意图,第一个码流片段(即片段1)的长度是尺寸1,在剩余码流片段中,各条带的片段2、片段4、片段6等偶数个码流片段,这些片段的长度是尺寸2,各条带的片段3、片段5、片段7等奇数个码流片段,这些片段的长度是尺寸3。
在实施例8中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure>>s)<<1+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第一个码流片段的长度是size1,后面chunkNum-1个码流片段的长度以两种固定数值奇偶切换,即依次在size2和size3之间进行切换,比如说,奇数个码流片段的长度是size2,偶数个码流片段的长度是size3,或者,奇数个码流片段的长度是size3,偶数个码流片段的长度是size2。比如说,size2=(1<<s)+x,size3=(1<<s)-x,size1=total_resouce–((chunknum-1)<<s),x为预设数值。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例9:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度以两种固定数值奇偶切换,奇数个码流片段的长度均为第一尺寸,偶数个码流片段的长度均为第二尺寸,第k个码流片段的长度不固定,记为第三尺寸。第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
在实施例9中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure>>s)<<1+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度是size1,除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度以两种固定数值奇偶切换,即依次在size2和size3之间进行切换,即奇数个码流片段的长度是size2,偶数个码流片段的长度是size3,或者,奇数个码流片段的长度是size3,偶数个码流片段的长度是size2。比如说,size2=(1<<s)+x,size3=(1<<s)-x,size1=total_resouce–((chunknum-1)<<s),x为预设数值。奇数个码流片段是剩余的chunkNum-1个码流片段中的奇数个码流片段,偶数个码流片段是剩余的chunkNum-1个码流片段中的偶数个码流片段。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
在实施例9中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure>>s)<<1+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度是size1,剩余的chunkNum-1个码流片段的长度以两种固定数值奇偶切换,即依次在size2和size3之间进行切换,比如说,奇数个码流片段的长度是size2,偶数个码流片段的长度是size3,或者,奇数个码流片段的长度是size3,偶数个码流片段的长度是size2。比如说,size2=(1<<s)+x,size3=(1<<s)-x,size1=total_resouce–((chunknum-1)<<s),x为预设数值。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例10:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度以两种固定数值奇偶切换,奇数个码流片段的长度均为第一尺寸,偶数个码流片段的长度均为第二尺寸,第k个码流片段的长度不固定,记为第三尺寸。第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
在实施例10中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据条带高度slice_height,可以采用如下公式计算码流片段数量chunkNum:chunknum=slice_height+1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度是size1,除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度以两种固定数值奇偶切换,即依次在size2和size3之间进行切换,即奇数个码流片段的长度是size2,偶数个码流片段的长度是size3,或者,奇数个码流片段的长度是size3,偶数个码流片段的长度是size2。比如说,size2=(((slice_width*bpp)<<3)>>3)+x,size3=(((slice_width*bpp)<<3)>>3)-x,size1=total_resouce–((chunknum-1)*(size2-x)),x为预设数值,k的取值范围1~chunknum。奇数个码流片段是剩余的chunkNum-1个码流片段中的奇数个码流片段,偶数个码流片段是剩余的chunkNum-1个码流片段中的偶数个码流片段。
在上述公式中,slice_width可以用于表示条带宽度,bpp可以用于表示每像素占用比特数,total_resouce可以表示目标传输比特数,chunknum可以表示码流片段数量。
在上述公式中,(((slice_width*bpp)<<3)>>3)可以记为条带行像素数目。
综上所述,size2基于条带行像素数目与预设数值x之和确定,size3基于条带行像素数目与预设数值x之差确定,size1基于目标传输比特数、size2和码流片段数量chunknum确定,又由于size2基于条带行像素数目确定,因此,size1基于目标传输比特数、条带行像素数目和码流片段数量chunknum确定,条带行像素数目基于条带宽度和每像素占用比特数确定。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
在实施例10中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据条带高度slice_height,可以采用如下公式计算码流片段数量chunkNum:chunknum=slice_height+1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度是size1,剩余码流片段的长度以两种固定数值奇偶切换,即依次在size2和size3之间进行切换,即奇数个码流片段的长度是size2,偶数个码流片段的长度是size3,或者,奇数个码流片段的长度是size3,偶数个码流片段的长度是size2。比如说,size2=(((slice_width*bpp)<<3)>>3)+x,size3=(((slice_width*bpp)<<3)>>3)-x,size1=total_resouce–((chunknum-1)*(size2-x))。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例11:每个条带的实际编码比特数的长度固定,每个条带的实际编码比特数的长度不是目标传输比特数,而是基于所有码流片段的长度确定,即所有码流片段的长度之和。通过对比特流缓冲区进行填零和字节对齐,使得所有码流片段的长度以两种固定数值奇偶切换,奇数个码流片段的长度均为第一尺寸,偶数个码流片段的长度均为第二尺寸,而比特流缓冲区的长度是第一尺寸的码流片段的长度之和,加上第二尺寸的码流片段的长度之和。
在实施例11中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,可以采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure>>s)<<1+n。在上述公式中,s为预设数值,即已配置的片段尺寸值,可由图像级语法参数指示,关于n的取值,n=left==0?0:(left<=(1<<s+x)?1:2),而left=(total_resoure–(chunknum-1)<<s)。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该实际编码比特数的长度为所有码流片段的长度之和,而所有码流片段的长度之和可以大于目标传输比特数(即总资源),也就是说,可以按照所有码流片段的长度对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:所有码流片段(即chunkNum个码流片段)的长度以两种固定数值奇偶切换,即依次在size1和size2之间进行切换,即奇数个码流片段的长度是size1,偶数个码流片段的长度是size2,或者,奇数个码流片段的长度是size2,偶数个码流片段的长度是size1。比如说,size1=(1<<s)+x,size2=(1<<s)-x,x为预设数值。显然,由于比特流缓冲区按照所有码流片段的长度进行填零和字节对齐,因此,能够使得所有码流片段的长度依次在size1和size2之间进行切换。
比如说,假设编码条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区之后,比特流缓冲区的长度是340,而目标传输比特数是360,那么,在实施例3-实施例10中,对比特流缓冲区进行填零和字节对齐,使得比特流缓冲区的长度从340到360,即需要填零的长度是20。在实施例11中,假设size1是99,size2是101,码流片段数量chunkNum为4,那么,比特流缓冲区的长度需要是400,即两个size1的长度与2个size2的长度之和,因此,在对比特流缓冲区进行填零和字节对齐时,需要使得比特流缓冲区的长度从340到400,即需要填零的长度是60,这样,正好使得所有码流片段的长度在size1和size2之间进行切换。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
示例性的,sliceNumX等于2时的码流片段的交织过程,可以先编码第一个条带的片段1,然后编码第二个条带的片段1,然后编码第一个条带的片段2,然后编码第二个条带的片段2,以此类推,一直到编码第一个条带的片段N,然后编码第二个条带的片段N。参见图6C所示,是码流片段的长度的示意图,各条带的片段1、片段3、片段5等奇数个码流片段,这些片段的长度是尺寸1,而片段2、片段4、片段6等偶数个码流片段,这些片段的长度是尺寸2。
在实施例11中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,可以采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure>>s)<<1+n。在上述公式中,s为预设数值,即已配置的片段尺寸值,可由图像级语法参数指示,关于n的取值,设left=(total_resoure–(chunknum-1)<<s),而n=left==0?0:(left<=(1<<s+x)?1:2)。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:所有码流片段(即chunkNum个码流片段)的长度以两种固定数值奇偶切换,即依次在size1和size2之间进行切换,即奇数个码流片段的长度是size1,偶数个码流片段的长度是size2,或者,奇数个码流片段的长度是size2,偶数个码流片段的长度是size1。比如说,size1=(1<<s)+x,size2=(1<<s)-x,x为预设数值。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例12:每个条带的实际编码比特数的长度固定,每个条带的实际编码比特数的长度不是目标传输比特数,而是基于所有码流片段的长度确定,即所有码流片段的长度之和。通过对比特流缓冲区进行填零和字节对齐,使得所有码流片段的长度以两种固定数值奇偶切换,奇数个码流片段的长度均为第一尺寸,偶数个码流片段的长度均为第二尺寸,而比特流缓冲区的长度是第一尺寸的码流片段的长度之和,加上第二尺寸的码流片段的长度之和。
在实施例12中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。以及,根据条带高度slice_height,可以采用如下公式计算码流片段数量chunkNum:chunknum=slice_height。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为所有码流片段的长度之和,而所有码流片段的长度之和可以大于目标传输比特数(即总资源),也就是说,可以按照所有码流片段的长度对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:所有码流片段(即chunkNum个码流片段)的长度以两种固定数值奇偶切换,即依次在size1和size2之间进行切换,即奇数个码流片段的长度是size1,偶数个码流片段的长度是size2,或者,奇数个码流片段的长度是size2,偶数个码流片段的长度是size1。
比如说,size1=(((slice_width*bpp+7)<<3)>>3)+x,size2=(((slice_width*bpp+7)<<3)>>3)-x,x为预设数值。从上述公式可以看出,条带行像素数目基于条带宽度和每像素占用比特数确定,如条带行像素数目是(((slice_width*bpp+7)<<3)>>3),而size1基于条带行像素数目与预设数值x之和确定,size2基于条带行像素数目与预设数值x之差确定。
示例性的,由于比特流缓冲区按照所有码流片段的长度进行填零和字节对齐,因此,能够使得所有码流片段的长度依次在size1和size2之间进行切换。
比如说,假设编码条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区之后,比特流缓冲区的长度是340,假设size1是99,size2是101,码流片段数量chunkNum为4,那么,比特流缓冲区的长度需要是400,即两个size1的长度与2个size2的长度之和,因此,在对比特流缓冲区进行填零和字节对齐时,需要使得比特流缓冲区的长度从340到400,即需要填零的长度是60,这样,正好使得所有码流片段的长度在size1和size2之间进行切换。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
在实施例12中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。以及,根据条带高度slice_height,可以采用如下公式计算码流片段数量chunkNum:chunknum=slice_height。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:所有码流片段(即chunkNum个码流片段)的长度以两种固定数值奇偶切换,即依次在size1和size2之间进行切换,比如说,奇数个码流片段的长度是size1,偶数个码流片段的长度是size2,或者,奇数个码流片段的长度是size2,偶数个码流片段的长度是size1。比如说,size1=(((slice_width*bpp+7)<<3)>>3)+x,size2=(((slice_width*bpp+7)<<3)>>3)-x,x可以为预设数值。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例13:每个条带的实际编码比特数的长度不固定(不同条带的实际编码比特数的长度可以相同,也可以不同),即不对比特流缓冲区填零和字节对齐,比特流缓冲区的长度不是目标传输比特数,而是实际编码比特数,例如,在编码条带生成比特流缓冲区之后,比特流缓冲区的长度是340,则比特流缓冲区的实际编码比特数就是340,而不需要额外填零操作。
前面chunkNum-1个码流片段的长度固定,记为第一尺寸,最后一个码流片段的长度不固定,记为第二尺寸,且码流需要包括最后一个码流片段对应的片段长度指示信息,该片段长度指示信息用于指示最后一个码流片段的长度,即用于指示第二尺寸的长度。
在实施例13中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure-RC_BUFFER_LENGTH)>>s+1,s为预设数值,即已配置的片段尺寸值,可以由图像级语法参数指示。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并计算每个比特流缓冲区对应的实际比特数real_bit。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。在得到slicenumX个比特流缓冲区之后,不再对比特流缓冲区进行填零和字节对齐,即比特流缓冲区的长度是实际编码比特数,而不是填零后的目标传输比特数。此外,可以计算每个比特流缓冲区对应的实际比特数real_bit,而该实际比特数real_bit就是该比特流缓冲区的实际编码比特数。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:前面chunkNum-1个码流片段的长度为size1,最后一个码流片段的长度为size2。比如说,size1=1<<s,size2=real_bit–((chunknum-1)<<s)。在上述公式中,s为预设数值,real_bit表示比特流缓冲区的实际编码比特数,chunknum表示码流片段数量。综上,size1是基于片段尺寸值s确定,size2是基于比特流缓冲区的实际编码比特数real_bit、片段尺寸值s和码流片段数量确定。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
示例性的,在编码最后一个码流片段之前,还可以在码流中编码片段头信息,该片段头信息是最后一个码流片段对应的片段长度指示信息,该片段头信息用于指示最后一个码流片段的长度,也就是说,该片段头信息的数值表示最后一个码流片段的长度,即size2的取值。比如说,该片段头信息可以采用固定比特数进行编码,如采用固定16比特进行编码。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
示例性的,sliceNumX等于2时的码流片段的交织过程,可以先编码第一个条带的片段1,然后编码第二个条带的片段1,然后编码第一个条带的片段2,然后编码第二个条带的片段2,以此类推,一直到编码第一个条带的片段N-1,然后编码第二个条带的片段N-1,然后编码第一个条带的片段N的片段头信息1,该片段头信息1用于指示第一个条带的片段N的长度,然后编码第一个条带的片段N,然后编码第二个条带的片段N的片段头信息2,该片段头信息2用于指示第二个条带的片段N的长度,然后编码第二个条带的片段N。参见图7A所示,是码流片段的长度的示意图,片段1-片段(N-1)的长度均是尺寸1,第一个条带的片段N的长度不固定,通过第一个条带的片段N头指示该长度,第二个条带的片段N的长度不固定(与第一个条带的片段N的长度也可能不同),通过第二个条带的片段N头指示该长度。
在实施例13中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure-RC_BUFFER_LENGTH)>>s+1,s为预设数值,即已配置的片段尺寸值,可以由图像级语法参数指示。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,在从码流中解析最后一个码流片段之前,可以先解析该码流片段的片段头信息,该片段头信息是最后一个码流片段对应的片段长度指示信息,该片段头信息用于指示最后一个码流片段的长度,该片段头信息可以采用固定比特数进行解析,如采用16比特进行解析。基于该片段头信息的数值(即最后一个码流片段的长度),从码流中解析最后一个码流片段。比如说,先从码流中解析第一个条带的最后一个码流片段的片段头信息,基于该片段头信息解析第一个条带的最后一个码流片段,然后从码流中解析第二个条带的最后一个码流片段的片段头信息,基于该片段头信息解析第二个条带的最后一个码流片段,以此类推。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:前面chunkNum-1个码流片段的长度为size1,最后一个码流片段的长度为size2。比如说,size1=1<<s,size2为最后一个码流片段的片段头信息的数值,即该片段头信息用于指示size2的长度,将其数值作为size2。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例14:每个条带的实际编码比特数的长度不固定(不同条带的实际编码比特数的长度可以相同,也可以不同),即不对比特流缓冲区填零和字节对齐,比特流缓冲区的长度不是目标传输比特数,而是实际编码比特数。后面chunkNum-1个码流片段的长度固定,记为第一尺寸,第一个码流片段的长度不固定,记为第二尺寸,且码流需要包括第一个码流片段对应的片段长度指示信息,该片段长度指示信息用于指示第一个码流片段的长度。
在实施例14中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure-RC_BUFFER_LENGTH)>>s+1,s为预设数值,即已配置的片段尺寸值,可以由图像级语法参数指示。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并计算每个比特流缓冲区对应的实际比特数real_bit。
示例性的,由于每个条带行存在sliceNumX个条带,因此,对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。在得到slicenumX个比特流缓冲区之后,不再对比特流缓冲区进行填零和字节对齐,即比特流缓冲区的长度是实际编码比特数。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第一个码流片段的长度为size1,后面chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1=real_bit–((chunknum-1)<<s)。在上述公式中,s为预设数值,real_bit表示比特流缓冲区的实际编码比特数,chunknum表示码流片段数量。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
示例性的,在编码第一个码流片段之前,还可以在码流中编码片段头信息,该片段头信息是第一个码流片段对应的片段长度指示信息,该片段头信息用于指示第一个码流片段的长度,也就是说,该片段头信息的数值表示第一个码流片段的长度,即size1的取值。比如说,该片段头信息可以采用固定比特数进行编码,如采用固定16比特进行编码。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
示例性的,sliceNumX等于2时的码流片段的交织过程,可以先编码第一个条带的片段1的片段头信息1,该片段头信息1用于指示第一个条带的片段1的长度,然后编码第一个条带的片段1,然后编码第二个条带的片段1的片段头信息2,该片段头信息2用于指示第二个条带的片段1的长度,然后编码第二个条带的片段1。然后,编码第一个条带的片段2,编码第二个条带的片段2,编码第一个条带的片段3,编码第二个条带的片段3,以此类推,一直到编码第一个条带的片段N,然后编码第二个条带的片段N。参见图7B所示,是码流片段的长度的示意图,片段2-片段N的长度均是尺寸1,第一个条带的片段1的长度不固定,通过第一个条带的片段1头指示该长度,第二个条带的片段1的长度不固定(与第一个条带的片段1的长度也可能不同),通过第二个条带的片段1头指示该长度。
在实施例14中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure-RC_BUFFER_LENGTH)>>s+1,s为预设数值,即已配置的片段尺寸值,可以由图像级语法参数指示。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,在从码流中解析第一个码流片段之前,可以先解析该码流片段的片段头信息,该片段头信息是第一个码流片段对应的片段长度指示信息,该片段头信息用于指示第一个码流片段的长度,该片段头信息可以采用固定比特数进行解析,如采用16比特进行解析。
基于该片段头信息的数值(即第一个码流片段的长度),从码流中解析第一个码流片段。比如说,先从码流中解析第一个条带的第一个码流片段的片段头信息,基于该片段头信息解析第一个条带的第一个码流片段,然后从码流中解析第二个条带的第一个码流片段的片段头信息,基于该片段头信息解析第二个条带的第一个码流片段,以此类推。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第一个码流片段的长度为size1,后面chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1为第一个码流片段的片段头信息的数值,即该片段头信息用于指示size1的长度,将其数值作为size1。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例15:每个条带的实际编码比特数的长度不固定(不同条带的实际编码比特数的长度可以相同,也可以不同),即不对比特流缓冲区填零和字节对齐,比特流缓冲区的长度不是目标传输比特数,而是实际编码比特数。除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度固定,记为第一尺寸,第k个码流片段的长度不固定,记为第二尺寸,且码流需要包括第k个码流片段对应的片段长度指示信息,该片段长度指示信息用于指示第k个码流片段的长度。第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
在实施例15中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure-RC_BUFFER_LENGTH)>>s+1,s为预设数值,即已配置的片段尺寸值,可以由图像级语法参数指示。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并计算每个比特流缓冲区对应的实际比特数real_bit。
示例性的,由于每个条带行存在sliceNumX个条带,因此,对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。在得到slicenumX个比特流缓冲区之后,不再对比特流缓冲区进行填零和字节对齐,即比特流缓冲区的长度是实际编码比特数。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1=real_bit–((chunknum-1)<<s)。在上述公式中,s为预设数值,k的取值范围为1~chunknum。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
示例性的,在编码第k个码流片段之前,还可以在码流中编码片段头信息,该片段头信息是第k个码流片段对应的片段长度指示信息,该片段头信息用于指示第k个码流片段的长度,也就是说,该片段头信息的数值表示第k个码流片段的长度,即size1的取值。比如说,该片段头信息可以采用固定比特数进行编码,如采用固定16比特进行编码。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
在实施例15中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure-RC_BUFFER_LENGTH)>>s+1,s为预设数值,即已配置的片段尺寸值,可以由图像级语法参数指示。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,在从码流中解析第k个码流片段之前,可以先解析该码流片段的片段头信息,该片段头信息是第k个码流片段对应的片段长度指示信息,该片段头信息用于指示第k个码流片段的长度,该片段头信息可以采用固定比特数进行解析,如采用16比特进行解析。
基于该片段头信息的数值(即第k个码流片段的长度),从码流中解析第k个码流片段。比如说,先从码流中解析第一个条带的第k个码流片段的片段头信息,基于该片段头信息解析第一个条带的第k个码流片段,然后从码流中解析第二个条带的第k个码流片段的片段头信息,基于该片段头信息解析第二个条带的第k个码流片段,以此类推。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1为第k个码流片段的片段头信息的数值,即该片段头信息用于指示size1的长度,将其数值作为size1。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例16:每个条带的实际编码比特数的长度不固定(不同条带的实际编码比特数的长度可以相同,也可以不同),即不对比特流缓冲区填零和字节对齐,比特流缓冲区的长度不是目标传输比特数,而是实际编码比特数。除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度固定,记为第一尺寸,第k个码流片段的长度不固定,记为第二尺寸,且码流需要包括第k个码流片段对应的片段长度指示信息,该片段长度指示信息用于指示第k个码流片段的长度。第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
在实施例16中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。以及,根据条带高度slice_height,可以采用如下公式计算码流片段数量chunkNum:chunknum=slice_height。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并计算每个比特流缓冲区对应的实际比特数real_bit。
示例性的,由于每个条带行存在sliceNumX个条带,因此,对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。在得到slicenumX个比特流缓冲区之后,不再对比特流缓冲区进行填零和字节对齐,即比特流缓冲区的长度是实际编码比特数。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。比如说,size2=(((slice_width*bpp)<<3)>>3),size1=real_bit–((chunknum-1)*size2),k取值范围是1~chunknum。slice_width用于表示条带宽度,bpp用于表示每像素占用比特数,real_bit表示比特流缓冲区对应的实际编码比特数,chunknum表示码流片段数量。综上,size2是基于条带宽度和每像素占用比特数确定,size1是基于比特流缓冲区对应的实际编码比特数、size2和码流片段数量确定。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
示例性的,在编码第k个码流片段之前,还可以在码流中编码片段头信息,该片段头信息是第k个码流片段对应的片段长度指示信息,该片段头信息用于指示第k个码流片段的长度,也就是说,该片段头信息的数值表示第k个码流片段的长度,即size1的取值。比如说,该片段头信息可以采用固定比特数进行编码,如采用固定16比特进行编码。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
在实施例16中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。以及,根据条带高度slice_height,可以采用如下公式计算码流片段数量chunkNum:chunknum=slice_height。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,在从码流中解析第k个码流片段之前,可以先解析该码流片段的片段头信息,该片段头信息是第k个码流片段对应的片段长度指示信息,该片段头信息用于指示第k个码流片段的长度,该片段头信息可以采用固定比特数进行解析,如采用16比特进行解析。
基于该片段头信息的数值(即第k个码流片段的长度),从码流中解析第k个码流片段。比如说,先从码流中解析第一个条带的第k个码流片段的片段头信息,基于该片段头信息解析第一个条带的第k个码流片段,然后从码流中解析第二个条带的第k个码流片段的片段头信息,基于该片段头信息解析第二个条带的第k个码流片段,以此类推。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。size2=(((slice_width*bpp)<<3)>>3),size1为第k个码流片段的片段头信息的数值,即该片段头信息用于指示size1的长度,将其数值作为size1。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例17:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,前面chunkNum-1个码流片段的长度固定,记为第一尺寸,最后一个码流片段的长度不固定,记为第二尺寸,且码流需要包括最后一个码流片段对应的片段长度指示信息,该片段长度指示信息用于指示最后一个码流片段的长度。
在实施例17中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure)>>s+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:前面chunkNum-1个码流片段的长度为size1,最后一个码流片段的长度为size2。比如说,size1=1<<s,size2=total_resouce–((chunknum-1)<<s))。在上述公式中,s为预设数值,即已配置的片段尺寸值。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
示例性的,在编码最后一个码流片段之前,还可以在码流中编码片段头信息,该片段头信息是最后一个码流片段对应的片段长度指示信息,该片段头信息用于指示最后一个码流片段的长度,也就是说,该片段头信息的数值表示最后一个码流片段的长度,即size2的取值。比如说,该片段头信息可以采用固定比特数进行编码,如采用固定16比特进行编码。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
示例性的,sliceNumX等于2时的码流片段的交织过程,编码第一个条带的片段1,编码第二个条带的片段1,编码第一个条带的片段2,编码第二个条带的片段2,以此类推,直到编码第一个条带的片段N-1,编码第二个条带的片段N-1,然后编码第一个条带的片段N的片段头信息1,片段头信息1用于指示第一个条带的片段N的长度,编码第一个条带的片段N,编码第二个条带的片段N的片段头信息2,片段头信息2用于指示第二个条带的片段N的长度,编码第二个条带的片段N。参见图8A所示,是码流片段长度的示意图,片段1-片段(N-1)的长度均是尺寸1,第一个条带的片段N的长度不固定,通过第一个条带的片段N头指示该长度,第二个条带的片段N的长度不固定,通过第二个条带的片段N头指示该长度。
在实施例17中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure)>>s+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,在从码流中解析最后一个码流片段之前,可以先解析该码流片段的片段头信息,该片段头信息是最后一个码流片段对应的片段长度指示信息,该片段头信息用于指示最后一个码流片段的长度,该片段头信息可以采用固定比特数进行解析,如采用16比特进行解析。基于该片段头信息的数值(即最后一个码流片段的长度),从码流中解析最后一个码流片段。比如说,先从码流中解析第一个条带的最后一个码流片段的片段头信息,基于该片段头信息解析第一个条带的最后一个码流片段,然后从码流中解析第二个条带的最后一个码流片段的片段头信息,基于该片段头信息解析第二个条带的最后一个码流片段,以此类推。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:前面chunkNum-1个码流片段的长度为size1,最后一个码流片段的长度为size2。比如说,size1=1<<s,size2为最后一个码流片段的片段头信息的数值,即该片段头信息用于指示size2的长度,将其数值作为size2。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例18:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,后面chunkNum-1个码流片段的长度固定,记为第一尺寸,第一个码流片段的长度不固定,记为第二尺寸,且码流需要包括第一个码流片段对应的片段长度指示信息,该片段长度指示信息用于指示第一个码流片段的长度。
在实施例18中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure)>>s+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第一个码流片段的长度为size1,后面chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1=total_resouce–((chunknum-1)<<s))。在上述公式中,s为预设数值,即已配置的片段尺寸值。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
示例性的,在编码第一个码流片段之前,还可以在码流中编码片段头信息,该片段头信息是第一个码流片段对应的片段长度指示信息,该片段头信息用于指示第一个码流片段的长度,也就是说,该片段头信息的数值表示第一个码流片段的长度,即size1的取值。比如说,该片段头信息可以采用固定比特数进行编码,如采用固定16比特进行编码。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
示例性的,sliceNumX等于2时的码流片段的交织过程,编码第一个条带的片段1的片段头信息1,片段头信息1用于指示第一个条带的片段1的长度,编码第一个条带的片段1,编码第二个条带的片段1的片段头信息2,片段头信息2用于指示第二个条带的片段1的长度,编码第二个条带的片段1。然后,编码第一个条带的片段2,编码第二个条带的片段2,编码第一个条带的片段3,编码第二个条带的片段3,以此类推,一直到编码第一个条带的片段N,然后编码第二个条带的片段N。参见图8B所示,是码流片段的长度的示意图,片段2-片段N的长度均是尺寸1,第一个条带的片段1的长度不固定,通过第一个条带的片段1头指示该长度,第二个条带的片段1的长度不固定,通过第二个条带的片段1头指示该长度。
在实施例18中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure)>>s+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,在从码流中解析第一个码流片段之前,可以先解析该码流片段的片段头信息,该片段头信息是第一个码流片段对应的片段长度指示信息,该片段头信息用于指示第一个码流片段的长度,该片段头信息可以采用固定比特数进行解析,如采用16比特进行解析。基于该片段头信息的数值(即第一个码流片段的长度),从码流中解析第一个码流片段。比如说,先从码流中解析第一个条带的第一个码流片段的片段头信息,基于该片段头信息解析第一个条带的第一个码流片段,然后从码流中解析第二个条带的第一个码流片段的片段头信息,基于该片段头信息解析第二个条带的第一个码流片段,以此类推。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第一个码流片段的长度为size1,后面chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1为第一个码流片段的片段头信息的数值,即该片段头信息用于指示size1的长度,将其数值作为size1。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例19:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度固定,记为第一尺寸,第k个码流片段的长度不固定,记为第二尺寸,且码流需要包括第k个码流片段对应的片段长度指示信息,该片段长度指示信息用于指示第k个码流片段的长度。第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
在实施例19中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure)>>s+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1=total_resouce–((chunknum-1)<<s))。在上述公式中,s为预设数值,即已配置的片段尺寸值。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
示例性的,在编码第k个码流片段之前,还可以在码流中编码片段头信息,该片段头信息是第k个码流片段对应的片段长度指示信息,该片段头信息用于指示第k个码流片段的长度,也就是说,该片段头信息的数值表示第k个码流片段的长度,即size1的取值。比如说,该片段头信息可以采用固定比特数进行编码,如采用固定16比特进行编码。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
在实施例19中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据总资源确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据总资源total_resource,采用如下公式计算码流片段数量chunkNum:chunknum=(total_resoure)>>s+n。s为预设数值,关于n的取值,n=total_resoure%(1<<s)==0?0:1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,在从码流中解析第k个码流片段之前,可以先解析该码流片段的片段头信息,该片段头信息是第k个码流片段对应的片段长度指示信息,该片段头信息用于指示第k个码流片段的长度,该片段头信息可以采用固定比特数进行解析,如采用16比特进行解析。基于该片段头信息的数值(即第k个码流片段的长度),从码流中解析第k个码流片段。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。比如说,size2=1<<s,size1为第k个码流片段的片段头信息的数值,即该片段头信息用于指示size1的长度,将其数值作为size1。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例20:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度固定,记为第一尺寸,第k个码流片段的长度不固定,记为第二尺寸,且码流需要包括第k个码流片段对应的片段长度指示信息,该片段长度指示信息用于指示第k个码流片段的长度。第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
在实施例20中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据条带高度slice_height,可以采用如下公式计算码流片段数量chunkNum:chunknum=slice_height。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。
示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。比如说,size2=(((slice_width*bpp+7)<<3)>>3),size1=total_resouce–((chunknum-1)*size2),k的取值范围是1~chunknum。在上述公式中,slice_width用于表示条带宽度,bpp用于表示每像素占用比特数,total_resouce表示目标传输比特数,chunknum表示码流片段数量。综上,size2是基于条带宽度和每像素占用比特数确定,size1是基于目标传输比特数、size2和码流片段数量确定。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
示例性的,在编码第k个码流片段之前,还可以在码流中编码片段头信息,该片段头信息是第k个码流片段对应的片段长度指示信息,该片段头信息用于指示第k个码流片段的长度,也就是说,该片段头信息的数值表示第k个码流片段的长度,即size1的取值。比如说,该片段头信息可以采用固定比特数进行编码,如采用固定16比特进行编码。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
在实施例20中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据条带高度slice_height,可以采用如下公式计算码流片段数量chunkNum:chunknum=slice_height。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,在从码流中解析第k个码流片段之前,可以先解析该码流片段的片段头信息,该片段头信息是第k个码流片段对应的片段长度指示信息,该片段头信息用于指示第k个码流片段的长度,该片段头信息可以采用固定比特数进行解析,如采用16比特进行解析。基于该片段头信息的数值(即第k个码流片段的长度),从码流中解析第k个码流片段。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。size2=(((slice_width*bpp+7)<<3)>>3),size1为第k个码流片段的片段头信息的数值,即该片段头信息用于指示size1的长度,将数值作为size1。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
实施例21:每个条带的实际编码比特数的长度固定,例如,每个条带的实际编码比特数的长度等于目标传输比特数,除第k个码流片段之外的剩余码流片段(即chunkNum-1个码流片段)的长度固定,记为第一尺寸,第k个码流片段的长度不固定,记为第二尺寸,且码流需要包括第k个码流片段对应的片段长度指示信息,该片段长度指示信息用于指示第k个码流片段的长度。第k个码流片段可以是所有码流片段中的最后一个码流片段;或者,第k个码流片段是所有码流片段中的第一个码流片段;或者,第k个码流片段位于第一个码流片段与最后一个码流片段之间,即第k个码流片段是任意一个码流片段。
在实施例21中,针对编码端来说,可以采用如下步骤实现编码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据条带高度slice_height,可以采用如下公式计算码流片段数量chunkNum:chunknum=slice_height+1。
第三步、依次编码每个条带行内的sliceNumX个条带,生成slicenumX个比特流缓冲区slicebuffer[sliceNumX],并对比特流缓冲区进行填零和字节对齐。
示例性的,由于每个条带行存在sliceNumX个条带,因此,可以对sliceNumX个条带进行编码,得到sliceNumX个条带对应的slicenumX个比特流缓冲区。针对每个比特流缓冲区,可以对该比特流缓冲区进行填零和字节对齐,以使该比特流缓冲区的长度为目标传输比特数(即总资源),即按照目标传输比特数对该比特流缓冲区进行填零和字节对齐。
第四步、将每个比特流缓冲区划分为chunkNum个码流片段,码流片段的长度不固定。示例性的,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度可以为size1,而剩余chunkNum-1个码流片段的长度可以为size2。比如说,size2=(((slice_width*bpp)<<3)>>3),size1=total_resouce–((chunknum-1)*size2)。
实施例21与实施例20相比,关于size2的计算公式有所不同,在实施例20中,size2=(((slice_width*bpp+7)<<3)>>3),在实施例21中,size2=(((slice_width*bpp)<<3)>>3),其区别在与:由于每个字节是8比特,在实施例20中,有“+7”的操作,通过该操作使得码流片段的长度多一个字节,而在实施例21中,没有“+7”的操作,即码流片段的长度上一个字节。
第五步、对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段(即sliceNumX个条带的码流片段)交织在一起形成最终码流。
示例性的,在编码第k个码流片段之前,还可以在码流中编码片段头信息,该片段头信息是第k个码流片段对应的片段长度指示信息,该片段头信息用于指示第k个码流片段的长度,也就是说,该片段头信息的数值表示第k个码流片段的长度,即size1的取值。比如说,该片段头信息可以采用固定比特数进行编码,如采用固定16比特进行编码。
在一种可能的实施方式中,对于一个条带行内的sliceNumX个条带,依次编码chunkNum次,每次将每个条带的码流片段交织在一起形成最终码流,可以包括但不限于:在已得到一个条带行内的所有条带对应的码流片段时,开始将X个条带对应的码流片段交织得到最终码流;其中,已得到一个条带行内的所有条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于码流片段数量。
第六步、判断条带是否编码结束,如果没有结束,返回第三步,编码下一个条带行。
在实施例21中,针对解码端来说,可以采用如下步骤实现解码方法:
第一步、将图像水平和垂直分割为sliceNumX*sliceNumY个矩形条带。
第二步、计算总资源total_resource(即目标传输比特数),并根据条带高度slice_height确定码流片段的码流片段数量chunkNum。比如说,采用如下公式计算总资源:total_resourec=((slice_width*slice_height*target_bpp+7)>>3)<<3;或者,total_resourec=((slice_width*slice_height*target_bpp+7+RC_BUFFER_LENGTH)>>3)<<3。根据条带高度slice_height,可以采用如下公式计算码流片段数量chunkNum:chunknum=slice_height+1。
第三步、接收码流,对于每个条带行的sliceNumX个条带,依次解析chunknum次,每次解析slicenumX个码流片段解交织到每个条带的码流缓冲区(即比特流缓冲区)。
示例性的,在从码流中解析第k个码流片段之前,可以先解析该码流片段的片段头信息,该片段头信息是第k个码流片段对应的片段长度指示信息,该片段头信息用于指示第k个码流片段的长度,该片段头信息可以采用固定比特数进行解析,如采用16比特进行解析。基于该片段头信息的数值(即第k个码流片段的长度),从码流中解析第k个码流片段。
示例性的,针对每个条带,解析chunknum次可以得到chunkNum个码流片段,chunkNum个码流片段的长度(chunksize)的计算方式可以为:第k个码流片段的长度为size1,剩余chunkNum-1个码流片段的长度为size2。size2=(((slice_width*bpp)<<3)>>3),size1为第k个码流片段的片段头信息的数值,即该片段头信息用于指示size1的长度,将数值作为size1。
第四步、基于每个条带的比特流缓冲区对每个条带进行解码。
在一种可能的实施方式中,在SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段时,开始对SliceNumX个条带对应的码流片段进行解码。其中,SliceNumX个条带对应的比特流缓冲区中存在SliceNumX个条带对应的码流片段,可以包括但不限于:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于码流片段数量。
第五步、在每个条带的解码完成后,得到每个条带的重建图像。
第六步、判断所有条带行的码流是否解析结束,如果没有结束,则返回第三步,解析下一个条带行,如果结束,则完成当前图像的解码过程,可以解析下一个图像。
示例性的,上述各实施例可以单独实现,也可以组合实现,比如说,实施例1-实施例21中的每个实施例,可以单独实现,实施例1-实施例21中的至少两个实施例,可以组合实现。上述各实施例中的参数解释说明,也可以应用到其它实施例中,如实施例1的解释可以应用到实施例2-实施例21中,实施例3的解释可以应用到实施例4-实施例21中。
示例性的,上述各实施例中,编码端的内容也可以应用到解码端,即解码端可以采用相同方式处理,解码端的内容也可以应用到编码端,即编码端可以采用相同方式处理。
实施例22:基于与上述方法同样的申请构思,本申请实施例中还提出一种解码装置,所述解码装置应用于解码端,所述解码装置包括:存储器,其经配置以存储视频数据;解码器,其经配置以实现上述实施例1-实施例21中的解码方法,即解码端的处理流程。
比如说,在一种可能的实施方式中,解码器,其经配置以实现:
将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;
确定每个条带内的码流片段数量;
对目标码流中同一条带行的水平方向的X个条带对应的码流片段进行解交织,得到每个条带对应的所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;
基于同一条带行的水平方向的X个条带对应的比特流缓冲区对所述X个条带进行解码;其中,每个条带对应的比特流缓冲区包括该条带对应的码流片段。
基于与上述方法同样的申请构思,本申请实施例中还提出一种编码装置,所述编码装置应用于编码端,所述编码装置包括:存储器,其经配置以存储视频数据;编码器,其经配置以实现上述实施例1-实施例21中的编码方法,即编码端的处理流程。
比如说,在一种可能的实施方式中,编码器,其经配置以实现:
将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;
确定每个条带内的码流片段数量;
对同一条带行的水平方向的X个条带进行编码,得到X个条带对应的X个比特流缓冲区;
针对每个比特流缓冲区,将该比特流缓冲区划分为所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;
将同一条带行的水平方向的X个条带对应的码流片段交织得到目标码流;
将所述目标码流发送给解码端。
基于与上述方法同样的申请构思,本申请实施例提供的解码端设备(也可以称为视频解码器),从硬件层面而言,其硬件架构示意图具体可以参见图9A所示。包括处理器911和机器可读存储介质912,机器可读存储介质912存储有能够被处理器911执行的机器可执行指令;处理器911用于执行机器可执行指令,以实现本申请上述实施例1-21公开的解码方法。
基于与上述方法同样的申请构思,本申请实施例提供的编码端设备(也可以称为视频编码器),从硬件层面而言,其硬件架构示意图具体可以参见图9B所示。包括处理器921和机器可读存储介质922,机器可读存储介质922存储有能够被处理器921执行的机器可执行指令;处理器921用于执行机器可执行指令,以实现本申请上述实施例1-21公开的编码方法。
基于与上述方法同样的申请构思,本申请实施例还提供一种机器可读存储介质,所述机器可读存储介质上存储有若干计算机指令,所述计算机指令被处理器执行时,能够实现本申请上述示例公开的方法,如上述上述各实施例中的解码方法或者编码方法。
基于与上述方法同样的申请构思,本申请实施例还提供一种计算机应用程序,所述计算机应用程序令被处理器执行时,能够实现本申请上述示例公开的解码方法或者编码方法。
基于与上述方法同样的申请构思,本申请实施例中还提出一种解码装置,所述解码装置应用于解码端,所述解码装置包括:划分模块,用于将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;确定模块,用于确定每个条带内的码流片段数量;解码模块,用于对目标码流中同一条带行的水平方向的X个条带对应的码流片段进行解交织,得到每个条带对应的所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;基于同一条带行的水平方向的X个条带对应的比特流缓冲区对所述X个条带进行解码;其中,每个条带对应的比特流缓冲区包括该条带对应的码流片段。
示例性的,所述确定模块确定每个条带内的码流片段数量时具体用于:根据条带宽度、条带高度和目标每像素占用比特数确定目标传输比特数,并根据所述目标传输比特数和已配置的片段尺寸值确定所述码流片段数量;或者,根据条带高度确定所述码流片段数量。
示例性的,所述解码模块对目标码流中同一条带行的水平方向的X个条带对应的码流片段进行解交织,得到每个条带对应的所述码流片段数量个码流片段时具体用于:基于同一条带行的水平方向的X个条带的顺序,依次解析每个条带对应的一个码流片段到该条带对应的比特流缓冲区,并判断是否已解析所有码流片段;若是,则完成所述X个条带的解交织,得到每个条带对应的所有码流片段;若否,则返回执行基于同一条带行的水平方向的X个条带的顺序,依次解析每个条带对应的一个码流片段到该条带对应的比特流缓冲区的操作。
示例性的,所述解码模块基于同一条带行的水平方向的X个条带对应的比特流缓冲区对所述X个条带进行解码时具体用于:在所述X个条带对应的比特流缓冲区中存在所述X个条带对应的码流片段时,开始对所述X个条带对应的码流片段进行解码。X个条带对应的比特流缓冲区中存在所述X个条带对应的码流片段,包括:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于所述码流片段数量。
基于与上述方法同样的申请构思,本申请实施例中还提出一种编码装置,所述编码装置应用于编码端,所述编码装置包括:划分模块,用于将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;确定模块,用于确定每个条带内的码流片段数量;编码模块,用于对同一条带行的水平方向的X个条带进行编码,得到X个条带对应的X个比特流缓冲区;针对每个比特流缓冲区,将该比特流缓冲区划分为所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;将同一条带行的水平方向的X个条带对应的码流片段交织得到目标码流;发送模块,用于将所述目标码流发送给解码端。
示例性的,所述确定模块确定每个条带内的码流片段数量时具体用于:根据条带宽度、条带高度和目标每像素占用比特数确定目标传输比特数,并根据所述目标传输比特数和已配置的片段尺寸值确定所述码流片段数量;或者,根据条带高度确定所述码流片段数量。
示例性的,所述编码模块将同一条带行的水平方向的X个条带对应的码流片段交织得到目标码流时具体用于:基于同一条带行的水平方向的X个条带的顺序,依次将每个条带对应的一个码流片段添加到当前码流,并判断是否已将所有码流片段均添加到当前码流;若是,则停止添加码流片段,并将当前码流作为目标码流;若否,则继续将每个条带对应的一个码流片段添加到当前码流,并返回执行判断是否已将所有码流片段均添加到当前码流的操作。
示例性的,所述编码模块将同一条带行的水平方向的X个条带对应的码流片段交织得到目标码流时具体用于:在已得到所述X个条带对应的码流片段时,开始将所述X个条带对应的码流片段交织得到目标码流;其中,已得到所述X个条带对应的码流片段,包括:针对每个条带,已得到该条带对应的S个码流片段,S大于或等于1,且S小于所述码流片段数量。
基于与上述方法同样的申请构思,本申请实施例中还提供一种摄像机设备,该摄像机设备可以包括上述任一实施例中的编码端和/或解码解码端。
基于与上述方法同样的申请构思,本申请实施例还提供一种机器可读存储介质,所述机器可读存储介质上存储有若干计算机指令,所述计算机指令被处理器执行时,能够实现本申请上述示例公开的编解码方法。其中,上述机器可读存储介质可以是任何电子、磁性、光学或其它物理存储装置,可以包含或存储信息,如可执行指令、数据,等等。例如,机器可读存储介质可以是:RAM(Radom Access Memory,随机存取存储器)、易失存储器、非易失性存储器、闪存、存储驱动器(如硬盘驱动器)、固态硬盘、任何类型的存储盘(如光盘、dvd等),或者类似的存储介质,或者它们的组合。
上述实施例阐明的系统、装置、模块或单元,可以由计算机芯片或实体实现,或由具有某种功能的产品来实现。一种典型的实现为计算机,计算机的形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可以由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其它可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其它可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。而且,这些计算机程序指令也可以存储在能引导计算机或其它可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或者多个流程和/或方框图一个方框或者多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其它可编程数据处理设备上,使得在计算机或者其它可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其它可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

Claims (11)

1.一种解码方法,其特征在于,所述方法包括:
将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;
确定每个条带内的码流片段数量;
对目标码流中同一条带行的水平方向的X个条带对应的码流片段进行解交织,得到每个条带对应的所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;其中,针对所述码流片段数量个码流片段,除第k个码流片段之外的剩余码流片段的长度均为第一尺寸,第k个码流片段的长度为第二尺寸;其中,所述第一尺寸基于已配置的片段尺寸值确定,所述第二尺寸基于目标传输比特数、所述片段尺寸值和所述码流片段数量确定;
基于同一条带行的水平方向的X个条带对应的比特流缓冲区对所述X个条带进行解码;其中,每个条带对应的比特流缓冲区包括该条带对应的码流片段。
2.根据权利要求1所述的方法,其特征在于,所述已配置的片段尺寸值是预先配置的预设数值,或者,所述已配置的片段尺寸值是图像级语法参数指示的数值。
3.根据权利要求1所述的方法,其特征在于,
所述确定每个条带内的码流片段数量,包括:
根据条带宽度、条带高度和目标每像素占用比特数确定目标传输比特数,并根据所述目标传输比特数和已配置的片段尺寸值确定所述码流片段数量;
或者,根据条带高度确定所述码流片段数量。
4.根据权利要求1所述的方法,其特征在于,
所述对目标码流中同一条带行的水平方向的X个条带对应的码流片段进行解交织,得到每个条带对应的所述码流片段数量个码流片段,包括:
基于同一条带行的水平方向的X个条带的顺序,依次解析每个条带对应的一个码流片段到该条带对应的比特流缓冲区,并判断是否已解析所有码流片段;
若是,则完成所述X个条带的解交织,得到每个条带对应的所有码流片段。
5.根据权利要求1或1所述的方法,其特征在于,所述基于同一条带行的水平方向的X个条带对应的比特流缓冲区对所述X个条带进行解码,包括:
在所述X个条带对应的比特流缓冲区中存在所述X个条带对应的码流片段时,开始对所述X个条带对应的码流片段进行解码;其中,所述X个条带对应的比特流缓冲区中存在所述X个条带对应的码流片段,包括:针对每个条带,该条带对应的比特流缓冲区中存在该条带对应的T个码流片段,T大于或等于1,且T小于所述码流片段数量。
6.根据权利要求1所述的方法,其特征在于,
所述第k个码流片段是所有码流片段中的最后一个码流片段。
7.一种编码方法,其特征在于,所述方法包括:
将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;
确定每个条带内的码流片段数量;
对同一条带行的水平方向的X个条带进行编码,得到X个条带对应的X个比特流缓冲区;
针对每个比特流缓冲区,将该比特流缓冲区划分为所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;其中,在实际编码比特数的长度固定时,针对所述码流片段数量个码流片段,除第k个码流片段之外的剩余码流片段的长度均为第一尺寸,第k个码流片段的长度为第二尺寸;其中,所述第一尺寸基于已配置的片段尺寸值确定,所述第二尺寸基于目标传输比特数、所述片段尺寸值和所述码流片段数量确定;
将同一条带行的水平方向的X个条带对应的码流片段交织得到目标码流;
将所述目标码流发送给解码端。
8.一种解码装置,其特征在于,所述解码装置包括:
划分模块,用于将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;
确定模块,用于确定每个条带内的码流片段数量;
解码模块,用于对目标码流中同一条带行的水平方向的X个条带对应的码流片段进行解交织,得到每个条带对应的所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;其中,针对所述码流片段数量个码流片段,除第k个码流片段之外的剩余码流片段的长度均为第一尺寸,第k个码流片段的长度为第二尺寸;其中,所述第一尺寸基于已配置的片段尺寸值确定,所述第二尺寸基于目标传输比特数、所述片段尺寸值和所述码流片段数量确定;
所述解码模块,还用于基于同一条带行的水平方向的X个条带对应的比特流缓冲区对所述X个条带进行解码;其中,每个条带对应的比特流缓冲区包括该条带对应的码流片段。
9.一种编码装置,其特征在于,所述编码装置包括:
划分模块,用于将待处理图像划分为X*Y个条带,X为水平方向的条带数量,Y为垂直方向的条带数量,X为大于1的正整数,Y为大于或等于1的正整数;
确定模块,用于确定每个条带内的码流片段数量;
编码模块,用于对同一条带行的水平方向的X个条带进行编码,得到X个条带对应的X个比特流缓冲区;针对每个比特流缓冲区,将该比特流缓冲区划分为所述码流片段数量个码流片段;其中,在所述码流片段数量个码流片段中,至少存在两种尺寸的码流片段;其中,在实际编码比特数的长度固定时,针对所述码流片段数量个码流片段,除第k个码流片段之外的剩余码流片段的长度均为第一尺寸,第k个码流片段的长度为第二尺寸;其中,所述第一尺寸基于已配置的片段尺寸值确定,所述第二尺寸基于目标传输比特数、所述片段尺寸值和所述码流片段数量确定;将同一条带行的水平方向的X个条带对应的码流片段交织得到目标码流;
发送模块,用于将所述目标码流发送给解码端。
10.一种解码端设备,其特征在于,包括:处理器和机器可读存储介质,所述机器可读存储介质存储有能够被所述处理器执行的机器可执行指令;
所述处理器用于执行机器可执行指令,以实现权利要求1-6任一项所述的方法步骤。
11.一种编码端设备,其特征在于,包括:处理器和机器可读存储介质,所述机器可读存储介质存储有能够被所述处理器执行的机器可执行指令;
所述处理器用于执行机器可执行指令,以实现权利要求7所述的方法步骤。
CN202310494035.4A 2022-03-18 2022-03-18 一种编码、解码方法、装置及其设备 Pending CN116405694A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310494035.4A CN116405694A (zh) 2022-03-18 2022-03-18 一种编码、解码方法、装置及其设备

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN202310494035.4A CN116405694A (zh) 2022-03-18 2022-03-18 一种编码、解码方法、装置及其设备
CN202210273469.7A CN116095340A (zh) 2022-03-18 2022-03-18 一种编码、解码方法、装置及其设备

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
CN202210273469.7A Division CN116095340A (zh) 2022-03-18 2022-03-18 一种编码、解码方法、装置及其设备

Publications (1)

Publication Number Publication Date
CN116405694A true CN116405694A (zh) 2023-07-07

Family

ID=86197901

Family Applications (2)

Application Number Title Priority Date Filing Date
CN202310494035.4A Pending CN116405694A (zh) 2022-03-18 2022-03-18 一种编码、解码方法、装置及其设备
CN202210273469.7A Pending CN116095340A (zh) 2022-03-18 2022-03-18 一种编码、解码方法、装置及其设备

Family Applications After (1)

Application Number Title Priority Date Filing Date
CN202210273469.7A Pending CN116095340A (zh) 2022-03-18 2022-03-18 一种编码、解码方法、装置及其设备

Country Status (3)

Country Link
CN (2) CN116405694A (zh)
TW (1) TW202339500A (zh)
WO (1) WO2023174407A1 (zh)

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101389021B (zh) * 2007-09-14 2010-12-22 华为技术有限公司 视频编解码方法及装置
CN101184244A (zh) * 2007-12-25 2008-05-21 北京数码视讯科技股份有限公司 一种视频编码的方法和系统
JP5812028B2 (ja) * 2013-03-08 2015-11-11 ソニー株式会社 映像処理装置および映像処理方法
US9596477B2 (en) * 2013-12-26 2017-03-14 Mediatek Inc. Methods of multiple-slice coding for frame buffer compression
CN109429069B (zh) * 2017-08-23 2021-08-24 珠海全志科技股份有限公司 一种显示流压缩编码器以及显示引擎
US10917662B2 (en) * 2018-03-08 2021-02-09 Mediatek Inc. Method and apparatus for dealing with compressed bitstream interleaving
AU2019232797A1 (en) * 2019-09-17 2021-04-01 Canon Kabushiki Kaisha Method, apparatus and system for encoding and decoding a block of video samples

Also Published As

Publication number Publication date
WO2023174407A1 (zh) 2023-09-21
TW202339500A (zh) 2023-10-01
CN116095340A (zh) 2023-05-09

Similar Documents

Publication Publication Date Title
RU2722536C1 (ru) Вывод опорных значений режима и кодирование и декодирование информации, представляющей режимы предсказания
US10567753B2 (en) Skip macroblock coding
US9277240B2 (en) Method of coding and decoding images, coding and decoding device and computer programs corresponding thereto
JP2008154155A (ja) 動画像符号化装置
US20120087414A1 (en) Apparatus and method for processing video data
Juurlink et al. Understanding the application: An overview of the h. 264 standard
KR20130053645A (ko) 적응적 루프 필터를 이용한 비디오 부호화/복호화 방법 및 장치
WO2017074539A1 (en) Parallel arithmetic coding techniques
WO2008016600A2 (en) Video encoding
Silveira et al. Memory bandwidth reduction in video coding systems through context adaptive lossless reference frame compression
KR20160105203A (ko) 멀티미디어 코덱, 상기 멀티미디어 코덱을 포함하는 애플리케이션 프로세서, 및 상기 애플리케이션 프로세서의 동작 방법
CN116405694A (zh) 一种编码、解码方法、装置及其设备
US20130089264A1 (en) Apparatus and method for encoding images, and apparatus and method for decoding images
KR20140031974A (ko) 화상 부호화 방법, 화상 복호 방법, 화상 부호화 장치, 화상 복호 장치, 화상 부호화 프로그램 및 화상 복호 프로그램
CN111726632B (zh) 一种编解码方法、装置及其设备
CN106686380B (zh) 采用基于多块的流水线的增强型数据处理设备及操作方法
RU2782400C2 (ru) Способ кодирования и декодирования изображений, устройство кодирования и декодирования и соответствующие компьютерные программы
RU2808075C1 (ru) Способ кодирования и декодирования изображений, устройство кодирования и декодирования и соответствующие компьютерные программы
KR100221196B1 (ko) 영상신호의 압축 및 복원을 위한 가변 길이부호화기
KR20120095794A (ko) 고속 영상 부호화 방법

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination