最近在分析EasyDarwin中RTSPSession的建立及初始化,当每一个推流请求接收时,EasyDarwin就会新建一个RTSPSession,在RTSPSession中有RTSPRequest* fRequest和RTPSession* fRTPSession两个属性
fRequest对应当前的RTSP请求,fRTPSession对应RTP会话用于创建RTPStream
二者的初始化如博文https://blog.youkuaiyun.com/blobliu/article/details/82592689中提到都是在RTSPSession的Run()方法中进行
同时在Run()方法状态机执行中发现fRequest和fRTPSession在进行一定的操作后都调用SetValue方法来保存操作变量的值,以类似于Key-Value的形式
转到定义发现SetValue方法是fRequest和fRTPSession继承于QTSSDictionary
QTSSDictionary作为数据字典提供保存变量,获取变量,修改,删除变量。类似于SetValue的方法还有SetValuePtr,setVal,获取变量的方法有GetValue,GetValuePtr,GetValueAsString
所有派生与QTSSDictionary的类实例化对象,都是一个QTSS_Object,具有若干属性,每个属性有一个或多个值,QTSS_AttributeID标识每一个属性
通过SetVal可以为属性添加单个值,而SetValue为属性添加过个值,每一个属性有属性名,ID号,数据类型,读写权限,回调函数,属性定义类为QTSSAttrInfoDict
在QTSSDictionaryMap中,存放有QTSSAttrInfoDict** fAttrArray,使用这个属性数组维护每一个属性,同时QTSSAttrInfoDict继承于QTSSDictionary,所以他们是属性的属性。
QTSSDictionary中有两个指向QTSSDictionaryMap的指针,来维护QTSSDictionary中的每一个属性的属性名,ID,数据类型,读写权限,回调函数。
QTSSDictionary中存放真正的属性,每一个属性可以有一个或者多个值,QTSSDictionaryMap中存放的fAttrArray[QTSS_AttributeID]维护的是属性的属性,即描述属性的特征,包含属性的‘属性名,ID号,数据类型,读写权限,回调函数’。
QTSSDictionaryMap构造函数的第一个参数代表保留参数个数,代表已经有的属性个数,而带有QTSSDictionaryMap::kInstanceAttrsAllowed标识的字典表示可以增加实例属性,这些属性都是存在对象的私有map中 fInstanceMap = new QTSSDictionaryMap( 0, theFlags );
sDictionaryMaps[kFileDictIndex] = new QTSSDictionaryMap(qtssFlObjNumParams);
sDictionaryMaps[kModuleDictIndex] = new QTSSDictionaryMap(qtssModNumParams);
sDictionaryMaps[kModulePrefsDictIndex] = new QTSSDictionaryMap(0, QTSSDictionaryMap::kInstanceAttrsAllowed | QTSSDictionaryMap::kCompleteFunctionsAllowed);
QTSSDictionaryMap内部有一个静态数组:
static QTSSDictionaryMap* sDictionaryMaps[kNumDictionaries + kNumDynamicDictionaryTypes];
其中的每一个元素在QTSSDictionary::Initialize中进行分配内存:
sDictionaryMaps[kAttrInfoDictIndex] = new QTSSDictionaryMap(qtssAttrInfoNumParams);
而每一个元素QTSSDictionaryMap的赋值是在QTSSDictionary::Initialize中进行。