2013年5月30日 星期四

[轉] 達夫設備(Duff's Device)的詳細說明

轉載自 http://blog.csdn.net/kingmax26/article/details/5252657

达夫设备(Duff's Device)的详细说明


前几天在网上看见了一段代码,叫做“Duff's Device”,后经验证它曾出现在Bjarne的TC++PL里面: 

代码的结构显得非常巧妙,把一个switch语句和一个do-while语句糅合在了一起。而在我看过的所有关于C和C++的书中,这样的代码都 是毫无道理的。然而,无论是在VS2005还是在GCC4.1.2下,这段代码都能正确地通过编译。加上适当的main函数,它都可以正常运行。我百思不 得其解。上网去查,也没查到好答案。

怎么办?先看看它的汇编代码吧,也许可以通过它的汇编代码看出它的意思。

2013年5月28日 星期二

ONVIF -- Multicast 問題分析經驗談

在進行 ONVIF Device Test Tool v12.12 的測試過程中,當測試 ONVIF 的 startMulticast 命令時,送出 Audio 時總是無法通過測試工具的檢驗,後來釐清是因為 profile s中規定 audio需要設定為 PCM-ulaw 的關係,但因此也學習了許多與 multicast 有關的知識。

以下將以 startMulticast 為例,整理幾個分析 multicast 的小技巧。

預備知識

StartMulticast 命令所做的事情,就是根據某個已經設定好的 profile,啟動 multicast streaming,可能同時包含 video 與 audio。原文摘錄如下:
This command starts multicast streaming using a specified media profile of an NVT. Streaming continues until StopMulticastStreaming is called for the same Profile. The streaming shall continue after a reboot of the NVT until a StopMulticastStreaming request is received. The multicast address, port and TTL are configured in the VideoEncoderConfiguration, AudioEncoderConfiguration and MetadataConfiguration respectively. An NVT that supports video, audio or metadata multicast streaming shall support the starting of a multicast stream through the StartMulticastStreaming command. 

2013年5月22日 星期三

FFMPEG -- Save streaming data as image in iOS

近期需要在 iPhone 的串流應用程式加上擷取圖片的功能,將自己的實作經驗作一整理。

Step 1. 使用FFMPEG取得串流內的影像資料,並進行解碼
av_read_frame(pFormatCtx, &packet); avcodec_decode_video2(videoCodecCtx, DecodedFrame, &frameFinished, & packet);

2013年5月21日 星期二

MTOM (Message Transmission Optimization Mechanism)


當我們要在 xml 中傳送一組binary資料時,一般的作法是將此資料先使用Base64編碼,再送出,如此會使得此資料大小增加為原本的 4/3 倍。

為此,W3C定義了MTOM方法,當傳送大量的資料時,可以減少所需的資料傳輸量。
MTOM 的原理是使用 XOP (XML-binary Optimized Packaging) 來封裝 binary 資料,目前 XOP 只定義使用一種封裝方法,就是 MIME Multipart/Related。

以下將介紹一個 MTOM 的例子,並介紹如何利用 gSOAP 取得 MTOM 資料

2013年5月15日 星期三

ONVIF -- Update System Firmware


1. ONVIF 設計了兩個命令,可用來更新系統韌體,分別是 UpgradeSystemFirmware 與 StartFirmwareUpgrade。
a. UpgradeSystemFirmware
其作法是使用 HTTP Post 送出一個 UpgradeSystemFirmware Request,直接將 Firmware 以 MTOM 的編碼方式放在此 http 封包中,傳送給 IPCAM,進行韌體更新。MTOM簡介可參考這裡

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

2013年5月13日 星期一

ONVIF -- soap-env 的 namespace 問題


問題描述
在進行 NVR 互測時,發現彼此雙方對於 SOAP-ENV 的 namespace 認知不同。
NVR針對 SOAP-ENV 只能看懂 "http://schemas.xmlsoap.org/soap/envelope/" (以下簡稱 A),卻不允許 "http://www.w3.org/2003/05/soap-envelope" (以下簡稱 B)

根據 OVNIF 官方 spec 演進,看來是新舊版本的關係
  • (2011/02) Reference_of_ONVIF_Development_v1 01 02.pdf 使用 A 
  • (2011/06) ONVIF-Core-Spec-v210.pdf 使用 B 
  • (2012/01) ONVIF-Core-Specification-v211.pdf 使用 B 
  • (2012/12) ONVIF-Core-Specification-v221.pdf 使用 B

2013年5月4日 星期六

WIFI 下分析網路問題的方法

近日在 iPad 上實作上的串流應用時,遇到一個奇怪的問題,串流播放約五分鐘後,WIFI 便會中斷,接著過幾十秒之後,WIFI又恢復正常,可以正常播放。

我們懷疑這可能是 iOS 本身的檢查網路機制,又或者是WIFI網路的問題。趁著這次機會,我好好研究了一下如何在 WIFI 下,捉取同一個網路內其他機器的網路封包,並進行問題分析的方法。

首先挑選捉取網路封包的工具,一開始我想使用 Debookee,但試用了之後,才發現不符合我的需求,因此最後仍使用 wireshark,在 Mac OS 10.8.2 下進行問題分析。