Hello all,

I sent this email to the list last week, but never saw it on the list
itself so I thought I would resend it... Did anyone see this or did the
zip file cause it to be filtered somewhere... I have attached the
individual files this time instead... Just put them in a zip folder and
follow the directions below.

Enjoy,

Brian


Brian Corrie wrote:
> Hello all,
>
> I just finished creating a new AG service that is quite useful for a pig
> node. Neither the VideoProducerService or VideoConsumerService are
> terribly useful for a pig node as the settings for neither are correct.
> The producer does not have unmuted video and the consumer does not
> transmit on startup and has low quality and bandwidth settings. This is
> an extension of the VideoProducerService that currently exists that both
> transmits video at startup as well as has all of the video
> sources un-muted.
>
> If anyone is interested, give it a go. We have tested under windows and
> Linux. I have been using it on my desktop for some time now and it seems
> to work fine - not to surprising at it didn't change much... 8-)
>
> If you want to install it, just copy the attached file (the ZIP folder)
> into C:\Documents and Settings\All Users\Application
> Data\AccessGrid\services folder. Under Linux you just put the folder in
> /var/lib/ag/local_services. You should be able to go into Manage My
> Node and see it listed when you try and add a service. You can then
> remove the old video service and add the new one. Voila!!!
>
> Enjoy,
>
> Brian
>
> p.s. If the zip file gets stripped out by virus filters let me know and
> I can resend...
>
>
>
#-----------------------------------------------------------------------------
# Name:        VideoProducerConsumerService.py
# Purpose:     Video service that starts up in a reasonable form for 
#               both video producing and consuming. Based on the 
#               VideoProducer.py
#
# Author:      Brian Corrie
#
# Created:     2003/06/02
# RCS-ID:      $Id: VideoProducerService.py,v 1.18 2003/10/22 20:52:36 judson 
Exp $
# Copyright:   (c) 2002
# Licence:     See COPYING.TXT
#-----------------------------------------------------------------------------
import sys, os

from AccessGrid.hosting.pyGlobus.Server import Server
from AccessGrid.Types import Capability
from AccessGrid.AGService import AGService
from AccessGrid import Platform
from AccessGrid.AGParameter import ValueParameter, OptionSetParameter, 
RangeParameter, TextParameter
from AccessGrid.NetworkLocation import MulticastNetworkLocation

vicstartup="""option add Vic.disable_autoplace false startupFile
option add Vic.muteNewSources false startupFile
option add Vic.maxbw 6000 startupFile
option add Vic.bandwidth %d startupFile
option add Vic.framerate %d startupFile
option add Vic.quality %d startupFile
option add Vic.defaultFormat %s startupFile
option add Vic.inputType %s startupFile
set device \"%s\"
set defaultPort($device) %s
option add Vic.device $device startupFile
option add Vic.transmitOnStartup true startupFile
option add Vic.defaultTTL 127 startupFile
proc user_hook {} {
    update_note 0 \"%s\"
}
"""



class VideoProducerConsumerService( AGService ):

   encodings = [ "h261" ]
   standards = [ "NTSC", "PAL" ]

   def __init__( self, server ):
      AGService.__init__( self, server )

      self.capabilities = [ Capability( Capability.PRODUCER, Capability.VIDEO ) 
]

      self.executable = os.path.join(Platform.GetInstallDir(), "vic")

      #
      # Set configuration parameters
      #

      # note: the datatype of the port parameter changes when a resource is set!
      self.streamname = TextParameter( "streamname", "Video" )
      self.port = TextParameter( "port", "" ) 
      self.encoding = OptionSetParameter( "encoding", "h261", 
VideoProducerConsumerService.encodings )
      self.standard = OptionSetParameter( "standard", "NTSC", 
VideoProducerConsumerService.standards )
      self.bandwidth = RangeParameter( "bandwidth", 800, 0, 3072 ) 
      self.framerate = RangeParameter( "framerate", 25, 1, 30 ) 
      self.quality = RangeParameter( "quality", 75, 1, 100 )
      self.configuration.append( self.streamname )
      self.configuration.append( self.port )
      self.configuration.append( self.encoding )
      self.configuration.append( self.standard )
      self.configuration.append( self.bandwidth )
      self.configuration.append( self.framerate )
      self.configuration.append (self.quality )

   def Start( self ):
      """Start service"""
      try:
         
         #
         # Resolve assigned resource to a device understood by vic
         #
         if self.resource == "None":
            vicDevice = "None"
         else:
            vicDevice = self.resource.resource

         #
         # Write vic startup file
         #
         startupfile = os.path.join(Platform.GetTempDir(),
            'VideoProducerConsumerService_%d.vic' % ( os.getpid() ) )

         f = open(startupfile,"w")
         if self.port.value == '':
            portstr = "None"
         else:
            portstr = self.port.value
         f.write( vicstartup % (self.bandwidth.value,
                                 self.framerate.value, 
                                 self.quality.value,
                                 self.encoding.value,
                                 self.standard.value,
                                 vicDevice,                 
                                 portstr,
                                 self.streamname.value ) )
         f.close()

         # Replace double backslashes in the startupfile name with single
         #  forward slashes (vic will crash otherwise)
         if sys.platform == Platform.WIN:
            startupfile = startupfile.replace("\\","/")

         # 
         # Start the service; in this case, store command line args in a list 
and let
         # the superclass _Start the service
         options = []
         options.append( "-u" )
         options.append( startupfile ) 
         options.append( "-C" )
         options.append( '"' + self.streamname.value + '"'  )
         if self.streamDescription.encryptionFlag != 0:
            options.append( "-K" )
            options.append( self.streamDescription.encryptionKey )
         # Check whether the network location has a "type" attribute
         # Note: this condition is only to maintain compatibility between
         # older venue servers creating network locations without this attribute
         # and newer services relying on the attribute; it should be removed
         # when the incompatibility is gone
         if self.streamDescription.location.__dict__.has_key("type"):
             # use TTL from multicast locations only
             if self.streamDescription.location.type == 
MulticastNetworkLocation.TYPE:
                options.append( "-t" )
                options.append( '%d' % (self.streamDescription.location.ttl) )
         options.append( '%s/%d' % ( self.streamDescription.location.host, 
                                        self.streamDescription.location.port) )
         self.log.info("Starting VideoProducerConsumerService")
         self.log.info(" executable = %s" % self.executable)
         self.log.info(" options = %s" % options)
         self._Start( options )
         #os.remove(startupfile)
      except:
         self.log.exception("Exception in VideoProducerConsumerService.Start")
         raise Exception("Failed to start service")
   Start.soap_export_as = "Start"

   def Stop( self ):
       """Stop the service"""

       # vic doesn't die easily (on linux at least), so force it to stop
       AGService.ForceStop(self)         

   Stop.soap_export_as = "Stop"


   def ConfigureStream( self, streamDescription ):
      """Configure the Service according to the StreamDescription"""

      ret = AGService.ConfigureStream( self, streamDescription )
      if ret and self.started:
         # service is already running with this config; ignore
         return

      # if started, stop
      if self.started:
         self.Stop()

      # if enabled, start
      if self.enabled:
         self.Start()
   ConfigureStream.soap_export_as = "ConfigureStream"

   def SetResource( self, resource ):
      """Set the resource used by this service"""

      self.log.info("VideoProducerConsumerService.SetResource : %s" % 
resource.resource )
      self.resource = resource
      if "portTypes" in self.resource.__dict__.keys():

          # Find the config element that refers to "port"
          try:
            index = self.configuration.index(self.port)
            found = 1
          except ValueError:
            found = 0

          # Create the port parameter as an option set parameter, now
          # that we have multiple possible values for "port"
          self.port = OptionSetParameter( "port", self.resource.portTypes[0], 
                                                           
self.resource.portTypes )

          # Replace or append the "port" element
          if found:
            self.configuration[index] = self.port
          else:
            self.configuration.append(self.port)

   SetResource.soap_export_as = "SetResource"

   def SetIdentity(self, profile):
      """
      Set the identity of the user driving the node
      """
      Platform.SetRtpDefaults( profile )
   SetIdentity.soap_export_as = "SetIdentity"

def AuthCallback(server, g_handle, remote_user, context):
    return 1

# Signal handler to shut down cleanly
def SignalHandler(signum, frame):
    """
    SignalHandler catches signals and shuts down the service.
    Then it stops the hostingEnvironment.
    """
    global agService
    agService.Shutdown()

if __name__ == '__main__':
   from AccessGrid.hosting.pyGlobus import Client
   import thread
   import signal
   import time

   server = Server( int(sys.argv[1]), auth_callback=AuthCallback )
   
   agService = VideoProducerConsumerService(server)

   service = server.create_service_object("Service")
   agService._bind_to_service( service )

   # Register the signal handler so we can shut down cleanly
   signal.signal(signal.SIGINT, SignalHandler)

   print "Starting server at", agService.get_handle()
   server.RunInThread()

   # Keep the main thread busy so we can catch signals
   while server.IsRunning():
      time.sleep(1)

[ServiceDescription]
name = VideoProducerConsumerService
description = Vic-based video service to send and display video to/from 
multicast address
capabilities = Capability1 Capability2
executable = VideoProducerConsumerService.py
platform = neutral

[Capability1]
role = producer
type = video

[Capability2]
role = consumer
type = video

Reply via email to