⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtspcommon.cpp

📁 H.264 RTSP 串流(live 555)視窗版本
💻 CPP
字号:
/**********This library is free software; you can redistribute it and/or modify it underthe terms of the GNU Lesser General Public License as published by theFree Software Foundation; either version 2.1 of the License, or (at youroption) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)This library is distributed in the hope that it will be useful, but WITHOUTANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESSFOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License formore details.You should have received a copy of the GNU Lesser General Public Licensealong with this library; if not, write to the Free Software Foundation, Inc.,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA**********/// "liveMedia"// Copyright (c) 1996-2010 Live Networks, Inc.  All rights reserved.// Common routines used by both RTSP clients and servers// Implementation#include "RTSPCommon.hh"#include "Locale.hh"#include <string.h>#include <stdio.h>Boolean parseRTSPRequestString(char const* reqStr,			       unsigned reqStrSize,			       char* resultCmdName,			       unsigned resultCmdNameMaxSize,			       char* resultURLPreSuffix,			       unsigned resultURLPreSuffixMaxSize,			       char* resultURLSuffix,			       unsigned resultURLSuffixMaxSize,			       char* resultCSeq,			       unsigned resultCSeqMaxSize) {  // This parser is currently rather dumb; it should be made smarter #####  // Read everything up to the first space as the command name:  Boolean parseSucceeded = False;  unsigned i;  for (i = 0; i < resultCmdNameMaxSize-1 && i < reqStrSize; ++i) {    char c = reqStr[i];    if (c == ' ' || c == '\t') {      parseSucceeded = True;      break;    }    resultCmdName[i] = c;  }  resultCmdName[i] = '\0';  if (!parseSucceeded) return False;  // Skip over the prefix of any "rtsp://" or "rtsp:/" URL that follows:  unsigned j = i+1;  while (j < reqStrSize && (reqStr[j] == ' ' || reqStr[j] == '\t')) ++j; // skip over any additional white space  for (; (int)j < (int)(reqStrSize-8); ++j) {    if ((reqStr[j] == 'r' || reqStr[j] == 'R')	&& (reqStr[j+1] == 't' || reqStr[j+1] == 'T')	&& (reqStr[j+2] == 's' || reqStr[j+2] == 'S')	&& (reqStr[j+3] == 'p' || reqStr[j+3] == 'P')	&& reqStr[j+4] == ':' && reqStr[j+5] == '/') {      j += 6;      if (reqStr[j] == '/') {	// This is a "rtsp://" URL; skip over the host:port part that follows:	++j;	while (j < reqStrSize && reqStr[j] != '/' && reqStr[j] != ' ') ++j;      } else {	// This is a "rtsp:/" URL; back up to the "/":	--j;      }      i = j;      break;    }  }  // Look for the URL suffix (before the following "RTSP/"):  parseSucceeded = False;  for (unsigned k = i+1; (int)k < (int)(reqStrSize-5); ++k) {    if (reqStr[k] == 'R' && reqStr[k+1] == 'T' &&	reqStr[k+2] == 'S' && reqStr[k+3] == 'P' && reqStr[k+4] == '/') {      while (--k >= i && reqStr[k] == ' ') {} // go back over all spaces before "RTSP/"      unsigned k1 = k;      while (k1 > i && reqStr[k1] != '/') --k1;      // the URL suffix comes from [k1+1,k]      // Copy "resultURLSuffix":      if (k - k1 + 1 > resultURLSuffixMaxSize) return False; // there's no room      unsigned n = 0, k2 = k1+1;      while (k2 <= k) resultURLSuffix[n++] = reqStr[k2++];      resultURLSuffix[n] = '\0';      // Also look for the URL 'pre-suffix' before this:      unsigned k3 = (k1 == 0) ? 0 : --k1;      while (k3 > i && reqStr[k3] != '/') --k3;      // the URL pre-suffix comes from [k3+1,k1]      // Copy "resultURLPreSuffix":      if (k1 - k3 + 1 > resultURLPreSuffixMaxSize) return False; // there's no room      n = 0; k2 = k3+1;      while (k2 <= k1) resultURLPreSuffix[n++] = reqStr[k2++];      resultURLPreSuffix[n] = '\0';      i = k + 7; // to go past " RTSP/"      parseSucceeded = True;      break;    }  }  if (!parseSucceeded) return False;  // Look for "CSeq:", skip whitespace,  // then read everything up to the next \r or \n as 'CSeq':  parseSucceeded = False;  for (j = i; (int)j < (int)(reqStrSize-5); ++j) {    if (reqStr[j] == 'C' && reqStr[j+1] == 'S' && reqStr[j+2] == 'e' &&	reqStr[j+3] == 'q' && reqStr[j+4] == ':') {      j += 5;      unsigned n;      while (j < reqStrSize && (reqStr[j] ==  ' ' || reqStr[j] == '\t')) ++j;      for (n = 0; n < resultCSeqMaxSize-1 && j < reqStrSize; ++n,++j) {	char c = reqStr[j];	if (c == '\r' || c == '\n') {	  parseSucceeded = True;	  break;	}	resultCSeq[n] = c;      }      resultCSeq[n] = '\0';      break;    }  }  if (!parseSucceeded) return False;  return True;}Boolean parseRangeParam(char const* paramStr, double& rangeStart, double& rangeEnd) {  double start, end;  Locale l("C", LC_NUMERIC);  if (sscanf(paramStr, "npt = %lf - %lf", &start, &end) == 2) {    rangeStart = start;    rangeEnd = end;  } else if (sscanf(paramStr, "npt = %lf -", &start) == 1) {    rangeStart = start;    rangeEnd = 0.0;  } else if (strcmp(paramStr, "npt=now-") == 0) {    rangeStart = 0.0;    rangeEnd = 0.0;  } else {    return False; // The header is malformed  }  return True;}Boolean parseRangeHeader(char const* buf, double& rangeStart, double& rangeEnd) {  // First, find "Range:"  while (1) {    if (*buf == '\0') return False; // not found    if (_strncasecmp(buf, "Range: ", 7) == 0) break;    ++buf;  }  // Then, run through each of the fields, looking for ones we handle:  char const* fields = buf + 7;  while (*fields == ' ') ++fields;  return parseRangeParam(fields, rangeStart, rangeEnd);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -