跨平台的INI处理源代码
#define INIFILE_H
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#ifndef OWP_DONT_DEF_FALSE
#ifndef FALSE
#define FALSE 0
#endif
#endif
#ifndef OWP_DONT_DEF_TRUE
#ifndef TRUE
#define TRUE 1
#endif
#endif
#ifndef OWP_DONT_DEF_BOOL
#ifndef BOOL
#define BOOL unsigned int
#endif
#endif
#ifndef OWP_DONT_DEF_CCHR
#ifndef CCHR
#define CCHR const char
#endif
#endif
#ifndef OWP_DONT_DEF_UCHR
#ifndef UCHR
#define UCHR unsigned char
#endif
#endif
#ifndef OWP_DONT_DEF_UCCHR
#ifndef UCCHR
#define UCCHR const unsigned char
#endif
#endif
#ifndef OWP_DONT_DEF_UINT
#ifndef UINT
#define UINT unsigned int
#endif
#endif
#ifndef OWP_DONT_DEF_WORD
#ifndef WORD
#define WORD unsigned short
#endif
#endif
#ifdef LINUX /* Remove CR, on unix systems. */
#define INI_REMOVE_CR
#define DONT_HAVE_STRUPR
#endif
#define tpNULL 0
#define tpSECTION 1
#define tpKEYVALUE 2
#define tpCOMMENT 3
struct ENTRY
{
char Type;
char *pText;
struct ENTRY *pPrev;
...
阅读全文...
硬盘录像机系列文档之三:框架
这一篇的主要内容是描述硬盘录像机的内部框架结构,建立基本的鸟瞰图。说到框架,就不能不对硬盘录像机做一个定义。
硬盘录像机的定义:以视频为中心,结合各种周边软硬件,以监控为目的的系统。
视频的定义很宽泛,包括专业摄像头/usb摄像头/DV/电视卡/web摄像头等设备采集的画面、视频片断、网络视频等。所有的目的就是一个,获取由多幅静态画面组成的动画视频。但是仅仅采集到视频是不够的,必需显示出来才能被人所认知,所以就需要视频显示的功能。同时视频具有一些基本的控制功能,比如亮度、对比度、色度、饱和度、分辨率等。显示和控制是最基本的要求,另外存储和录像播放也是必不可少,同时,系统中还会包括一些附属设备和功能,比如云台控制、开关报警、音频录制、远程观看和控制等。把以上这些功能组合起来,就构成了一套完整的硬盘录像机。
从系统架构上看,一套完整的硬盘录像机包括以下几个方面:
1.原始数据采集和控制。
对于视频采集设备,目前一般分为四种。一种是以BT848/878或7143芯片为核心的软采集卡,主要功能是通过AD转换将模拟信号转换为数字信号,再通过驱动送往应用层。接口有三种方式,一种是比较“原始”的连接库(DLL/lib)方式,通过函数进行调用来获得每一帧画面,这种方式比较原始,但是效率是最高的;第二种是通过标准的系统调用来提供数据,比如vfw(video for windows)和v4l(video for linux),这种方式最先起源于usb摄像头,目的是提供统一的接口以方便用户调用,但是面对越来越多的视频采集设备和日益发展的硬件水平,其接口逐渐变得不那么适合,对于windows而言,正在逐步淘汰vfw,而在linux里,v4l也进化到了v2版本;第三种是windows独有的方式:directshow,复杂,强大,效率相对要低一些,开发比较困难。软卡的优点是数据处理方式很灵活,可以跟随软硬件的不断发展而进化,缺点是在目前的硬件水平下,多路同时处理比较受限,主要表现在多路压缩时占用的CPU过高和PCI带宽不够,但随着CPU的不断进步和PCI-X的逐步实现,这些都是可以解决的。
第二种采集设备是以软卡机制为前端,以dsp芯片为核心的硬采集卡。主要框架是...
阅读全文...
硬盘录像机系列文档之二:开篇
http://www.heybrain.com首发,如有转载,请务必保留网站连接。
90年左右,第一批涉足视频监控的企业开始在国内出现,比如北京的行者等,这个阶段由于硬件的价格昂贵和硬件能力的约束,特别是软件开发上的约束,很多东西无法实现,所以这阶段,视频监控还是以模拟为主,就是架设好摄像头,再将视频线、云台控制线等连接到控制机房,机房内放置对应的监视器,其实就是电视机的改装体,甚至在一些地方,就是直接用老式的黑白电视机来代替。然后将视频头接入监视器,云台控制线接入云台控制器。这时的云台控制器大多直接从国外进口,其包含的技术含量并不高,但物以稀为贵,价格还是很高的。某些场合下并不需要云台控制,所以只需监视器和录像机即可工作。用录像带录制有一些天生存在的问题,比如时间不长,保存困难。为了有更长的录制时间,制造商们制造出了超常的录像带,尺寸大,而且搬运的时候很费力气。即便如此,一卷录像带也不过能录制2个小时的影像,就是说每隔2个小时就需要更换一次录像带。由于录像带使用的是感光方式的光学胶卷,所以要长时间保存就对环境有比较高的要求,而且由于尺寸比较大,造成保存空间比较大。同时,由于录像带不可中断的特点,若要临时查看现场录像,只能将正在录制的录像带中断,之后这卷录像带上还未录制的部分就不好利用了,一般只能报废,从而产生意外的浪费。
不管怎样,模拟的监控系统还是满足了绝大多数的需求,可以很好的工作。说句题外话,我觉得国内的开发人员都有一个通用的问题,就是对美工过度追求,甚至影响到功能的实现。其实大多数的需求里,实用是第一位的,简单而且符合要求的软件才是客户需要的,漂亮和华丽的外观都可以在后期改善,而不应该一开始就对其进行考虑。
从2000 年开始,软硬件的发展一日千里,相关技术日益成熟,如视频压缩、显卡的硬件加速、高速CPU等,很多模拟技术在数字化技术面前变得很容易实现,于是数字的监控系统开始发轫和发展。这阶段开始做监控系统的公司大多活的很滋润,因为竞争少,市场又十分巨大。全中国有那么多的银行营业所,每个营业所都要更新监控系统,而且是硬性规定。但是好景不长,由于利益关系,在一两年内,很多公司开始涉足这个行业,而且为了抢占市场,都互相打压价格,造成市场的分裂和混乱,同时利润空间却越来越小。此阶段可谓监控行业的战国时期,群雄逐鹿,天下大乱。
所谓分久必和,经过一段时间的混乱,现在的行业现状终于开始呈现秩序和分化。目前的现状就是能者居之,要么软件做的好,要么硬件研究的深。但是时间尚短,还需要一段时间的观察和思考才能有定论。
无论如何,这个行业的技术含量和利益深度还是有挖掘潜力的。特别是今年中央扩大了监控的适用范围,会造成一段时间内的需求上升,但是产品的质量也越来越成为占领市场的杀手锏。
硬盘录像机系列文档之一:前言
说明:这是几年前写的,现在看来还算有点意义。加点补充,在此(http://www.heybrain.com)首发,如有转载,请务必保留原始网站连接。
前言:
经过几年的开发,对硬盘录像机产生了一些厌倦,但是有些东西还是值得纪录的,所以就写了这个技术整理。目的是为了记录一些曾经的经验和教训,某些不清楚的部分不会抄一些文章来充数,也不会为了让文字看起来比较丰满而作过多的资料调查,所以能阅读这个文档的对象应该有一些起码的知识。
整个文档用从全局到细节,再返回全局的方式来写,先对整体设计、环境、行业现状进行描述,列举一些应该深入的方向,然后进行详细的叙述,最后再对整体进行一次勾勒,让自己,也让阅读者对硬盘录像机的历史和发展有一个基本的认识。
因为只是个人写作,不一定会有计划,写到哪里只能是看情况。
2006-05-18 17:43
跨平台的移动鼠标代码
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#ifdef WIN32
#include < windows.h >
#else
#include < unistd.h >
#include < X11/X.h >
#include < X11/Xlib.h >
#endif
int main(int argc, char* argv[])
{
char sx[10], sy[10];
int x, y;
if ( argc < 3 ) return 0;
strcpy(sx, argv[1]);
strcpy(sy, argv[2]);
x = atoi(sx);
y = atoi(sy);
#ifdef WIN32
SetCursorPos(x, y);
#else
Display *dpy;
Window rootwindow;
dpy = XOpenDisplay(NULL);
if ( ! dpy ) {
printf("Couldn't open Xdisplay.\n");
exit(1);
}
rootwindow = DefaultRootWindow(dpy);
XWarpPointer(dpy, rootwindow, rootwindow, 0, 0, 0, 0, x, y);
XCloseDisplay(dpy);
#endif
return 0;
}
改编自fltk,添加了linux平台下的Sleep实现,只支持Windows和Linux,分别用vc和gcc编译,代码如下:
| 1 | //threads.h, LGPL |
| 2 | |
| 3 | #ifndef Threads_H |
| 4 | #define Threads_H |
| 5 | |
| 6 | #ifdef WIN32 |
| 7 | |
| 8 | #include < windows.h > |
| 9 | #include < process.h > |
| 10 | |
| 11 | typedef unsigned long Fl_Thread; |
| 12 | |
| 13 | static int fl_create_thread(Fl_Thread& t, void *(*f) (void *), void* p) |
| 14 | { |
| 15 | return t = (Fl_Thread)_beginthread((void( __cdecl * )( void * ))f, 0, p); |
| 16 | } |
| 17 | |
| 18 | #else |
| 19 | |
| 20 | // Use POSIX threading... |
| 21 | #include < pthread.h > |
| 22 | #include < unistd.h > |
| 23 | |
| 24 | typedef pthread_t Fl_Thread; |
| 25 | |
| 26 | static int fl_create_thread(Fl_Thread& t, void *(*f) (void *), void* p) |
| 27 | { |
| 28 | return pthread_create((pthread_t*)&t, 0, f, p); |
| 29 | } |
| 30 | |
| 31 | static void Sleep(unsigned long dwMilliseconds) |
| 32 | { |
| 33 | usleep(dwMilliseconds * 1000); |
| 34 | } |
| 35 | |
| 36 | #endif |
| 37 | |
| 38 | #endif // !Threads_h |
使用示例:
| 1 | #include "thread.h" |
| 2 | ... |
| 3 | |
| 4 | static Fl_Thread m_thread; // define |
| 5 | ... |
| 6 | |
| 7 | // thread create |
| 8 | fl_create_thread(m_thread, thread_fun, 0); |
| 9 | ... |
| 10 | |
| 11 | static void* thread_fun(void *p) |
| 12 | { |
| 13 | while (1) { |
| 14 | ... |
| 15 | } |
| 16 | |
| 17 | return 0; |
| 18 | } |
从编译Linux kernel说开来
编译内核的概念是linux最帅的地方,windows是不会提供操作系统的源代码的,而linux则不然,操作系统的源代码全部都是公开的。
对于发行版而言,比如rh9,debian,suse等,都提供编译好的kernel供用户使用,但是这样的kernel未必是用户需要的,这时就可以自
己对 kernel的源代码进行编译,然后替换掉原来的kernel。
其实编译kernel并不恐怖,只是一件很简单的事情,就几条
指令而已。/usr/src/linnux是kernel源代码常用的放置目录,进入此目录,执行make
menuconfig,会出来一个图形界面,里面是kernel的各种配置和选项,把自己喜欢的驱动和配置选上,不需要的去除即可。然后make
dep,这是检查新的配置是否正确和做一些初始化工作。然后就是make
bzImage,这是真正开始编译kernel,bzImage是编译后的kernel文件名,可以为任意名字,只是一般会以bzImage、
zImage或vmlinuz之类为名。如果编译成功会生成一个bzImage文件,这就是kernel了。系统启动最主要的就是调用这个文件,里面包括
了文件系统、硬件驱动、网络基础、内存管理、进程管理等,在/boot下面有一个bzImage或者vmlinuz之类的文件就是原有的kernel,只
要把编译后的kernel文件(bzImage)替换掉就换成新的kernel了,或者用新名字复制到/boot下,再将grub或lilo的配置文件修
改一下,下次启动系统的时候即可使用新的kernel。下面是make
modules,这是编译驱动,或者说叫模块,在linux下驱动可以和kernel编译在一起,也可以编译成单独的模块文件,如果是第一种,
kernel启动的时候就会自动尝试载入驱动,第二种则是需要的时候手工加载驱动,也可以手动卸载。这是windows没有的功能,比如显卡的驱动在
windows下不重新启动系统是无法更新的,但在linux下却可以。比如对显卡做升级动作的时候其实就是在编译module,并卸载旧驱动,加载新驱
动,整个步骤无需重启系统。最后一步,就是make
modules_install,这个步骤是在/lib/modules下面生成一个按照kernel版本号为格式的目录,再将编译好的modules复
制进去。kernel启动的时候会通过这样的路径搜索modules文件,类似windows的system32目录。
写了这么多,
很多没玩过linux的人看了会很迷糊,但了解一些相关认识还是很有趣的,因为这才是linux好玩的地方,一个随便捏来捏去的操作系统,可以满足某些人
士的变态心理-_-# windows可以运行的硬件平台很有限,因为不公开,而且尺寸也很大,linux却因为可以自己编译,所以支持几乎所有的硬件平
台,x86,cs51,avr,pda,手机,alpha,大型机等等。同时尺寸还很小,一般编译一个可以运行到shell的系统,只要4、5M的尺寸就
可以搞定。加一个x-window也就30M左右,这在windows是不可想象的。这都是kernel公开,可以手动编译的好处和乐趣....
2006-05-10 20:55 (根据聊天纪录修改)
老文档,存档(2003年07月12日 10:23 PM)
========================================================================
学习软件开发是一个非常艰苦的过程,入门不是非常困难,但是要步入一定境界,的确是很困难的,甚至需要天赋和机遇。天赋对于软件开发来说,最重要的可能是
一些在中国人来看很简单的事情,那就是朦胧美、境界、顿悟等等和这些词相关的那种味道。而机遇就是有好的经验有好的引路人有好的环境好的书籍等等,讲的简
单点就是有机会去接触前人的思想,软件开发,最重要的不是API的使用技巧,不是framework的使用,不是数据库的原理,不是数据结构,那是什么?
是设计思想!为什么这么写?为什么这样架构?为什么如此考虑?这都是设计思想的作用。那么所谓的设计思想从什么地方来的呢?那就是前面讲的天赋和机遇了,
天赋是没有办法的事情,机遇是可以追求的,因为只要努力,机遇就会变成手里的玩具。
后面就是我从几年的经历中觉得值得看值得思考的书籍和问题
设计模式:绝对的好书,绝对难懂的书,现在好像没有人不知道这本书,没有人没看过这本书,但是很好有人敢说明白所有模式的含义和用处,那么这本有没有必要看呢?有!有深度才会难懂。
JAVA与模式:这本书和设计模式的组合可能是就是中文里的倚天剑和屠龙刀了。两本书一起看,绝对是对头脑的激荡。
JAVA:什么具体的书就不说了,因为好书很多,学JAVA的目的是为了看前面的<JAVA与模式>:)
C++、Object Pascal、Python、Java、smalltalk有什么异同?如果都用OOP来编码,有什么区别?
事件在各种语言中是如何实现的?
Thread是如何实现的?如何使用才能达到最大的功效?
在一个不安全的网络中,如何安全的传送数据?比如用UDP传送不能有错误数据。
如果你本身的专业不是计算机,那么正好,请比较你的专业和计算机专业的不同之处。
为什么计算机行业没有大批量的标准?如果让你来制定,你会制定什么?如何制定?如何执行?
软件是什么?
软件的目的是什么?
学一点手语,想想用手说话和用嘴巴说话有什么不同?
生活中的事情是否会触发一些软件开发的感想?
尝试用一个星期去思考一个很难的问题,废寝忘食的想
软件应该从什么地方下手?构架?实现?细节?语言?环境?、、、、、、
如果要开发一个跨语言(C、C++、Object Pascal、VB、python、ASP、perl)跨平台(Windows,Linux,MACOS)跨网络(Lan,Wan)跨语言界面(中文、英文、阿拉伯文等)的系统,如何做?
你有多久没有仰望星空了?
开发是否成了你生活的唯一?你向往的是一种什么样的生活?
今天从网上下载了这个老片子,看了后,似乎找不到当初的感觉了,一是配音居然是粤语,二是忽然发现巩阿姨原来这么成熟的,一点都配不上韩冬儿这个唯美的名字。唯一有感觉的就只剩下主题歌了:焚心以火。
焚身以火让火烧熔我
燃烧我心喷出爱的颂歌
奋不顾身投进爱的红火
我不愿意让黄土地埋了我
让我写下诗
让千生都知道有个我
让万世都知道有个你
共享福祸
焚心以火烫上爱的深烙
燃烧的心黄土地埋不了我
爱情也许可以延续三千年,但生活的重点依然是柴米油盐酱醋茶。蒙天放醒来后,注定不能适应当时的生活,而韩冬儿也不 再是三千年前的那个妙人,最好的结局只能是凄惨收场。如果用王子公主的套路想象一下,基本上只会一塌糊涂,那样就无法成就一部完整的影片了。影片最后二人 四目相对,一边是痴情无奈,一边是过眼云烟,这就是残酷而真实的现实,无法抗拒的现实。感情算的了什么,在现实的冲击下,能留下记忆就已很好,挽留的结局 就是一无所有,放弃的结局就是空留回忆。
仔细想想,所谓感人的电影大多是以分手或者死亡为主题,为什么?其实很简单,只有这样的结局才能留下最美的一瞬间,将可能的生活细节掩盖在刹那芳华之中。但真正的生活就是如此的平铺直叙、简单平实。感动于美好的感情瞬间,直面生活的永恒持续,才是良好的生活态度。
2006-05-03 00:34
(转)最后一个支持vc6的directx sdk版本
DirectX v9.0c SDK (summer 2004)版本不再支持 VC++ 6 了! 这个问题搞了我几日!!!
如果想支持VC6就用(DirectX v9.0b SDK)吧.

