Bino 1.1.0


Next: , Up: (dir)

Bino

This manual was last updated 17 May 2011 for version 1.1.0 of Bino.

Copyright © 2011 Martin Lambers (marlam@marlam.de), Stefan Eilemann (eile@eyescale.ch), Frédéric Devernay (Frederic.Devernay@inrialpes.fr)

Copying and distribution of this file and the referenced image files, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. These files are offered as-is, without any warranty.

Table of Contents:


Next: , Previous: Top, Up: Top

1 Overview

Bino is a 3D video player with multi-display support.

3D videos are more accurately called stereoscopic videos. Such videos have separate views for the left and right eye and thus allow depth perception through stereopsis.

All input files are combined into one media source, so you can have video, audio, and subtitle streams in separate files. The files are decoded with the FFmpeg libraries, so URLs and other special constructs are supported.

Bino supports a wide variety of stereoscopic input layouts and display techniques.


Next: , Previous: Overview, Up: Top

2 Invocation

Synopsis: bino [option...] [file...]

--help
Print help.
--version
Print version.
-n
--no-gui
Do not use the GUI, just play the given input in a plain window using the parameters given on the command line.
-L
--log-level=LEVEL
Select log level: debug, info, warning, error, or quiet.
--device-type=TYPE
Type of input device: default, firewire, or x11.
--device-frame-size=WxH
If the input is a device, request the given frame size, e.g. 640x480.
--device-frame-rate=N/D
If the input is a device, request the given frame rate, e.g. 25/1.
--lirc-config=FILE
Use the given LIRC configuration file. This option can be used more than once.
-v
--video=STREAM
Select video stream (1-n, depending on the input).
-a
--audio=STREAM
Select audio stream (1-n, depending on the input).
-s
--subtitle=STREAM
Select subtitle stream (1-n, depending on the input).
-i
--input=TYPE
Select input type. See Input Layouts.
-o
--output=TYPE
Select output type. See Output Techniques.
-S
--swap-eyes
Swap left/right view.
-f
--fullscreen
Fullscreen.
--fullscreen-screens=[S0[,S1[,...]]]
Use the listed screens S0, ..., Sn in fullscreen mode. Screen numbers start with 1. If the list is empty, the primary screen will be used (this is the default).
--fullscreen-flip-left
Flip left view vertically when in fullscreen mode.
--fullscreen-flop-left
Flop left view horizontally when in fullscreen mode.
--fullscreen-flip-right
Flip right view vertically when in fullscreen mode.
--fullscreen-flop-right
Flop right view horizontally when in fullscreen mode.
-c
--center
Center window on screen.
--subtitle-encoding=ENC
Set subtitle encoding.
--subtitle-font=FONT
Set subtitle font name.
--subtitle-size=N
Set subtitle font size.
--subtitle-scale=S
Set subtitle scale factor.
--subtitle-color=COLOR
Set subtitle color, in [AA]RRGGBB format.
--subtitle-parallax=VAL
Subtitle parallax adjustment (-1 to +1).
-P
--parallax=VAL
Parallax adjustment (-1 to +1).
-C
--crosstalk=VAL
Crosstalk leak level (0 to 1). Comma-separated values for the R,G,B channels.
-G
--ghostbust=VAL
Amount of crosstalk ghostbusting to apply (0 to 1).
-b
--benchmark
Benchmark mode: no audio, no time synchronization, output of frames-per-second measurements.
-l
--loop
Loop the input media.


Next: , Previous: Invocation, Up: Top

3 Input Layouts

Bino supports the following stereoscopic input layouts:

mono
Single view (2D).
separate-left-right
Left/right view in separate streams, left first.
separate-right-left
Left/right view in separate streams, right first.
top-bottom
Left view top, right view bottom.
top-bottom-half
Left view top, right view bottom, half height.
bottom-top
Left view bottom, right view top.
bottom-top-half
Left view bottom, right view top, half height.
left-right
Left view left, right view right.
left-right-half
Left view left, right view right, half width.
right-left
Left view right, right view left.
right-left-half
Left view right, right view left, half width.
even-odd-rows
Left view even rows, right view odd rows.
odd-even-rows
Left view odd rows, right view even rows.

The default is to autodetect the input type from meta data stored in the file. If this fails, Bino tries to autodetect the input type based on the file name. See File Name Conventions. If that fails, too, Bino guesses based on the resolution of the input.


Next: , Previous: Input Layouts, Up: Top

4 Output Techniques

Bino supports the following stereoscopic display techniques:

mono-left
Left view only.
mono-right
Right view only.
top-bottom
Left view top, right view bottom.
top-bottom-half
Left view top, right view bottom, half height.
left-right
Left view left, right view right.
left-right-half
Left view left, right view right, half width.
even-odd-rows
Left view even rows, right view odd rows.
even-odd-columns
Left view even columns, right view odd columns.
checkerboard
Left and right view in checkerboard pattern.
hdmi-frame-pack
HDMI frame packing mode (left top, right bottom, plus extra blank lines separating the two views). This mode is only necessary if you are forcing your display into the corresponding HDMI 3D mode. A description how to do this on GNU/Linux can be found in this post to the Bino mailing list.
red-cyan-monochrome
Red/cyan anaglyph, monochrome method.
red-cyan-half-color
Red/cyan anaglyph, half color method.
red-cyan-full-color
Red/cyan anaglyph, full color method.
red-cyan-dubois
Red/cyan anaglyph, high-quality Dubois method.
green-magenta-monochrome
Green/magenta anaglyph, monochrome method.
green-magenta-half-color
Green/magenta anaglyph, half color method.
green-magenta-full-color
Green/magenta anaglyph, full color method.
green-magenta-dubois
Green/magenta anaglyph, high-quality Dubois method.
amber-blue-monochrome
Amber/blue anaglyph, monochrome method.
amber-blue-half-color
Amber/blue anaglyph, half color method.
amber-blue-full-color
Amber/blue anaglyph, full color method.
amber-blue-dubois
Amber/blue anaglyph, high-quality Dubois method.
red-green-monochrome
Red/green anaglyph, monochrome method.
red-blue-monochrome
Red/blue anaglyph, monochrome method.
stereo
OpenGL quad-buffer stereo.
equalizer
Multi-display OpenGL via Equalizer with a 2D canvas setup.
equalizer-3d
Multi-display OpenGL via Equalizer with a 3D screen setup.

For stereo input, the default is stereo if the display supports it, otherwise red-cyan-dubois. The default for mono input is mono-left.


Next: , Previous: Output Techniques, Up: Top

5 File Name Conventions

If the meta data stored in a file does not indicate its stereoscopic layout, Bino tries to guess it by looking at the last part of the file name before the file name extension (.ext).

The following file name forms are recognized:

*-lr.ext
left-right
*-lrh.ext
*-lrq.ext
left-right-half
*-rl.ext
right-left
*-rlh.ext
*-rlq.ext
right-left-half
*-tb.ext
*-ab.ext
top-bottom
*-tbh.ext
*-abq.ext
top-bottom-half
*-bt.ext
*-ba.ext
bottom-top
*-bth.ext
*-baq.ext
bottom-top-half
*-eo.ext
*-eoq.ext
*-3dir.ext
even-odd-rows
*-oe.ext
*-oeq.ext
*-3di.ext
odd-even-rows
*-2d.ext
mono


Next: , Previous: File Name Conventions, Up: Top

6 Interactive Control

6.1 Keyboard Shortcuts

Bino reacts on a number of keyboard shortcuts during playback.

Make sure that the video area has the keyboard focus before using these shortcuts, e.g. by clicking into it.

The following shortcuts are recognized:

ESC
Leave fullscreen mode, or quit when in window mode.
q
Quit.
p
SPACE
Pause / unpause.
f
Toggle fullscreen.
c
Center window.
e
Swap left/right eye.
v
Cycle through available video streams.
a
Cycle through available audio streams.
a
Cycle through available subtitle streams.
1
2
Adjust contrast.
3
4
Adjust brightness.
5
6
Adjust hue.
7
8
Adjust saturation.
<
>
Adjust parallax.
(
)
Adjust ghostbusting.
LEFT
RIGHT
Seek 10 seconds backward / forward.
UP
DOWN
Seek 1 minute backward / forward.
PAGE UP
PAGE DOWN
Seek 10 minutes backward / forward.
Mouse click
Seek according to the horizontal click position.

6.2 Remote Controls

Bino supports remote controls via LIRC.

Use the client name ‘bino’ in your LIRC configuration. The default LIRC configuration file usually is ~/.lircrc. You can use the ‘--lirc-config’ option to use one or more custom LIRC configuration files instead.

The following commands are available:

play
Start playback, or switch of pause mode.
pause
When playing, go into pause mode.
stop
Stop playback.
cycle-video-stream
Cycle through available video streams.
cycle-audio-stream
Cycle through available audio streams.
cycle-subtitle-stream
Cycle through available subtitle streams.
toggle-stereo-mode-swap
Swap left/right eye.
toggle-fullscreen
Toggle fullscreen.
center
Center window.
adjust-contrast delta
Adjust contrast by adding delta, e.g. -0.05 or +0.05.
adjust-brightness delta
Adjust brightness by adding delta, e.g. -0.05 or +0.05.
adjust-hue delta
Adjust hue by adding delta, e.g. -0.05 or +0.05.
adjust-saturation delta
Adjust saturation by adding delta, e.g. -0.05 or +0.05.
adjust-parallax delta
Adjust parallax by adding delta, e.g. -0.01 or +0.01.
adjust-subtitle-parallax delta
Adjust contrast by adding delta, e.g. -0.01 or +0.01.
seek delta
Seek by the given number of seconds relative to the current position. For example -60.0 seeks backwards one minute, and +60.0 seeks forward one minute.
set-pos pos
Seek by setting an absolute position in the stream, with pos between 0 and 1. For example, to seek to the middle of the video, use 0.5.

Example LIRC configuration file excerpt:

     begin
       remote = ...
       button = ...
       prog   = bino
       config = adjust-brightness +0.05
     end


Next: , Previous: Interactive Control, Up: Top

7 Camera Devices

Bino supports the following types of camera devices:

Note: for firewire and x11 devices to work, your FFmpeg libraries must have libdc1394 and x11grab enabled, which is not the default.


Next: , Previous: Camera Devices, Up: Top

8 Crosstalk Ghostbusting

Many stereoscopic display devices suffer from crosstalk between the left and right view. This results in ghosting artifacts that can degrade the viewing quality, depending on the video content.

Bino can optionally reduce the ghosting artifacts. For this, it needs two know

  1. the amount of crosstalk of your display device and
  2. the amount of ghostbusting that is adequate for the video you want to watch.

Please note that ghostbusting does not work with anaglyph glasses.

To measure the display crosstalk, do the following:

  1. Display the gamma-pattern-tb.png image and correct the display gamma settings according to the included instructions. You need to have correct gamma settings before measuring crosstalk.
  2. Display the crosstalk-pattern-tb.png image and determine the crosstalk levels using the included instructions.

You now have three crosstalk values for the red, green, and blue channels. You can now tell Bino about this using the --crosstalk option. For example, if you have measured 8% of crosstalk for red, 12% for green, and 10% for blue, use

     $ bino --crosstalk 0.08,0.12,0.10

Once you know the crosstalk levels of your display device, you can set the amount of ghostbusting that Bino should apply using the --ghostbust option. This will vary depending on the content you want to watch. Movies with very dark scenes should be viewed with at least 50% ghostbusting (--ghostbust 0.5), whereas overall bright movies, where crosstalk is less disturbing, could be viewed with a lower level (e.g. --ghostbust 0.1).

To check if you crosstalk calibration is correct, display the crosstalk patterns with full ghostbusting, like this:

     $ bino --crosstalk 0.08,0.12,0.10 --ghostbust 1.0 crosstalk-pattern-tb.png

The remaining crosstalk should optimally be 0%.


Previous: Crosstalk Ghostbusting, Up: Top

9 Advanced Multi Display Support

Bino supports distributed multi-display output via the Equalizer framework.

This is how it works:

9.1 Building Bino with Equalizer Support

First, install Equalizer 0.9.3 (also known as 1.0-beta) or later. See http://www.equalizergraphics.com/. Verify that it works by running the included eqHello example.

Then, build Bino with Equalizer support. The output of configure should contain the following line:

     Equalizer: yes

Now you need an Equalizer configuration file for your display setup.

9.2 Configuring Equalizer and Starting Bino

Bino needs a two-dimensional Equalizer canvas (= combined screen area), subdivided into segments (= single display areas). For example, if you have two projectors that project onto a 2m x 1m screen side-by-side, then your canvas is 2m x 1m large, and you have two segments: the first segment fills the left half of the canvas, and the second segment fills the right half.

Next, Equalizer needs to know how to render into each segment. For this purpose, you define several hierarchical objects: nodes (= processes, possibly on different systems), pipes (= graphics cards), windows (= output windows with OpenGL contexts), and channels (= parts of windows). The video output happens at the channel level: each channel is assigned to one segment of the canvas. Most probably you just have one fullscreen window per pipe, and a single output channel per window.

Note that one node is special: the application node, which is the node that you initially start (the other nodes are started automatically by Equalizer). The application node is called 'appNode' in the Equalizer configuration, and Bino will play audio only on the application node. All video output is then synchronized to this audio output.

Once you have your configuration file (examples are given below), you can check if it works correctly using the eqHello example:

     $ eqHello --eq-config configuration.eqc

Once you made sure that this works, you can start Bino using this command:

     $ bino -o equalizer --eq-config configuration.eqc video.mp4

Note that all your nodes need access to the video file using the same name, so a shared filesystem is helpful if you use multiple systems.

To play live video from a webcam or TV card, you can set up a streaming server using ffserver (part of FFmpeg) or vlc, and then give the appropriate URL to Bino. You can use multicast to stream the video to multiple systems efficiently.

The output mode -o equalizer-3d allows to configure non-planar projections. Bino projects the video onto a virtual screen in 3D space. The screen is located in the distance of the biggest front-facing segment, and sized to fill the wall optimally. By configuring the output segments accordingly, various advanced display configurations can be used, e.g. displays rotated around the Z axis by an arbitrary angle or non-planar screens.

9.3 Example Configurations

9.3.1 Simple 2D video output

In this example, you have a 2m x 1m screen and two projectors: one for the left half of the screen, and one for the right half. The two projectors are connected to two graphics cards on the same system.

In this situation, you have one node with two pipes, and each pipe has a fullscreen window with a single output channel. The first output channel is assigned to the left segment, and the second output channel is assigned to the right channel. The resulting configuration looks like this:

     server
     {
         config
         {
             appNode
             {
                 pipe { device 0 window { attributes { hint_fullscreen ON } channel { name "left" }}}
                 pipe { device 1 window { attributes { hint_fullscreen ON } channel { name "right" }}}
             }
             observer {}
             layout { view { observer 0 }}
             canvas
             {
                 layout 0
                 wall
                 {
                     bottom_left  [ 0.0  0.0 -1 ]
                     bottom_right [ 2.0  0.0 -1 ]
                     top_left     [ 0.0  1.0 -1 ]
                 }
                 segment { channel "left" viewport [ 0.0 0.0 0.5 1.0 ] }
                 segment { channel "right" viewport [ 0.5 0.0 0.5 1.0 ] }
             }
             compound
             {
                 compound { channel ( view 0 segment 0 ) swapbarrier {} }
                 compound { channel ( view 0 segment 1 ) swapbarrier {} }
             }
         }
     }

9.3.2 3D video output across multiple systems

In the following example, you have a 4m x 3m screen for 3D projection via passive stereo (e.g. polarization). You have two systems, "render1" and "render2", each equipped with two graphics cards. The two cards on "render1" generate two images for the left half of the screen: one for the left eye view and one for the right eye view. The two cards on "render2" generate left and right view for the right half of the screen. Additionally, you have a system called "master" which has a sound card and should display a small control window.

This setup is very similar to the situation shown in multi-display-vrlab.jpg.

The configuration looks like this:

     server
     {
         connection { hostname "master" }
         config
         {
             appNode
             {
                 connection { hostname "master" }
                 pipe { window { viewport [ 100 100 400 300 ] channel { name "control" }}}
             }
             node
             {
                 connection { hostname "render1" }
                 pipe { device 0 window { attributes { hint_fullscreen ON } channel { name "render1left" }}}
                 pipe { device 1 window { attributes { hint_fullscreen ON } channel { name "render1right" }}}
             }
             node
             {
                 connection { hostname "render2" }
                 pipe { device 0 window { attributes { hint_fullscreen ON } channel { name "render2left" }}}
                 pipe { device 1 window { attributes { hint_fullscreen ON } channel { name "render2right" }}}
             }
             observer {}
             layout { view { observer 0 }}
             canvas
             {
                 layout 0
                 wall
                 {
                     bottom_left  [ 0.0 0.0 -1 ]
                     bottom_right [ 4.0 0.0 -1 ]
                     top_left     [ 0.0 3.0 -1 ]
                 }
                 segment { channel "render1left"  viewport [ 0.0 0.0 0.5 1.0 ] }
                 segment { channel "render1right" viewport [ 0.0 0.0 0.5 1.0 ] }
                 segment { channel "render2left"  viewport [ 0.5 0.0 0.5 1.0 ] }
                 segment { channel "render2right" viewport [ 0.5 0.0 0.5 1.0 ] }
                 segment { channel "control"      viewport [ 0.0 0.0 1.0 1.0 ] }
             }
             compound
             {
                 compound { eye [ LEFT  ] channel ( view 0 segment 0 ) swapbarrier {} }
                 compound { eye [ RIGHT ] channel ( view 0 segment 1 ) swapbarrier {} }
                 compound { eye [ LEFT  ] channel ( view 0 segment 2 ) swapbarrier {} }
                 compound { eye [ RIGHT ] channel ( view 0 segment 3 ) swapbarrier {} }
                 compound {               channel ( view 0 segment 4 ) swapbarrier {} }
             }
         }
     }

9.3.3 Non-planar Displays

The -o equalizer-3d mode allows to set up arbitrary-oriented screens using either the wall-based or projection-based 3D frustum descriptions.

In this example we set up two 16:10 displays side-by-side which have been rotated around their Z axis by 1.3 degrees radians (~74 degrees). The image multi-display-rotated.jpg illustrates this setup. Other setups include distortion-correct projection for curved screens, or arbitrarily-placed screens in a 3D space.

First, we rotate a normally-aligned screen by 1.3 degrees and output the result:

     eq::Matrix4f matrix(eq::Matrix4f::IDENTITY);
     matrix.rotate(1.3f, eq::Vector3f::FORWARD);
     wall.bottomLeft = matrix * wall.bottomLeft;
     wall.bottomRight = matrix * wall.bottomRight;
     wall.topLeft = matrix * wall.topLeft;
     std::cout << wall << std::endl;

yields a rotated screen centered on the origin:

     bottom_left  [   -0.69578     0.6371         -1 ]
     bottom_right [   -0.26778    -0.9046         -1 ]
     top_left     [    0.26778     0.9046         -1 ]

This screen has to be moved along the X-axis for the left and right screen by 0.5195m, which places the edges of the screen on the origin. The resulting wall descriptions are used for the left and right segment, as shown in the configuration below.

The configuration references two GPUs full-screen output. By changing the node resource section, the outputs may be mapped to two computers. When disabling the fullscreen mode and setting 'device 0' for the second pipe, two windows simulate this setup on a single machine.

     global
     {
         EQ_WINDOW_IATTR_HINT_FULLSCREEN ON
     }
     
     server
     {
         config
         {
             appNode
             {
                 pipe
                 {
                     device 0
                     window
                     {
                         viewport [ .215 .5 .4 .4 ]
                         channel { name "channel1" }
                     }
                 }
                 pipe
                 {
                     device 1
                     window
                     {
                         viewport [ .285 .1 .4 .4 ]
                         attributes{ hint_drawable window }
                         channel { name "channel2" }
                     }
                 }
             }
     
             layout { view{ }}
             canvas
             {
                 layout   0
     
                 segment
                 {
                     channel  "channel1"
                     wall
                     {
                         bottom_left  [   -1.21528     0.6371         -1 ]
                         bottom_right [   -0.78728    -0.9046         -1 ]
                         top_left     [   -0.25172     0.9046         -1 ]
                     }
                 }
                 segment
                 {
                     channel  "channel2"
                     wall
                     {
                         bottom_left  [   -0.17628     0.6371         -1 ]
                         bottom_right [    0.25172    -0.9046         -1 ]
                         top_left     [    0.78728     0.9046         -1 ]
                     }
                 }
             }
     
             compound
             {
                 compound
                 {
                     channel ( segment 0 )
                     swapbarrier{}
                 }
                 compound
                 {
                     channel ( segment 1 )
                     swapbarrier{}
                 }
             }
         }
     }