建军's profiledino的共享空间PhotosBlogLists Tools Help

建军 张

Occupation
Location
Interests
No list items have been added yet.
March 25

悲惨世界

本文谨此纪念这段时间的悲惨生活。
信用卡爆了,工资卡掉了,人生的悲剧不过于此,如果再加上大牙松动吃饭不能下咽,嘴角生疮满嘴是泡而没有钱去就医,这样的生活又该怎么形容呢?
人生啊人生……
March 15

今日一别,不知何时才能相见

    繁忙的工作让我失去了与文字的接触,却只有心中的失落才让我再次唤醒。
    在这样一个城市的相遇是我们谁也没有想到的,即使在毕业之前充满的无数幻想,也没有猜到会是这样一个地方。而事实却真的是这样,在我加班几个夜晚之后,她空降到了这个城市,对于我们来说无比陌生的城市。
    见面之前总是非常地激动,可真正在地铁站见面的时候心里却异常恬静,记得在她的身边我总是这样的感觉。人生的长河在偶然之间让我们短短地相聚两年后又为着各自的命运而分离,刚浅尝社会这杯苦酒不到一年的我们也不能对人生发出多少叹息。在一些闲谈之时,我脑海里总是浮现着不久前的岁月片段,第一次见面带着她们找宿舍时我的青涩,在夜晚的华师漫步欣赏夜景时的安静,在她某个纪念日陪着逛街吃小吃的无耐。能在这个城市来回味这样的事情的确非常特别。
    一周很快过去,我的工作太忙了,我们也只能匆匆相见两面。在地铁站的分别最让我心酸,目送她走上地铁往一个方向驶去后,我却不得不坐上反方向的列车,人生的一段短暂相聚又再次分离背驰,分别的话语,也只能是“希望下次能够再见”,可是下次会是什么时候呢?
    我的心里也只有一句话反复着,今日一别,不知何时才能相见……
September 25

一兄弟发来的中秋贺词

中秋将至
凭榄远望
忽生苍茫之感
人生幸事
莫过邀三五知己 濒湖小酌
然人生漂泊
兄弟散于江湖
有心相聚
无力常缝
遥寄诸君 盼君安康
勿忘衷肠 
September 20

如何使VC在每次编译后自动增加其版本信息

这完全是我的英文翻译,为了那些和我一样英语别扭的技术员不再多受语言障碍之苦。
翻译不好请见谅,原文请见:http://support.microsoft.com/?id=237870
 
摘要:
Visual C++ 并不具备在每次编译后自动增加版本资源信息的能力,本文介绍一种方法来实现这一功能。
 
相信介绍:
你可以按照以下的步骤写一段程序来更改资源编辑文件(.rc)。rc文件是在VC的控制之下,VC在保存的时候才修改rc文件,此时才会影响到版本资源信息。下面描述的方法能够适用于所有的VC工程。下面举例说明。
 
建立一个MFC(.exe)的新工程,取名为"MyProject",该工程将产生一个MyProject.rc的资源文件,这个rc文件包含了一个名为MyProject.rc2的文件。.rc2文件是用户定义资源。请按以下步骤操作:
 
1、移除.rc文件的版本信息,将其放到.rc2之中。
    a.用文本编辑器分别打开.rc和.rc2文件(在RES文件夹中):在VC中文件菜单选择"Open",在弹出对话框的"Open as"中选择"text",然后选择.rc文件打开。
    b.在.rc中找到版本资源描述,类似于下面的信息:
///////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "Comments", "Sample Application\0"
            VALUE "CompanyName", "Microsoft Corp.\0"
            VALUE "FileDescription", "MyProject MFC Application\0"
            VALUE "FileVersion", "1, 0, 0, 1\0"
            VALUE "InternalName", "MyProject\0"
            VALUE "LegalCopyright", "Copyright (C) 1999\0"
            VALUE "OriginalFilename", "MyProject.EXE\0"
            VALUE "ProductName", "MyProject Application\0"
            VALUE "ProductVersion", "1, 0, 0, 1\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END
    c.将.rc文件的版本资源描述剪切,粘贴在.rc2的"Add manually edited resources here..."文字下方。具体每个直接代表什么意义,请查看MSDN的帮助文档。
 
2、分别替换FILEVERSION 和PRODUCTVERSION 的值为宏变量FILEVER 和PRODUCTVER。类似的,替换字符串变量FileVersion 和ProductVersion 的值为宏变量STRFILEVER 和STRPRODUCTVER。
 
3、在VS_VERSION_INFO 资源声明前添加"#include VersionNo.h"。此时.rc2的版本信息应该为如下:
///////////////////////////////////////////////////////////////////////
//
// Version
//
#include "VersionNo.h"
VS_VERSION_INFO VERSIONINFO
FILEVERSION FILEVER
PRODUCTVERSION PRODUCTVER
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "Comments", "Sample Application\0"
            VALUE "CompanyName", "Microsoft Corp.\0"
            VALUE "FileDescription", "MyProject MFC Application\0"
            VALUE "FileVersion", STRFILEVER
            VALUE "InternalName", "MyProject\0"
            VALUE "LegalCopyright", "Copyright (C) 1997\0"
            VALUE "OriginalFilename", "MyProject.EXE\0"
            VALUE "ProductName", "MyProject Application\0"
            VALUE "ProductVersion", STRPRODUCTVER
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END
4、在你的工程下建立一个叫做"VersionNo.h"的头文件,文件包含内容如下:
#define FILEVER        1,0,0,1
#define PRODUCTVER     1,0,0,1
#define STRFILEVER     "1, 0, 0, 1\0"
#define STRPRODUCTVER  "1, 0, 0, 1\0"
 
提示:在最后一行添加换行和回车符号
 
5、VersionNo.h里面的内容将会被Visual Basic Script 宏修改。下面介绍的这种宏处理Visual C++ BuildFinish事件,因此在它编译完成前一定不要退出。不论什么时候这个VB脚本语言被调用,它都会在保存退出的时候固定增幅地增加头文件的版本号。这样就能实现版本号的自动增加。
 
安装和使用VB脚本语言,按照如下操作:
 
    a.用VC打开一个现有的DSM (macro)文件或者新建一个。如果是新建,Vc中点击"New",在文件菜单中选择"Macro File "。
 
    b.复制粘贴以下的语句(an empty DSM file cannot be installed in Visual C++; the next step explains installing)
Function GetProjectDir(FullName)

'VC++ doesn't provide any method for getting the path of the active project
'See the VB Script reference for more information on the VB Script functions
'used in this function

Dim proj_path
proj_path = Split(StrReverse(FullName),"\",-1,1)

Dim count
count = UBound(proj_path)

Dim full_path
full_path = ""
Dim i

for i = 1 to count
full_path = full_path & "\" & proj_path(i)
next

GetProjectDir = StrReverse(full_path)

End Function


Sub ReplaceText(selection, count, incrementby)

'selection represents the TextSelection object
'count represents the position of the version number to be incremented
'incrementby represents a number that will be added to the existing version number

selection.WordRight dsMove, count
selection.WordRight dsExtend, 1
Dim str
str = selection.Text
str = str + incrementby

selection.Text = str

End Sub


Sub Application_BuildFinish(numError, numWarning)

'This event will be triggered after every build of a project
'You can check numError and/or numWarning to determine if you want to continue
'If numError <> 0 Then
    'exit sub
'Obtain the full path of the active project
Dim full_path
full_path = GetProjectDir(ActiveProject.FullName)

full_path = full_path & "versionno.h"

'Open the VersionNo.h file
Documents.Open full_path

'Obtain the TextSelection object
Dim selection
set selection = ActiveDocument.Selection
selection.StartOfDocument

'Increment the version information
ReplaceText selection, 9, 1
selection.LineDown
selection.StartOfLine
ReplaceText selection, 9, 1
selection.LineDown
selection.StartOfLine
ReplaceText selection, 10, 1
selection.LineDown
selection.StartOfLine
ReplaceText selection, 10, 1

ActiveDocument.Save
ActiveDocument.Close

End Sub
提示:以上代码仅是示例,具体应该根据实际情况修改
 
    c.如果DSM没有被安装过,则按如下安装:在"Tool"菜单选择Customize ,点击Add-in and Macro Files 标签,浏览选择DSM文件,并选择关闭。
 
6、编译MyProject.exe,编译完成后查看VersionNo.h文件,它将变成以下内容:
#define FILEVER        1,0,0,2
#define PRODUCTVER     1,0,0,2
#define STRFILEVER     "1, 0, 0, 2\0"
#define STRPRODUCTVER  "1, 0, 0, 2\0"
 
如果再次编译,版本信息会再次增加。如果编译错误,在早期的宏描述中做一些更改预防版本号增加。
September 17

善意的谎言

昨天中午陪着小刘去拉头发。我知道这将是一个难熬的下午,所以进了理发店我就早早跑到一个角落坐起翻着买的报纸回味中国女足被巴西羞辱的场景,什么发型,什么价位都让她自己去决定吧,我是最不喜欢听那些理发师对着你甜言蜜语,又是赞扬又是找缺点,想尽各种手段让你多掏钱。
刚回味到那个韩傻丢的第三个球(第一场打丹麦的时候我就非常怀疑她会做出这样的举动来取悦观众),小刘屁颠屁颠地跑了过来,“老公,我要用沙宣!”看着她的满脸激动,我当然不能说任何的意见。“要得,用沙宣头发更柔顺啥”。她幸福地又走回理发师边上做起准备工作,我也继续着我的痛苦回味。
把报纸上的所有广告仔细浏览了一遍,再回顾了两遍韩傻丢球的经典动作之后,我站起身来去巡视一下小刘的工作进度。她在上发膏,理发师一边弄一边吹嘘着这个发膏的效果多好,颜色好看,还有淡淡香气喔。我苦笑了一下,估计这头发没有5个小时是弄不好的了。我无聊地拿起了装发膏的包装盒,果然是VS,和洗发水一样的血红色包装,大大的VS在上面特别显眼。就像刚才看广告一样,我仔细地看着,唔,不对!这上面赫然印着两个字:“莎萱”!我纳闷了,什么时候沙宣换商标了?多加了俩草头?再仔细看看生产地,广东东莞某镇某村!我晕,我知道东莞是一个灰常发达的地方,但沙宣怎么也不可能把厂址放在那里吧?我懂了,小刘被那个美发师给蒙鸟!
我正准备告诉小刘,但转过去一看,她正买脸笑容地看着我“沙宣的,感觉真的还不错,呵呵”。我可无语了,小刘啊小刘,看来对社会上的一套,你确实还是太太太单纯了。我如果现在告诉她这是冒牌货,她一定会马上把这个理发店弄翻天,更重要的是,那美好快乐的心情不知道要多久才能补回来。我能告诉她这是冒牌的吗?我决定做一个善意的谎言,装着不知道的样子,买脸堆笑地赞扬着她。她就是那么个小孩子,她需要的是做头发的感觉,具体用什么发膏重要么?呵呵,至少在我看来,让她幸福才是最重要的。
小刘不会用MSN,所以我才把这件事给写在space上,我打算就让她一直被这个发型而收获自信吧。她还刚读研究生,一切都发展得还不错,真的希望以后的她能永远保持自己的单纯,做一个快乐的女神。
September 04

DLL在Release下的调试方法

    在做一个DLL的开发时想与一个测试程序联合调试,而且不用把工程与测试程序联合起来。遇到了各种错误搞得我心中很是不爽,出现了“one or more breakpoints cannot be set and have been disabled”的错误信息让我花了好长时间终于解决,趁现在有空的时候把解决的方法记录下来,以供以后需要的朋友参考。
    有很多人也许认为在Release状态下VC是不能进行调试的,其实并不是这样。对于DLL工程的Release调试方法如下:
    1、如果该DLL还静态调用了其它的DLL,则进行第二步,否则去第三步;
    2、进入Project Setting -> Debug,在Category中选择Additional DLLs,把本工程需要静态调用的DLL添加到下面的列表框中;
    3、进入Project Setting -> C/C++,在Debug info中选择Program Database;Optimizations中选择即使是Maximize Speed也没有关系,选择Default也可以;
    4、进入Project Setting -> Link,在Category中选择Debug,选中Debug info 复选框和Microsoft format;
    5、ASSERT宏在发行版本中不起作用,而应该用VERIFY来进行发行版的调试。如果发行版本运行有问题,可以先禁止所有代码优化再进行调试。
August 07

[转]H.264 picture parameter sets成员值含义

picture parameter sets

1. pic_parameter_set_id
pic_parameter_set_id指明了在切片头中对应的某个psp.pic_parameter_set_id的值应该在0到255,包括0和255

2. seq_parameter_set_id
set_parameter_set_id表示激活的sps.seq_parameter_set_id应该取值在0到31之间,包括边界值.

3. entropy_coding_mode_flag
entropy_coding_mode_flag决定了在解码方法上使用的方法.
如果entropy_coding_mode_flag为0的话,就使用Exp-Golomb编码方法
如果entropy_coding_mode_flag为1的话,就使用CABAC方法.

4. pic_order_present_flag
pic_order_present_flag等于1表示在切片头中图像顺序值存在,pic_order_present_flag为0表示切片头中的图像顺序值不存在

5. num_slice_groups_minus1
num_slice_groups_minus1加上1表示一个图像中的切片组数目.当num_slice_groups_minus1为0时,图象所有的切片属于同一组.

6. slice_group_map_type
slice_group_map_type表示从切片组单到切片组的映射方法.slice_group_map_type的值可以取0到6.
slice_group_map_type=0表示插值切片组.
slice_group_map_type=1表示分散切片组映射
slice_group_map_type=2表示一个或多个"前景"切片组和一个"剩余"切片组.
slice_group_map_type=3,4,5时,表示变换切片组.当num_slice_groups_minus1不不1时,slice_group_map_type应该不为3,4,5.
slice_group_map_type=6时,表示从外部对对于每个切片组单元进行外部的切片赋值.
如果frame_mbs_only_flag为0而且mb_adaptive_frame_field_flag为1且编码图像是一帧的话,切片组映射单元是宏块对
如果frame_mbs_only_flag为1而且mb_adaptive_frame_field_flag为1且编码图像是一场的话,切片组映射单元是宏块
其他的情况下,切片组单元是两个宏块,它们在一帧宏块对中是垂直连续的

7.run_length_minus1[i]被用来赋给在光栅扫描中第i个切片组指明连续切片组单元的数量.run_length_minus1[i]的取值应为0到PicSizeInMapUnits-1.

top_left[ i ] and bottom_right[ i ] specify the top-left and bottom-right corners of a rectangle, respectively. top_left[ i ] and bottom_right[ i ] are slice group map unit positions in a raster scan of the picture for the slice group map units. For each rectangle i, all of the following constraints shall be obeyed by the values of the syntax elements top_left[ i ] and bottom_right[ i ]

8.top_left[i] and bottom_right[i]
top_left[i] and bottom_right[i]指出了矩形区左上角和右下角.top_left[i] and bottom_right[i]是对于一个切片组的图像的光栅扫描位置.对于每个矩形i,top_left[i] and bottom_right[i]应该满足所有的以下的约束:

a) top_left[i]应该比bottom_right[i]小或等于,bottom_right[i]应该比PicSizeInMapUnits的值小.
b) (top_left[i]%PicWidthInMbs)应该比(bottom_right[i]%PicWidthInMbs)的值小或等于.

9. slice_group_change_direction_flag在slice_group_map_type为3,4,5时跟slice_group_map_type一块儿来提取生成映射类型,

10.slice_group_change_rate_minus1
slice_group_change_rate_minus1用来指明SliceGroupChangeRate变量的值.SliceGroupChangeRate指出当切片组的大小对于每个图像来说都不同的时候,对切片组数目的运算的乘数.slice_group_change_rate_minus1取值范围为0到PicSizeInMapUnits-1:
SliceGroupChangeRate = slice_group_change_rate_minus1+1;

11. pic_size_in_map_units_minus1
pic_size_in_map_units_minus1用来指明在一个图象中使用的切片组映射单元的数目.pic_size_in_map_units_minus1应该等于PicSizeInMapUnits-1.

12. slice_group_id[i]
slice_group_id[i]说明了切片组单元中由光栅扫描顺序指定的第i个切片组.slice_group_id[i]应该取0到num_slice_groups_minus1.

13. num_ref_idx_l0_active_minus1指明了参考图像列表0中的最大参考索引值,它被用来解码图像的每一个切片,列表0在num_ref_idx_active_override_flag值为0的时候被使用.当MbaffFrameFlag值为1时,num_ref_idx_l0_active_minus1是解码帧宏块的最大索引值,而2 * num_ref_idx_10_active_minus1 + 1是解码场宏块的最大索引值.num_ref_idx_l0_active_minus1的取值为0到31.

14. num_ref_idx_l1_active_minus1与num_ref_idx_l0_active_minus1有相同的语义,只不过它是针对列表1来说的.

15.weighted_pred_flag
weighted_pred_flag=0表示加权预测在P和SP切片中没有被使用
weighted_pred_flag=1表示加权预测在P和SP切片中有使用.

16. weighted_bipred_idc
weighted_bipred_idc=0表示默认的加权预测被应用到B切片中.
weighted_bipred_idc=1表示外部的加权预测被应用到B切片中.
weighted_bipred_idc=2表示内部的加权预测被应用到B切片中.
weighted_bipred_idc的取值为0,1,2.

17.pic_init_qp_minus26指出了对于每个切片来说的SliceQPY的初始值减26.初始值在切片层中当非0的slice_qp_delta被解码后时改变,在非0的mb_qp_delta值被在宏块层解码时再次被改变.pic_init_qp_minus26应该取-26到+25.

18. pic_init_qs_minus26
pic_init_qs_minus26指出了对于SP或SI切片中的SliceQSY的被始值减26.这个初始值在切片层中当一个非0的slice_qs_delta被解码的时候被修改.pic_init_qs_minus26的取值为-26到25.

19.chroma_qp_index_offset
chroma_qp_index_offset表示在查QPC表时,对于QPY和QSY应该加上的偏移量.chroma_qp_index_offset取值为-12到12

20. deblocking_filter_control_present_flag
deblocking_filter_control_present_flag=1表示在切片头处用来控制解块滤波的特征值是存在的.
deblocking_filter_control_present_flag=0表示在切片头处用来控制解块滤波的特征值是不存在的.

21. constrained_intra_pred_flag
constrained_intra_pred_flag=0表示在帧内预测的时候允许剩余数据和邻近宏块解码采样.
constrained_intra_pred_flag=1表示在受限的帧内预测,对宏块预测中使用帧内宏块预测模式只使用剩余数据和从I和SI宏块类型中的解码采样值.


22. redundant_pic_cnt_present_flag
redundant_pic_cnt_present_flag=0表示redundant_pic_cnt在切片头中,数据分区B和数据分区C中不存在.
redundant_pic_cnt_present_flag=1表示redundant_pic_cnt在所有切片头中,数据分区B和数据分区C中存在.
 

 
Photo 1 of 3
More albums (1)