2005-08-28 03:20:00 +02:00
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author .
*
*/
2009-09-16 11:05:15 +02:00
# ifndef __STDC_FORMAT_MACROS
# define __STDC_FORMAT_MACROS
# endif
# include <stdint.h>
2005-08-28 03:20:00 +02:00
# include <stdlib.h>
# include <unistd.h>
# include <sys/ioctl.h>
# include <linux/dvb/frontend.h>
2006-09-17 03:20:00 +02:00
# include "femonreceiver.h"
# include "femonosd.h"
2005-08-28 03:20:00 +02:00
# include "femontools.h"
2008-12-16 11:26:46 +01:00
static cString getCA ( int value )
{
// http://www.dvb.org/index.php?id=174
// http://en.wikipedia.org/wiki/Conditional_access_system
switch ( value ) {
case 0x0000 : return cString : : sprintf ( " %s (%X) " , trVDR ( " Free To Air " ) , value ) ; // Reserved
case 0x0001 . . . 0x009F :
2012-04-02 18:25:31 +02:00
case 0x00A2 . . . 0x00FF : return cString : : sprintf ( " %s (%X) " , tr ( " Fixed " ) , value ) ; // Standardized systems
case 0x00A0 . . . 0x00A1 : return cString : : sprintf ( " %s (%X) " , tr ( " Analog " ) , value ) ; // Analog signals
case 0x0100 . . . 0x01FF : return cString : : sprintf ( " SECA Mediaguard (%X) " , value ) ; // Canal Plus
case 0x0464 : return cString : : sprintf ( " EuroDec (%X) " , value ) ; // EuroDec
case 0x0500 . . . 0x05FF : return cString : : sprintf ( " Viaccess (%X) " , value ) ; // France Telecom
case 0x0600 . . . 0x06FF : return cString : : sprintf ( " Irdeto (%X) " , value ) ; // Irdeto
case 0x0900 . . . 0x09FF : return cString : : sprintf ( " NDS Videoguard (%X) " , value ) ; // News Datacom
case 0x0B00 . . . 0x0BFF : return cString : : sprintf ( " Conax (%X) " , value ) ; // Norwegian Telekom
case 0x0D00 . . . 0x0DFF : return cString : : sprintf ( " CryptoWorks (%X) " , value ) ; // Philips
case 0x0E00 . . . 0x0EFF : return cString : : sprintf ( " PowerVu (%X) " , value ) ; // Scientific Atlanta
case 0x1000 : return cString : : sprintf ( " RAS (%X) " , value ) ; // Tandberg Television
case 0x1200 . . . 0x12FF : return cString : : sprintf ( " NagraVision (%X) " , value ) ; // BellVu Express
case 0x1700 . . . 0x17FF : return cString : : sprintf ( " BetaCrypt (%X) " , value ) ; // BetaTechnik
case 0x1800 . . . 0x18FF : return cString : : sprintf ( " NagraVision (%X) " , value ) ; // Kudelski SA
case 0x22F0 : return cString : : sprintf ( " Codicrypt (%X) " , value ) ; // Scopus Network Technologies
case 0x2600 : return cString : : sprintf ( " BISS (%X) " , value ) ; // European Broadcasting Union
case 0x4347 : return cString : : sprintf ( " CryptOn (%X) " , value ) ; // CryptOn
case 0x4800 : return cString : : sprintf ( " Accessgate (%X) " , value ) ; // Telemann
case 0x4900 : return cString : : sprintf ( " China Crypt (%X) " , value ) ; // CryptoWorks
case 0x4A10 : return cString : : sprintf ( " EasyCas (%X) " , value ) ; // EasyCas
case 0x4A20 : return cString : : sprintf ( " AlphaCrypt (%X) " , value ) ; // AlphaCrypt
case 0x4A70 : return cString : : sprintf ( " DreamCrypt (%X) " , value ) ; // Dream Multimedia
case 0x4A60 : return cString : : sprintf ( " SkyCrypt (%X) " , value ) ; // @Sky
case 0x4A61 : return cString : : sprintf ( " Neotioncrypt (%X) " , value ) ; // Neotion
case 0x4A62 : return cString : : sprintf ( " SkyCrypt (%X) " , value ) ; // @Sky
case 0x4A63 : return cString : : sprintf ( " Neotion SHL (%X) " , value ) ; // Neotion
case 0x4A64 . . . 0x4A6F : return cString : : sprintf ( " SkyCrypt (%X) " , value ) ; // @Sky
case 0x4A80 : return cString : : sprintf ( " ThalesCrypt (%X) " , value ) ; // TPS
case 0x4AA1 : return cString : : sprintf ( " KeyFly (%X) " , value ) ; // SIDSA
case 0x4ABF : return cString : : sprintf ( " DG-Crypt (%X) " , value ) ; // Beijing Compunicate Technology Inc.
case 0x4AD0 . . . 0x4AD1 : return cString : : sprintf ( " X-Crypt (%X) " , value ) ; // XCrypt Inc.
case 0x4AD4 : return cString : : sprintf ( " OmniCrypt (%X) " , value ) ; // Widevine Technologies, Inc.
case 0x4AE0 : return cString : : sprintf ( " RossCrypt (%X) " , value ) ; // Digi Raum Electronics Co. Ltd.
case 0x5500 : return cString : : sprintf ( " Z-Crypt (%X) " , value ) ; // Digi Raum Electronics Co. Ltd.
case 0x5501 : return cString : : sprintf ( " Griffin (%X) " , value ) ; // Griffin
2009-03-24 11:51:51 +01:00
default : break ;
2008-12-16 11:26:46 +01:00
}
return cString : : sprintf ( " %X " , value ) ;
}
2010-02-28 20:42:06 +01:00
static const char * getUserString ( int Value , const tDvbParameterMap * Map )
2008-12-16 11:26:46 +01:00
{
2010-02-28 20:42:06 +01:00
const tDvbParameterMap * map = Map ;
2008-12-16 11:26:46 +01:00
while ( map & & map - > userValue ! = - 1 ) {
if ( map - > driverValue = = Value )
2009-08-29 20:01:20 +02:00
return map - > userString ? trVDR ( map - > userString ) : " --- " ;
2008-12-16 11:26:46 +01:00
map + + ;
}
return " --- " ;
}
2012-03-29 20:48:52 +02:00
cDvbDevice * getDvbDevice ( cDevice * device )
{
cDvbDevice * dev = dynamic_cast < cDvbDevice * > ( device ) ;
# ifdef __DYNAMIC_DEVICE_PROBE
if ( ! dev & & device & & device - > HasSubDevice ( ) )
dev = dynamic_cast < cDvbDevice * > ( device - > SubDevice ( ) ) ;
# endif
return dev ;
}
2012-01-15 22:07:53 +01:00
cString getFrontendInfo ( cDvbDevice * device )
2006-09-17 03:20:00 +02:00
{
cString info ;
struct dvb_frontend_info value ;
fe_status_t status ;
uint16_t signal = 0 ;
uint16_t snr = 0 ;
uint32_t ber = 0 ;
uint32_t unc = 0 ;
cChannel * channel = Channels . GetByNumber ( cDevice : : CurrentChannel ( ) ) ;
2012-01-15 22:07:53 +01:00
if ( ! device )
return info ;
int fe = open ( * cString : : sprintf ( FRONTEND_DEVICE , device - > Adapter ( ) , device - > Frontend ( ) ) , O_RDONLY | O_NONBLOCK ) ;
2006-09-17 03:20:00 +02:00
if ( fe < 0 )
2012-01-15 22:07:53 +01:00
return info ;
2006-09-17 03:20:00 +02:00
2012-01-15 22:07:53 +01:00
info = cString : : sprintf ( " CARD:%d \n STRG:%d \n QUAL:%d " , device - > CardIndex ( ) , device - > SignalStrength ( ) , device - > SignalQuality ( ) ) ;
2009-09-16 08:37:51 +02:00
if ( ioctl ( fe , FE_GET_INFO , & value ) > = 0 )
2012-03-25 15:55:42 +02:00
info = cString : : sprintf ( " %s \n TYPE:%d \n NAME:%s " , * info , value . type , * device - > DeviceName ( ) ) ;
2009-09-16 08:37:51 +02:00
if ( ioctl ( fe , FE_READ_STATUS , & status ) > = 0 )
info = cString : : sprintf ( " %s \n STAT:%02X " , * info , status ) ;
if ( ioctl ( fe , FE_READ_SIGNAL_STRENGTH , & signal ) > = 0 )
2009-09-22 07:44:30 +02:00
info = cString : : sprintf ( " %s \n SGNL:%04X " , * info , signal ) ;
2009-09-16 08:37:51 +02:00
if ( ioctl ( fe , FE_READ_SNR , & snr ) > = 0 )
2009-09-22 07:44:30 +02:00
info = cString : : sprintf ( " %s \n SNRA:%04X " , * info , snr ) ;
2009-09-16 08:37:51 +02:00
if ( ioctl ( fe , FE_READ_BER , & ber ) > = 0 )
2009-09-22 07:44:30 +02:00
info = cString : : sprintf ( " %s \n BERA:%08X " , * info , ber ) ;
2009-09-16 08:37:51 +02:00
if ( ioctl ( fe , FE_READ_UNCORRECTED_BLOCKS , & unc ) > = 0 )
2009-09-22 07:44:30 +02:00
info = cString : : sprintf ( " %s \n UNCB:%08X " , * info , unc ) ;
2009-09-16 08:37:51 +02:00
close ( fe ) ;
2006-09-17 03:20:00 +02:00
if ( cFemonOsd : : Instance ( ) )
info = cString : : sprintf ( " %s \n VIBR:%.0f \n AUBR:%.0f \n DDBR:%.0f " , * info , cFemonOsd : : Instance ( ) - > GetVideoBitrate ( ) , cFemonOsd : : Instance ( ) - > GetAudioBitrate ( ) , cFemonOsd : : Instance ( ) - > GetDolbyBitrate ( ) ) ;
if ( channel )
2008-12-13 21:25:26 +01:00
info = cString : : sprintf ( " %s \n CHAN:%s " , * info , * channel - > ToText ( ) ) ;
2006-09-17 03:20:00 +02:00
return info ;
}
2012-01-15 22:07:53 +01:00
cString getFrontendName ( cDvbDevice * device )
2005-08-28 03:20:00 +02:00
{
2012-01-15 22:07:53 +01:00
if ( ! device )
return NULL ;
2012-03-25 15:55:42 +02:00
return ( cString : : sprintf ( " %s on device #%d " , * device - > DeviceName ( ) , device - > CardIndex ( ) ) ) ;
2005-08-28 03:20:00 +02:00
}
2012-01-15 22:07:53 +01:00
cString getFrontendStatus ( cDvbDevice * device )
2005-08-28 03:20:00 +02:00
{
fe_status_t value ;
2012-01-15 22:07:53 +01:00
if ( ! device )
return NULL ;
int fe = open ( * cString : : sprintf ( FRONTEND_DEVICE , device - > Adapter ( ) , device - > Frontend ( ) ) , O_RDONLY | O_NONBLOCK ) ;
2005-08-28 03:20:00 +02:00
if ( fe < 0 )
return NULL ;
2009-09-16 11:05:15 +02:00
memset ( & value , 0 , sizeof ( value ) ) ;
ioctl ( fe , FE_READ_STATUS , & value ) ;
2005-08-28 03:20:00 +02:00
close ( fe ) ;
2012-01-15 22:07:53 +01:00
return ( cString : : sprintf ( " Status %s:%s:%s:%s:%s on device #%d " , ( value & FE_HAS_LOCK ) ? " LOCKED " : " - " , ( value & FE_HAS_SIGNAL ) ? " SIGNAL " : " - " , ( value & FE_HAS_CARRIER ) ? " CARRIER " : " - " , ( value & FE_HAS_VITERBI ) ? " VITERBI " : " - " , ( value & FE_HAS_SYNC ) ? " SYNC " : " - " , device - > CardIndex ( ) ) ) ;
2005-08-28 03:20:00 +02:00
}
2012-01-15 22:07:53 +01:00
uint16_t getSignal ( cDvbDevice * device )
2005-08-28 03:20:00 +02:00
{
uint16_t value = 0 ;
2012-01-15 22:07:53 +01:00
if ( ! device )
return ( value ) ;
int fe = open ( * cString : : sprintf ( FRONTEND_DEVICE , device - > Adapter ( ) , device - > Frontend ( ) ) , O_RDONLY | O_NONBLOCK ) ;
2005-08-28 03:20:00 +02:00
if ( fe < 0 )
return ( value ) ;
2009-09-16 11:05:15 +02:00
ioctl ( fe , FE_READ_SIGNAL_STRENGTH , & value ) ;
2005-08-28 03:20:00 +02:00
close ( fe ) ;
return ( value ) ;
}
2012-01-15 22:07:53 +01:00
uint16_t getSNR ( cDvbDevice * device )
2005-08-28 03:20:00 +02:00
{
uint16_t value = 0 ;
2012-01-15 22:07:53 +01:00
if ( ! device )
return ( value ) ;
int fe = open ( * cString : : sprintf ( FRONTEND_DEVICE , device - > Adapter ( ) , device - > Frontend ( ) ) , O_RDONLY | O_NONBLOCK ) ;
2005-08-28 03:20:00 +02:00
if ( fe < 0 )
return ( value ) ;
2009-09-16 11:05:15 +02:00
ioctl ( fe , FE_READ_SNR , & value ) ;
2005-08-28 03:20:00 +02:00
close ( fe ) ;
return ( value ) ;
}
2012-01-15 22:07:53 +01:00
uint32_t getBER ( cDvbDevice * device )
2005-08-28 03:20:00 +02:00
{
uint32_t value = 0 ;
2012-01-15 22:07:53 +01:00
if ( ! device )
return ( value ) ;
int fe = open ( * cString : : sprintf ( FRONTEND_DEVICE , device - > Adapter ( ) , device - > Frontend ( ) ) , O_RDONLY | O_NONBLOCK ) ;
2005-08-28 03:20:00 +02:00
if ( fe < 0 )
return ( value ) ;
2009-09-16 11:05:15 +02:00
ioctl ( fe , FE_READ_BER , & value ) ;
2005-08-28 03:20:00 +02:00
close ( fe ) ;
return ( value ) ;
}
2012-01-15 22:07:53 +01:00
uint32_t getUNC ( cDvbDevice * device )
2005-08-28 03:20:00 +02:00
{
uint32_t value = 0 ;
2012-01-15 22:07:53 +01:00
if ( ! device )
return ( value ) ;
int fe = open ( * cString : : sprintf ( FRONTEND_DEVICE , device - > Adapter ( ) , device - > Frontend ( ) ) , O_RDONLY | O_NONBLOCK ) ;
2005-08-28 03:20:00 +02:00
if ( fe < 0 )
return ( value ) ;
2009-09-16 11:05:15 +02:00
ioctl ( fe , FE_READ_UNCORRECTED_BLOCKS , & value ) ;
2005-08-28 03:20:00 +02:00
close ( fe ) ;
return ( value ) ;
}
2006-09-17 03:20:00 +02:00
cString getApids ( const cChannel * channel )
{
int value = 0 ;
cString apids = cString : : sprintf ( " %d " , channel - > Apid ( value ) ) ;
while ( channel - > Apid ( + + value ) & & ( value < MAXAPIDS ) )
apids = cString : : sprintf ( " %s, %d " , * apids , channel - > Apid ( value ) ) ;
return apids ;
}
cString getDpids ( const cChannel * channel )
{
int value = 0 ;
cString dpids = cString : : sprintf ( " %d " , channel - > Dpid ( value ) ) ;
while ( channel - > Dpid ( + + value ) & & ( value < MAXDPIDS ) )
dpids = cString : : sprintf ( " %s, %d " , * dpids , channel - > Dpid ( value ) ) ;
return dpids ;
}
2007-10-14 03:20:00 +02:00
cString getSpids ( const cChannel * channel )
{
int value = 0 ;
cString spids = cString : : sprintf ( " %d " , channel - > Spid ( value ) ) ;
while ( channel - > Spid ( + + value ) & & ( value < MAXSPIDS ) )
spids = cString : : sprintf ( " %s, %d " , * spids , channel - > Spid ( value ) ) ;
return spids ;
}
2008-12-16 11:26:46 +01:00
cString getCAids ( const cChannel * channel )
2006-09-17 03:20:00 +02:00
{
int value = 0 ;
2008-12-16 11:26:46 +01:00
cString caids = cString : : sprintf ( " %s " , * getCA ( channel - > Ca ( value ) ) ) ;
while ( channel - > Ca ( + + value ) & & ( value < MAXCAIDS ) )
caids = cString : : sprintf ( " %s, %s " , * caids , * getCA ( channel - > Ca ( value ) ) ) ;
2006-09-17 03:20:00 +02:00
return caids ;
}
2008-11-10 23:30:00 +01:00
cString getVideoStream ( int value )
{
if ( value ! = 0 )
return cString : : sprintf ( " #%d " , value ) ;
return cString : : sprintf ( " --- " ) ;
}
cString getAudioStream ( int value , const cChannel * channel )
{
int pid = 0 ;
if ( IS_AUDIO_TRACK ( value ) )
pid = int ( value - ttAudioFirst ) ;
if ( channel & & channel - > Apid ( pid ) ) {
if ( channel - > Alang ( pid ) )
return cString : : sprintf ( " #%d (%s) " , channel - > Apid ( pid ) , channel - > Alang ( pid ) ) ;
else
return cString : : sprintf ( " #%d " , channel - > Apid ( pid ) ) ;
2008-11-22 22:12:39 +01:00
}
return cString : : sprintf ( " --- " ) ;
}
cString getAC3Stream ( int value , const cChannel * channel )
{
int pid = 0 ;
if ( IS_DOLBY_TRACK ( value ) )
pid = int ( value - ttDolbyFirst ) ;
if ( channel & & channel - > Dpid ( pid ) ) {
if ( channel - > Dlang ( pid ) )
return cString : : sprintf ( " #%d (%s) " , channel - > Dpid ( pid ) , channel - > Dlang ( pid ) ) ;
else
return cString : : sprintf ( " #%d " , channel - > Dpid ( pid ) ) ;
2008-11-10 23:30:00 +01:00
}
return cString : : sprintf ( " --- " ) ;
}
2008-11-09 12:43:27 +01:00
cString getVideoCodec ( int value )
{
switch ( value ) {
case VIDEO_CODEC_MPEG2 : return cString : : sprintf ( " %s " , tr ( " MPEG-2 " ) ) ;
case VIDEO_CODEC_H264 : return cString : : sprintf ( " %s " , tr ( " H.264 " ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2008-11-09 12:43:27 +01:00
}
return cString : : sprintf ( " --- " ) ;
}
cString getAudioCodec ( int value )
{
switch ( value ) {
case AUDIO_CODEC_MPEG1_I : return cString : : sprintf ( " %s " , tr ( " MPEG-1 Layer I " ) ) ;
case AUDIO_CODEC_MPEG1_II : return cString : : sprintf ( " %s " , tr ( " MPEG-1 Layer II " ) ) ;
case AUDIO_CODEC_MPEG1_III : return cString : : sprintf ( " %s " , tr ( " MPEG-1 Layer III " ) ) ;
case AUDIO_CODEC_MPEG2_I : return cString : : sprintf ( " %s " , tr ( " MPEG-2 Layer I " ) ) ;
case AUDIO_CODEC_MPEG2_II : return cString : : sprintf ( " %s " , tr ( " MPEG-2 Layer II " ) ) ;
case AUDIO_CODEC_MPEG2_III : return cString : : sprintf ( " %s " , tr ( " MPEG-2 Layer III " ) ) ;
case AUDIO_CODEC_HEAAC : return cString : : sprintf ( " %s " , tr ( " HE-AAC " ) ) ;
2010-06-23 11:16:17 +02:00
case AUDIO_CODEC_LATM : return cString : : sprintf ( " %s " , tr ( " LATM " ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2008-11-09 12:43:27 +01:00
}
return cString : : sprintf ( " --- " ) ;
}
cString getAudioChannelMode ( int value )
{
switch ( value ) {
case AUDIO_CHANNEL_MODE_STEREO : return cString : : sprintf ( " %s " , tr ( " stereo " ) ) ;
case AUDIO_CHANNEL_MODE_JOINT_STEREO : return cString : : sprintf ( " %s " , tr ( " joint Stereo " ) ) ;
case AUDIO_CHANNEL_MODE_DUAL : return cString : : sprintf ( " %s " , tr ( " dual " ) ) ;
case AUDIO_CHANNEL_MODE_SINGLE : return cString : : sprintf ( " %s " , tr ( " mono " ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2008-11-09 12:43:27 +01:00
}
return cString : : sprintf ( " --- " ) ;
}
2006-09-17 03:20:00 +02:00
cString getCoderate ( int value )
{
2008-12-16 11:26:46 +01:00
return cString : : sprintf ( " %s " , getUserString ( value , CoderateValues ) ) ;
2006-09-17 03:20:00 +02:00
}
cString getTransmission ( int value )
{
2008-12-16 11:26:46 +01:00
return cString : : sprintf ( " %s " , getUserString ( value , TransmissionValues ) ) ;
2006-09-17 03:20:00 +02:00
}
2009-08-25 19:22:06 +02:00
2006-09-17 03:20:00 +02:00
cString getBandwidth ( int value )
{
2008-12-16 11:26:46 +01:00
return cString : : sprintf ( " %s " , getUserString ( value , BandwidthValues ) ) ;
2006-09-17 03:20:00 +02:00
}
cString getInversion ( int value )
{
2008-12-16 11:26:46 +01:00
return cString : : sprintf ( " %s " , getUserString ( value , InversionValues ) ) ;
2006-09-17 03:20:00 +02:00
}
cString getHierarchy ( int value )
{
2008-12-16 11:26:46 +01:00
return cString : : sprintf ( " %s " , getUserString ( value , HierarchyValues ) ) ;
2006-09-17 03:20:00 +02:00
}
cString getGuard ( int value )
{
2008-12-16 11:26:46 +01:00
return cString : : sprintf ( " %s " , getUserString ( value , GuardValues ) ) ;
2006-09-17 03:20:00 +02:00
}
cString getModulation ( int value )
{
2008-12-16 11:26:46 +01:00
return cString : : sprintf ( " %s " , getUserString ( value , ModulationValues ) ) ;
2008-11-09 12:43:27 +01:00
}
2012-01-15 22:07:53 +01:00
cString getTerrestrialSystem ( int value )
{
return cString : : sprintf ( " %s " , getUserString ( value , SystemValuesTerr ) ) ;
}
cString getSatelliteSystem ( int value )
2008-11-09 12:43:27 +01:00
{
2012-01-15 22:07:53 +01:00
return cString : : sprintf ( " %s " , getUserString ( value , SystemValuesSat ) ) ;
2008-11-09 12:43:27 +01:00
}
cString getRollOff ( int value )
{
2008-12-16 11:26:46 +01:00
return cString : : sprintf ( " %s " , getUserString ( value , RollOffValues ) ) ;
2008-11-09 12:43:27 +01:00
}
cString getResolution ( int width , int height , int scan )
{
if ( ( width > 0 ) & & ( height > 0 ) ) {
switch ( scan ) {
case VIDEO_SCAN_INTERLACED : return cString : : sprintf ( " %dx%d %s " , width , height , tr ( " interlaced " ) ) ;
case VIDEO_SCAN_PROGRESSIVE : return cString : : sprintf ( " %dx%d %s " , width , height , tr ( " progressive " ) ) ;
default : return cString : : sprintf ( " %dx%d " , width , height ) ;
}
}
return cString : : sprintf ( " --- " ) ;
}
2006-09-17 03:20:00 +02:00
cString getAspectRatio ( int value )
{
switch ( value ) {
2008-11-09 12:43:27 +01:00
case VIDEO_ASPECT_RATIO_RESERVED : return cString : : sprintf ( " %s " , tr ( " reserved " ) ) ;
case VIDEO_ASPECT_RATIO_EXTENDED : return cString : : sprintf ( " %s " , tr ( " extended " ) ) ;
case VIDEO_ASPECT_RATIO_1_1 : return cString : : sprintf ( " 1:1 " ) ;
case VIDEO_ASPECT_RATIO_4_3 : return cString : : sprintf ( " 4:3 " ) ;
case VIDEO_ASPECT_RATIO_16_9 : return cString : : sprintf ( " 16:9 " ) ;
case VIDEO_ASPECT_RATIO_2_21_1 : return cString : : sprintf ( " 2.21:1 " ) ;
case VIDEO_ASPECT_RATIO_12_11 : return cString : : sprintf ( " 12:11 " ) ;
case VIDEO_ASPECT_RATIO_10_11 : return cString : : sprintf ( " 10:11 " ) ;
case VIDEO_ASPECT_RATIO_16_11 : return cString : : sprintf ( " 16:11 " ) ;
case VIDEO_ASPECT_RATIO_40_33 : return cString : : sprintf ( " 40:33 " ) ;
case VIDEO_ASPECT_RATIO_24_11 : return cString : : sprintf ( " 24:11 " ) ;
case VIDEO_ASPECT_RATIO_20_11 : return cString : : sprintf ( " 20:11 " ) ;
case VIDEO_ASPECT_RATIO_32_11 : return cString : : sprintf ( " 32:11 " ) ;
case VIDEO_ASPECT_RATIO_80_33 : return cString : : sprintf ( " 80:33 " ) ;
case VIDEO_ASPECT_RATIO_18_11 : return cString : : sprintf ( " 18:11 " ) ;
case VIDEO_ASPECT_RATIO_15_11 : return cString : : sprintf ( " 15:11 " ) ;
case VIDEO_ASPECT_RATIO_64_33 : return cString : : sprintf ( " 64:33 " ) ;
case VIDEO_ASPECT_RATIO_160_99 : return cString : : sprintf ( " 160:99 " ) ;
case VIDEO_ASPECT_RATIO_3_2 : return cString : : sprintf ( " 3:2 " ) ;
case VIDEO_ASPECT_RATIO_2_1 : return cString : : sprintf ( " 2:1 " ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2006-09-17 03:20:00 +02:00
}
return cString : : sprintf ( " --- " ) ;
}
cString getVideoFormat ( int value )
{
switch ( value ) {
2008-11-09 12:43:27 +01:00
case VIDEO_FORMAT_UNKNOWN : return cString : : sprintf ( " %s " , tr ( " unknown " ) ) ;
case VIDEO_FORMAT_RESERVED : return cString : : sprintf ( " %s " , tr ( " reserved " ) ) ;
case VIDEO_FORMAT_COMPONENT : return cString : : sprintf ( " %s " , tr ( " component " ) ) ;
case VIDEO_FORMAT_PAL : return cString : : sprintf ( " %s " , tr ( " PAL " ) ) ;
case VIDEO_FORMAT_NTSC : return cString : : sprintf ( " %s " , tr ( " NTSC " ) ) ;
case VIDEO_FORMAT_SECAM : return cString : : sprintf ( " %s " , tr ( " SECAM " ) ) ;
case VIDEO_FORMAT_MAC : return cString : : sprintf ( " %s " , tr ( " MAC " ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2006-09-17 03:20:00 +02:00
}
return cString : : sprintf ( " --- " ) ;
}
2008-11-09 12:43:27 +01:00
cString getFrameRate ( double value )
{
if ( value > 0 )
return cString : : sprintf ( " %.2f %s " , value , tr ( " Hz " ) ) ;
return cString : : sprintf ( " --- " ) ;
}
2006-09-17 03:20:00 +02:00
cString getAC3BitStreamMode ( int value , int coding )
{
switch ( value ) {
2008-11-09 12:43:27 +01:00
case AUDIO_BITSTREAM_MODE_CM : return cString : : sprintf ( " %s " , tr ( " Complete Main (CM) " ) ) ;
case AUDIO_BITSTREAM_MODE_ME : return cString : : sprintf ( " %s " , tr ( " Music and Effects (ME) " ) ) ;
case AUDIO_BITSTREAM_MODE_VI : return cString : : sprintf ( " %s " , tr ( " Visually Impaired (VI) " ) ) ;
case AUDIO_BITSTREAM_MODE_HI : return cString : : sprintf ( " %s " , tr ( " Hearing Impaired (HI) " ) ) ;
case AUDIO_BITSTREAM_MODE_D : return cString : : sprintf ( " %s " , tr ( " Dialogue (D) " ) ) ;
case AUDIO_BITSTREAM_MODE_C : return cString : : sprintf ( " %s " , tr ( " Commentary (C) " ) ) ;
case AUDIO_BITSTREAM_MODE_E : return cString : : sprintf ( " %s " , tr ( " Emergency (E) " ) ) ;
case AUDIO_BITSTREAM_MODE_VO_KAR : return cString : : sprintf ( " %s " , ( coding = = 1 ) ? tr ( " Voice Over (VO) " ) : tr ( " Karaoke " ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2006-09-17 03:20:00 +02:00
}
return cString : : sprintf ( " --- " ) ;
}
cString getAC3AudioCodingMode ( int value , int stream )
{
if ( stream ! = 7 ) {
switch ( value ) {
2008-11-09 12:43:27 +01:00
case AUDIO_CODING_MODE_1_1 : return cString : : sprintf ( " 1+1 - %s, %s " , tr ( " Ch1 " ) , tr ( " Ch2 " ) ) ;
case AUDIO_CODING_MODE_1_0 : return cString : : sprintf ( " 1/0 - %s " , tr ( " C " ) ) ;
case AUDIO_CODING_MODE_2_0 : return cString : : sprintf ( " 2/0 - %s, %s " , tr ( " L " ) , tr ( " R " ) ) ;
case AUDIO_CODING_MODE_3_0 : return cString : : sprintf ( " 3/0 - %s, %s, %s " , tr ( " L " ) , tr ( " C " ) , tr ( " R " ) ) ;
case AUDIO_CODING_MODE_2_1 : return cString : : sprintf ( " 2/1 - %s, %s, %s " , tr ( " L " ) , tr ( " R " ) , tr ( " S " ) ) ;
case AUDIO_CODING_MODE_3_1 : return cString : : sprintf ( " 3/1 - %s, %s, %s, %s " , tr ( " L " ) , tr ( " C " ) , tr ( " R " ) , tr ( " S " ) ) ;
case AUDIO_CODING_MODE_2_2 : return cString : : sprintf ( " 2/2 - %s, %s, %s, %s " , tr ( " L " ) , tr ( " R " ) , tr ( " SL " ) , tr ( " SR " ) ) ;
case AUDIO_CODING_MODE_3_2 : return cString : : sprintf ( " 3/2 - %s, %s, %s, %s, %s " , tr ( " L " ) , tr ( " C " ) , tr ( " R " ) , tr ( " SL " ) , tr ( " SR " ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2006-09-17 03:20:00 +02:00
}
}
return cString : : sprintf ( " --- " ) ;
}
cString getAC3CenterMixLevel ( int value )
{
switch ( value ) {
2008-11-09 12:43:27 +01:00
case AUDIO_CENTER_MIX_LEVEL_MINUS_3dB : return cString : : sprintf ( " -3.0 %s " , tr ( " dB " ) ) ;
case AUDIO_CENTER_MIX_LEVEL_MINUS_4_5dB : return cString : : sprintf ( " -4.5 %s " , tr ( " dB " ) ) ;
case AUDIO_CENTER_MIX_LEVEL_MINUS_6dB : return cString : : sprintf ( " -6.0 %s " , tr ( " dB " ) ) ;
case AUDIO_CENTER_MIX_LEVEL_RESERVED : return cString : : sprintf ( " %s " , tr ( " reserved " ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2006-09-17 03:20:00 +02:00
}
return cString : : sprintf ( " --- " ) ;
}
cString getAC3SurroundMixLevel ( int value )
{
switch ( value ) {
2008-11-09 12:43:27 +01:00
case AUDIO_SURROUND_MIX_LEVEL_MINUS_3dB : return cString : : sprintf ( " -3 %s " , tr ( " dB " ) ) ;
case AUDIO_SURROUND_MIX_LEVEL_MINUS_6dB : return cString : : sprintf ( " -6 %s " , tr ( " dB " ) ) ;
case AUDIO_SURROUND_MIX_LEVEL_0_dB : return cString : : sprintf ( " 0 %s " , tr ( " dB " ) ) ;
case AUDIO_SURROUND_MIX_LEVEL_RESERVED : return cString : : sprintf ( " %s " , tr ( " reserved " ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2006-09-17 03:20:00 +02:00
}
return cString : : sprintf ( " --- " ) ;
}
cString getAC3DolbySurroundMode ( int value )
{
switch ( value ) {
2008-11-09 12:43:27 +01:00
case AUDIO_DOLBY_SURROUND_MODE_NOT_INDICATED : return cString : : sprintf ( " %s " , tr ( " not indicated " ) ) ;
case AUDIO_DOLBY_SURROUND_MODE_NOT_DOLBYSURROUND : return cString : : sprintf ( " %s " , trVDR ( " no " ) ) ;
case AUDIO_DOLBY_SURROUND_MODE_DOLBYSURROUND : return cString : : sprintf ( " %s " , trVDR ( " yes " ) ) ;
case AUDIO_DOLBY_SURROUND_MODE_RESERVED : return cString : : sprintf ( " %s " , tr ( " reserved " ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2006-09-17 03:20:00 +02:00
}
return cString : : sprintf ( " --- " ) ;
}
cString getAC3DialogLevel ( int value )
{
if ( value > 0 )
return cString : : sprintf ( " -%d %s " , value , tr ( " dB " ) ) ;
return cString : : sprintf ( " --- " ) ;
}
cString getFrequencyMHz ( int value )
{
while ( value > 20000 ) value / = 1000 ;
return cString : : sprintf ( " %d %s " , value , tr ( " MHz " ) ) ;
}
cString getAudioSamplingFreq ( int value )
{
switch ( value ) {
2008-11-09 12:43:27 +01:00
case AUDIO_SAMPLING_FREQUENCY_INVALID : return cString : : sprintf ( " --- " ) ;
case AUDIO_SAMPLING_FREQUENCY_RESERVED : return cString : : sprintf ( " %s " , tr ( " reserved " ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2006-09-17 03:20:00 +02:00
}
2008-11-09 12:43:27 +01:00
return cString : : sprintf ( " %d %s " , value , tr ( " Hz " ) ) ;
2006-09-17 03:20:00 +02:00
}
cString getAudioBitrate ( double value , double stream )
{
switch ( ( int ) stream ) {
2008-11-09 12:43:27 +01:00
case AUDIO_BITRATE_INVALID : return cString : : sprintf ( " --- " ) ;
case AUDIO_BITRATE_RESERVED : return cString : : sprintf ( " %s (%s) " , tr ( " reserved " ) , * getBitrateKbits ( value ) ) ;
case AUDIO_BITRATE_FREE : return cString : : sprintf ( " %s (%s) " , tr ( " free " ) , * getBitrateKbits ( value ) ) ;
2009-03-24 11:51:51 +01:00
default : break ;
2006-09-17 03:20:00 +02:00
}
return cString : : sprintf ( " %s (%s) " , * getBitrateKbits ( stream ) , * getBitrateKbits ( value ) ) ;
}
2008-11-09 12:43:27 +01:00
cString getVideoBitrate ( double value , double stream )
{
return cString : : sprintf ( " %s (%s) " , * getBitrateMbits ( stream ) , * getBitrateMbits ( value ) ) ;
}
2006-09-17 03:20:00 +02:00
cString getBitrateMbits ( double value )
{
2008-11-09 12:43:27 +01:00
if ( value > 0 )
2006-09-17 03:20:00 +02:00
return cString : : sprintf ( " %.2f %s " , value / 1000000.0 , tr ( " Mbit/s " ) ) ;
2008-11-09 12:43:27 +01:00
return cString : : sprintf ( " --- " ) ;
2006-09-17 03:20:00 +02:00
}
cString getBitrateKbits ( double value )
{
2009-08-25 19:22:06 +02:00
if ( value > 0 )
2006-09-17 03:20:00 +02:00
return cString : : sprintf ( " %.0f %s " , value / 1000.0 , tr ( " kbit/s " ) ) ;
2008-11-09 12:43:27 +01:00
return cString : : sprintf ( " --- " ) ;
2006-09-17 03:20:00 +02:00
}
2009-08-25 19:22:06 +02:00
2011-11-19 15:02:16 +01:00
// --- cFemonBitStream -------------------------------------------------------
2009-08-25 19:22:06 +02:00
2011-11-19 15:02:16 +01:00
uint32_t cFemonBitStream : : GetUeGolomb ( )
2009-08-25 19:22:06 +02:00
{
int n = 0 ;
2011-11-19 15:02:16 +01:00
while ( ! GetBit ( ) & & ( n < 32 ) )
2009-08-25 19:22:06 +02:00
n + + ;
2011-11-19 15:02:16 +01:00
return ( n ? ( ( 1 < < n ) - 1 ) + GetBits ( n ) : 0 ) ;
2009-08-25 19:22:06 +02:00
}
2011-11-19 15:02:16 +01:00
int32_t cFemonBitStream : : GetSeGolomb ( )
2009-08-25 19:22:06 +02:00
{
2011-11-19 15:02:16 +01:00
uint32_t r = GetUeGolomb ( ) + 1 ;
2009-08-25 19:22:06 +02:00
2011-11-19 15:02:16 +01:00
return ( ( r & 1 ) ? - ( r > > 1 ) : ( r > > 1 ) ) ;
2009-08-25 19:22:06 +02:00
}
2011-11-19 15:02:16 +01:00
void cFemonBitStream : : SkipGolomb ( )
2009-08-25 19:22:06 +02:00
{
2011-11-19 15:02:16 +01:00
int n = 0 ;
2009-08-25 19:22:06 +02:00
2011-11-19 15:02:16 +01:00
while ( ! GetBit ( ) & & ( n < 32 ) )
n + + ;
SkipBits ( n ) ;
2009-08-25 19:22:06 +02:00
}