home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 July / VPR0107B.BIN / DRIVER / CANOPUS / MVR32 / mvr32.exe / data1.cab / MpegTransfer_J / Vc / Samples / Com / MpegTransfer.txt
Text File  |  2001-02-09  |  17KB  |  375 lines

  1.                                                                     2000/2/24
  2.                                                                     Ver 1.00
  3. MpegTransfer(MPEG2プログラム・ストリーム転送ライブラリ)について
  4.                                                             カノープス株式会社
  5.  
  6. 1 概要
  7.     (1) MpegTransferは、MPEG2プログラム・ストリームのネットワーク経由での転送機能を実現する、C++クラス・ライブラリである。
  8.     (2) MpegTransferは、C++ソース・ファイルで提供される。
  9.     (3) ネットワーク・プロトコルとしては、UDP/IPを用いる。
  10.     (4) ネットワーク・プロトコルへのアクセスは、Windows Socket 2経由で実行される。
  11.     (5) MVR-D2000の制御は、MVR-D2000 SDK(以下、SDKと略記)が提供するAPIを用いて実行される。
  12.     (5) プログラムは、Microsoft VC++ 6.0(with service pack 3)を用いて開発されている。
  13.  
  14. 2 ファイル一覧
  15.  
  16.     .\MpegTransfer.txt
  17.         このファイル自身
  18.     .\MpegTransfer\
  19.         MpegTransfer C++クラスのソース・ファイル群
  20.     .\Encode_cEx\
  21.         MpegTransferを用いた送信サンプル・プログラムEncode_cEx.exeのソース・ファイル群
  22.     .\Decode_cEx\
  23.         MpegTransferを用いた受信サンプル・プログラムDecode_cEx.exeのソース・ファイル群
  24.     .\bin\
  25.         Debug\
  26.             デバッグ版Encode_cEx.exe、Decode_cEx.exe
  27.         Release\
  28.             リリース版Encode_cEx.exe、Decode_cEx.exe
  29.  
  30. 3 MpegTransfer C++クラス
  31. 3-1 クラス階層
  32.     CObject                 MFC 基底クラス
  33.      |
  34.      +--CMpegTransfer       CMpegSender/CMpegTransferのための基底クラス
  35.          |
  36.          +--CMpegSender     送信クラス
  37.          |
  38.          +--CMpegReceiver   受信クラス
  39.  
  40. 3-2 CMpegTransfer
  41.     CMpegSender/CMpegReceiverの基底クラス。アプリが直接CMpegTransferのインスタンスを生成することはない。
  42.     以下に、公開(public)メンバを列挙する。
  43.  
  44.     static const DWORD m_cbBuffDefault;
  45.         32KB。SDKメモリ転送バッファ・サイズ(ENC_BSS_PARAMETER.cbBuff/DEC_BSR_PARAMETER.cbBuff)であり、
  46.         同時に、(ネットワーク経由での)1回の送信/受信サイズのディフォルト値。
  47.  
  48.     static const DWORD m_cBuffDefault;
  49.         16。SDKメモリ転送バッファ数(ENC_BSS_PARAMETER.cBuff/DEC_BSR_PARAMETER.cBuff)のディフォルト値。
  50.  
  51.     CMpegTransfer(UINT nId = 1);
  52.         入力
  53.             nId
  54.                 SDKエンコーダ/デコーダ識別子
  55.  
  56.     static BOOL StartUp();
  57.         Ws2_32.dllにWinSock2の使用を開始することを通知する。
  58.         アプリの起動直後に1回だけ呼び出さなければならない。
  59.  
  60.     static BOOL CleanUp();
  61.         Ws2_32.dllにWinSock2の使用を終了することを通知する。
  62.         アプリの終了直前に1回だけ呼び出さなければならない。
  63.  
  64.     static BOOL SetSockAddrIn(LPCTSTR pszAddress, WORD nPort, LPSOCKADDR_IN pAddr);
  65.         インターネット・アドレス文字列とポート#からソケット・アドレス(SOCKADDR_IN)を生成する。
  66.         返値
  67.             成功すると、0以外の値を返す。失敗すると、0を返す。
  68.         入力
  69.             pszAddress
  70.                 インターネット・アドレス文字列
  71.             nPort
  72.                 ポート#
  73.         出力
  74.             pAddr
  75.  
  76.     static int SendOverlapped(SOCKET hSocket, int fSocketType, LPVOID pBuff, DWORD cbBuff, LPDWORD pcbSent,
  77.         LPSOCKADDR_IN pAddr = NULL);
  78.         1回分の送信をWin32 overlapped IOで実行する。
  79.         返値
  80.             成功すると、0を返す。失敗すると、0以外の値を返す。
  81.         入力
  82.             hSocket
  83.                 Win32 ソケット・ハンドル
  84.             fSocketType
  85.                 TCP(SOCK_STREAM)またはUDP(SOCK_DGRAM)を指定する。
  86.             pBuff
  87.                 送信バッファ
  88.             cbBuff
  89.                 送信サイズ
  90.             pAddr
  91.                 UDPの場合の、相手先のソケット・アドレスを指定する。TCPの場合は不要。
  92.         出力
  93.             pcbSent
  94.                 実際に送信したバイト数
  95.  
  96.     static int ReceiveOverlapped(SOCKET hSocket, int fSocketType, LPVOID pBuff, DWORD cbBuff, LPDWORD pcbReceived,
  97.         LPSOCKADDR_IN pAddr = NULL);
  98.         1回分の受信をWin32 overlapped IOで実行する。
  99.         返値
  100.             成功すると、0を返す。失敗すると、0以外の値を返す。
  101.         入力
  102.             hSocket
  103.                 Win32 ソケット・ハンドル
  104.             fSocketType
  105.                 TCP(SOCK_STREAM)またはUDP(SOCK_DGRAM)を指定する。
  106.             pBuff
  107.                 受信バッファ
  108.             cbBuff
  109.                 受信サイズ
  110.             pAddr
  111.                 UDPの場合の、相手先のソケット・アドレスを指定する。TCPの場合は不要。
  112.         出力
  113.             pcbReceived
  114.                 実際に受信したバイト数
  115.  
  116.     operator SOCKET();
  117.         返値
  118.             Win32 ソケット・ハンドルを返す。
  119.  
  120.     LPSOCKADDR_IN Addr();
  121.         返値
  122.             ローカル・マシンのソケット・アドレスを返す。
  123.  
  124.     LPSOCKADDR_IN AddrOpposite();
  125.         返値
  126.             相手先のマシンののソケット・アドレスを返す。
  127.  
  128.     virtual BOOL Connect(LPCTSTR pszAddress, WORD nPort, LPCTSTR pszAddressOpposite);
  129.         ソケットを生成する。
  130.         返値
  131.             成功すると、0以外の値を返す。失敗すると、0を返す。
  132.         入力
  133.             pszAddress
  134.                 ローカル・マシンのインターネット・アドレス文字列
  135.             nPort
  136.                 ポート#
  137.             pszAddressOpposite
  138.                 相手先のマシンのインターネット・アドレス文字列
  139.  
  140.     virtual BOOL Disconnect();
  141.         ソケットをクローズする。
  142.         返値
  143.             成功すると、0以外の値を返す。失敗すると、0を返す。
  144.  
  145. 3-3 CMpegSender
  146.     エンコード及びエンコード結果の送信を実行するクラス。
  147.     使用例としては、Encode_cExのソース・ファイル参照。
  148.     以下に、公開(public)メンバを列挙する。
  149.  
  150.     CMpegSender(UINT nEncId);
  151.         入力
  152.             nEncId
  153.                 SDKエンコーダ識別子
  154.  
  155.     static BOOL Init(UINT nEncId, CMpegSender* pSender = NULL,
  156.         ENC_CB_STATUS pfnStatus = NULL, ENC_CB_ERROR pfnError = NULL, ENC_CB_VOBU_ENT pfnVobuEnt = NULL);
  157.         エンコーダを初期化する。
  158.         返値
  159.             成功すると、0以外の値を返す。失敗すると、0を返す。
  160.         入力
  161.             nEncId
  162.                 SDKエンコーダ識別子
  163.             pSender
  164.                 CMpegSenderのインスタンス。CMpegSenderのインスタンスがまだ生成されていない場合は、NULLを指定する。
  165.             pfnStatus
  166.             pfnError
  167.             pfnVobuEnt
  168.                 SDK ENC_Set_Callback APIに渡す引数と同一。詳細は、SDKマニュアル参照。
  169.         備考
  170.             通常は、CMpegSenderのインスタンスがまだ生成されていない段階でエンコーダを初期化したい場合に使用する。
  171.             CMpegSenderのインスタンスにエンコーダを初期化したい場合は、下記の(staticでない)Initメンバを使用する。
  172.  
  173.     static BOOL Exit(UINT nEncId);
  174.         エンコーダの使用を終了する。
  175.         返値
  176.             成功すると、0以外の値を返す。失敗すると、0を返す。
  177.         入力
  178.             nEncId
  179.                 SDKエンコーダ識別子
  180.         備考
  181.             通常は、CMpegSenderのインスタンスの削除後にエンコーダの使用を終了したい場合に使用する。
  182.             CMpegSenderのインスタンスがまだ存在する間にエンコーダの使用を終了したい場合は、
  183.             下記の(staticでない)Exitメンバを使用する。
  184.  
  185.     BOOL Init(ENC_CB_STATUS pfnStatus = NULL, ENC_CB_ERROR pfnError = NULL, ENC_CB_VOBU_ENT pfnVobuEnt = NULL);
  186.         エンコーダを初期化する。
  187.         返値
  188.             成功すると、0以外の値を返す。失敗すると、0を返す。
  189.         入力
  190.             pfnStatus
  191.             pfnError
  192.             pfnVobuEnt
  193.                 SDK ENC_Set_Callback APIに渡す引数と同一。詳細は、SDKマニュアル参照。
  194.         備考
  195.             通常は、CMpegSenderのインスタンスにエンコーダを初期化したい場合に使用する。
  196.             CMpegSenderのインスタンスがまだ生成されていない段階でエンコーダを初期化したい場合は、
  197.             上記の(static)Initメンバを使用する。
  198.  
  199.     BOOL Exit();
  200.         エンコーダの使用を終了する。
  201.         返値
  202.             成功すると、0以外の値を返す。失敗すると、0を返す。
  203.         備考
  204.             通常は、CMpegSenderのインスタンスがまだ存在する間にエンコーダの使用を終了したい場合に使用する。
  205.             CMpegSenderのインスタンスの削除後にエンコーダの使用を終了したい場合は、上記の(static)Exitメンバを使用する。
  206.  
  207.     BOOL SendStart(DWORD cbBssBuff = m_cbBuffDefault, DWORD cBssBuff = m_cBuffDefault);
  208.         エンコード及びエンコード結果の送信を開始する。
  209.         返値
  210.             成功すると、0以外の値を返す。失敗すると、0を返す。
  211.         入力
  212.             cbBssBuff
  213.                 SDKメモリ転送バッファ・サイズ(ENC_BSS_PARAMETER.cbBuff)であり、
  214.                 同時に、(ネットワーク経由での)1回の送信サイズ。ディフォルトは、32KB。
  215.             cBuff
  216.                 SDKメモリ転送バッファ数(ENC_BSS_PARAMETER.cBuff)。ディフォルトは、16。
  217.  
  218.     BOOL SendStop();
  219.         エンコード及びエンコード結果の送信を終了する。
  220.         返値
  221.             成功すると、0以外の値を返す。失敗すると、0を返す。
  222.  
  223. 3-4 CMpegReceiver
  224.     MPEG2プログラム・ストリームの受信、及び、受信結果のデコードを実行するクラス。
  225.     デコーダとしてMPL-D2000(改)が使用されている場合は、CMpegReceiver内部の受信バッファ及びSDK内部のデコーダ・バッファの
  226.     空き具合に応じてデコーダ・マスター・クロックを切り替える。
  227.     使用例としては、Decode_cExのソース・ファイル参照。
  228.     以下に、公開(public)メンバを列挙する。
  229.  
  230.     CMpegReceiver(UINT nDecId);
  231.         入力
  232.             nDecId
  233.                 SDKデコーダ識別子
  234.  
  235.     static BOOL Init(UINT nDecId, CMpegReceiver* pReceiver = NULL, DEC_CB_STATUS pfnStatus = NULL, DEC_CB_ERROR pfnError = NULL);
  236.         デコーダを初期化する。
  237.         返値
  238.             成功すると、0以外の値を返す。失敗すると、0を返す。
  239.         入力
  240.             nDecId
  241.                 SDKデコーダ識別子
  242.             pSender
  243.                 CMpegReceiverのインスタンス。CMpegSenderのインスタンスがまだ生成されていない場合は、NULLを指定する。
  244.             pfnStatus
  245.             pfnError
  246.                 SDK DEC_Set_Callback APIに渡す引数と同一。詳細は、SDKマニュアル参照。
  247.         備考
  248.             通常は、CMpegReceiverのインスタンスがまだ生成されていない段階でデコーダを初期化したい場合に使用する。
  249.             CMpegReceiverのインスタンスにデコーダを初期化したい場合は、下記の(staticでない)Initメンバを使用する。
  250.  
  251.     static BOOL Exit(UINT nDecId);
  252.         デコーダの使用を終了する。
  253.         返値
  254.             成功すると、0以外の値を返す。失敗すると、0を返す。
  255.         入力
  256.             nDecId
  257.                 SDKデコーダ識別子
  258.         備考
  259.             通常は、CMpegReceiveのインスタンスの削除後にデコーダの使用を終了したい場合に使用する。
  260.             CMpegReceiveのインスタンスがまだ存在する間にデコーダの使用を終了したい場合は、
  261.             下記の(staticでない)Exitメンバを使用する。
  262.  
  263.     BOOL Init(DEC_CB_STATUS pfnStatus = NULL, DEC_CB_ERROR pfnError = NULL);
  264.         デコーダを初期化する。
  265.         返値
  266.             成功すると、0以外の値を返す。失敗すると、0を返す。
  267.         入力
  268.             pfnStatus
  269.             pfnError
  270.                 SDK DEC_Set_Callback APIに渡す引数と同一。詳細は、SDKマニュアル参照。
  271.         備考
  272.             通常は、CMpegReceiveのインスタンスにデコーダを初期化したい場合に使用する。
  273.             CMpegReceiverのインスタンスがまだ生成されていない段階でデコーダを初期化したい場合は、
  274.             上記の(static)Initメンバを使用する。
  275.  
  276.     BOOL Exit();
  277.         デコーダの使用を終了する。
  278.         返値
  279.             成功すると、0以外の値を返す。失敗すると、0を返す。
  280.         備考
  281.             通常は、CMpegReceiverのインスタンスがまだ存在する間にデコーダの使用を終了したい場合に使用する。
  282.             CMpegReceiverのインスタンスの削除後にデコーダの使用を終了したい場合は、上記の(static)Exitメンバを使用する。
  283.  
  284.     BOOL ReceiveStart(DWORD cbBssBuff = m_cbBuffDefault, DWORD cBssBuff = m_cBuffDefault);
  285.         MPEG2プログラム・ストリームの受信、及び、受信結果のデコードを開始する。
  286.         返値
  287.             成功すると、0以外の値を返す。失敗すると、0を返す。
  288.         入力
  289.             cbBssBuff
  290.                 SDKメモリ転送バッファ・サイズ(ENC_BSR_PARAMETER.cbBuff)であり、
  291.                 同時に、(ネットワーク経由での)1回の受信サイズ。ディフォルトは、32KB。
  292.             cBuff
  293.                 SDKメモリ転送バッファ数(ENC_BSR_PARAMETER.cBuff)。ディフォルトは、16。
  294.  
  295.     BOOL ReceiveStop();
  296.         MPEG2プログラム・ストリームの受信、及び、受信結果のデコードを終了する。
  297.         返値
  298.             成功すると、0以外の値を返す。失敗すると、0を返す。
  299.  
  300. 4 サンプル・プログラム(Encode_cEx.exe/Decode_cEx.exe)の使用方法
  301. 4-1 一回の実行毎に、下記を繰り返す。
  302.     (1) 接続オプションの設定
  303.         ローカル・アドレス、ポート#、相手先のアドレスを入力する。
  304.     (2) 接続
  305.         接続は、Encode_cEx.exe、Decode_cEx.exeのどちらで先に実行してもかまわないl。
  306.     (3) 送信/受信オプションの設定
  307.         バッファ・サイズは、Encode_cEx.exeとDecode_cEx.exeで同じ値を設定しなければならない。
  308.     (4) 送信/受信開始
  309.         Decode_cEx.exeで受信を開始した後、Encode_cEx.exeで送信を開始する。
  310.         Decode_cEx.exeは、受信を開始すると、受信待ちで待機する。
  311.         Encode_cEx.exe~Decode_cEx.exe間でのハンド・シェーク(例えば、Deocode_cEx.exeから送信開始要求を送る等)は実装していない。
  312.     (5) 送信/受信終了
  313.         先にEncode_cEx.exeで送信終了を実行すると、Decode_cEx.exeの受信も自動的に終了する。
  314.         先にDecode_cEx.exeで受信を終了した場合は、Encode_cEx.exeは自動的には送信終了しないので、コマンド・メニューから
  315.         明示的に送信終了を実行しなければならない。
  316.         通常は、先にEncode_cEx.exeで送信終了を実行する。
  317.         Encode_cEx.exe~Decode_cEx.exe間でのハンド・シェーク(例えば、Deocode_cEx.exeから送信終了要求を送る等)は実装していない。
  318.     (6) 切断
  319.         切断は、Encode_cEx.exe、Decode_cEx.exeのどちらで先に実行してもかまわない。
  320.  
  321. 4-2 Encode_cEx.exe/Decode_cEx.exeは、プロセス(Encode_cEx.exe/Decode_cEx.exeの実行中のインスタンス)1個当たり、
  322.     1枚のMVR-D2000カードを使用する。
  323.  
  324.     複数枚のMVR-D2000カードを装着したPC上で、同時に複数のEncode_cEx.exeを動作させたい場合は、
  325.     2個め以降のEncode_cEx.exeに対し、下記の様に、起動オプションとしてエンコーダID(SDKのエンコーダID)を指定する。
  326.         Encode_cEx.exe /id:n (n = 2, 3, ...)
  327.     例えば、2個めのEncode_cEx.exeに対しては、下記の様に指定する。
  328.         Encode_cEx.exe /id:2
  329.     /idオプションが省略された場合、Encode_cEx.exeはエンコーダID = 1で実行される。
  330.  
  331.     同様に、同時に複数のDecode_cEx.exeを動作させたい場合は、
  332.     2個め以降のDecode_cEx.exeに対し、下記の様に、起動オプションとしてデコーダID(SDKのデコーダID)を指定する。
  333.         Decode_cEx.exe /id:n (n = 2, 3, ...)
  334.     /idオプションが省略された場合、Decode_cEx.exeはデコーダID = 1で実行される。
  335.  
  336. 5 実績
  337.     (1) 10Mbpsのイーサネット回線で接続したPC間で、Encode_cEx.exe及びDecode_cEx.exeを用いて、
  338.         ビデオ=6Mbpsまで、オーディオ=224kbpsのMPEG2プログラム・ストリームの転送動作を確認している。
  339.         但し、Windows 98ではWindows NTに比べて受信が遅いので、薦められない。
  340.     (2) エンコード~デコード間の遅延時間
  341.         以下では、ビデオ=6Mbpsの場合を例として、ビデオのビット・レートから遅延時間を概算する。
  342.         実際のビット・レートでは、オーディオのビット・レート、及び、プログラム・ストリームとしての付加情報
  343.         (パック・ヘッダ、PESヘッダ等)によるビット・レートの増加分が含まれるが、これらの値はビデオのビット・レート
  344.         と比較すると小さいので、概算では無視しても問題ない。
  345.         (a) MVR-D2000のエンコーダが実行を開始してからデータを出力し始めるまでの遅延時間は、ビット・レートに無関係に
  346.             一定であり、通常、約0.06~0.1秒である。
  347.         (b) MVR-D2000のドライバ(MvrAvc.dll)は、内部のデコーダ・バッファが一杯になるまではデコードを開始しない。
  348.             このことによる遅延時間は、
  349.                 32KB × 16 ÷ (6Mbps ÷ 8) = 0.70秒
  350.             となる。
  351.         (c) MPEGデータには、デコード開始時の初期遅延が設定されている。MP@MLの場合の初期遅延は、
  352.                 1835008bits ÷ 6Mbps = 0.31秒
  353.         以上から、遅延時間の合計は、1.11秒(0.1 + 0.70 + 0.31)となる。
  354.         (a)~(c)のうち、(b)は、バッファ・サイズの変更で小さくすることができる。バッファ・サイズを16KBにすると、
  355.         (b)は0.35秒になり、遅延時間の合計は、0.76秒に短縮される。
  356.         Encode_cEx.exe/Decode_cEx.exeを動作させて元の映像と再生映像との時間差を計った結果は、上記の時間に一致している。
  357.         即ち、現在の実装では無駄なオーバーヘッドはないと言える。
  358.  
  359.         以上から、遅延時間を短くするにはバッファ・サイズを小さくすれば良いことになるが、逆に、小さくし過ぎると
  360.         転送が間に合わなくなる。
  361.         下表に、ビデオのビット・レートとバッファ・サイズの下限値(目安)を示す。
  362.  
  363.             ビデオ(Mbps)    バッファ・サイズ(KB)    遅延時間(秒)
  364.             ----------------------------------------------------
  365.             6               16 × 16                0.76
  366.             4               16 × 16                1.08
  367.             2                8 × 16                1.53
  368.  
  369. 6 備考
  370.     (1) Window Socket 2の実装では、APIが失敗しても、WSAGetLastError APIがエラー・コードを返さない(代わりに、0を返す)
  371.         場合がよくある。
  372.     (2) 当初のMpegTransferではネットワーク・プロトコルとしてTCP/IPを用いた転送も実装していたが、実験の結果、TCP/IPでの
  373.         安定した転送はビデオ=2Mbpsまでであったため、TCP/IPを用いた実は装削除した。
  374.  
  375.