分类 随笔 下的文章

开发编程语言(七):运行execute.c


起步

初步的可运行的已经在github上了:https://github.com/OriginUnion/origin,发现有bug可以留言,供学习而已。

上一篇已经介绍了语法分析并且创建了我们所需要的数据结构,运行函数从main.cORG_interpret(interpreter);开始。

入口运行函数

运行函数的结构如下:

void ORG_interpret(ORG_Interpreter *inter) {
    inter->execute_storage = MEM_open_storage(0);
    org_add_std_fp(inter);
    org_execute_statement_list(inter, NULL, inter->statement_list);
}

第一句创建一个存储器,第二句注册全局变量,STDIN STDOUT STDERR将他们与c语言的标准输入输出进行关联;第三句中,将解析的语句存在inter->statement_list,进行逐句执行。


一些面试笔试题_2017校招


1.音视频不同步的原因:

一般是客户端的问题。

由于音视频包都会带上时间戳,出现不同步的根本原因是客户端取出当前数据包解码放入缓冲队列,进行渲染时(在这做同步)不能从缓冲队列中同时找到当前时间戳的视频解码数据和音频解码数据,所以只能先取其中一个拿个渲染。

(注:拿去渲染后,如果时间戳同步,渲染一般不会出现不同步的情况,硬件处理相对成熟);

渲染不同步,可以说是缓冲队列设置太小,没有考虑网络不好数据包传输慢或者需要丢包重传的情况。 当然还有可能是解码的问题,音视频其中之一的解码效率太慢,而缓冲队列设置合适,稍微不好一点的网络情况导致解码数据包(音频or视频)来不及放入缓冲队列。

如果是服务端的问题,比较不好处理。

音视频线程数据采集速度不同步(和采集卡有关),封装协议时就已经出现同一时间戳的音视频包实际是不同步的情况。