Archive

Archive for July, 2016

Vim 异步编译插件 vimmake

July 16th, 2016 1 comment

推荐下自己写的用了好几年的编程插件:vimmake ?完美支持 vim的异步模式:
GitHub – skywind3000/vimmake: Customize shell commands in vim

让用户自定义各种不同的编译或运行任务,并且在 Vim 中执行他们。类似 NotePad++的自定义 Commands 和 EditPlus/UltraEdit 的 ‘User Tool’ 或者 GEdit中的 External Tool 以及 TextMate 中的 Shell Command。完美支持 vim 7.4.1829 后已经稳定成熟的异步任务机制,不需要写任何 Vim Script 也可以很容易的体验到 vim 的异步任务机制,并且使用它来执行各种艰巨的编译任务,让你一边编辑代码,一边跑编译任务。

安装:拷贝 vimmake.vim 到你的 ~/.vim/plugin 或用 vundle 指向 skywind3000/vimmake .

简单使用:异步编译 & 运行 C/C++ 代码

首先每个 “用户自定义工具” 使用一个独立的 shell脚本来描述(Windows下是.cmd的批处理文件),我们将首先编写 vimmake可以使用的 gcc编译工具脚本, “~/.vim/vimmake.gcc”:

#! /bin/sh
gcc "$VIM_FILEPATH" -o "$VIM_FILEDIR/$VIM_FILENOEXT"

就这么短短的两行,当你把它设置成 0755的权限时,就可以在 Vim中通过下面语句运行了:

:VimTool gcc

命令 :VimTool {name} 命令会在 Vim里面直接调用 ~/.vim/ 目录下,名为 “vimmake.{name}” 的脚本来完成各种类似编译或者执行的任务,所以用:VimTool gcc 就可以运行前面定义的名为 vimmake.gcc 的工具脚本来编译当前的源代码了。

现在编辑 “~/.vim/” 下面名为 “vimmake.run” 的脚本,以便用 :VimTool run 来运行当前代码:

#! /bin/sh
"$VIM_FILEDIR/$VIM_FILENOEXT"

记得将 vimmake.run 的模式设置成 0755,如今有了两个可以直接在 Vim里通过 VimTool命令启动的工具(gcc 和 run),接下来我们需要设置 run 这个工具的模式为默认运行模式,而 gcc 为 quickfix模式(输出会被捕获并重定向到 quickfix窗口),现在打开 .vimrc 添加一行:

let g:vimmake_mode = { 'gcc':'quickfix', 'run':'normal' }

而如果我们能够使用到较新版本的 vim(7.4.1829或者更高),我们就可以使用异步方式在后台启动 gcc,并且将后台进程的输出实时重定向到界面下端的 quickfix 窗口:

let g:vimmake_mode = { 'gcc':'async', 'run':'normal' }

在这之后,将 ‘gcc’的运行模式设置成 ‘async’ 后,:VimTool gcc 就可以以异步的方式运行名为 vimmake.gcc 的脚本然后在后台执行编译任务了,就像传统 IDE编译任务一样。

以往使用 Vim 的 :make 之类的命令编译项目时,往往无法异步,编译任务一运行,你就无法编辑了,只有等到编译结束,才能返回编辑状态,大项目时,不得不另外开一个终端来进行编译,这是很痛苦的事情,有了异步任务以后,你能在同一个屏幕下编辑并且实时在 quickfix窗口查看编译的进度。

vimmake 可以让你在不需要掌握晦涩的 VimScript 和繁琐的异步编程接口的情况下,直接方便的使用vim 异步功能来完成各种长时间编译任务。同时为了加快你的:编译-编辑-编译 工作流的流畅度,我们需要配置一两个热键来调用 :VimTool 命令:

noremap <F7> :VimTool gcc<cr>
noremap <F5> :VimTool run<cr>
inoremap <F7> <ESC>:VimTool gcc<cr>
inoremap <F5> <ESC>:VimTool run<cr>

在 .vimrc里面加入上面的几行代码,你就可以方便的按 F7编译当前文件,F5运行之了。和GEdit
类似,VimTool命令在运行具体工具脚本前会设置若干环境变量来记录当前编辑的文件名,路径,当前vim工作目录等一系列信息,然后在工具脚本里面可以直接取出这些值来调用需要的外部工具链:
如上图,后台运行工具脚本进行编译,并且编译器的输出会被实时显示到下面的 quickfix窗口,选中错误的那行输出,会直接跳转:

Read more…

Categories: 随笔 Tags:

学习视频编解码知识需要哪些前置知识?

July 8th, 2016 No comments

如果要随便学学,便于日后使用那花两个星期买本书,配合网上文章就行了。

如果你想自己动手改 x264,为其添加一些你想要的东西,那么下面步骤你得耐心走完:

1: JPEG编码不但要学,还要自己实现,这是图像编码的基础,理解下yuv, dct, 量化,熵编码(不用参考 libjpeg,太庞大,建议参考 tinyjpeg.c,单文件)

2: MPEG2编码要学,现代编码器都是 block based 的,而 block based编码器的祖先就在MPEG2,理解下帧内编码,帧间预测,运动矢量,残差图等基础概念。具体代码可以看早期版本的 ffmpeg 的 avcodec,比如 mpeg12enc.c 代码也就1000多行,容易看,不过其中牵扯很多ffmpeg的内部数据结构,比如 picture, DCTELEM,各种 table,bitstream,vlc, swscale 等公共模块,缺点是文档少,优点是读了这些对你读其他 ffmpeg代码有帮助。

3: 自己实现一个类 MPEG2 编码器,最好自己从头实现个编码器,具体实现方式可以参考我的上面提到的 “视频编码技术简介”。

4: 参照 MPEG2的原理阅读 h.264的相关文章和书籍,了解和MPEG2的异同,比如先从intra入手,并且阅读 x264的早期版本代码,比如 2005年的版本,重点阅读 common 目录,基本的数据结构都在那里了,基本的图像,宏块,预测等都在那里了,阅读完以后阅读 encoder目录,了解程序的结构,2005版本的 x264是今天 x264的基础。

5: 阅读最新的 x264代码,并整理代码脉络,了解近年来引入的各种优化方法,然后 google, google, google …….

6: 愉快的修改 x264吧,比如增加搜索强度,修改预测范围,增加抗丢包特性,或者增加带内编码冗余,修改内部缓存策略,寻找降低编码延迟的方法,根据你的需求,修改,测试,修改,测试。。。。。。

7: 至于 MPEG4文件格式,可看可不看,一下午的事情。

参考阅读:

视频编码器原理简介

Categories: 编程技术 Tags:

如何禁止 Win7 强制更新到 Windows 10 ?

July 4th, 2016 No comments

岳父岳母,爹妈的 Windows 7 纷纷被自动升级成 Windows 10 各种问题(一台画面变成非全屏,解析度被莫名奇妙降低,占不满显示器、运行卡,另一台台式机无线网卡不能用,还有一台某炒股软件跑不起来,按win键弹出菜单时会顿一下)。

花费了我两个整天的时间帮他们降级,找了很多方法,网上大部分都不能对新版 Gwx起作用

终于,找到了并且永久性锁定自动升级的最直接方式了:

regedit:
HKEY_LOCAL_MACHINE 下面
SOFTWARE\Policies\Microsoft\Windows 下面新建项目(目录)Gwx
然后在
SOFTWARE\Policies\Microsoft\Windows\Gwx 下面新建 DWORD 值:
DisableGwx=1

好了,Windows 结扎手术完成,不用当心一不留神弄出个 Windows 10 来给大伙惹麻烦了。

补充:本来上次回家时间就短,好些事情没办,好些朋友没见,好了,微软一个强制升级,就把你锁家里了。

自己的事情也算小事了,爹妈平常和岳父母平日和我们聚少离多,也就爱炒个股看个基金寻找下乐趣,你把人家弄的用不了了,不好用了,老人家自己不会弄,又舍不得花钱请人修,只能眼巴巴花好几个月的时间等着你回去帮他们解决。这样的感受是很不好的,就像公园里两个大爷正高兴的下着棋,过来个顽皮小孩一把把老人的棋盘掀湖里去了,周围的人都会觉得小孩有些缺乏教养,没有公德心一般。

很多喜欢宠物的人为了不给大家添麻烦都倡导给自己的狗或猫做节育手术,真爱宠物就要对它负责,所以我们也本着对windows负责的态度对它做个结扎,防止它趁你不留神在外面闯祸,避免给大家添麻烦,对,公德心嘛。

Categories: 随笔 Tags:
Wordpress Social Share Plugin powered by Ultimatelysocial