260 likes | 554 Views
Developing DVB-Java Applications. Richard Houldsworth Philips Research richard.houldsworth@philips.com. Overview. This presentation is an introduction to programming for DVB-Java. How to get started. Technical details of key DVB-J concepts
E N D
Developing DVB-Java Applications Richard Houldsworth Philips Research richard.houldsworth@philips.com
Overview • This presentation is an introduction to programming for DVB-Java. • How to get started. • Technical details of key DVB-J concepts • Hints on how to use the APIs for typical Xlets and EPGs.
Infrastructure for App. Development • You can start Java development on your favourite computer using JDK or whatever. • Need some minimal MHP APIs (e.g. JavaTV ref. impl). • Does not easily allow testing of UIs on a TV • Access to developer version of an MHP STB • A much better simulation of the target environment • For optimising your application's start-up time... • DSMCC object carousel builders • MPEG multiplexer / modulator to interface to STB
Application Environment • Standard Java VM. • MHP services can include multiple applications • Your application may need to execute at the same time as other applications in that service context (e.g. an EPG). • The application manager controls: • STB resources - you need to negotiate for resources. • Application lifecycle - the application can be terminated at any time on service selection. • Your application needs to work reliably in these constraints
Entry Point: Xlet • Applications must define a class which implements the javax.tv.xlet.Xlet interface. • Like java.applet.Applet but simpler & without historical browser 'baggage'. • Methods are normally called in this sequence • initXlet(), startXlet(), {later} destroyXlet() • initXlet() is where most initialisation should be done • startXlet() is where scarce resources should be acquired • Called by the MHP "application manager”, which sets up an XletContext for the Xlet.
Context Hierarchy Service Context 1 Service Context 2 Java Media Player Xlet Context Xlet Context Xlet Context Xlet A Xlet B Xlet C Application Manager
Application Delivery • Think about how much bandwidth will be available in the network for your application. • Very simple example • 256 Kbits/second bandwidth available for app. • App. has 4 x 100KByte images and 120KBytes of Java class files. • 520KBytes @ 256 Kbits/second = 16 seconds • How long will people wait for this application to start? • Somebody often needs to restrain the designers!
Broadcast Data: java.io • DSMCC object carousels appear as a (read-only) file system. • Classloader search path is initialised based on broadcast signalling before an application is started. • Normal File classes from java.io work fine. • e.g. new java.io.FileInputStream("my_data.dat") • Classes building on java.io.File work fine. • e.g. Toolkit.getImage(“background.jpg”) • Overall behaviour very like a standalone Java application - it is not very similar to Applet (it doesn’t use URLs)
Broadcast Data: org.dvb.dsmcc • The org.dvb.dsmcc package extends java.io . It supports asynchronous functions for broadcast file systems. • DSMCCObject.asynchronousLoad() DSMCCObject.addObjectChangeEvent() • DSMCCStreamEvent.subscribe() • Use ServiceDomain.attach() to attach to another object carousel • For early development, treat DSMCC as a normal file system. Use extended API when you need fine control over your broadcast data.
Other data sources • MPEG-2 section filter API: org.davic.mpeg.sections • Useful for non-MHP data broadcast protocols, • e.g. sharing images between MHP and existing boxes. Even accessing Data Carousels. • IP interface: java.net • Used for both return (bidirectional) and broadcast channels (multicast) • org.dvb.net.DatagramSocketBufferControl provides some extensions to give better control over multicast. • For control of the return channel: org.dvb.net.rc
User interface: TV display • There are differences between TV and computer displays: • picture aspect ratio (4:3, 14:9, 16:9) • overscan - assume 5% loss around the edge. • pixel aspect ration (non 1:1) - prescale bitmaps or use java.awt.Graphics.stretchImage() • colour space - the AWT surface is sRGB, but the internal display format may be YUV, with limited colour resolution, or palettized. • interlacing - avoid using single pixel lines, avoid high contrast between adjacent pixels. Pre-filter bitmaps. • Graphics possibly not accurately aligned with video. • Possibly a limited number of alpha levels
User Interface: java.awt • MHP uses the standard java.awt package • Lightweight components • JDK 1.1.x event model • No "classical" UI widgets - too computery for TV • No requirement for a windowing system • Support for overlapping windows not required
User Interface: org.dvb.ui • DVB Extensions to AWT :- • org.dvb.ui.DVBColor provides alpha (i.e. transparency through graphics to video) • org.dvb.ui.DVBGraphics - supports alpha composition. • org.dvb.ui.DVBBufferedImage - a writeable buffer of image data - good for double buffering and effects. • org.dvb.ui.DVBTextLayoutManager allows simple display of formatted text • These extensions are similar to parts of Java 2 AWT - you can prototype on JDK 1.3, but be aware of the differences. Also consider the performance cost of alpha.
User Interface : org.havi.ui • Widget set more graphically oriented than java.awt (e.g. icons, animations) • HLook interface allows pluggable look&feel. • HNavigable.setFocusTraversal() allows applications to describe a focus navigation map (up/down/left/right) • Device framework • HScreenDevice & sub-classes allow applications to access a model of the graphics, video & background devices in a system, and request a configuration. • Extra key codes for remote controls • org.havi.ui.event.HRcEvent
User Interface: Getting the root container • Your application can get its top level UI container in 2 ways. • javax.tv.graphics.TVContainer.getRootContainer() • Returns an invisible {0,0} size container • Size & position the container by hand • Methods on org.havi.ui.HSceneFactory • Allow applications to be more expressive about what they really want. Returns an HScene object.
creates HSceneTemplate getBestScene(template) creates HScene User Interface: Configuring the scene • Each Xlet has an HScene representing a region of the TV display. • Create from the HSceneFactory using an HSceneTemplate with the desired properties Application HSceneFactory • Similar model used for HScreenDevice
User Interface: Drawing your components • Several different ways of approaching this in your applications. • Draw everything using java.awt.Graphics primitives • Define your own lightweight components extending java.awt.Component. • Can implement org.havi.ui.HNavigable for extended navigation • Use the HAVi widget set • Can define your own appearance if you need. • Consider code size and impact on performance.
User Interface: User input • There is no mouse input, and only a few key codes. • Only one AWT component has input focus at any time • No other components receive input events • The org.dvb.event API traps input events before they enter AWT • Allows applications to register an interest in a subset of the input events - its UserEventRepository • it can register exclusive access to these • Consider this early in your design process • Test it on TVs & with TV remote controls very early
Controlling Media: javax.media • Applications can have basic control of video and audio with the Java Media Framework. • Based on JMF 1.0 • Use org.davic.net.dvb.DVBLocator to select what to show: dvb://<original network ID>.<transport stream ID>.<service id>[.<event ID>] [;<component tag>] • Applications can obtain running JMF players. • Needed for applications running as part of a TV service to get access to already running A/V. • See javax.tv.service.selection.ServiceMediaHandler
Controlling Media: javax.tv.media • MHP provides a number of extra JMF controls • For video scaling... • javax.tv.media.AWTVideoSizeControl (simple) • org.dvb.media.BackgroundVideoPresentationControl (flexible) • Platforms aren't required to support unlimited video scaling • Control and monitoring of subtitles, service components • Fine control over audio playback from memory • org.davic.media.MediaTimePositionControl • Notification of changes in incoming TV signals • video size, aspect ratio, ...
Synchronising with Media • DSMCC stream events • org.dvb.dsmcc.DSMCCStreamEvent.subscribe() • org.davic.media.StreamEventControl.subscribeStreamEvent() • Use media time (NPT) • org.davic.media.MediaTimeEventControl • Use a private section • org.davic.mpeg.sections • Choice really determined by the broadcaster - the data needs to be injected at the right time in the right format.
EPGs: Service Information • There are some APIs that are only useful for non-service bound applications (e.g. Electronic Program Guides) • i.e. the application is signalled on all services. • Access to broadcast service information • DVB-SI API - org.dvb.si • Gives access to all the low level detail of DVB-SI for those who know how to use that. • JavaTV SI API - javax.tv.service, javax.tv.service.guide • A high level abstract view • Beware: many broadcast networks don't follow the DVB-SI specification very well or very completely.
EPGs: Service Selection • Previewing a TV service • Get ServiceContentHandler objects to access JMF. • Using JMF, an EPG can preview a TV service without starting any associated applications. • Really selecting a TV service (incl. applications) • Get ServiceContext from ServiceContextFactory • Use javax.tv.service.selection.ServiceContext.select() • This kills locally signalled Xlets. Don’t use unless you really ‘own’ the service context.
Hints: Speed • Optimising application launch time • Consumers are impatient - they won't wait for TV. • Get user interaction working quickly. • Make use of asynchronous asset loading (e.g. images) • Look at the files needed by your application to get the initial display - fine tune your broadcast so those are loaded together & quickly. • Image decode time is significant - e.g. fullscreen JPEGs • Analyse major transitions between different parts of your application. • Think about pre-loading assets you are likely to need
Hints: Cleanup • Check your application cleans up after itself • cause any threads you created to exit voluntarily. • stop(),deallocate() and close() any JMF players you created. • stop() and destroy() any ServiceContext objects you created. • flush any images using the Image.flush() method. • have no unnecessary delays in your Xlet.destroyXlet() method. • Doing this is a matter of being considerate to other applications running in the box.
General Hints • An STB is not a high-end platform • don’t expect PC performance • Reliability and robustness are vital • people will not tolerate unreliable applications in the consumer environment • unreliable applications make the STB look unreliable • Remember that your application may be paused and resumed at any time • Resources are very scarce, and you may lose them at any time • but you may also get them back at any time