毕业于上海大学通信与信息工程学院,从事流媒体和视频编解码的研究与开发工作; 研究领域包括视频编解码标准、视频处理和流媒体技术、移动互联网技术等。
优酷地址:点这里
优酷播放地址:点击这里
单元测试是软件测试过程中的重要组成部分,指的是对程序中单个子程序或过程进行测试的过程。单元测试针对的不是整个程序,而是针对构成整体的较小的程序模块上进行的测试。
众所周知,试图对软件进行完全的测试并发现全部的问题是一件不可能的任务,对于测试而言,最有效的思想就是努力使测试尽可能完全。 在这个过程中,测试用例的设计至关重要。
对于一家技术研发流程完善的技术公司来说,代码审查都是必不可少的一部分。虽然大部分代码审查工作都是研发团队的工程师完成,广义上讲,代码审查也是软件测试的一部分。
1、HM10 encoder关于SAO的初始化操作 在编码开始之前,编码器将进行与SAO有关的一些初始化设置。如在TAppEncTop::encode()函数中调用TAppEncTop::xInitLibCfg()进行与config相关的设置: m_cTEncTop.
1、测试心理 上文中曾经提到过研发和测试在思路和观念上的一些矛盾。多数情况下,研发工程师并不精通软件测试的思路,因此可能会认为测试无非就是走一个流程,认为“软件测试就是证明软件不存在错误的过程”,或者“测试的目的在于证明软件能正确完成其功能”,或者“演示软件做了应该做的流程”。
1、定义 软件测试(QA)的定义无比简单:所谓软件测试,就是一个或者一系列过程,确保软件可以完成了该完成的功能,不执行不该有的操作。
1、SAO的意义 在图像中像素值剧烈变化的边界区,经过编码-解码重建之后通常会出现波纹状的失真现象,这种失真称作振铃效应。振铃效应产生的根本原因在于边界区高频分量在编码过程中丢失。
1、属性——property Objective-C的属性用于封装对象之中的数据,其作用同类的数据成员类似,但是所起到的作用远远大于普通的数据成员。
1、引言 Intel SSE 4指令集是当前使用广泛的汇编指令集,最初在45nm的Intel 64位处理器和AMD的K10处理器中提供。SSE4的含义是Streaming SIMD Extension 4,SIMD即单指令多数据技术(Single Instruction Multiple Data)。
1、汇编指令集 目前大部分的PC机采用的都是Intel或者AMD的CPU,其支持的多媒体汇编指令有: MMX:多媒体扩展指令(MultiMedia eXtention),该指令由Intel在1996年为Pentium处理器开发,包括了57条多媒体指令,可以i一次处理多个数据。
函数是组成C/C++程序的基本元素,是将一段执行某项功能的代码进行了封装的代码段。为了实现设计的功能,函数的功能正确性是首要的前提,但是仅仅是正确还不够,其设计的科学性和合理性也是影响函数使用的重要因素。
内存的管理是C/C++开发程序过程中的一个比较麻烦的问题。对于经验不是足够丰富的程序员来说,开发比较复杂的程序的时候几乎肯定会遇到内存管理方面的bug。
第五条:使用枚举类型表示状态和选项,可以使代码更加清晰,可读性更好。 枚举类型使用关键字enum定义,通常与typedef相结合,定义一组状态或选项: typedef enum CustomState { CustomStateNon...
1、为什么要进行傅里叶变换,其物理意义是什么? 傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。
第三条:多用字面量语法,少用等价的方法 这部分所描述的是创建foundation类的对象时的技巧。Foundation框架是iOS中至关重要的框架,iOS应用中大部分数据都可以用foundation类表示。
【本文参考微信公众号:“程序猿”,账号:imkuqin,原文链接】 1、空类: //NullClass.h #pragma once class CNullClass { }; 查看CNullClass实例的大小: int...
【同其他模块一样,HEVC标准文档中只实现了反量化过程,量化过程交由编码器实现。这样可使得编码器采用如自适应量化AQ、率失真优化量化RDOQ等更优的量化方法。
【变换和量化是整个视频编码技术系列中理论性和研究性较强的一部分,本文暂时不去研究变换的原理、推导过程等,只是调试一下在参考代码中对预测残差进行变换的实现过程。
3、像素块的帧内预测 为了有效地预测多种不同种类的内容,HEVC支持多种不同的预测方法。角度预测可以模拟多种不同方向的结构,而平面和DC模式适用于平滑和渐变区域。
【因工作需要,开始研究一下X265的基本使用方法。由于对HEVC的算法、概念的完全理解尚需时日,因此暂时只是考虑一下如何对x265进行下载、编译和测试方法,内部代码的实现未来再进行研究。
【前面N篇博文都讲了一些HEVC帧内预测的代码结构和简单的方法,但是尚未对整体的算法和实现做一个比较完整的描述。本篇借助参考文献《High Efficiency Video Coding (HEVC) -- Algorithms and Architectures》的相关章节的阅读笔记,对HEVC的帧内预测算法做一个比较完整的阐述。
计算机的工作方式可以归结为两种基本能力,即存储程序和自动地执行程序,前者靠存储器实现,后者靠CPU实现。计算机的工作原理即不断地从内存 中取出一条条指令放在CPU中运行。
该系列是《Effective Objective-C 2.0——编写高质量iOS与OS X代码的52个有效方法》的读书笔记。 第一条:了解Objective-C语言的起源 同C++类似,Objective-C也是C语言进行面相对象化的扩展。
1、进程内组件和进程外组件 使用dll实现组件程序,则客户长须在调用组件程序的服务时,需要将dll装进自身的进程,所以客户程序和组件运行于同一进程空间,此类组件称为进程内组件。
1、COM对象 在客户程序与组件交互的过程中,COM组件将以COM对象形式封装的实体提供给客户程序。与C++等面向对象语言中类的概念类似,COM对象也包含其成员属性和成员方法,前者反应COM对象的状态,后者是对象提供给外界的接口。
1、进程 所谓进程,可以认为是一个程序及其正在运行的过程。相对来说,程序是一个静态的概念,而进程是一个动态的概念,更加强调程序运行的过程和状态。一般一个进程至少要包含几个内容,即程序代码、程序处理的数据、CPU寄存器的值、堆和栈以及进程所占用的系统资源。
【我们知道,Directshow整体上是构建在COM之上的,也可以认为是COM在视频、流媒体领域的一种特定的应用和封装。如果只是为了开发High level的directshow应用,COM方面的只是其实并非必须;但如果涉及到filter层的自定义开发,那么研究COM的概念和基本原理是很有必要的。
1、操作系统的概念 当前的计算机以及智能手机等设备,没有操作系统是不现实的事情。包括PC机上常见的Windows、Mac OS X和Linux,手机上的iOS和Android都是拥有巨大影响力的操作系统的典范。
除了前述的多种具有特定用途的寄存器之外,8086的CPU中还存在一类特殊的寄存器,称为标识寄存器flag,其每一位可能用来存储特定的信息,主要有以下三类: (1)相关指令的某些执行结果; (2)为CPU执行相关指令提供依据; (3)控制CPU的相关工作方式。
CALL和RET指令常常用来实现子程序的设计。这两个指令同jmp、loop、jcxz等指令同属于转移指令。 1、ret和retf 转移指令的主要功能就是修改CS和IP或者只修改IP的内容。
可以修改IP或者同时修改CS和IP的指令统称为转移指令。转移指令控制CPU执行内存中某处的代码,其作用相当于C语言中的GOTO。在C语言中并不鼓励使用goto语句,但是在汇编语言中由于没有复杂的流程控制运算符,使用转移指令称为必然。
标题中所指的两个基本问题是:(1)处理的数据在什么地方?(2)要处理的数据有多长?要使得计算机正常工作,这两个问题必须给予说明,否则无法工作。 1、bx, si, di, bp 这四个寄存器用于内存寻址的规则有: (1)在8086中只有这四个寄存器可以用于[]中进行内存单元寻址。
1、基本概念 所谓单例,即某一个类始终只能返回一个实例,也可以理解为类本身就是一个实例。单例类通常适合作为某些保存全局应用信息的全局对象,以及部分耗费大量系统资源的重量级对象。
1、[bx+idata] 通常情况下,我们使用ds和[bx]指定内存中的一个内存单元。而[bx+idata]所表示的是一种更加灵活的方式来定位内存地址,其表示的是段地址为DS,偏移地址为(bx)+idata的内存位置。
【本文主要分为前后两部分,前半部分基本是Vivienne Sze、Madhukar BudagaviGary和J. Sullivan所编著的《High Efficiency Video Coding (HEVC) ——Algorithms and Architectures》的第三章前半部分的笔记,后半部分是在HM-10.0中对Intra预测时块分割相应的代码研究。
众所周知的是,我们所开发的应用程序需依赖于操作系统运行,因此应用程序所使用的内存空间必须是安全的,不能与操作系统和其他应用程序相重合。因此,应用程序所需要的空间应当通过操作系统申请。
了解了基本的Git概念之后,现在我们开始讲Git应用到实际的工作中来。通常比较常用的代码托管网站有Github和BitBucket等,二者基本功能类似,在细节上稍稍有点区别。
1、[bx] 在之前编写的汇编代码中,我们经常使用到[0]、[1]等标志,方括号中的数字表示某个偏移地址,该地址同段地址一起表示某个内存的位置。但是,在实际应用中存在一个问题,masm等编译器实际上不支持[n]这样的写法,在代码中的[1]、[2]实际上会被处理成1、2等数字型常量,而不是我们希望的偏移地址。
我们知道,不同对象之间通信的方法比较常用的有代理(delegate)、通知中心(NotificationCenter)等方法。Block则是另一种对象间通信的方法。
1、UIScrollView的基本概念 在iOS应用中,使用UIView类来显示一个视图。UIView只是最基本的视图类,单单靠UIView来方便地完成复杂应用开发是不可能的,因此需要多种更加强大的派生类来丰富UIKit的类库。
0、准备工作: 由于现在我们的操作系统通常都是win7或者win8,所以要运行masm需要做一些准备工作。这里只简单描述一下过程,详细的请搜索这篇文章《Win7(64位)下使用MASM和DEBUG方法》。
在前面的某篇博文中,我们简要介绍了如何使用Xcode进行简单的工程和代码管理的方法。实际上,Xcode自带的版本控制工具的功能并不是非常完善,而且使用体验同大部分主流的版本控制工具也有较大的差异。
上篇叙述了8086CPU的通用寄存器和代码寄存器的一些东西。仅仅这些是远远不够的,显而易见的一个原因是,如果CPU只是对自己内部的寄存器进行操作,不能同外部数据进行交互,那么将无法完成任何工作。
第31篇博文大体介绍了HEVC参考代码HM10的编码器结构,但仅仅停留在compressCU()以上的层次,并未对具体编码的结构做深入解析。在此篇博文中我们依据对视频YUV序列的帧内编码的流程,重新梳理HM编码器的代码结构。
近日某网盘对用户保存其中的部分私人视频进行篡改,使得这部分视频无论是在线或者下载后均无法播放。我们借着研究对应方法,修复被非法篡改的视频数据,恢复正常使用的机会,研究一下avi的数据格式。
在视频应用的开发中,经常会使用到几个结构体,如MPEG2VIDEOINFO和VIDEOINFOHEADER2等,用来表示视频播放中所需要的一些参数。
在一个典型的MVC结构中,Model部分负责保存目标数据,View部分主要负责实现数据的界面以及将数据显示出来,二者在Controller的操作下协同工作。
在帧内预测的过程中,获取临近的Prediction Unit的边缘数据作为当前PU的参考数据。数据获取完成后,并不一定会直接使用这些数据进行预测,而可能会先将这些预测数据进行一次滤波操作。