<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852955</guid>
        <pubDate>Tue, 12 Oct 2021 19:48:02 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852955</link>
        <description><![CDATA[Lem0nti: Судя по всему, скачать пример из темы оказалось сложнее чем яндексить варианты на питоне.<br>Ваш путь - это одноразовый путь.<br>Если вы не разберётесь с RTSP, то плата за подход &quot;как бы сделать так, чтобы ничего не делать&quot; - это открытки и высокий траффик]]></description>
        <author>Lem0nti</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852920</guid>
        <pubDate>Tue, 12 Oct 2021 11:28:02 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852920</link>
        <description><![CDATA[jester81: DELPHI - заработало:<br>
edit1.Text:=&#39;<a class='tag-url' href='http://admin:admin@172.16.42.11:8080/snap.jpg%27;' target='_blank'>http://admin:admin@172.16.42.11:8080/snap.jpg%27;</a><br>
<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TForm1.BitBtn1Click(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;memorystream.Clear;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NetHTTPClient1.Get (edit1.Text, memorystream);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memorystream.SaveToFile(&#39;A_Teste.jpeg&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;on E: Exception do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Error:=e.ToString();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;showmessage(&#39; Ошибка= &#39;+Error);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.FormCreate(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;memorystream:=TMemoryStream.Create;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Jpeg:=TJpegImage.create;</div><div class="code_line">&nbsp;&nbsp; &nbsp;edit1.Text:=&#39;http://admin:admin@172.16.42.11:8080/snap.jpg&#39;;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>jester81</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852906</guid>
        <pubDate>Tue, 12 Oct 2021 06:45:03 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852906</link>
        <description><![CDATA[jester81: Ураааааааааааааааааа, нулевой  поток ожил.<br>Нужно было в настройках камеры указать в разделе:<br>Конфигурация-Видео-Видео-Видеокодирование<br>стоял параметр: MJPEG<br>нужно было поставить: H.264  и разрешение поставил максимальное<br>ЗАРАБОТАЛО &#33;<br>(Но в Пайтоне)]]></description>
        <author>jester81</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852905</guid>
        <pubDate>Tue, 12 Oct 2021 05:26:53 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852905</link>
        <description><![CDATA[jester81: Написал на ПАЙТОНЕ, тоже не работает именно с этой камерой.<br>
172.16.42.12:554 - пашет<br>
172.16.42.11:554  - не пашет<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">import cv2</div><div class="code_line">from tkinter import *</div><div class="code_line">from tkinter import messagebox</div><div class="code_line">&nbsp;</div><div class="code_line">cap = cv2.VideoCapture(&#39;rtsp://admin:admin@172.16.42.12:554/cam/realmonitor?channel=1&amp;subtype=0&#39;)</div><div class="code_line">&nbsp;</div><div class="code_line">while True:</div><div class="code_line">&nbsp;&nbsp; &nbsp;ret, img = cap.read()</div><div class="code_line">&nbsp;&nbsp; &nbsp;gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)</div><div class="code_line">&nbsp;&nbsp; &nbsp;img=cv2.resize(img,(800,600))</div><div class="code_line">&nbsp;&nbsp; &nbsp;cv2.imshow(&#39;IP Camera stream&#39;, img)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if cv2.waitKey(1) &amp; 0xFF == ord(&#39;s&#39;):</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cv2.imwrite(&#39;c:\Python\images.jpg&#39;, img)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if cv2.waitKey(1) &amp; 0xFF == ord(&#39;q&#39;):</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;break</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">cv2.destroyAllWindows()</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2021-10-12T06:24:02+00:00">12.10.21, 06:24</time></span></span><br>
есть прогресс.......<br>
В пайтоне заработал первый поток, нулевой НЕ ХОЧЕТ<br>
ПАШЕТ = cap = cv2.VideoCapture(&#39;rtsp://admin:admin@172.16.42.11:554/1&#39;)<br>
НЕ ПАШЕТ = cap = cv2.VideoCapture(&#39;rtsp://admin:admin@172.16.42.11:554/0&#39;)<br>
(прошу прощения за НЕ ДЕЛФИ язык, но приходиться извращаться для достижения цели)<br>
Подсказку нашел на этом сайте: <a class='tag-url' href='https://www.ispyconnect.com/camera/herospeed' target='_blank'>https://www.ispyconnect.com/camera/herospeed</a>]]></description>
        <author>jester81</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852900</guid>
        <pubDate>Mon, 11 Oct 2021 14:30:07 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852900</link>
        <description><![CDATA[Lem0nti: Потому что это не HTTP-протокол. Если вы скачаете пример выше, то там есть как организовать общение с камерой по RTSP.]]></description>
        <author>Lem0nti</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852880</guid>
        <pubDate>Mon, 11 Oct 2021 11:24:38 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3852880</link>
        <description><![CDATA[jester81: Добрый день.<br>
У меня та же беда, старался поймать поток с камеры, но не получилось.<br>
Что я делал:<br>
1. Есть камеры ДАХУА -с них поток поймало по HTTP   и скриншот сделало из потока .<br>
Ну в VLC плеере работает так: rtsp://admin:admin@172.16.42.12:554/cam/realmonitor?channel=1&amp;subtype=0<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Form1: TForm1;</div><div class="code_line">&nbsp;&nbsp;memorystream: TMemoryStream;</div><div class="code_line">&nbsp;&nbsp;Jpeg: &nbsp;TJpegImage;</div><div class="code_line">&nbsp;&nbsp;aaa:string;</div><div class="code_line">&nbsp;&nbsp;Error:string;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm}</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.BitBtn1Click(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;memorystream.Clear;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// edit1.Text &nbsp;----&#62; &nbsp;http://admin:admin@172.16.42.12:8080/cgi-bin/snapshot.cgi?channel1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NetHTTPClient1.Get (edit1.Text, memorystream);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memorystream.SaveToFile(&#39;A_Teste.jpeg&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;on E: Exception do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Error:=e.ToString();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;showmessage(&#39; Ошибка= &#39;+Error);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
<br>
2. Есть иная камера , &quot;HeroSpeed&quot; ,location=&quot;Guangzhou&quot;, 172.16.42.11<br>
Через VLC плеер пашет = rtsp://admin:admin@172.16.42.11:554/cam/realmonitor?channel=1&amp;subtype=0<br>
и так пашет = rtsp://admin:admin@172.16.42.11:554/cam/realmonitor<br>
и так пашет = rtsp://admin:admin@172.16.42.11:8080/0<br>
и так пашет = rtsp://admin:admin@172.16.42.11:554/0<br>
но через DELPHI  - не хочет по HTTP.<br>
НЕ пашет = <a class='tag-url' href='http://admin:admin@172.16.42.11:8080/cgi-bin/snapshot.cgi?channel1' target='_blank'>http://admin:admin@172.16.42.11:8080/cgi-b...ot.cgi?channel1</a><br>
<br>
Может кто-то подсказать по этой камере, как ее заставить работать ?]]></description>
        <author>jester81</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3825871</guid>
        <pubDate>Tue, 17 Mar 2020 09:55:20 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3825871</link>
        <description><![CDATA[DenisBbb: <strong class='tag-b'>Lem0nti</strong>Боюсь что у меня нет таких знаний, проверьте лс]]></description>
        <author>DenisBbb</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3825869</guid>
        <pubDate>Tue, 17 Mar 2020 09:49:00 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3825869</link>
        <description><![CDATA[Lem0nti: По dcu - сделано в 10.2. Если она недосутпна, то вы можете попробовать адаптировать парсинг пакета из его текущей обёртки. TBaseThread это наследник от потока, ожидающий элементы очереди, а TThreadSignalledQueue это просто потокозащищённый наследник от TQueue.]]></description>
        <author>Lem0nti</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3825857</guid>
        <pubDate>Tue, 17 Mar 2020 06:59:14 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3825857</link>
        <description><![CDATA[DenisBbb: <strong class='tag-b'>Lem0nti</strong> Есть коммерческое предложение, нужно сделать RTSP клиент который способен получить аудио-видео поток от видеокамеры/видеорегистратора кроме того, нужно писать этот поток на HDD, и после этого еще раздавать нуждающмся клиентам, их адреса заранее не известны <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-17T07:04:56+00:00">17.03.20, 07:04</time></span></span><br>
<strong class='tag-b'>Lem0nti</strong> ни в какую не компилирует без этих юнитов, на DCUхи он и не смотрит <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-17T07:11:19+00:00">17.03.20, 07:11</time></span></span><br>
<strong class='tag-b'>Lem0nti</strong> пока курил эту тему узнал что DCU годится при одинаковых версиях компилятора]]></description>
        <author>DenisBbb</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3825691</guid>
        <pubDate>Mon, 16 Mar 2020 05:13:10 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3825691</link>
        <description><![CDATA[Lem0nti: Там есть dcu для тех модулей, исходники которых включать неуместно. Не удаляйте их и всё срастётся.<br><br>Нет, не думал.<br>Но с трансляцией как есть всё просто - берём кадры как есть в h264 и пересылаем их куда надо. Собственно, у меня так работает. Конечно, если надо раздавать обязательно в соответствии с RFC и потребители видео условно неизвестны, то это может не помочь.]]></description>
        <author>Lem0nti</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3825607</guid>
        <pubDate>Sun, 15 Mar 2020 06:40:36 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3825607</link>
        <description><![CDATA[DenisBbb: Скачал исходник, при компиляции ругается на отсутствующий модуль cBaseThread_TH <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-15T06:41:17+00:00">15.03.20, 06:41</time></span></span><br>
<strong class='tag-b'>Lem0nti</strong> не думал реализовать трансляцию RTSP потока?]]></description>
        <author>DenisBbb</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3813812</guid>
        <pubDate>Wed, 30 Oct 2019 08:21:29 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3813812</link>
        <description><![CDATA[Lem0nti: Не очень активная тема, к сожалению ...<br>
<br>
В общем, решил я свой вопрос. Не разбирался непосредственно в проблеме, скорей всего неправильные сдвиги при распарсивании пакета. Просто сделал такие переделки:<br>
    - WinSock вместо Indy<br>
    - interleaved вместо non-interleaved<br>
    - ну и камеру подвезли, вместо эмулятора VLC<br>
<br>
Получаемые кадры отлично скармливаются декодеру, картинка есть. В прилагаемом примере нет работы с авторизацией и логического пинга. Однако, работа непосредственно с RTP налажена. Забирайте кому надо :).<br>
<span class="b-attach" data-size="37165" data-hits="1091" data-attach-id="61072" data-attach-post-id="3813812">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3813812&amp;attach_id=61072' title='Скачать файл' target='_blank'>RTSPProtocol.rar</a> (, : 1091)
		</span>]]></description>
        <author>Lem0nti</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3813027</guid>
        <pubDate>Mon, 21 Oct 2019 12:27:41 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3813027</link>
        <description><![CDATA[Lem0nti: В аттаче к посту программа, в ней реализовано общение с трансляцией VLC-плеера. На молчаливый вопрос «почему не камера», ответ таков - пока нет ни одной камеры в офисе, к которой мне можно подключиться, жду закупки.<br>
Запускаем трансляцию в VLC, после этого запускаем прогу.<br>
<br>
Чтобы пошла трансляция, необходимо произвести такие шаги:<br>
- Жмём кнопку «Подключиться», после этого появится список команд<br>
- Жмём двойной клик на команде DESCRIBE – это отправит запрос на наличие потоков, к которым можно подключиться. Далее в списке появятся ссылки на доступные потоки. Все, которые начинаются там с «2=», это потоки видео. В этот же момент запоминается тип данных (96 – это видео в формате h264).<br>
- выбираем в списке ниже ту ссылку, которая начинается с 2= и жмём двойной клик на команде SETUP. От этого действия мы получаем идентификатор сессии, с помощью которого можно начинать получать видео.<br>
- жмём двойной клик на PLAY, после этого начинается передача видео на UDP-порт 54000.<br>
<br>
Теперь видео-кадры приходят. Отлично приходят, получаю их, нахожу смещение Payload, получаю RTP (обкурил RFC и эти материалы - <a class='tag-url' href='https://habr.com/ru/post/117735/' target='_blank'>https://habr.com/ru/post/117735/</a>, <a class='tag-url' href='https://habr.com/ru/post/233237/' target='_blank'>https://habr.com/ru/post/233237/</a>).<br>
Надеюсь, всё вышеперечисленное сможет кому-то помочь, включая проблему, оставшуюся без ответа в этом топике. В приложенном коде кроме описанного также присутствует:<br>
- отправка «логического» пинга, чтобы связь не обрывалась, по таймеру, который нужен источнику.<br>
- запоминание SPS и PPS кадров, потому что от VLC и многих камер, они просто не приходят<br>
<br>
И вот тут начинаются проблемы… Вроде всё сделано по инструкции, но внезапно оказалось, что тип кадра 5 (опорный) не приходит в пакетах с маркером конца пакета. Иногда он может быть у одного из «серединных» пакетов кадра. Тип кадра беру как последние 5 бит второго байта RTP-пакета если пакет – часть кадра или как последние 5 бит первого байта RTP-пакета, если кадр целиком уместился в пакет. При этом, по итогу сохранения данных, я вполне наблюдаю определённую периодичность бОльших, чем другие кадров.<br>
Помогите, пожалуйста, разобраться, где я промахнулся с получением типа кадра.<br>
<br>
Прошу прощения за некропост, но мне кажется, что тут в топике есть некоторая недосказанность, которая у меня уже решена. И в то же самое время, наступил тупик через несколько шагов. Если вы поможете мне из него выбраться, буду очень благодарен.<br>
<br>
Если будете запускать прогу до ознакомления с содержимым, то на этот случай предупреждаю - засирает папку файлами, в которые сохраняются RTP-пакеты, для отладочных целей.<br>
<br>
<span class="b-attach" data-size="9150" data-hits="1099" data-attach-id="61044" data-attach-post-id="0">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=0&amp;attach_id=61044' title='Скачать файл' target='_blank'>RTSPProtocol.rar</a> (, : 1099)
		</span>]]></description>
        <author>Lem0nti</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3701175</guid>
        <pubDate>Mon, 09 Jan 2017 14:09:58 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3701175</link>
        <description><![CDATA[Fr0sT: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3701154'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2017-01-09T09:59:16+00:00">09.01.17, 09:59</time></span><div class='quote '>вот и я не понял, а вообще такого же типа константу в delphi можно описать?</div></div><br>
const DELAY_SECOND: DelayInterval = (sec: 1, usec: 0);<br>
Но еще раз, с очередью какая-то странная муть, скорее всего, для твоих целей оно и не нужно.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3701154'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2017-01-09T09:59:16+00:00">09.01.17, 09:59</time></span><div class='quote '>как откусить ХЗ сколько, по RFC там то ли 12 байт, то ли 12 бит, то ли все 32 байта </div></div><br>
Ну я имел в виду заголовок http ответа, весь заголовок бинарного потока по идее должен сохраниться.]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3701154</guid>
        <pubDate>Mon, 09 Jan 2017 09:59:16 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3701154</link>
        <description><![CDATA[woojin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3701138'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2017-01-09T06:48:37+00:00">09.01.17, 06:48</time></span><div class='quote '>Тут какая-то очередь, неясно зачем. </div></div><br>
вот и я не понял, а вообще такого же типа константу в delphi можно описать?<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3701138'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2017-01-09T06:48:37+00:00">09.01.17, 06:48</time></span><div class='quote '> откусываем заголовок</div></div><br>
вот&#33; именно&#33;<br>
как откусить ХЗ сколько, по RFC там то ли 12 байт, то ли 12 бит, то ли все 32 байта]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3701138</guid>
        <pubDate>Mon, 09 Jan 2017 06:48:37 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3701138</link>
        <description><![CDATA[Fr0sT: Тут какая-то очередь, неясно зачем. Если надо только сохранять принятое (да еще и в консольном приложении), то никаких сложностей не вижу - блокирующие сокеты, простейший вариант. Коннектимся, пишем в сокет запрос, читаем ответ, откусываем заголовок, поток пишем в файл. Для отзывчивости перед каждым блокирующим вызовом (recv, send, connect) вызывать select с таймаутом. Всё.]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3701130</guid>
        <pubDate>Mon, 09 Jan 2017 04:45:43 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3701130</link>
        <description><![CDATA[woojin: ВСЕХ С НАСТУПИВШИМ&#33; УДАЧИ, СЧАСТЬЯ, УСПЕХОВ  :crazy: <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3699366'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-26T07:17:12+00:00">26.12.16, 07:17</time></span><div class='quote '>А ты собираешься еще и видео сам проигрывать (в смысле, разбирать свойства, декодировать кадры, отображать на канвасе)? Если нет, то зачем тебе заголовок, просто скорми поток классу-плееру на свой вкус</div></div><br>
нет конечно, не собираюсь<br>
приложение будет консольным, ему надо сохранять данный поток в файл (но использовать библиотеки типа &quot;ffmpeg&quot; не хочется для таких дел)<br>
<br>
хочется переложить (или написать аналог) данную программу с С/С++ на Pascal<br>
<br>
<br>
p.s. начал перекладывать потихоньку (как переложу, конечно покажу) и возник вопрос<br>
файл .hh<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">extern DelayInterval const DELAY_ZERO;</div><div class="code_line">extern DelayInterval const DELAY_SECOND;</div><div class="code_line">extern DelayInterval const DELAY_MINUTE;</div><div class="code_line">extern DelayInterval const DELAY_HOUR;</div><div class="code_line">extern DelayInterval const DELAY_DAY;</div></ol></div></div></div></div><br>
файл cpp;<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef INT_MAX</div><div class="code_line">#define INT_MAX 0x7FFFFFFF</div><div class="code_line">#endif</div><div class="code_line">const DelayInterval DELAY_ZERO(0, 0);</div><div class="code_line">const DelayInterval DELAY_SECOND(1, 0);</div><div class="code_line">const DelayInterval DELAY_MINUTE = 60*DELAY_SECOND;</div><div class="code_line">const DelayInterval DELAY_HOUR = 60*DELAY_MINUTE;</div><div class="code_line">const DelayInterval DELAY_DAY = 24*DELAY_HOUR;</div><div class="code_line">const DelayInterval ETERNITY(INT_MAX, MILLION-1);</div></ol></div></div></div></div><br>
можно ли такое же сделать на паскале, у меня получается ни как правильно описать данные константы<br>
<br>
это оба файла целиком (без вступительных коментов)<br>
*.hh<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef _DELAY_QUEUE_HH</div><div class="code_line">#define _DELAY_QUEUE_HH</div><div class="code_line">&nbsp;</div><div class="code_line">#ifndef _NET_COMMON_H</div><div class="code_line">#include &quot;NetCommon.h&quot;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef TIME_BASE</div><div class="code_line">typedef TIME_BASE time_base_seconds;</div><div class="code_line">#else</div><div class="code_line">typedef long time_base_seconds;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">///// A &quot;Timeval&quot; can be either an absolute time, or a time interval /////</div><div class="code_line">&nbsp;</div><div class="code_line">class Timeval {</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;time_base_seconds seconds() const {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return fTv.tv_sec;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;time_base_seconds seconds() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return fTv.tv_sec;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;time_base_seconds useconds() const {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return fTv.tv_usec;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;time_base_seconds useconds() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return fTv.tv_usec;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;int operator&#62;=(Timeval const&amp; arg2) const;</div><div class="code_line">&nbsp;&nbsp;int operator&#60;=(Timeval const&amp; arg2) const {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return arg2 &#62;= *this;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;int operator&#60;(Timeval const&amp; arg2) const {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return !(*this &#62;= arg2);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;int operator&#62;(Timeval const&amp; arg2) const {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return arg2 &#60; *this;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;int operator==(Timeval const&amp; arg2) const {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return *this &#62;= arg2 &amp;&amp; arg2 &#62;= *this;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;int operator!=(Timeval const&amp; arg2) const {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return !(*this == arg2);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;void operator+=(class DelayInterval const&amp; arg2);</div><div class="code_line">&nbsp;&nbsp;void operator-=(class DelayInterval const&amp; arg2);</div><div class="code_line">&nbsp;&nbsp;// returns ZERO iff arg2 &#62;= arg1</div><div class="code_line">&nbsp;</div><div class="code_line">protected:</div><div class="code_line">&nbsp;&nbsp;Timeval(time_base_seconds seconds, time_base_seconds useconds) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fTv.tv_sec = seconds; fTv.tv_usec = useconds;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp;time_base_seconds&amp; secs() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return (time_base_seconds&amp;)fTv.tv_sec;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;time_base_seconds&amp; usecs() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return (time_base_seconds&amp;)fTv.tv_usec;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;struct timeval fTv;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">#ifndef max</div><div class="code_line">inline Timeval max(Timeval const&amp; arg1, Timeval const&amp; arg2) {</div><div class="code_line">&nbsp;&nbsp;return arg1 &#62;= arg2 ? arg1 : arg2;</div><div class="code_line">}</div><div class="code_line">#endif</div><div class="code_line">#ifndef min</div><div class="code_line">inline Timeval min(Timeval const&amp; arg1, Timeval const&amp; arg2) {</div><div class="code_line">&nbsp;&nbsp;return arg1 &#60;= arg2 ? arg1 : arg2;</div><div class="code_line">}</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">class DelayInterval operator-(Timeval const&amp; arg1, Timeval const&amp; arg2);</div><div class="code_line">// returns ZERO iff arg2 &#62;= arg1</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">///// DelayInterval /////</div><div class="code_line">&nbsp;</div><div class="code_line">class DelayInterval: public Timeval {</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;DelayInterval(time_base_seconds seconds, time_base_seconds useconds)</div><div class="code_line">&nbsp;&nbsp; &nbsp;: Timeval(seconds, useconds) {}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">DelayInterval operator*(short arg1, DelayInterval const&amp; arg2);</div><div class="code_line">&nbsp;</div><div class="code_line">extern DelayInterval const DELAY_ZERO;</div><div class="code_line">extern DelayInterval const DELAY_SECOND;</div><div class="code_line">extern DelayInterval const DELAY_MINUTE;</div><div class="code_line">extern DelayInterval const DELAY_HOUR;</div><div class="code_line">extern DelayInterval const DELAY_DAY;</div><div class="code_line">&nbsp;</div><div class="code_line">///// _EventTime /////</div><div class="code_line">&nbsp;</div><div class="code_line">class _EventTime: public Timeval {</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;_EventTime(unsigned secondsSinceEpoch = 0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;unsigned usecondsSinceEpoch = 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp;// We use the Unix standard epoch: January 1, 1970</div><div class="code_line">&nbsp;&nbsp; &nbsp;: Timeval(secondsSinceEpoch, usecondsSinceEpoch) {}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">_EventTime TimeNow();</div><div class="code_line">&nbsp;</div><div class="code_line">extern _EventTime const THE_END_OF_TIME;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">///// DelayQueueEntry /////</div><div class="code_line">&nbsp;</div><div class="code_line">class DelayQueueEntry {</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;virtual ~DelayQueueEntry();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;intptr_t token() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;return fToken;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">protected: // abstract base class</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry(DelayInterval delay);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;virtual void handleTimeout();</div><div class="code_line">&nbsp;</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp;friend class DelayQueue;</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry* fNext;</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry* fPrev;</div><div class="code_line">&nbsp;&nbsp;DelayInterval fDeltaTimeRemaining;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;intptr_t fToken;</div><div class="code_line">&nbsp;&nbsp;static intptr_t tokenCounter;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">///// DelayQueue /////</div><div class="code_line">&nbsp;</div><div class="code_line">class DelayQueue: public DelayQueueEntry {</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp;DelayQueue();</div><div class="code_line">&nbsp;&nbsp;virtual ~DelayQueue();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;void addEntry(DelayQueueEntry* newEntry); // returns a token for the entry</div><div class="code_line">&nbsp;&nbsp;void updateEntry(DelayQueueEntry* entry, DelayInterval newDelay);</div><div class="code_line">&nbsp;&nbsp;void updateEntry(intptr_t tokenToFind, DelayInterval newDelay);</div><div class="code_line">&nbsp;&nbsp;void removeEntry(DelayQueueEntry* entry); // but doesn&#39;t delete it</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry* removeEntry(intptr_t tokenToFind); // but doesn&#39;t delete it</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;DelayInterval const&amp; timeToNextAlarm();</div><div class="code_line">&nbsp;&nbsp;void handleAlarm();</div><div class="code_line">&nbsp;</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry* head() { return fNext; }</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry* findEntryByToken(intptr_t token);</div><div class="code_line">&nbsp;&nbsp;void synchronize(); // bring the &#39;time remaining&#39; fields up-to-date</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;_EventTime fLastSyncTime;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div></ol></div></div></div></div><br>
.cpp<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &quot;DelayQueue.hh&quot;</div><div class="code_line">#include &quot;GroupsockHelper.hh&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">static const int MILLION = 1000000;</div><div class="code_line">&nbsp;</div><div class="code_line">///// Timeval /////</div><div class="code_line">&nbsp;</div><div class="code_line">int Timeval::operator&#62;=(const Timeval&amp; arg2) const {</div><div class="code_line">&nbsp;&nbsp;return seconds() &#62; arg2.seconds()</div><div class="code_line">&nbsp;&nbsp; &nbsp;|| (seconds() == arg2.seconds()</div><div class="code_line">&nbsp;&nbsp; &nbsp;&amp;&amp; useconds() &#62;= arg2.useconds());</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void Timeval::operator+=(const DelayInterval&amp; arg2) {</div><div class="code_line">&nbsp;&nbsp;secs() += arg2.seconds(); usecs() += arg2.useconds();</div><div class="code_line">&nbsp;&nbsp;if (useconds() &#62;= MILLION) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;usecs() -= MILLION;</div><div class="code_line">&nbsp;&nbsp; &nbsp;++secs();</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void Timeval::operator-=(const DelayInterval&amp; arg2) {</div><div class="code_line">&nbsp;&nbsp;secs() -= arg2.seconds(); usecs() -= arg2.useconds();</div><div class="code_line">&nbsp;&nbsp;if ((int)useconds() &#60; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;usecs() += MILLION;</div><div class="code_line">&nbsp;&nbsp; &nbsp;--secs();</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;if ((int)seconds() &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp;secs() = usecs() = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">DelayInterval operator-(const Timeval&amp; arg1, const Timeval&amp; arg2) {</div><div class="code_line">&nbsp;&nbsp;time_base_seconds secs = arg1.seconds() - arg2.seconds();</div><div class="code_line">&nbsp;&nbsp;time_base_seconds usecs = arg1.useconds() - arg2.useconds();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if ((int)usecs &#60; 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;usecs += MILLION;</div><div class="code_line">&nbsp;&nbsp; &nbsp;--secs;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;if ((int)secs &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp;return DELAY_ZERO;</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;return DelayInterval(secs, usecs);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">///// DelayInterval /////</div><div class="code_line">&nbsp;</div><div class="code_line">DelayInterval operator*(short arg1, const DelayInterval&amp; arg2) {</div><div class="code_line">&nbsp;&nbsp;time_base_seconds result_seconds = arg1*arg2.seconds();</div><div class="code_line">&nbsp;&nbsp;time_base_seconds result_useconds = arg1*arg2.useconds();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;time_base_seconds carry = result_useconds/MILLION;</div><div class="code_line">&nbsp;&nbsp;result_useconds -= carry*MILLION;</div><div class="code_line">&nbsp;&nbsp;result_seconds += carry;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return DelayInterval(result_seconds, result_useconds);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">#ifndef INT_MAX</div><div class="code_line">#define INT_MAX 0x7FFFFFFF</div><div class="code_line">#endif</div><div class="code_line">const DelayInterval DELAY_ZERO(0, 0);</div><div class="code_line">const DelayInterval DELAY_SECOND(1, 0);</div><div class="code_line">const DelayInterval DELAY_MINUTE = 60*DELAY_SECOND;</div><div class="code_line">const DelayInterval DELAY_HOUR = 60*DELAY_MINUTE;</div><div class="code_line">const DelayInterval DELAY_DAY = 24*DELAY_HOUR;</div><div class="code_line">const DelayInterval ETERNITY(INT_MAX, MILLION-1);</div><div class="code_line">// used internally to make the implementation work</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">///// DelayQueueEntry /////</div><div class="code_line">&nbsp;</div><div class="code_line">intptr_t DelayQueueEntry::tokenCounter = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">DelayQueueEntry::DelayQueueEntry(DelayInterval delay)</div><div class="code_line">&nbsp;&nbsp;: fDeltaTimeRemaining(delay) {</div><div class="code_line">&nbsp;&nbsp;fNext = fPrev = this;</div><div class="code_line">&nbsp;&nbsp;fToken = ++tokenCounter;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">DelayQueueEntry::~DelayQueueEntry() {</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void DelayQueueEntry::handleTimeout() {</div><div class="code_line">&nbsp;&nbsp;delete this;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">///// DelayQueue /////</div><div class="code_line">&nbsp;</div><div class="code_line">DelayQueue::DelayQueue()</div><div class="code_line">&nbsp;&nbsp;: DelayQueueEntry(ETERNITY) {</div><div class="code_line">&nbsp;&nbsp;fLastSyncTime = TimeNow();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">DelayQueue::~DelayQueue() {</div><div class="code_line">&nbsp;&nbsp;while (fNext != this) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;DelayQueueEntry* entryToRemove = fNext;</div><div class="code_line">&nbsp;&nbsp; &nbsp;removeEntry(entryToRemove);</div><div class="code_line">&nbsp;&nbsp; &nbsp;delete entryToRemove;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void DelayQueue::addEntry(DelayQueueEntry* newEntry) {</div><div class="code_line">&nbsp;&nbsp;synchronize();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry* cur = head();</div><div class="code_line">&nbsp;&nbsp;while (newEntry-&#62;fDeltaTimeRemaining &#62;= cur-&#62;fDeltaTimeRemaining) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;newEntry-&#62;fDeltaTimeRemaining -= cur-&#62;fDeltaTimeRemaining;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cur = cur-&#62;fNext;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;cur-&#62;fDeltaTimeRemaining -= newEntry-&#62;fDeltaTimeRemaining;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Add &quot;newEntry&quot; to the queue, just before &quot;cur&quot;:</div><div class="code_line">&nbsp;&nbsp;newEntry-&#62;fNext = cur;</div><div class="code_line">&nbsp;&nbsp;newEntry-&#62;fPrev = cur-&#62;fPrev;</div><div class="code_line">&nbsp;&nbsp;cur-&#62;fPrev = newEntry-&#62;fPrev-&#62;fNext = newEntry;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void DelayQueue::updateEntry(DelayQueueEntry* entry, DelayInterval newDelay) {</div><div class="code_line">&nbsp;&nbsp;if (entry == NULL) return;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;removeEntry(entry);</div><div class="code_line">&nbsp;&nbsp;entry-&#62;fDeltaTimeRemaining = newDelay;</div><div class="code_line">&nbsp;&nbsp;addEntry(entry);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void DelayQueue::updateEntry(intptr_t tokenToFind, DelayInterval newDelay) {</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry* entry = findEntryByToken(tokenToFind);</div><div class="code_line">&nbsp;&nbsp;updateEntry(entry, newDelay);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void DelayQueue::removeEntry(DelayQueueEntry* entry) {</div><div class="code_line">&nbsp;&nbsp;if (entry == NULL || entry-&#62;fNext == NULL) return;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;entry-&#62;fNext-&#62;fDeltaTimeRemaining += entry-&#62;fDeltaTimeRemaining;</div><div class="code_line">&nbsp;&nbsp;entry-&#62;fPrev-&#62;fNext = entry-&#62;fNext;</div><div class="code_line">&nbsp;&nbsp;entry-&#62;fNext-&#62;fPrev = entry-&#62;fPrev;</div><div class="code_line">&nbsp;&nbsp;entry-&#62;fNext = entry-&#62;fPrev = NULL;</div><div class="code_line">&nbsp;&nbsp;// in case we should try to remove it again</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">DelayQueueEntry* DelayQueue::removeEntry(intptr_t tokenToFind) {</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry* entry = findEntryByToken(tokenToFind);</div><div class="code_line">&nbsp;&nbsp;removeEntry(entry);</div><div class="code_line">&nbsp;&nbsp;return entry;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">DelayInterval const&amp; DelayQueue::timeToNextAlarm() {</div><div class="code_line">&nbsp;&nbsp;if (head()-&#62;fDeltaTimeRemaining == DELAY_ZERO) return DELAY_ZERO; // a common case</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;synchronize();</div><div class="code_line">&nbsp;&nbsp;return head()-&#62;fDeltaTimeRemaining;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void DelayQueue::handleAlarm() {</div><div class="code_line">&nbsp;&nbsp;if (head()-&#62;fDeltaTimeRemaining != DELAY_ZERO) synchronize();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (head()-&#62;fDeltaTimeRemaining == DELAY_ZERO) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;// This event is due to be handled:</div><div class="code_line">&nbsp;&nbsp; &nbsp;DelayQueueEntry* toRemove = head();</div><div class="code_line">&nbsp;&nbsp; &nbsp;removeEntry(toRemove); // do this first, in case handler accesses queue</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;toRemove-&#62;handleTimeout();</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">DelayQueueEntry* DelayQueue::findEntryByToken(intptr_t tokenToFind) {</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry* cur = head();</div><div class="code_line">&nbsp;&nbsp;while (cur != this) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (cur-&#62;token() == tokenToFind) return cur;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cur = cur-&#62;fNext;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return NULL;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void DelayQueue::synchronize() {</div><div class="code_line">&nbsp;&nbsp;// First, figure out how much time has elapsed since the last sync:</div><div class="code_line">&nbsp;&nbsp;_EventTime timeNow = TimeNow();</div><div class="code_line">&nbsp;&nbsp;if (timeNow &#60; fLastSyncTime) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;// The system clock has apparently gone back in time; reset our sync time and return:</div><div class="code_line">&nbsp;&nbsp; &nbsp;fLastSyncTime &nbsp;= timeNow;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;DelayInterval timeSinceLastSync = timeNow - fLastSyncTime;</div><div class="code_line">&nbsp;&nbsp;fLastSyncTime = timeNow;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Then, adjust the delay queue for any entries whose time is up:</div><div class="code_line">&nbsp;&nbsp;DelayQueueEntry* curEntry = head();</div><div class="code_line">&nbsp;&nbsp;while (timeSinceLastSync &#62;= curEntry-&#62;fDeltaTimeRemaining) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;timeSinceLastSync -= curEntry-&#62;fDeltaTimeRemaining;</div><div class="code_line">&nbsp;&nbsp; &nbsp;curEntry-&#62;fDeltaTimeRemaining = DELAY_ZERO;</div><div class="code_line">&nbsp;&nbsp; &nbsp;curEntry = curEntry-&#62;fNext;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;curEntry-&#62;fDeltaTimeRemaining -= timeSinceLastSync;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">///// _EventTime /////</div><div class="code_line">&nbsp;</div><div class="code_line">_EventTime TimeNow() {</div><div class="code_line">&nbsp;&nbsp;struct timeval tvNow;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;gettimeofday(&amp;tvNow, NULL);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return _EventTime(tvNow.tv_sec, tvNow.tv_usec);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">const _EventTime THE_END_OF_TIME(INT_MAX);</div></ol></div></div></div></div>]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3699366</guid>
        <pubDate>Mon, 26 Dec 2016 07:17:12 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3699366</link>
        <description><![CDATA[Fr0sT: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3699084'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-23T09:59:56+00:00">23.12.16, 09:59</time></span><div class='quote '>н придумал ничего лучшего как просто за биндить (BIND) рандомно выбранные порты</div></div><br>
Если порт уже кем-то занят, конструктор вывалит исключение, зачем оно тебе, если порт неважен? Делай в цикле до первого успеха.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3699084'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-23T09:59:56+00:00">23.12.16, 09:59</time></span><div class='quote '>по скольку с камеры прёт только видео h264 то значит получать его надо в структуру (или reord) описывающий данный стандарт (rfc6184), попытался отправить данные в такую структуру, но она как то не верно заполняется</div></div><br>
А ты собираешься еще и видео сам проигрывать (в смысле, разбирать свойства, декодировать кадры, отображать на канвасе)? Если нет, то зачем тебе заголовок, просто скорми поток классу-плееру на свой вкус]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3699084</guid>
        <pubDate>Fri, 23 Dec 2016 09:59:56 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3699084</link>
        <description><![CDATA[woojin: подумал... почитал... посмотрел...<br>
<br>
получилось сделать, на winsock отправку и приём текста для управления камерой<br>
после получения камерой команды PLAY, она начинает вещать/передавать уже по UDP, и в этом случае н придумал ничего лучшего как просто за биндить (BIND) рандомно выбранные порты<br>
выглядит это вот так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TRTSPSocket.SetError(error: Integer);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Ferror := error;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TRTSPSocket.init (const ver: word; const socktype: integer; protocol: integer): boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;iResult: integer;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := true;</div><div class="code_line">&nbsp;&nbsp;iResult := WSAStartup(Fver, vWSAData);</div><div class="code_line">&nbsp;&nbsp;if iResult&#60;&#62;0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetError(WSAGetLastError());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit(false);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;vSocket := socket(AF_INET, socktype, protocol);</div><div class="code_line">&nbsp;&nbsp;if vSocket = INVALID_SOCKET then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetError(WSAGetLastError());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit(false);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TRTSPSocket._GetLocalIP : string;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;HostEnt : PHostEnt;</div><div class="code_line">&nbsp;&nbsp;Name : PAnsiChar;</div><div class="code_line">&nbsp;&nbsp;InAddr : PInAddr;</div><div class="code_line">&nbsp;&nbsp;h_addr_list : MarshaledAStringList;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;GetHostName( Name, $FF );</div><div class="code_line">&nbsp;&nbsp;HostEnt := GetHostByName( Name );</div><div class="code_line">// &nbsp;Result := inet_ntoa( PInAddr( HostEnt.h_addr_list^ )^ );</div><div class="code_line">&nbsp;&nbsp;h_addr_list := HostEnt.h_addr_list;</div><div class="code_line">&nbsp;&nbsp;InAddr := PInAddr( h_addr_list^ );</div><div class="code_line">&nbsp;&nbsp;Result := inet_ntoa( InAddr^ );</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TRTSPSocket.create(const AAddress: string; const APort: integer = 554; ASockType: integer = SOCK_STREAM; AProtocol: integer = IPPROTO_IP): boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;iResult, p : integer;</div><div class="code_line">&nbsp;&nbsp;a : string;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if not init(Fver, ASockType, AProtocol) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetError(WSAGetLastError());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit(false);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;a := _GetLocalIP;</div><div class="code_line">&nbsp;&nbsp;vSockAddrIn.sin_family := AF_INET;</div><div class="code_line">&nbsp;&nbsp;Randomize;</div><div class="code_line">&nbsp;&nbsp;p := Random( 65535 - 1024 ) + 1024;</div><div class="code_line">&nbsp;&nbsp;vSockAddrIn.sin_port := htons( p );</div><div class="code_line">&nbsp;&nbsp;vSockAddrIn.sin_addr.S_addr := inet_addr(PAnsiChar(AnsiString(a)));</div><div class="code_line">// &nbsp;vSockAddrIn.sin_addr.S_addr := inet_addr(PAnsiChar(AnsiString(&#39;10.10.10.10&#39;)));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;vSockAddrOut.sin_family := AF_INET;</div><div class="code_line">&nbsp;&nbsp;vSockAddrOut.sin_port := htons(APort);</div><div class="code_line">&nbsp;&nbsp;vSockAddrOut.sin_addr.S_addr := inet_addr(PAnsiChar(AnsiString(AAddress)));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;iResult := bind(vSocket, vSockAddrIn, sizeof(vSockAddrIn));</div><div class="code_line">&nbsp;&nbsp;if iResult = SOCKET_ERROR then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetError(WSAGetLastError());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit(false);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
камера начинает передавать на нужн(ый/ые) порты данные, они иду кусками, сначала 31 байт, потом 15, потом валит несколько кусков по 1480 (примерно), далее, всё повторяется 31,15,... и так далее<br>
интересно то что если смотреть на лог liveMedia, то там сначала 20 байт, потом 4 и потом разные размеры без остановки<br>
я так понимаю у них читается только первый заголовок, а потом просто идёт складывание всех кусков (пакетов - ХЗ как эти части правильно назвать) и они пропускают следующие заголовки, но опять же не понятно почему такая разница в размерах: у меня 31 и 15 - у них 20 и 4<br>
<br>
по скольку с камеры прёт только видео h264 то значит получать его надо в структуру (или reord) описывающий данный стандарт (<a class='tag-url' href='https://tools.ietf.org/html/rfc6184' target='_blank'>rfc6184</a>), попытался отправить данные в такую структуру, но она как то не верно заполняется<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">/**</div><div class="code_line">&nbsp;&nbsp; Sequence Parameter Set</div><div class="code_line">&nbsp;&nbsp; @see 7.3.2.1 Sequence parameter set RBSP syntax</div><div class="code_line">&nbsp;&nbsp; @see read_seq_parameter_set_rbsp</div><div class="code_line">&nbsp;&nbsp; @see write_seq_parameter_set_rbsp</div><div class="code_line">&nbsp;&nbsp; @see debug_sps</div><div class="code_line">*/</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int profile_idc;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int constraint_set0_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int constraint_set1_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int constraint_set2_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int constraint_set3_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int constraint_set4_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int constraint_set5_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int reserved_zero_2bits;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int level_idc;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int seq_parameter_set_id;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int chroma_format_idc;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int residual_colour_transform_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int bit_depth_luma_minus8;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int bit_depth_chroma_minus8;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int qpprime_y_zero_transform_bypass_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int seq_scaling_matrix_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int seq_scaling_list_present_flag[8];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int* ScalingList4x4[6];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int UseDefaultScalingMatrix4x4Flag[6];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int* ScalingList8x8[2];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int UseDefaultScalingMatrix8x8Flag[2];</div><div class="code_line">&nbsp;&nbsp; &nbsp;int log2_max_frame_num_minus4;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int pic_order_cnt_type;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int log2_max_pic_order_cnt_lsb_minus4;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int delta_pic_order_always_zero_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int offset_for_non_ref_pic;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int offset_for_top_to_bottom_field;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int num_ref_frames_in_pic_order_cnt_cycle;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int offset_for_ref_frame[256];</div><div class="code_line">&nbsp;&nbsp; &nbsp;int num_ref_frames;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int gaps_in_frame_num_value_allowed_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int pic_width_in_mbs_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int pic_height_in_map_units_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int frame_mbs_only_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int mb_adaptive_frame_field_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int direct_8x8_inference_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int frame_cropping_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int frame_crop_left_offset;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int frame_crop_right_offset;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int frame_crop_top_offset;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int frame_crop_bottom_offset;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int vui_parameters_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int aspect_ratio_info_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int aspect_ratio_idc;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int sar_width;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int sar_height;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int overscan_info_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int overscan_appropriate_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int video_signal_type_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int video_format;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int video_full_range_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int colour_description_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int colour_primaries;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int transfer_characteristics;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int matrix_coefficients;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int chroma_loc_info_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int chroma_sample_loc_type_top_field;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int chroma_sample_loc_type_bottom_field;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int timing_info_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int num_units_in_tick;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int time_scale;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int fixed_frame_rate_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int nal_hrd_parameters_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int vcl_hrd_parameters_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int low_delay_hrd_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int pic_struct_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int bitstream_restriction_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int motion_vectors_over_pic_boundaries_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int max_bytes_per_pic_denom;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int max_bits_per_mb_denom;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int log2_max_mv_length_horizontal;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int log2_max_mv_length_vertical;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int num_reorder_frames;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int max_dec_frame_buffering;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} vui;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int cpb_cnt_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int bit_rate_scale;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int cpb_size_scale;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int bit_rate_value_minus1[32]; // up to cpb_cnt_minus1, which is &#60;= 31</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int cpb_size_value_minus1[32];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int cbr_flag[32];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int initial_cpb_removal_delay_length_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int cpb_removal_delay_length_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int dpb_output_delay_length_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int time_offset_length;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} hrd;</div><div class="code_line">&nbsp;</div><div class="code_line">} sps_t;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">/**</div><div class="code_line">&nbsp;&nbsp; Picture Parameter Set</div><div class="code_line">&nbsp;&nbsp; @see 7.3.2.2 Picture parameter set RBSP syntax</div><div class="code_line">&nbsp;&nbsp; @see read_pic_parameter_set_rbsp</div><div class="code_line">&nbsp;&nbsp; @see write_pic_parameter_set_rbsp</div><div class="code_line">&nbsp;&nbsp; @see debug_pps</div><div class="code_line">*/</div><div class="code_line">typedef struct </div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int pic_parameter_set_id;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int seq_parameter_set_id;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int entropy_coding_mode_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int pic_order_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int num_slice_groups_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int slice_group_map_type;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int run_length_minus1[8]; // up to num_slice_groups_minus1, which is &#60;= 7 in Baseline and Extended, 0 otheriwse</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int top_left[8];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int bottom_right[8];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int slice_group_change_direction_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int slice_group_change_rate_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int pic_size_in_map_units_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int slice_group_id[256]; // FIXME what size?</div><div class="code_line">&nbsp;&nbsp; &nbsp;int num_ref_idx_l0_active_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int num_ref_idx_l1_active_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int weighted_pred_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int weighted_bipred_idc;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int pic_init_qp_minus26;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int pic_init_qs_minus26;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int chroma_qp_index_offset;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int deblocking_filter_control_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int constrained_intra_pred_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int redundant_pic_cnt_present_flag;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// set iff we carry any of the optional headers</div><div class="code_line">&nbsp;&nbsp; &nbsp;int _more_rbsp_data_present;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int transform_8x8_mode_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int pic_scaling_matrix_present_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; int pic_scaling_list_present_flag[8];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; int* ScalingList4x4[6];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; int UseDefaultScalingMatrix4x4Flag[6];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; int* ScalingList8x8[2];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; int UseDefaultScalingMatrix8x8Flag[2];</div><div class="code_line">&nbsp;&nbsp; &nbsp;int second_chroma_qp_index_offset;</div><div class="code_line">} pps_t;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">/**</div><div class="code_line">&nbsp;&nbsp;Slice Header</div><div class="code_line">&nbsp;&nbsp;@see 7.3.3 Slice header syntax</div><div class="code_line">&nbsp;&nbsp;@see read_slice_header_rbsp</div><div class="code_line">&nbsp;&nbsp;@see write_slice_header_rbsp</div><div class="code_line">&nbsp;&nbsp;@see debug_slice_header_rbsp</div><div class="code_line">*/</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int first_mb_in_slice;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int slice_type;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int pic_parameter_set_id;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int frame_num;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int field_pic_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int bottom_field_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int idr_pic_id;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int pic_order_cnt_lsb;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int delta_pic_order_cnt_bottom;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int delta_pic_order_cnt[ 2 ];</div><div class="code_line">&nbsp;&nbsp; &nbsp;int redundant_pic_cnt;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int direct_spatial_mv_pred_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int num_ref_idx_active_override_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int num_ref_idx_l0_active_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int num_ref_idx_l1_active_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int cabac_init_idc;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int slice_qp_delta;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int sp_for_switch_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int slice_qs_delta;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int disable_deblocking_filter_idc;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int slice_alpha_c0_offset_div2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int slice_beta_offset_div2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int slice_group_change_cycle;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int luma_log2_weight_denom;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int chroma_log2_weight_denom;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int luma_weight_l0_flag[64];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int luma_weight_l0[64];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int luma_offset_l0[64];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int chroma_weight_l0_flag[64];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int chroma_weight_l0[64][2];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int chroma_offset_l0[64][2];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int luma_weight_l1_flag[64];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int luma_weight_l1[64];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int luma_offset_l1[64];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int chroma_weight_l1_flag[64];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int chroma_weight_l1[64][2];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int chroma_offset_l1[64][2];</div><div class="code_line">&nbsp;&nbsp; &nbsp;} pwt; // predictive weight table</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct // FIXME stack or array</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int ref_pic_list_reordering_flag_l0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int ref_pic_list_reordering_flag_l1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int reordering_of_pic_nums_idc;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int abs_diff_pic_num_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int long_term_pic_num;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} rplr; // ref pic list reorder</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct // FIXME stack or array</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int no_output_of_prior_pics_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int long_term_reference_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int adaptive_ref_pic_marking_mode_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int memory_management_control_operation;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int difference_of_pic_nums_minus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int long_term_pic_num;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int long_term_frame_idx;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int max_long_term_frame_idx_plus1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} drpm; // decoded ref pic marking</div><div class="code_line">&nbsp;</div><div class="code_line">} slice_header_t;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">/**</div><div class="code_line">&nbsp;&nbsp; Access unit delimiter</div><div class="code_line">&nbsp;&nbsp; @see 7.3.1 NAL unit syntax</div><div class="code_line">&nbsp;&nbsp; @see read_nal_unit</div><div class="code_line">&nbsp;&nbsp; @see write_nal_unit</div><div class="code_line">&nbsp;&nbsp; @see debug_nal</div><div class="code_line">*/</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int primary_pic_type;</div><div class="code_line">} aud_t;</div><div class="code_line">&nbsp;</div><div class="code_line">/**</div><div class="code_line">&nbsp;&nbsp; Network Abstraction Layer (NAL) unit</div><div class="code_line">&nbsp;&nbsp; @see 7.3.1 NAL unit syntax</div><div class="code_line">&nbsp;&nbsp; @see read_nal_unit</div><div class="code_line">&nbsp;&nbsp; @see write_nal_unit</div><div class="code_line">&nbsp;&nbsp; @see debug_nal</div><div class="code_line">*/</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int forbidden_zero_bit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int nal_ref_idc;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int nal_unit_type;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void* parsed; // FIXME</div><div class="code_line">&nbsp;&nbsp; &nbsp;int sizeof_parsed;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//uint8_t* rbsp_buf;</div><div class="code_line">&nbsp;&nbsp; &nbsp;//int rbsp_size;</div><div class="code_line">} nal_t;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int _is_initialized;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int sps_id;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int initial_cpb_removal_delay;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int initial_cpb_delay_offset;</div><div class="code_line">} sei_buffering_t;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int clock_timestamp_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int ct_type;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int nuit_field_based_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int counting_type;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int full_timestamp_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int discontinuity_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int cnt_dropped_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int n_frames;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int seconds_value;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int minutes_value;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int hours_value;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int seconds_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int minutes_flag;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int hours_flag;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int time_offset;</div><div class="code_line">} picture_timestamp_t;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int _is_initialized;</div><div class="code_line">&nbsp;&nbsp;int cpb_removal_delay;</div><div class="code_line">&nbsp;&nbsp;int dpb_output_delay;</div><div class="code_line">&nbsp;&nbsp;int pic_struct;</div><div class="code_line">&nbsp;&nbsp;picture_timestamp_t clock_timestamps[3]; // 3 is the maximum possible value</div><div class="code_line">} sei_picture_timing_t;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int rbsp_size;</div><div class="code_line">&nbsp;&nbsp;uint8_t* rbsp_buf;</div><div class="code_line">} slice_data_rbsp_t;</div><div class="code_line">&nbsp;</div><div class="code_line">/**</div><div class="code_line">&nbsp;&nbsp; H264 stream</div><div class="code_line">&nbsp;&nbsp; Contains data structures for all NAL types that can be handled by this library. &nbsp;</div><div class="code_line">&nbsp;&nbsp; When reading, data is read into those, and when writing it is written from those. &nbsp;</div><div class="code_line">&nbsp;&nbsp; The reason why they are all contained in one place is that some of them depend on others, we need to </div><div class="code_line">&nbsp;&nbsp; have all of them available to read or write correctly.</div><div class="code_line">&nbsp;*/</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;nal_t* nal;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sps_t* sps;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pps_t* pps;</div><div class="code_line">&nbsp;&nbsp; &nbsp;aud_t* aud;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sei_t* sei; //This is a TEMP pointer at whats in h-&#62;seis... &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int num_seis;</div><div class="code_line">&nbsp;&nbsp; &nbsp;slice_header_t* sh;</div><div class="code_line">&nbsp;&nbsp; &nbsp;slice_data_rbsp_t* slice_data;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sps_t* sps_table[32];</div><div class="code_line">&nbsp;&nbsp; &nbsp;pps_t* pps_table[256];</div><div class="code_line">&nbsp;&nbsp; &nbsp;sei_t** seis;</div><div class="code_line">&nbsp;</div><div class="code_line">} h264_stream_t;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;int payloadType;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int payloadSize;</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint8_t* payload;</div><div class="code_line">} sei_t;</div></ol></div></div></div></div><br>
это СИшное описание, переделал под Паскалевское<br>
<br>
<br>
<a class='tag-url' href='http://www.live555.com/liveMedia/public/live555-latest.tar.gz' target='_blank'>live555</a><br>
брал данную библиотеку/программу для контроля получаемых данных, хочу сделать нечто подобное (пока с минимальным функционалом) на дельфях<br>
<br>
P.S. и для неё нужна камера, к которой можно данной прогой (из каталога testProgs) подцепится]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3698437</guid>
        <pubDate>Mon, 19 Dec 2016 07:06:22 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3698437</link>
        <description><![CDATA[Fr0sT: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698186'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T14:07:34+00:00">16.12.16, 14:07</time></span><div class='quote '>подцепляюсь с блокировкой (кнопка DESCR) - ни какого ответа пока не нажмёшь на кнопку SETUP - после приходит первый ответ </div></div><br>
А какой может быть ответ, если в Descr ты ничего серверу не отсылаешь?<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698186'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T14:07:34+00:00">16.12.16, 14:07</time></span><div class='quote '>там нет ограничений на количество прочитанного (о чём говорит параметр -1 SetLength(Result, ReceiveBuf(Pointer(nil)^, -1)))</div></div><br>
там нет ограничений на количество прочитанного <strong class='tag-b'>на момент вызова функции</strong>.<br>
1. Пришел пакет с Response pt1<br>
2. Socket.Read<br>
3. Пришел пакет с Response pt2<br>
4. ???<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698186'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T14:07:34+00:00">16.12.16, 14:07</time></span><div class='quote '>примерчик можно?</div></div><br>
Это обычные функции/методы без WSA. recv, send, connect и т.д. См. первую часть статьи Григорьева.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698186'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T14:07:34+00:00">16.12.16, 14:07</time></span><div class='quote '>это получается сервер к серверу будет цепляться?</div></div><br>
Повторяю: я не знаю, как устроен протокол. Смотри в спеки, как там эти порты будут использоваться. Если смущает название &quot;сервер&quot; - окей, пусть это будет &quot;слушающий сокет на клиенте&quot;. Но компонент все равно называется ServerSocket.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698186'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T14:07:34+00:00">16.12.16, 14:07</time></span><div class='quote '>могу дать С++ программу (она правда под FreeBSD) там (для меня) дикий сумбур, но хотелось бы сделать нечто подобное </div></div><br>
Давай]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3698186</guid>
        <pubDate>Fri, 16 Dec 2016 14:07:34 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3698186</link>
        <description><![CDATA[woojin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698149'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T11:41:32+00:00">16.12.16, 11:41</time></span><div class='quote '>При блокирующем режиме должен читать без всяких слипов.</div></div><br>
подцепляюсь с блокировкой (кнопка DESCR) - ни какого ответа пока не нажмёшь на кнопку SETUP - после приходит первый ответ  :( (фигня какая то)<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698149'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T11:41:32+00:00">16.12.16, 11:41</time></span><div class='quote '>Функция прочитает только часть</div></div><br>
там нет ограничений на количество прочитанного (о чём говорит параметр -1 SetLength(Result, ReceiveBuf(Pointer(nil)^, <strong class='tag-b'>-1</strong>)))<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698149'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T11:41:32+00:00">16.12.16, 11:41</time></span><div class='quote '> можно обойтись берклевскими функциями.</div></div><br>
примерчик можно?<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698149'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T11:41:32+00:00">16.12.16, 11:41</time></span><div class='quote '>Насколько я помню, нужен ServerSocket. Но я не знаю, как используется этот порт - клиент у себя открывает или сервер.</div></div><br>
это получается сервер к серверу будет цепляться?<br>
есть пример? (если не сложно)<br>
<br>
P.S. могу дать С++ программу (она правда под FreeBSD) там (для меня) дикий сумбур, но хотелось бы сделать нечто подобное]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3698149</guid>
        <pubDate>Fri, 16 Dec 2016 11:41:32 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3698149</link>
        <description><![CDATA[Fr0sT: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698116'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T08:35:58+00:00">16.12.16, 08:35</time></span><div class='quote '>по поводу этого, мне просто не понятно в каком случае применить блокировку</div></div><br>
Блокировка блокирует выполнение, если в данный момент не получается выполнить функцию прямо сейчас. Т.е. вокруг неблокирующего сокета должна быть обвязка, тем или иным способом повторяющая вызов либо проверяющая результат. В твоем случае легче блокирующий.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698116'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T08:35:58+00:00">16.12.16, 08:35</time></span><div class='quote '>ползал я в System.Win.ScktComp эта функция (на сколько я понимаю, хотя могу и ошибаться) читает полностью весь пакет</div></div><br>
Да, пакет читает. Но что если ответ сервера в него не влезет? Функция прочитает только часть. Т.ч. в идеале надо склеивать в накопитель, искать там &#092;r&#092;n&#092;r&#092;n (конец заголовка), разбирать его, вычленять content-length и считывать тело ответа, если он есть.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698116'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T08:35:58+00:00">16.12.16, 08:35</time></span><div class='quote '>вообще читать ни чего не хочет, кстати интересно что если поставить меньше 300 то тоже ни каких данных не приходит<br>
если использовать OnRead снова ни чего нет, я так понял что надо самому инициализировать чтение потока, по этому сначала отправка сообщения, потом задержка и чтение</div></div><br>
При блокирующем режиме должен читать без всяких слипов.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698116'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T08:35:58+00:00">16.12.16, 08:35</time></span><div class='quote '>P.S. статейка эта Статья :: 2.2. Сокеты Windows : А Григорьев? правильно нашёл?</div></div><br>
Почти, только в WSA не стоит лезть, можно обойтись берклевскими функциями.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698116'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T08:35:58+00:00">16.12.16, 08:35</time></span><div class='quote '>и ещё Bind, Listen, Accept - их можно задать у ClientSocket или придётся всё самому описывать с использованием WinApi.WinSock?</div></div><br>
Насколько я помню, нужен ServerSocket. Но я не знаю, как используется этот порт - клиент у себя открывает или сервер.]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3698116</guid>
        <pubDate>Fri, 16 Dec 2016 08:35:58 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3698116</link>
        <description><![CDATA[woojin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698097'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T07:40:10+00:00">16.12.16, 07:40</time></span><div class='quote '>&quot;ctNonBlocking или ctBlocking - без разницы работает одинаково&quot;</div></div><br>
по поводу этого, мне просто не понятно в каком случае применить блокировку<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698097'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T07:40:10+00:00">16.12.16, 07:40</time></span><div class='quote '>ReceiveText вернет только часть ответа</div></div><br>
ползал я в System.Win.ScktComp эта функция (на сколько я понимаю, хотя могу и ошибаться) читает полностью весь пакет<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function TCustomWinSocket.ReceiveText: AnsiString;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;SetLength(Result, ReceiveBuf(Pointer(nil)^, -1)); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// выставляет длину получаемых данных</div><div class="code_line">&nbsp;&nbsp;SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result))); // и тут уже записывает их в Result</div><div class="code_line">end;</div></ol></div></div></div></div><br>
а вот без этого<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3698097'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-16T07:40:10+00:00">16.12.16, 07:40</time></span><div class='quote '> &quot;sleep(300);&quot;</div></div><br>
вообще читать ни чего не хочет, кстати интересно что если поставить меньше 300 то тоже ни каких данных не приходит<br>
если использовать OnRead снова ни чего нет, я так понял что надо самому инициализировать чтение потока, по этому сначала отправка сообщения, потом задержка и чтение<br>
<br>
P.S. статейка эта <a class='tag-url' href='http://programming-lang.com/ru/comp_programming/grigorev/0/j151.html' target='_blank'>Статья :: 2.2. Сокеты Windows : А Григорьев</a>? правильно нашёл?<br>
и ещё Bind, Listen, Accept - их можно задать у ClientSocket или придётся всё самому описывать с использованием WinApi.WinSock?]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3698097</guid>
        <pubDate>Fri, 16 Dec 2016 07:40:10 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3698097</link>
        <description><![CDATA[Fr0sT: Если надо слушать порт на своей машине, чтобы сервер на него начал передавать поток, то это Bind на порт, Listen, Accept, получение принимающего сокета и затем чтение из него. Если же надо инициировать соединение самому, то это проще - просто еще один clientsocket.<br>А вообще советую почитать статью А. Григорьева про сокеты, чтобы иметь представление о предмете. Потому что &quot;ctNonBlocking или ctBlocking - без разницы работает одинаково&quot;, &quot;sleep(300);&quot; - это тихий ужас. Кроме того, если ответ сервера не уместится в один пакет, то ReceiveText вернет только часть ответа. Надо собирать ответ в буфере, пока не встретится сигнатура завершения, и тогда уже его разбирать.]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3697933</guid>
        <pubDate>Thu, 15 Dec 2016 10:44:38 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3697933</link>
        <description><![CDATA[woojin: сделал на другом компоненте<br>
вроде как получилось, с одним &quot;НО&quot; ни как не могу понять, как подцепится к видео потоку<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;session: string; &nbsp; // глобальная переменная</div><div class="code_line">&nbsp;</div><div class="code_line">// получаю данные с камеры</div><div class="code_line">procedure TForm1.ButtonDescrClick(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;s: string;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;s := &#39;DESCRIBE rtsp://admin:admin@10.10.10.64:554 RTSP/1.0&#39;+#13#10+</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &#39;CSeq: 2&#39;+#13#10+</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &#39;User-Agent: AppName&#39;+#13#10+</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &#39;Accept: application/sdp&#39;+#13#10;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if ClientSocket1.Socket.Connected then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ClientSocket1.Socket.Close;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ClientSocket1.Close;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;ClientSocket1.Port := 554;</div><div class="code_line">&nbsp;&nbsp;ClientSocket1.Address := &#39;10.10.10.64&#39;;</div><div class="code_line">&nbsp;&nbsp;ClientSocket1.ClientType := TClientType(ComboBox1.ItemIndex); // ctNonBlocking или ctBlocking - без разницы работает одинаково</div><div class="code_line">&nbsp;&nbsp;ClientSocket1.Open;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
ответ<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">RTSP/1.0 200 OK</div><div class="code_line">CSeq: 2</div><div class="code_line">Content-Type: application/sdp</div><div class="code_line">Content-Base: rtsp://admin:admin@10.10.10.64:554/</div><div class="code_line">Content-Length: 575</div><div class="code_line">&nbsp;</div><div class="code_line">v=0</div><div class="code_line">o=- 1481815230001505 1481815230001505 IN IP4 10.10.10.64</div><div class="code_line">s=Media Presentation</div><div class="code_line">e=NONE</div><div class="code_line">b=AS:5050</div><div class="code_line">t=0 0</div><div class="code_line">a=control:rtsp://admin:admin@10.10.10.64:554/</div><div class="code_line">m=video 0 RTP/AVP 96</div><div class="code_line">c=IN IP4 0.0.0.0</div><div class="code_line">b=AS:5000</div><div class="code_line">a=recvonly</div><div class="code_line">a=x-dimensions:1280,720</div><div class="code_line">a=control:rtsp://admin:admin@10.10.10.64:554/trackID=1</div><div class="code_line">a=rtpmap:96 H264/90000</div><div class="code_line">a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z0IAII2NQCgC3QgAADhAAAr8gCA=,aM44gA==</div><div class="code_line">a=Media_header:MEDIAINFO=494D4B48010100000400010000000000000000000000000000000000000000000000000000000000;</div><div class="code_line">a=appversion:1.0</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// делаю настройки</div><div class="code_line">procedure TForm1.ButtonSetupClick(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;s: string;</div><div class="code_line">&nbsp;&nbsp;start, finish: integer;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;s := &#39;SETUP rtsp://admin:admin@10.10.10.64:554/trackID=1 RTSP/1.0&#39;+#13#10+</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &#39;CSeq: 3&#39;+#13#10+</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &#39;User-Agent: AppName&#39;+#13#10+</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &#39;Transport: RTP/AVP;unicast;client_port=10024-10025&#39;+#13#10+#13#10; // порты взяты на обум но они свободны</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;ClientSocket1.Socket.SendText(s);</div><div class="code_line">&nbsp;&nbsp;sleep(300);</div><div class="code_line">&nbsp;&nbsp;s := ClientSocket1.Socket.ReceiveText;</div><div class="code_line">&nbsp;&nbsp;start := pos(&#39;Session:&#39;, s)+Length(&#39;Session:&#39;); &nbsp; // \</div><div class="code_line">&nbsp;&nbsp;finish := pos(&#39;;&#39;, s, start); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp;&#62; получаю номер сессии в глобальную переменную session</div><div class="code_line">&nbsp;&nbsp;session := trim(copy(s, start, finish-start)); &nbsp; &nbsp;// /</div><div class="code_line">&nbsp;&nbsp;Memo1.Lines.Add(s);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
ответ<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">RTSP/1.0 200 OK</div><div class="code_line">CSeq: 3</div><div class="code_line">Session: &nbsp; &nbsp; &nbsp; 1471661481;timeout=60</div><div class="code_line">Transport: RTP/AVP;unicast;client_port=10024-10025;server_port=8280-8281;ssrc=509cf2f0;mode=&quot;play&quot;</div><div class="code_line">Date: &nbsp;Thu, Dec 15 2016 15:20:30 GMT</div></ol></div></div></div></div><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// отправляю запрос на проигрывание</div><div class="code_line">procedure TForm1.ButtonPlayClick(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;s: string;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;s := &#39;PLAY rtsp://admin:admin@10.10.10.64:554/ RTSP/1.0&#39;+#13#10+</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &#39;CSeq: 4&#39;+#13#10+</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &#39;User-Agent: AppName&#39;+#13#10+</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &#39;Session: &#39;+ session +#13#10+</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &#39;Range: npt=0.000-&#39;+#13#10+#13#10;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;ClientSocket1.Socket.SendText(s);</div><div class="code_line">&nbsp;&nbsp;sleep(300);</div><div class="code_line">&nbsp;&nbsp;s := ClientSocket1.Socket.ReceiveText;</div><div class="code_line">&nbsp;&nbsp;Memo1.Lines.Add(s);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
ответ<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">RTSP/1.0 200 OK</div><div class="code_line">CSeq: 4</div><div class="code_line">Session: &nbsp; &nbsp; &nbsp; 1471661481</div><div class="code_line">RTP-Info: url=rtsp://admin:admin@10.10.10.64:554/trackID=1;seq=49912;rtptime=665131904</div><div class="code_line">Date: &nbsp;Thu, Dec 15 2016 15:20:30 GMT</div></ol></div></div></div></div><br>
и далее как то надо начать читать поток... но вот как не могу разобраться, т.е. как назначить своему клиенту именно те порты которые я указал выше (10024-10025) и что именно надо писать после внесения данных в лог (Memo1.Lines.Add(s);) что бы началось чтение из указанных портов сервера?<br>
надо ли создавать новы(й/е) компонент(ы) TClientSocket с разными портами сервера (опять же вопрос как назначить свои собственные порты)?<br>
<br>
в логе <strong class='tag-b'>програмки на С++</strong> вот что отображается (часть с предыдущего ответа):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Date: &nbsp;Thu, Dec 15 2016 15:20:30 GMT</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">[URL:&quot;rtsp://admin:admin@10.10.10.64:554/&quot;]: Started playing session...</div><div class="code_line">Stream &quot;rtsp://admin:admin@10.10.10.64:554/&quot;; video/H264: &nbsp; &nbsp;Received 20 bytes. &nbsp; &nbsp; &nbsp;Presentation time: 1481797230.432135!</div><div class="code_line">Stream &quot;rtsp://admin:admin@10.10.10.64:554/&quot;; video/H264: &nbsp; &nbsp;Received 4 bytes. &nbsp; &nbsp; &nbsp; Presentation time: 1481797230.432135!</div><div class="code_line">Stream &quot;rtsp://admin:admin@10.10.10.64:554/&quot;; video/H264: &nbsp; &nbsp;Received 25377 bytes. &nbsp; Presentation time: 1481797230.432135!</div><div class="code_line">Stream &quot;rtsp://admin:admin@10.10.10.64:554/&quot;; video/H264: &nbsp; &nbsp;Received 3025 bytes. &nbsp; &nbsp;Presentation time: 1481797230.472135!</div><div class="code_line">Stream &quot;rtsp://admin:admin@10.10.10.64:554/&quot;; video/H264: &nbsp; &nbsp;Received 3041 bytes. &nbsp; &nbsp;Presentation time: 1481797230.512135!</div></ol></div></div></div></div><br>
<br>
если кто то занимался подобными вещами посоветуйте плиз]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3697324</guid>
        <pubDate>Mon, 12 Dec 2016 07:08:41 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3697324</link>
        <description><![CDATA[Fr0sT: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3697288'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-11T18:37:16+00:00">11.12.16, 18:37</time></span><div class='quote '>это &#092;r&#092;n&#092;r&#092;n? </div></div><br>
Ага.]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3697288</guid>
        <pubDate>Sun, 11 Dec 2016 18:37:16 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3697288</link>
        <description><![CDATA[woojin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3696853'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-07T07:10:06+00:00">07.12.16, 07:10</time></span><div class='quote '>Что такое TcpClient?</div></div><br>
у RAD STUDIO XE5 есть набор компонентов INTENET, это оттуда<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3696853'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-07T07:10:06+00:00">07.12.16, 07:10</time></span><div class='quote '>запрос должен завершаться двумя &#092;r&#092;n</div></div><br>
это &#092;r&#092;n&#092;r&#092;n?]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696853</guid>
        <pubDate>Wed, 07 Dec 2016 07:10:06 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696853</link>
        <description><![CDATA[Fr0sT: Что такое TcpClient? Он синхронный или асинхронный? Что за партизаны, каждый кусок инфы клещами тянуть приходится...<br>
<br>
Не знаю, как там у RTSP, но у HTTP по стандарту запрос должен завершаться <strong class='tag-b'>двумя</strong> &#092;r&#092;n]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696780</guid>
        <pubDate>Tue, 06 Dec 2016 12:32:16 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696780</link>
        <description><![CDATA[woojin: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TForm1.Button3Click(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;request: TRequest;</div><div class="code_line">&nbsp;&nbsp;cmd, h, c: string;</div><div class="code_line">&nbsp;&nbsp;szh, szc: integer;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;cmd := &#39;DESCRIBE rtsp://admin:admin@10.10.10.64:554/ RTSP/1.0&#39; + #13#10 +</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &#39;CSeq: 2&#39; + #13#10 +</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &#39;User-Agent: AppName&#39; + #13#10 +</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &#39;Accept: application/sdp&#39; + #13#10;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TcpClient1.Open;</div><div class="code_line">&nbsp;&nbsp;TcpClient1.Active:=True;</div><div class="code_line">&nbsp;&nbsp;TcpClient1.Sendln(cmd);</div><div class="code_line">// &nbsp;TcpClient1.Receiveln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.TcpClient1Receive(Sender: TObject; Buf: PAnsiChar;</div><div class="code_line">&nbsp;&nbsp;var DataLen: Integer);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Memo1.Lines.Add(&#39;Receive(&#39; + IntToStr(DataLen) + &#39;): &#39; + Buf);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
вот таким кодом отправляю запрос, но в ответ ни чего не получаю без закомментированной строки<br>
если её раскоментировать, то в Memo сразу появляется текст<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">RTSP/1.0 200 OK</div><div class="code_line">CSeq: 2</div><div class="code_line">Content-Type: application/sdp</div><div class="code_line">Content-Base: rtsp://10.10.10.64:554/</div><div class="code_line">Content-Length: 545</div><div class="code_line">&nbsp;</div><div class="code_line">v=0</div><div class="code_line">o=- 1480520940099739 1480520940099739 IN IP4 10.10.10.64</div><div class="code_line">s=Media Presentation</div><div class="code_line">e=NONE</div><div class="code_line">b=AS:5050</div><div class="code_line">t=0 0</div><div class="code_line">a=control:rtsp://10.10.10.64:554/</div><div class="code_line">m=video 0 RTP/AVP 96</div><div class="code_line">c=IN IP4 0.0.0.0</div><div class="code_line">b=AS:5000</div><div class="code_line">a=recvonly</div><div class="code_line">a=x-dimensions:1280,720</div><div class="code_line">a=control:rtsp://10.10.10.64:554/trackID=1</div><div class="code_line">a=rtpmap:96 H264/90000</div><div class="code_line">a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z0IAII2NQCgC3QgAADhAAAr8gCA=,aM44gA==</div><div class="code_line">a=Media_header:</div></ol></div></div></div></div><br>
<br>
но он не полный&#33;<br>
не хватает в конце (после двоеточия)<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">MEDIAINFO=494D4B48010100000400010000000000000000000000000000000000000000000000000000000000;</div><div class="code_line">a=appversion:1.0</div></ol></div></div></div></div>]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696749</guid>
        <pubDate>Tue, 06 Dec 2016 10:09:27 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696749</link>
        <description><![CDATA[Fr0sT: Почему сервер рвет связь - это уж неизвестно. Возможно, ты ему что-то не то скармливаешь. Можешь попробовать отправлять запросы вручную через telnet - вот уж там точно влияние надстроек исключено. Ну а неполное вычитывание, не имея кода, точно никак не проверишь.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3696736'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>woojin &#064; <time class="tag-quote__quoted-time" datetime="2016-12-06T09:13:45+00:00">06.12.16, 09:13</time></span><div class='quote '>а где именно есть?<br>
и что за обёртка - win.sockets и TBaseSocket? </div></div><br>
WinSock, TSocketClient]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696736</guid>
        <pubDate>Tue, 06 Dec 2016 09:13:45 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696736</link>
        <description><![CDATA[woojin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410019&view=findpost&p=3696573'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Fr0sT &#064; <time class="tag-quote__quoted-time" datetime="2016-12-05T06:57:38+00:00">05.12.16, 06:57</time></span><div class='quote '>Все есть, и recv, и классовые обертки.</div></div><br>
а где именно есть?<br>
и что за обёртка - win.sockets и TBaseSocket?]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696670</guid>
        <pubDate>Mon, 05 Dec 2016 17:30:28 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696670</link>
        <description><![CDATA[woojin: да, уровень знаний равен НУЛЮ (((<br>понятно что не полностью читается, но в &quot;индях&quot; первый пакет данных читается полностью, а вот при отправке запроса на второй пакет, вылетает ошибка - почему инди не правильно работает, если там всё &quot;оптимизировано и настроено&quot;?]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696573</guid>
        <pubDate>Mon, 05 Dec 2016 06:57:38 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696573</link>
        <description><![CDATA[Fr0sT: Все есть, и recv, и классовые обертки. Но если уровень познаний в сокетах невелик, то легче использовать Indy.<br>Обрезанные данные - скорее всего потому, что вычитываешь не полностью.]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696512</guid>
        <pubDate>Sun, 04 Dec 2016 14:50:13 +0000</pubDate>
        <title>интерфейс RTSP(554)</title>
        <link>https://forum.sources.ru/index.php?showtopic=410019&amp;view=findpost&amp;p=3696512</link>
        <description><![CDATA[woojin: всем привет&#33;<br>
<br>
надо сделать интерфейс общения с IP камерой, через RTSP<br>
уже нашёл описание данного стандарта (правда на английском, но это не проблема)<br>
<br>
на данный момент не получается правильно последовательно считать данные с камеры<br>
<br>
отправляю запрос:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&#39;DESCRIBE rtsp://admin:admin@10.10.10.64:554/ RTSP/1.0&#39; + #13#10 +</div><div class="code_line">&#39;CSeq: 2&#39; + #13#10 +</div><div class="code_line">&#39;User-Agent: AppName&#39; + #13#10 +</div><div class="code_line">&#39;Accept: application/sdp&#39; + #13#10;</div></ol></div></div></div></div><br>
<br>
назад получаю не полные данные, что именно я должен получить я знаю, но вот приходят они частично обрезанные<br>
<br>
получилось считать целиком при помощи IdTCPClient<br>
но второй запрос уже обрабатываться не хочет, т.е. отсылаю его, а мне в ответ ошибка 10054<br>
<br>
подскажите как правильно отправить/получить данные<br>
<br>
P.S. разве в нет в дельфи аналогов функций SEND, RECV и обязательно надо использовать подключение заголовочного файла из &quot;си&quot;]]></description>
        <author>woojin</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	