2013年5月14日 星期二

JPEG over RTP when resolution larger then 2040*2040


參考 rfc2435,當使用 RTP 傳送封包時,此處定義的長寬最大值為2040。那麼當超過 2040 時,應該如何實作呢?? 以下提供幾種作法當作參考。


一、參考 rfc5371,使用 JPEG2000 的作法
作法是在 SDP 內加以描述,範例如下:
m=video 49170/2 RTP/AVP 98
a=rtpmap:98 jpeg2000/90000
a=fmtp:98 sampling=YCbCr-4:2:0;width=128;height=128



二、參考 ONVIF-Streaming-Spec-v221.pdf 定義的 JPEG over RTP
作法是使用 rfc3550 定義的 RTP Extension,說明如下: 
  1. 如果 image size < 2040*2040,那麼使用原本 rfc2435 定義的欄位來放置 width, height。 
  2. 如果 image size 超出 rfc2435 限制(大於2040),那麼首先設定 RTP header 中的 X-bit(Extension),表示將使用 RTP 定義的 extension 功能,RTP header 請參考 http://albert-oma.blogspot.tw/2012/05/rtp.html
  3. 接著新增 RTP extension header(ONVIF定義的extension使用0xFFD8當成識別碼),讓接收端了解此RTP會支援 ONVIF 定義的 JPEG over RTP。此部份請參考下圖。
  4. 將 rfc2435 所定義的 RTP/JPEG header 的 width, height 設定為 0。
  5. 將正確的 width, height 值設定在 JPEG spec 所定義的 SOF marker 中,並將此 marker 加入 RTP extension payload。
  6. 接收端若在 decode 時發現此封包已經設定 X-bit,而且width/height=0,便應該要知道需要去解開 extension payload 中的 SOF marker,並由此得知正確的 width/height.
  7. 需注意的是此處的 SOF marker 並非存在於 JPEG 中,而是應該存在於 RTP extension payload。實作時可以直接複製 JPEG 的 SOF marker,當成 RTP extension 即可。  

以下摘錄一個 SOF marker 的例子,圖片請參考這裡
FF C0 00 11 08 06 00 08 00 03 01 22 00 02 11 01 03 11 01
SOF marker其說明如下:
標記固定值為 0xFFCO
長度(包含長度本身,但不包含 FFC0)  0x0011=17
精度,每個顏色分量每個圖元的位元數 (bits per pixel per color component)  0x08
圖像高度 0x0600 = 1536
圖像寬度 0x0800 = 2048
顏色分量數(number of color components) 0x03
顏色分量信號(for each component) 01 22 00 02 11 01 03 11 01

三、自己訂
在 SDP中,加入 extension attribute,例如:"a=x-CompanyName-Width",

四、其他網路上的用法
透過 Google 大師,發現網路上慣用的用法有 "x-dimensions" 和 "cliprect",不過這部份不確定是參考哪份spec制定而成。

註1:H.264可以直接從 SPS 中取得取得 width/height (pic_width_in_mbs_minus1 與 pic_height_in_map_units_minus1),並不一定要從 RTP header中得知,因此並不會有上述 2040 上限的問題。

註2:"x-dimensions" 實作在 live555 的 MediaSession.cpp,摘錄 openRTSP 說明如下:
Alternatively, if the session's SDP description contains the media-level attribute "a=x-dimensions: ,", then these values will be used instead (in which case you won't need to use the "-w" and "-h" options). Similarly, if the session's SDP description contains the media-level attribute "a=x-framerate: ", then this value will be used instead (in which case you won't need to use the "-f" option).



參考資料
a. RTP Payload Format for JPEG 2000 Video Streams (2008/10)
    http://tools.ietf.org/html/rfc5371
b. RTP Payload Format for JPEG-compressed Video (1998/10)
    http://tools.ietf.org/html/rfc2435
c. ONVIF ONVIF-Streaming-Spec-v221.pdf
    chapter 5.1.4 JPEG over RTP
d. RTP: A Transport Protocol for Real-Time Applications
    http://www.ietf.org/rfc/rfc3550.txt
e. http://en.wikipedia.org/wiki/JPEG
f. http://el.mdu.edu.tw/datacos/09922312044A/JPEG002.pdf