infilter.pl
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. # ====================================================================
  3. # The Vovida Software License, Version 1.0 
  4. # Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. # 1. Redistributions of source code must retain the above copyright
  9. #    notice, this list of conditions and the following disclaimer.
  10. # 2. Redistributions in binary form must reproduce the above copyright
  11. #    notice, this list of conditions and the following disclaimer in
  12. #    the documentation and/or other materials provided with the
  13. #    distribution.
  14. # 3. The names "VOCAL", "Vovida Open Communication Application Library",
  15. #    and "Vovida Open Communication Application Library (VOCAL)" must
  16. #    not be used to endorse or promote products derived from this
  17. #    software without prior written permission. For written
  18. #    permission, please contact vocal@vovida.org.
  19. # 4. Products derived from this software may not be called "VOCAL", nor
  20. #    may "VOCAL" appear in their name, without prior written
  21. #    permission of Vovida Networks, Inc.
  22. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  23. # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  24. # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  25. # NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  26. # NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  27. # IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  28. # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  29. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  30. # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  31. # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  32. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  33. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  34. # DAMAGE.
  35. # ====================================================================
  36. # This software consists of voluntary contributions made by Vovida
  37. # Networks, Inc. and many individuals on behalf of Vovida Networks,
  38. # Inc.  For more information on Vovida Networks, Inc., please see
  39. # <http://www.vovida.org/>.
  40. use Fcntl;
  41. #chdir; # go home
  42. $pipeName = "sip-inpipe";
  43. $IN_FIFO = "$pipeName.out";
  44. $IN_CTL_FIFO = "$pipeName.out.ctl";
  45. $OUT_FIFO = "$pipeName.in";
  46. $OUT_CTL_FIFO = "$pipeName.in.ctl";
  47. unless (-p $IN_FIFO) {
  48.     unlink $IN_FIFO;
  49.     system('mknod', $IN_FIFO, 'p')
  50.       && die "can't mknod $IN_FIFO: $!";
  51. }
  52. unless (-p $IN_CTL_FIFO) {
  53.     unlink $IN_CTL_FIFO;
  54.     system('mknod', $IN_CTL_FIFO, 'p')
  55.       && die "can't mknod $IN_FIFO: $!";
  56. }
  57. unless (-p $OUT_FIFO) {
  58.     unlink $OUT_FIFO;
  59.     system('mknod', $OUT_FIFO, 'p')
  60.       && die "can't mknod $OUT_FIFO: $!";
  61. }
  62. unless (-p $OUT_CTL_FIFO) {
  63.     unlink $OUT_CTL_FIFO;
  64.     system('mknod', $OUT_CTL_FIFO, 'p')
  65.       && die "can't mknod $OUT_FIFO: $!";
  66. }
  67. sysopen (IN_FIFO, $IN_FIFO, O_RDWR) || die "can't read $IN_FIFO: $!";
  68. sysopen (OUT_FIFO, $OUT_FIFO, O_RDWR) || die "can't write $OUT_FIFO: $!";
  69. sysopen (IN_CTL_FIFO, $IN_CTL_FIFO, O_RDWR) || die "can't read $IN_CTL_FIFO: $!";
  70. sysopen (OUT_CTL_FIFO, $OUT_CTL_FIFO, O_RDWR) || die "can't write $OUT_CTL_FIFO: $!";
  71. sub readOk {
  72.     $rin = $win = $ein = '';
  73.     vec($rin,fileno(IN_FIFO),1) = 1;
  74.     vec($rin,fileno(IN_CTL_FIFO),1) = 1;
  75.     ($nfound,$timeleft) =
  76.       select($rout=$rin, $wout=$win, $eout=$ein, $timeout);
  77.     @bits = split(//, unpack("b*", $rout));
  78.     if($bits[fileno(IN_CTL_FIFO)]) {
  79. # this is a reset of some sort, so trash everything and punt
  80.     }
  81.     
  82. }
  83. sub recMsg {
  84.     local($msg);
  85.     # use select?
  86.     # next line blocks until there's a reader
  87. #    print "reading headern";
  88.     # check for reset messages in case something gets restarted
  89.     $total_bytes_read = 0;
  90.     $msg = "";
  91.     while($total_bytes_read < 15) {
  92. $total_bytes_read += sysread(IN_FIFO, $b, 15 - $total_bytes_read);
  93. if($total_bytes_read == 0) {
  94.     # do something here 
  95. #     print "nothing!n";
  96. }
  97. $msg .= $b;
  98.     }
  99.     if ($total_bytes_read < 15) {
  100. # print "foo!n";
  101.     }
  102.     # parse for number of bytes to read
  103.     chomp($msg);
  104.     ($cmd, $bytes_to_read) = split(/ /, $msg, 2);
  105. #    print "done reading headern";
  106. #    print "reading ($bytes_to_read bytes)n";
  107.     $total_bytes_read = 0;
  108.     $msg = "";
  109.     while($total_bytes_read  < $bytes_to_read) {
  110. $bytes = sysread(IN_FIFO, $b, 
  111.  $bytes_to_read - $total_bytes_read);
  112. if($bytes == 0) {
  113.     # do something here 
  114. #     print "nothing!n";
  115. }
  116. $msg .= $b;
  117. $total_bytes_read += $bytes;
  118.     }
  119.     if ($total_bytes_read < $bytes_to_read) {
  120. # print "foo!n";
  121.     }
  122. #    print "done reading ($total_bytes_read bytes)n";
  123. #    print "got: $msgn";
  124.     return $msg;
  125. }
  126. sub sendMsg {
  127.     local($msg) = $_[0];
  128.     local($encodedMsg);
  129.     local($total_bytes_written) = 0;
  130.     local($header);
  131.     local($bytes_to_write);
  132.     local($bytes);
  133. #    print "write buf: $headern";
  134.     $header = sprintf("msg %10.10dn", length($msg));
  135.     $encodedMsg = $header . $msg;
  136.     $bytes_to_write = length($encodedMsg);
  137.     while($total_bytes_written < $bytes_to_write) {
  138. $bytes  = syswrite(OUT_FIFO, $encodedMsg, 
  139.    length($encodedMsg) - $total_bytes_written, 
  140.    $total_bytes_written);
  141. if(!$bytes) {
  142.     die "error writing $OUT_FIFO: $!";
  143. }
  144. $total_bytes_written += $bytes;
  145.     }
  146. }
  147. ######################################################################
  148. #  everything above this line should not need to be changed
  149. ######################################################################
  150. # doing this resets the filter software and stops any waiting by the
  151. # other side
  152. $msg = "a";
  153. syswrite(OUT_CTL_FIFO, $msg, length($msg));
  154. # here is the infinite loop in question
  155. while (1) {
  156.     print "waiting for messagen";
  157.     $buf = recMsg();
  158.     print "got msg... parsing and retransmittingn";
  159.     print "buf:n$bufn----n";  # uncomment this to print out buffers before they
  160.                             # are modified
  161.     $buf = &filter($buf);
  162.     print "newbuf:n$bufn!!!!n";  # uncomment this to print out buffers before they
  163.                             # are modified
  164.     sendMsg($buf);
  165. }
  166. # below this is the filter
  167. sub filter {
  168.     local($_) = $_[0];
  169.     # put filter commands here
  170.     # for more information about perl regular expressions, do 
  171.     #
  172.     #     man perlre
  173.     # here are some examples
  174.     # s/hello/goodbye/; # replace hello with goodbye at most once per line
  175.     # s/^From/To/; # replace a with b at the start of the line only
  176.     # y/r//d; # this should kill carriage returns  (y means use tr syntax)
  177.     if(/v=0/) {
  178.         # has an SDP
  179.         # Our stack should not be looking at the o= line.
  180.         if (/c=IN IP4 192.168.5.110/)
  181.         {
  182.             s/o=Pingtel 5 5 IN IP4 127.0.0.1/o=Pin 5 5 IN IP4 192.168.5.110/;
  183.         }
  184.         elsif (/c=IN IP4 192.168.5.111/)
  185.         {
  186.             s/o=Pingtel 5 5 IN IP4 127.0.0.1/o=Pin 5 5 IN IP4 192.168.5.111/;
  187.         }
  188.         elsif (/c=IN IP4 192.168.5.112/)
  189.         {
  190.             s/o=Pingtel 5 5 IN IP4 127.0.0.1/o=Pin 5 5 IN IP4 192.168.5.112/;
  191.         }
  192.         elsif (/c=IN IP4 192.168.5.113/)
  193.         {
  194.             s/o=Pingtel 5 5 IN IP4 127.0.0.1/o=Pin 5 5 IN IP4 192.168.5.113/;
  195.         }
  196.     }
  197.     # s/sip:6396@192.168.5.1/sip:6396@yoyo.private.vovida.com/g;
  198.     # s/sip:6396@192.168.26.180/sip:aaln_0@galileo.private.vovida.com/g;
  199.     # s/sip:6396@192.168.16.180/sip:aaln_0@galileo.private.vovida.com/g;
  200.     # s/sip:6396@192.168.6.180/sip:aaln_0@galileo.private.vovida.com/g;
  201.     s/sip:6396@192.168.5.1/sip:aaln_0@galileo.private.vovida.com/g;
  202.     s/sip:6391@192.168.5.1/sip:6391@galileo.private.vovida.com/g;
  203.     s/sip:6248@192.168.5.1/sip:6248@galileo.private.vovida.com/g;
  204.     s/sip:6249@192.168.5.1/sip:aaln_0@galileo.private.vovida.com/g;
  205.     # s/sip:6391@192.168.5.1/sip:6391@frisbee.private.vovida.com/g;
  206.     # s/aaln_([0-1])@192.168.5.1/aaln_1@galileo.private.vovida.com/g;
  207.     # s/sip:([0-9])([0-9])([0-9])([0-9])@192.168.26.180/sip:1234@galileo.private.vovida.com/g;
  208.     # s/sip:([0-9])([0-9])([0-9])([0-9])@192.168.16.180/sip:1234@galileo.private.vovida.com/g;
  209.     # s/sip:([0-9])([0-9])([0-9])([0-9])@192.168.6.180/sip:1234@galileo.private.vovida.com/g;
  210.     # s/sip:([0-9])([0-9])([0-9])([0-9])@192.168.5.1/sip:1234@galileo.private.vovida.com/g;
  211.     # s/UDP 192.168.5.1/UDP galileo.private.vovida.com/g;
  212.     # s/UDP 192.168.20.15/UDP yoyo.private.vovida.com/g;
  213.     # s/UDP 192.168.20.16/UDP frisbee.private.vovida.com/g;
  214.     # don't change this line
  215.     return $_;
  216. }