X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Finfopanels.cpp;h=0b3248e17a5ca4588c9f004404a737fa6ee5ca1e;hb=bed888c88ce154913bfd76a008ea586a6fbbb62d;hp=5e7c2516bac63f8656178bbb1961f2018f4ea220;hpb=712f983f22d2880e2fe8f1af101d8b314b87c26b;p=vlc diff --git a/modules/gui/qt4/components/infopanels.cpp b/modules/gui/qt4/components/infopanels.cpp index 5e7c2516ba..0b3248e17a 100644 --- a/modules/gui/qt4/components/infopanels.cpp +++ b/modules/gui/qt4/components/infopanels.cpp @@ -22,208 +22,399 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include "components/infopanels.hpp" #include "qt4.hpp" +#include "components/infopanels.hpp" #include +#include #include #include #include +#include #include - +#include +#include +#include +#include /************************************************************************ * Single panels ************************************************************************/ -/* First Panel - Meta Info */ - -MetaPanel::MetaPanel( QWidget *parent, intf_thread_t *_p_intf ) : - QWidget( parent ), p_intf( _p_intf ) +/** + * First Panel - Meta Info + * All the usual MetaData are displayed and can be changed. + **/ +MetaPanel::MetaPanel( QWidget *parent, + intf_thread_t *_p_intf ) + : QWidget( parent ), p_intf( _p_intf ) { - int line = 0; - QGridLayout *l = new QGridLayout( this ); -#define ADD_META( string, widget ) { \ - l->addWidget( new QLabel( qfu( string ) ), line, 0 ); \ - widget = new QLabel( "" ); \ - l->addWidget( widget, line, 1 ); \ + QGridLayout *metaLayout = new QGridLayout( this ); + + int line = 0; /* Counter for GridLayout */ + p_input = NULL; + +#define ADD_META( string, widget ) { \ + metaLayout->addWidget( new QLabel( qtr( string ) + " :" ), line, 0 ); \ + widget = new QLineEdit; \ + metaLayout->addWidget( widget, line, 1, 1, 9 ); \ + line++; } + + /* Title, artist and album*/ + ADD_META( VLC_META_TITLE, title_text ); /* OK */ + ADD_META( VLC_META_ARTIST, artist_text ); /* OK */ + ADD_META( VLC_META_COLLECTION, collection_text ); /* OK */ + + /* Genre Name */ + /* FIXME List id3genres.h is not includable yet ? */ + genre_text = new QLineEdit; + metaLayout->addWidget( new QLabel( qtr( VLC_META_GENRE ) + " :" ), line, 0 ); + metaLayout->addWidget( genre_text, line, 1, 1, 5 ); + + /* Number - on the same line */ + metaLayout->addWidget( new QLabel( qtr( "Track Number" ) + " :" ), + line, 6 ); + seqnum_text = new QLineEdit; + seqnum_text->setInputMask("0000"); + seqnum_text->setAlignment( Qt::AlignRight ); + metaLayout->addWidget( seqnum_text, line, 7, 1, 3 ); + line++; + + /* Date (Should be in years) */ + date_text = new QLineEdit; + date_text->setInputMask("0000"); + date_text->setAlignment( Qt::AlignRight ); + metaLayout->addWidget( new QLabel( qtr( VLC_META_DATE ) + " :" ), line, 0 ); + metaLayout->addWidget( date_text, line, 1, 1, 2 ); + + /* Rating - on the same line */ + metaLayout->addWidget( new QLabel( qtr( VLC_META_RATING ) + " :" ), line, 3, 1, 2 ); + rating_text = new QSpinBox; setSpinBounds( rating_text ); + metaLayout->addWidget( rating_text, line, 5, 1, 1 ); + + /* Language on the same line */ + metaLayout->addWidget( new QLabel( qfu( VLC_META_LANGUAGE ) + " :" ), line, 6, 1, 2 ); + language_text = new QLineEdit; + language_text->setReadOnly( true ); + metaLayout->addWidget( language_text, line, 8, 1, 2 ); + line++; + + /* ART_URL */ + art_cover = new QLabel( "" ); + art_cover->setMinimumHeight( 128 ); + art_cover->setMinimumWidth( 128 ); + art_cover->setMaximumHeight( 128 ); + art_cover->setMaximumWidth( 128 ); + art_cover->setScaledContents( true ); + art_cover->setPixmap( QPixmap( ":/noart.png" ) ); + metaLayout->addWidget( art_cover, line, 7, 4, 2 ); + +/* Settings is unused */ +/* l->addWidget( new QLabel( qtr( VLC_META_SETTING ) + " :" ), line, 5 ); + setting_text = new QLineEdit; + l->addWidget( setting_text, line, 6, 1, 4 ); */ + +/* Less used metadata */ +#define ADD_META_2( string, widget ) { \ + metaLayout->addWidget( new QLabel( qtr( string ) + " :" ), line, 0 ); \ + widget = new QLineEdit; \ + metaLayout->addWidget( widget, line, 1, 1, 7 ); \ line++; } - ADD_META( _( "Name" ), name_text ); - ADD_META( _( "URI" ), uri_text ); - ADD_META( VLC_META_ARTIST, artist_text ); - ADD_META( VLC_META_GENRE, genre_text ); - ADD_META( VLC_META_COPYRIGHT, copyright_text ); - ADD_META( VLC_META_COLLECTION, collection_text ); - ADD_META( VLC_META_SEQ_NUM, seqnum_text ); - ADD_META( VLC_META_DESCRIPTION, description_text ); - ADD_META( VLC_META_RATING, rating_text ); - ADD_META( VLC_META_DATE, date_text ); - ADD_META( VLC_META_LANGUAGE, language_text ); - ADD_META( VLC_META_NOW_PLAYING, nowplaying_text ); - ADD_META( VLC_META_PUBLISHER, publisher_text ); - ADD_META( VLC_META_SETTING, setting_text ); + + /* Now Playing - Useful for live feeds (HTTP, DVB, ETC...) */ + ADD_META_2( VLC_META_NOW_PLAYING, nowplaying_text ); + nowplaying_text->setReadOnly( true ); + ADD_META_2( VLC_META_PUBLISHER, publisher_text ); + ADD_META_2( VLC_META_COPYRIGHT, copyright_text ); + ADD_META_2( "Comments:", description_text ); + +/* useless metadata */ + + //ADD_META_2( VLC_META_ENCODED_BY, encodedby_text ); + /* ADD_META( TRACKID ) Useless ? */ + /* ADD_URI - DO not show it, done outside */ + +#undef ADD_META +#undef ADD_META_2 + + CONNECT( title_text, textEdited( QString ), this, enterEditMode() ); + CONNECT( artist_text, textEdited( QString ), this, enterEditMode() ); + CONNECT( collection_text, textEdited( QString ), this, enterEditMode() ); + CONNECT( genre_text, textEdited( QString ), this, enterEditMode() ); + CONNECT( seqnum_text, textEdited( QString ), this, enterEditMode() ); + + CONNECT( date_text, textEdited( QString ), this, enterEditMode() ); + CONNECT( description_text, textEdited( QString ), this, enterEditMode() ); +/* CONNECT( rating_text, valueChanged( QString ), this, enterEditMode( QString ) );*/ + + /* We are not yet in Edit Mode */ + b_inEditMode = false; } -MetaPanel::~MetaPanel() -{ -} +MetaPanel::~MetaPanel(){} +/** + * Update all the MetaData and art on an "item-changed" event + **/ void MetaPanel::update( input_item_t *p_item ) { + /* Don't update if you are in edit mode */ + if( b_inEditMode ) return; + + char *psz_meta; #define UPDATE_META( meta, widget ) { \ - char* psz_meta = p_item->p_meta->psz_##meta; \ + psz_meta = input_item_Get##meta( p_item ); \ if( !EMPTY_STR( psz_meta ) ) \ widget->setText( qfu( psz_meta ) ); \ else \ - widget->setText( "" ); } - - if( !EMPTY_STR( p_item->psz_name ) ) - name_text->setText( qfu( p_item->psz_name ) ); - else name_text->setText( "" ); - if( !EMPTY_STR( p_item->psz_uri ) ) - uri_text->setText( qfu( p_item->psz_uri ) ); - else uri_text->setText( "" ); - UPDATE_META( artist, artist_text ); - UPDATE_META( genre, genre_text ); - UPDATE_META( copyright, copyright_text ); - UPDATE_META( album, collection_text ); - UPDATE_META( tracknum, seqnum_text ); - UPDATE_META( description, description_text ); - UPDATE_META( rating, rating_text ); - UPDATE_META( date, date_text ); - UPDATE_META( language, language_text ); - UPDATE_META( nowplaying, nowplaying_text ); - UPDATE_META( publisher, publisher_text ); - UPDATE_META( setting, setting_text ); + widget->setText( "" ); } \ + free( psz_meta ); +#define UPDATE_META_INT( meta, widget ) { \ + psz_meta = input_item_Get##meta( p_item ); \ + if( !EMPTY_STR( psz_meta ) ) \ + widget->setValue( atoi( psz_meta ) ); } \ + free( psz_meta ); + + /* Name / Title */ + psz_meta = input_item_GetTitle( p_item ); + char *psz_name = input_item_GetName( p_item ); + if( !EMPTY_STR( psz_meta ) ) + title_text->setText( qfu( psz_meta ) ); + else if( !EMPTY_STR( psz_name ) ) + title_text->setText( qfu( psz_name ) ); + else title_text->setText( "" ); + free( psz_meta ); + free( psz_name ); + + /* URL / URI */ + psz_meta = input_item_GetURL( p_item ); + if( !EMPTY_STR( psz_meta ) ) + { + emit uriSet( QString( psz_meta ) ); + free( psz_meta ); + } + else + { + free( psz_meta ); + psz_meta = input_item_GetURI( p_item ); + if( !EMPTY_STR( psz_meta ) ) + emit uriSet( QString( psz_meta ) ); + } + + /* Other classic though */ + UPDATE_META( Artist, artist_text ); + UPDATE_META( Genre, genre_text ); + UPDATE_META( Copyright, copyright_text ); + UPDATE_META( Album, collection_text ); + UPDATE_META( Description, description_text ); + UPDATE_META( Language, language_text ); + UPDATE_META( NowPlaying, nowplaying_text ); + UPDATE_META( Publisher, publisher_text ); +// UPDATE_META( Setting, setting_text ); +// UPDATE_META( EncodedBy, encodedby_text ); + + UPDATE_META( Date, date_text ); + UPDATE_META( TrackNum, seqnum_text ); + UPDATE_META_INT( Rating, rating_text ); + +#undef UPDATE_META_INT #undef UPDATE_META -} -void MetaPanel::clear() -{ + /* Art Urls */ + psz_meta = input_item_GetArtURL( p_item ); + if( psz_meta && !strncmp( psz_meta, "file://", 7 ) ) + { + QString artUrl = qfu( psz_meta ).replace( "file://",QString("" ) ); + art_cover->setPixmap( QPixmap( artUrl ) ); + } + else + art_cover->setPixmap( QPixmap( ":/noart.png" ) ); + free( psz_meta ); } -/* Second Panel - Stats */ - -InputStatsPanel::InputStatsPanel( QWidget *parent, intf_thread_t *_p_intf ) : - QWidget( parent ), p_intf( _p_intf ) +/** + * Save the MetaData, triggered by parent->save Button + **/ +void MetaPanel::saveMeta() { - QGridLayout *layout = new QGridLayout(this); - StatsTree = new QTreeWidget(this); - QList items; - - layout->addWidget(StatsTree, 0, 0 ); - StatsTree->setColumnCount( 3 ); - StatsTree->header()->hide(); - -#define CREATE_TREE_ITEM( itemName, itemText, itemValue, unit ) { \ - itemName = \ - new QTreeWidgetItem((QStringList () << itemText << itemValue << unit )); \ - itemName->setTextAlignment( 1 , Qt::AlignRight ) ; } - - -#define CREATE_CATEGORY( catName, itemText ) { \ - CREATE_TREE_ITEM( catName, itemText , "", "" ); \ - catName->setExpanded( true ); \ - StatsTree->addTopLevelItem( catName ); } - -#define CREATE_AND_ADD_TO_CAT( itemName, itemText, itemValue, catName, unit ) { \ - CREATE_TREE_ITEM( itemName, itemText, itemValue, unit ); \ - catName->addChild( itemName ); } - - CREATE_CATEGORY( input, qtr("Input") ); - CREATE_CATEGORY( video, qtr("Video") ); - CREATE_CATEGORY( streaming, qtr("Streaming") ); - CREATE_CATEGORY( audio, qtr("Audio") ); - + playlist_t *p_playlist; + char psz[5]; - CREATE_AND_ADD_TO_CAT( read_media_stat, qtr("Read at media"), "0", input , "kB") ; - CREATE_AND_ADD_TO_CAT( input_bitrate_stat, qtr("Input bitrate"), "0", input, "kb/s") ; - CREATE_AND_ADD_TO_CAT( demuxed_stat, qtr("Demuxed"), "0", input, "kB") ; - CREATE_AND_ADD_TO_CAT( stream_bitrate_stat, qtr("Stream bitrate"), "0", input, "kb/s") ; + meta_export_t p_export; + p_export.p_item = p_input; - CREATE_AND_ADD_TO_CAT( vdecoded_stat, qtr("Decoded blocks"), "0", video, "" ) ; - CREATE_AND_ADD_TO_CAT( vdisplayed_stat, qtr("Displayed frames"), "0", video, "") ; - CREATE_AND_ADD_TO_CAT( vlost_frames_stat, qtr("Lost frames"), "0", video, "") ; + if( p_input == NULL ) + return; - CREATE_AND_ADD_TO_CAT( send_stat, qtr("Sent packets"), "0", streaming, "") ; - CREATE_AND_ADD_TO_CAT( send_bytes_stat, qtr("Sent bytes"), "0", streaming, "kB") ; - CREATE_AND_ADD_TO_CAT( send_bitrate_stat, qtr("Sent bitrates"), "0", streaming, "kb/s") ; + /* we can write meta data only in a file */ + vlc_mutex_lock( &p_input->lock ); + int i_type = p_input->i_type; + vlc_mutex_unlock( &p_input->lock ); + if( i_type == ITEM_TYPE_FILE ) + { + char *psz_uri_orig = input_item_GetURI( p_input ); + char *psz_uri = psz_uri_orig; + if( !strncmp( psz_uri, "file://", 7 ) ) + psz_uri += 7; /* strlen("file://") = 7 */ - CREATE_AND_ADD_TO_CAT( adecoded_stat, qtr("Decoded blocks"), "0", audio, "") ; - CREATE_AND_ADD_TO_CAT( aplayed_stat, qtr("Played buffers"), "0", audio, "") ; - CREATE_AND_ADD_TO_CAT( alost_stat, qtr("Lost buffers"), "0", audio, "") ; + p_export.psz_file = strndup( psz_uri, PATH_MAX ); + free( psz_uri_orig ); + } + else + return; + + /* now we read the modified meta data */ + input_item_SetTitle( p_input, qtu( title_text->text() ) ); + input_item_SetArtist( p_input, qtu( artist_text->text() ) ); + input_item_SetAlbum( p_input, qtu( collection_text->text() ) ); + input_item_SetGenre( p_input, qtu( genre_text->text() ) ); + input_item_SetTrackNum( p_input, qtu( seqnum_text->text() ) ); + input_item_SetDate( p_input, qtu( date_text->text() ) ); + + input_item_SetCopyright( p_input, qtu( copyright_text->text() ) ); + input_item_SetPublisher( p_input, qtu( publisher_text->text() ) ); + input_item_SetDescription( p_input, qtu( description_text->text() ) ); + + p_playlist = pl_Yield( p_intf ); + PL_LOCK; + p_playlist->p_private = &p_export; + + module_t *p_mod = module_Need( p_playlist, "meta writer", NULL, 0 ); + if( p_mod ) + module_Unneed( p_playlist, p_mod ); + PL_UNLOCK; + pl_Release( p_playlist ); + + /* Reset the status of the mode. No need to emit any signal */ + b_inEditMode = false; +} - input->setExpanded( true ); - video->setExpanded( true ); - streaming->setExpanded( true ); - audio->setExpanded( true ); - StatsTree->resizeColumnToContents( 0 ); - StatsTree->setColumnWidth( 1 , 100 ); +bool MetaPanel::isInEditMode() +{ + return b_inEditMode; } -InputStatsPanel::~InputStatsPanel() +void MetaPanel::enterEditMode() { + setEditMode( true ); } -void InputStatsPanel::update( input_item_t *p_item ) +void MetaPanel::setEditMode( bool b_editing ) { - vlc_mutex_lock( &p_item->p_stats->lock ); - -#define UPDATE( widget, format, calc... ) \ - { QString str; widget->setText( 1 , str.sprintf( format, ## calc ) ); } + b_inEditMode = b_editing; + if( b_editing )emit editing(); +} - UPDATE( read_media_stat, "%8.0f", (float)(p_item->p_stats->i_read_bytes)/1000); - UPDATE( input_bitrate_stat, "%6.0f", - (float)(p_item->p_stats->f_input_bitrate * 8000 )); - UPDATE( demuxed_stat, "%8.0f", - (float)(p_item->p_stats->i_demux_read_bytes)/1000 ); - UPDATE( stream_bitrate_stat, "%6.0f", - (float)(p_item->p_stats->f_demux_bitrate * 8000 )); +void MetaPanel::setInput( input_item_t *input ) +{ + if( b_inEditMode ) return; - /* Video */ - UPDATE( vdecoded_stat, "%5i", p_item->p_stats->i_decoded_video ); - UPDATE( vdisplayed_stat, "%5i", p_item->p_stats->i_displayed_pictures ); - UPDATE( vlost_frames_stat, "%5i", p_item->p_stats->i_lost_pictures ); + p_input = input; +} - /* Sout */ - UPDATE( send_stat, "%5i", p_item->p_stats->i_sent_packets ); - UPDATE( send_bytes_stat, "%8.0f", - (float)(p_item->p_stats->i_sent_bytes)/1000 ); - UPDATE( send_bitrate_stat, "%6.0f", - (float)(p_item->p_stats->f_send_bitrate*8)*1000 ); +/* + * Clear all the metadata widgets + * Unused yet FIXME + */ +void MetaPanel::clear(){ + setEditMode( false ); +} - /* Audio*/ - UPDATE( adecoded_stat, "%5i", p_item->p_stats->i_decoded_audio ); - UPDATE( aplayed_stat, "%5i", p_item->p_stats->i_played_abuffers ); - UPDATE( alost_stat, "%5i", p_item->p_stats->i_lost_abuffers ); +/** + * Second Panel - Shows the extra metadata in a tree, non editable. + **/ +ExtraMetaPanel::ExtraMetaPanel( QWidget *parent, + intf_thread_t *_p_intf ) + : QWidget( parent ), p_intf( _p_intf ) +{ + QGridLayout *layout = new QGridLayout(this); - vlc_mutex_unlock(& p_item->p_stats->lock ); + QLabel *topLabel = new QLabel( qtr( "Extra metadata and other information" + " are shown in this list.\n" ) ); + topLabel->setWordWrap( true ); + layout->addWidget( topLabel, 0, 0 ); + + extraMetaTree = new QTreeWidget( this ); + extraMetaTree->setAlternatingRowColors( true ); + extraMetaTree->setColumnCount( 2 ); + extraMetaTree->header()->hide(); +/* QStringList headerList = ( QStringList() << qtr( "Type" ) + * << qtr( "Value" ) ); + * Useless, add this header if you think it would help the user ** + */ + + layout->addWidget( extraMetaTree, 1, 0 ); } -void InputStatsPanel::clear() +/** + * Update the Extra Metadata from p_meta->i_extras + **/ +void ExtraMetaPanel::update( input_item_t *p_item ) { + vlc_mutex_lock( &p_item->lock ); + vlc_meta_t *p_meta = p_item->p_meta; + if( !p_meta ) + return; + QStringList tempItem; + + QList items; + vlc_dictionary_t * p_dict = &p_meta->extra_tags; + char ** ppsz_allkey = vlc_dictionary_all_keys( p_dict ); + for (int i = 0; ppsz_allkey[i] ; i++ ) + { + const char * psz_value = (const char *)vlc_dictionary_value_for_key( + p_dict, ppsz_allkey[i] ); + tempItem.append( qfu( ppsz_allkey[i] ) + " : "); + tempItem.append( qfu( psz_value ) ); + items.append( new QTreeWidgetItem ( extraMetaTree, tempItem ) ); + free( ppsz_allkey[i] ); + } + vlc_mutex_unlock( &p_item->lock ); + free( ppsz_allkey ); + extraMetaTree->addTopLevelItems( items ); } -/* Third panel - Stream info */ +/** + * Clear the ExtraMetaData Tree + **/ +void ExtraMetaPanel::clear() +{ + extraMetaTree->clear(); +} -InfoPanel::InfoPanel( QWidget *parent, intf_thread_t *_p_intf ) : - QWidget( parent ), p_intf( _p_intf ) +/** + * Third panel - Stream info + * Display all codecs and muxers info that we could gather. + **/ +InfoPanel::InfoPanel( QWidget *parent, + intf_thread_t *_p_intf ) + : QWidget( parent ), p_intf( _p_intf ) { QGridLayout *layout = new QGridLayout(this); - InfoTree = new QTreeWidget(this); + QList items; - layout->addWidget(InfoTree, 0, 0 ); + QLabel *topLabel = new QLabel( qtr( "Information about what your media or" + " stream is made of.\n Muxer, Audio and Video Codecs, Subtitles " + "are shown." ) ); + topLabel->setWordWrap( true ); + layout->addWidget( topLabel, 0, 0 ); + + InfoTree = new QTreeWidget(this); InfoTree->setColumnCount( 1 ); InfoTree->header()->hide(); + layout->addWidget(InfoTree, 1, 0 ); } InfoPanel::~InfoPanel() { } +/** + * Update the Codecs information on parent->update() + **/ void InfoPanel::update( input_item_t *p_item) { InfoTree->clear(); @@ -250,52 +441,147 @@ void InfoPanel::update( input_item_t *p_item) } } +/** + * Clear the tree + **/ void InfoPanel::clear() { InfoTree->clear(); } -/*************************************************************************** - * Tab widget - ***************************************************************************/ +/** + * Save all the information to a file + * Not yet implemented. + **/ +/* +void InfoPanel::saveCodecsInfo() +{ -InfoTab::InfoTab( QWidget *parent, intf_thread_t *_p_intf, bool _stats ) : - QTabWidget( parent ), stats( _stats ), p_intf( _p_intf ) +} +*/ + +/** + * Fourth Panel - Stats + * Displays the Statistics for reading/streaming/encoding/displaying in a tree + */ +InputStatsPanel::InputStatsPanel( QWidget *parent, + intf_thread_t *_p_intf ) + : QWidget( parent ), p_intf( _p_intf ) { -// setGeometry(0, 0, 400, 500); + QGridLayout *layout = new QGridLayout(this); - MP = new MetaPanel(NULL, p_intf); - addTab(MP, qtr("&General")); - IP = new InfoPanel(NULL, p_intf); - addTab(IP, qtr("&Details")); - if( stats ) - { - ISP = new InputStatsPanel( NULL, p_intf ); - addTab(ISP, qtr("&Stats")); - } + QList items; + + QLabel *topLabel = new QLabel( qtr( "Various statistics about the current" + " media or stream.\n Played and streamed info are shown." ) ); + topLabel->setWordWrap( true ); + layout->addWidget( topLabel, 0, 0 ); + + StatsTree = new QTreeWidget(this); + StatsTree->setColumnCount( 3 ); + StatsTree->header()->hide(); + +#define CREATE_TREE_ITEM( itemName, itemText, itemValue, unit ) { \ + itemName = \ + new QTreeWidgetItem((QStringList () << itemText << itemValue << unit )); \ + itemName->setTextAlignment( 1 , Qt::AlignRight ) ; } + +#define CREATE_CATEGORY( catName, itemText ) { \ + CREATE_TREE_ITEM( catName, itemText , "", "" ); \ + catName->setExpanded( true ); \ + StatsTree->addTopLevelItem( catName ); } + +#define CREATE_AND_ADD_TO_CAT( itemName, itemText, itemValue, catName, unit ){ \ + CREATE_TREE_ITEM( itemName, itemText, itemValue, unit ); \ + catName->addChild( itemName ); } + + /* Create the main categories */ + CREATE_CATEGORY( input, qtr("Input") ); + CREATE_CATEGORY( video, qtr("Video") ); + CREATE_CATEGORY( streaming, qtr("Streaming") ); + CREATE_CATEGORY( audio, qtr("Audio") ); + + CREATE_AND_ADD_TO_CAT( read_media_stat, qtr("Read at media"), + "0", input , "kB" ); + CREATE_AND_ADD_TO_CAT( input_bitrate_stat, qtr("Input bitrate"), + "0", input, "kb/s" ); + CREATE_AND_ADD_TO_CAT( demuxed_stat, qtr("Demuxed"), "0", input, "kB") ; + CREATE_AND_ADD_TO_CAT( stream_bitrate_stat, qtr("Stream bitrate"), + "0", input, "kb/s" ); + + CREATE_AND_ADD_TO_CAT( vdecoded_stat, qtr("Decoded blocks"), + "0", video, "" ); + CREATE_AND_ADD_TO_CAT( vdisplayed_stat, qtr("Displayed frames"), + "0", video, "" ); + CREATE_AND_ADD_TO_CAT( vlost_frames_stat, qtr("Lost frames"), + "0", video, "" ); + + CREATE_AND_ADD_TO_CAT( send_stat, qtr("Sent packets"), "0", streaming, "" ); + CREATE_AND_ADD_TO_CAT( send_bytes_stat, qtr("Sent bytes"), + "0", streaming, "kB" ); + CREATE_AND_ADD_TO_CAT( send_bitrate_stat, qtr("Sent bitrates"), + "0", streaming, "kb/s" ); + + CREATE_AND_ADD_TO_CAT( adecoded_stat, qtr("Decoded blocks"), + "0", audio, "" ); + CREATE_AND_ADD_TO_CAT( aplayed_stat, qtr("Played buffers"), + "0", audio, "" ); + CREATE_AND_ADD_TO_CAT( alost_stat, qtr("Lost buffers"), "0", audio, "" ); + + input->setExpanded( true ); + video->setExpanded( true ); + streaming->setExpanded( true ); + audio->setExpanded( true ); + + StatsTree->resizeColumnToContents( 0 ); + StatsTree->setColumnWidth( 1 , 100 ); + + layout->addWidget(StatsTree, 1, 0 ); } -InfoTab::~InfoTab() +InputStatsPanel::~InputStatsPanel() { } -/* This function should be called approximately twice a second. - * p_item should be locked - * Stats will always be updated */ -void InfoTab::update( input_item_t *p_item, bool update_info, - bool update_meta ) +/** + * Update the Statistics + **/ +void InputStatsPanel::update( input_item_t *p_item ) { - if( update_info ) - IP->update( p_item ); - if( update_meta ) - MP->update( p_item ); - if( stats ) - ISP->update( p_item ); + vlc_mutex_lock( &p_item->p_stats->lock ); + +#define UPDATE( widget, format, calc... ) \ + { QString str; widget->setText( 1 , str.sprintf( format, ## calc ) ); } + + UPDATE( read_media_stat, "%8.0f", + (float)(p_item->p_stats->i_read_bytes)/1000); + UPDATE( input_bitrate_stat, "%6.0f", + (float)(p_item->p_stats->f_input_bitrate * 8000 )); + UPDATE( demuxed_stat, "%8.0f", + (float)(p_item->p_stats->i_demux_read_bytes)/1000 ); + UPDATE( stream_bitrate_stat, "%6.0f", + (float)(p_item->p_stats->f_demux_bitrate * 8000 )); + + /* Video */ + UPDATE( vdecoded_stat, "%5i", p_item->p_stats->i_decoded_video ); + UPDATE( vdisplayed_stat, "%5i", p_item->p_stats->i_displayed_pictures ); + UPDATE( vlost_frames_stat, "%5i", p_item->p_stats->i_lost_pictures ); + + /* Sout */ + UPDATE( send_stat, "%5i", p_item->p_stats->i_sent_packets ); + UPDATE( send_bytes_stat, "%8.0f", + (float)(p_item->p_stats->i_sent_bytes)/1000 ); + UPDATE( send_bitrate_stat, "%6.0f", + (float)(p_item->p_stats->f_send_bitrate*8)*1000 ); + + /* Audio*/ + UPDATE( adecoded_stat, "%5i", p_item->p_stats->i_decoded_audio ); + UPDATE( aplayed_stat, "%5i", p_item->p_stats->i_played_abuffers ); + UPDATE( alost_stat, "%5i", p_item->p_stats->i_lost_abuffers ); + + vlc_mutex_unlock(& p_item->p_stats->lock ); } -void InfoTab::clear() +void InputStatsPanel::clear() { - IP->clear(); - MP->clear(); - if( stats ) ISP->clear(); }