ASessionDescription::parse

2024-06-04 03:08
文章标签 parse asessiondescription

本文主要是介绍ASessionDescription::parse,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  安卓N版本ASessionDescription::parse函数原文:

bool ASessionDescription::parse(const void *data, size_t size) {//先把mTracks和mFormats里的内容清空mTracks.clear();mFormats.clear();//向mTracks里添加一个元素Attribs()//Attribs是类型为KeyedVector<AString,AString>的容器//向mFormats容器里添加一个元素AString("[root]")//mFormats是类型为Vector<AString>的容器mTracks.push(Attribs());mFormats.push(AString("[root]"));//将指定缓冲区里的内容拷贝到desc对象里AString desc((const char *)data, size);//循环解析拷贝到desc对象里的内容//内容是按行划分的size_t i = 0;for (;;) {//从内容的位置i开始查找"\n"的位置//返回位置i后最先出现的"\n"的位置eolPosssize_t eolPos = desc.find("\n", i);if (eolPos < 0) {//如果eolPos的值小于0,说明位置i后没有"\n"了//即到达了结尾,跳出循环break;}AString line;if ((size_t)eolPos > i && desc.c_str()[eolPos - 1] == '\r') {// We accept both '\n' and '\r\n' line endings, if it's// the latter, strip the '\r' as well.//如果(size_t)eolPos > i,则说明//desc.c_str()[i,eolPos - 1]是新的一行内容不包括desc.c_str()[eolPos]//因为desc.c_str()[eolPos] == '\n'//如果desc.c_str()[eolPos - 1] == '\r'则将该字符去掉//只将desc.c_str()[i,eolPos - 1 - 1]里的内容拷贝进line里line.setTo(desc, i, eolPos - i - 1);} else {line.setTo(desc, i, eolPos - i);}if (line.empty()) {//如果line内容为空//则迭代进行下一次循环//将i的位置设置到下一行的首位置i = eolPos + 1;continue;}if (line.size() < 2 || line.c_str()[1] != '=') {//如果line.size() < 2 或者 line.c_str()[1] != '='//则说明这是一无效的行//返回false结束循环//有效一行的格式是:如"a=*****"return false;}ALOGI("%s", line.c_str());switch (line.c_str()[0]) {case 'v':{//如果该行内容首字符为'v'//则判断该行内容是否为"v=0"//如果不是则说明该行是一个无效的行返回falseif (strcmp(line.c_str(), "v=0")) {return false;}break;}case 'a':case 'b':{//解析该行内容首字符为'a'和'b'的情况//解析出一对儿key和valueAString key, value;//查找key和value的分割符":"的位置colonPos//一般情况下line.str()[0,colonPos-1]为key//line.str()[colonPos]为":"//line.str()[colonPos+1,line.size()-1]ssize_t colonPos = line.find(":", 2);if (colonPos < 0) {//如果colonPos < 0//说明该行没有key和value的分割符":"//即该行就是key,将line赋值给keykey = line;} else {//如果colonPos > 0//则说明存在key和value的分割符":"//line.str()[colonPos]为":"//将包含key的内容line.str()[0,colonPos-1]赋值到key里//通过函数key.setTo(line, 0, colonPos)完成key.setTo(line, 0, colonPos);if (key == "a=fmtp" || key == "a=rtpmap"|| key == "a=framesize") {//分析key为 "a=fmtp" "a=rtpmap" "a=framesize"的情况//从该行内容里从key和value的分割符":"位置colonPos后查找" "的位置//对应该种情况,从分隔符":"的位置colonPos开始查找" "的位置spacePosssize_t spacePos = line.find(" ", colonPos + 1);if (spacePos < 0) {//如果spacePos < 0说明分隔符":"后没有" "的位置//该行是无效的行,返回falsereturn false;}//重新设置key,//此时key为line.strz()[0,spacePos-1]key.setTo(line, 0, spacePos);//将" "的位置赋值给colonPoscolonPos = spacePos;}//line.strz()[colonPos + 1,line.size()-1]为valuevalue.setTo(line, colonPos + 1, line.size() - colonPos - 1);}key.trim();value.trim();ALOGV("adding '%s' => '%s'", key.c_str(), value.c_str());//将解析出来的一对儿key和value添加到mTracks后一个元素所表示的容器里mTracks.editItemAt(mTracks.size() - 1).add(key, value);break;}case 'm':{ALOGV("new section '%s'",AString(line, 2, line.size() - 2).c_str());//处理该行首字符为'm'的情况//向mTracks容器添加一个类型为Attribs的元素//将line.str()[2,line.size() - 1]里的内容添加到mFormats容器里mTracks.push(Attribs());mFormats.push(AString(line, 2, line.size() - 2));break;}default:{//处理该行首字符为其他字符的情况AString key, value;//从该行查找"="字符的位置ssize_t equalPos = line.find("=");//line.str()[0,equalPos]为key//line.str()[equalPos+1,line.size() -1]为valuekey = AString(line, 0, equalPos + 1);value = AString(line, equalPos + 1, line.size() - equalPos - 1);key.trim();value.trim();ALOGV("adding '%s' => '%s'", key.c_str(), value.c_str());mTracks.editItemAt(mTracks.size() - 1).add(key, value);break;}}//迭代解析下一行i = eolPos + 1;}return true;
}

  小结:
  ASessionDescription::parse函数的功能就是根据内容格式解析出对应的key和value并用相应的数据结构存储起来。

  给出一个会话例子:
  

   Example:C->S: DESCRIBE rtsp://server.example.com/fizzle/foo RTSP/1.0CSeq: 312Accept: application/sdp, application/rtsl, application/mhegS->C: RTSP/1.0 200 OKCSeq: 312Date: 23 Jan 1997 15:35:06 GMTContent-Type: application/sdpContent-Length: 376v=0o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4s=SDP Seminari=A Seminar on the session description protocolu=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.pse=mjh@isi.edu (Mark Handley)c=IN IP4 224.2.17.12/127t=2873397496 2873404696a=recvonlym=audio 3456 RTP/AVP 0m=video 2232 RTP/AVP 31m=whiteboard 32416 UDP WBa=orient:portrait

这篇关于ASessionDescription::parse的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028895

相关文章

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

tiptap parseHTML renderHTML 使用

要在 Tiptap 中使用 parseHTML 和 renderHTML,可以通过创建自定义扩展来解析和渲染自定义的 HTML 元素。这两个方法允许你定义如何将 HTML 解析为 ProseMirror 文档节点以及如何将 ProseMirror 的文档节点渲染为 HTML。 1. parseHTML parseHTML 用于将 HTML 元素解析为 ProseMirror 节点。在自定义扩展

Parse和TryParse区别

基本数据类型就有Parse和TryParse方法,将数字字符串转换为指定的数字类型。TryParse这个方法会返回一个布尔值,来表示解析是否成功,那么就可以免去添加异常处理代码的麻烦。 方法/步骤 1 Parse将数字字符串转换为指定的数字类型 short sparse=Int16.Parse("24"); int iparse=Int32.Parse("24");

IE浏览器不支持JSON.parse

JS代码$("#btn-cancel").click(function(){xhr.simpleCall({func:'logOut',complete:function(XHR){if(XHR.status != 200){alert(JSON.parse(XHR.response).msg);}else{appFunc.localData.clear();window.location.hre

OGG-01389 File header failed to parse tokens.

OGG-01389 File header failed to parse tokens. http://blog.csdn.net/zbdba/article/details/44095105;  处理的思路:   1.查看日志   2.在目标端看最新的队列文件的日期,假如没有最新的队列文件就说明源端没有投递过来   3.在源端查看日志   4.在源端修改参数文件,使版本一致   5

【项目经验】——JSON.parse() JSON.stringify()

我们在做项目的时候,都知道序列化和反序列化,师哥说:“有正就有反,有来就有回!”的确,就是这样。然后我们在这里分享一下JSON.stringify()  和JSON.parse() parse用于从一个字符串中解析出Json对象。如下: var str='{"name":"李卫中","age":"22","sex":"男"}' 结果: JSON.parse(str)==> Obje

Parse 使用- iOS 后台数据

Parse 使用- iOS 后台数据 本文是Ctrl+C文章: 原文地址:http://blog.csdn.net/vipwangl/article/details/8846415  最近在学习Parse,但是Parse的中文教程比较少,看到这篇英文教程,把它翻译一下与大家共享,本人的英语水平不是很高,有的地方可能译得不好,望大神轻拍。。 原文地址http://www.raywe

xamarn.android binding parse sdk for a week to work

Xamarin.Android PackageName 需要设置为项目命名空间且全小写。 http://blog.csdn.net/jameszhou/article/details/41806377

Int32.Parse, Convert.ToInt32,Int32.TryParse三者的区别

Int32.Parse, Convert.ToInt32,Int32.TryParse三者的区别 Int32. Parse (string)         Int32.Parse (string str) method converts the string representation of a number to its 32-bit signed integer equivalent

JSON.parse 解析NaN, Infinity, -Infinity失败

背景 JSON.parse() 方法解析字符串时, 如果字符串包含NaN, Infinity, -Infinity会报错。因为我们需要先将NaN, Infinity, -Infinity替换成字符类型,再做转换 解决方法 function convert(str) {str = str.replace(/NaN/g, '"NaN"');str = str.replace(/-Infinity