Display frame statistics in plugin menu.

This commit is contained in:
Johns 2012-07-02 17:05:36 +02:00
parent 3bb7782d40
commit 696bb8e934
6 changed files with 94 additions and 8 deletions

View File

@ -2,6 +2,7 @@ User johns
Date: Date:
Release Version 0.5.1 Release Version 0.5.1
Display frame statistics in plugin menu.
Fix bug: 100% CPU use during playback. Fix bug: 100% CPU use during playback.
Fix bug: audio use 100% CPU during pause. Fix bug: audio use 100% CPU during pause.
Guard audio skip against old PTS values. Guard audio skip against old PTS values.

View File

@ -2689,3 +2689,22 @@ void Resume(void)
pthread_mutex_unlock(&SuspendLockMutex); pthread_mutex_unlock(&SuspendLockMutex);
} }
/*
** Get decoder statistics.
**
** @param[out] missed missed frames
** @param[out] duped duped frames
** @param[out] dropped dropped frames
** @param[out] count number of decoded frames
*/
void GetStats(int *missed, int *duped, int *dropped, int *counter)
{
*missed = 0;
*duped = 0;
*dropped = 0;
*counter = 0;
if (MyHwDecoder) {
VideoGetStats(MyHwDecoder, missed, duped, dropped, counter);
}
}

View File

@ -90,6 +90,9 @@ extern "C"
extern void Suspend(int, int, int); extern void Suspend(int, int, int);
/// Resume plugin /// Resume plugin
extern void Resume(void); extern void Resume(void);
/// Get decoder statistics
extern void GetStats(int *, int *, int *, int *);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -921,9 +921,9 @@ void cMenuSetupSoft::Store(void)
//SetupStore("VideoFormat", Setup.VideoFormat); //SetupStore("VideoFormat", Setup.VideoFormat);
if (Setup.VideoDisplayFormat != VideoDisplayFormat) { if (Setup.VideoDisplayFormat != VideoDisplayFormat) {
Setup.VideoDisplayFormat = VideoDisplayFormat; Setup.VideoDisplayFormat = VideoDisplayFormat;
cDevice:: cDevice::PrimaryDevice()->
PrimaryDevice()->SetVideoDisplayFormat(eVideoDisplayFormat SetVideoDisplayFormat(eVideoDisplayFormat(Setup.
(Setup.VideoDisplayFormat)); VideoDisplayFormat));
} }
//SetupStore("VideoDisplayFormat", Setup.VideoDisplayFormat); //SetupStore("VideoDisplayFormat", Setup.VideoDisplayFormat);
@ -1102,14 +1102,43 @@ cSoftHdControl::~cSoftHdControl()
*/ */
class cSoftHdMenu:public cOsdMenu class cSoftHdMenu:public cOsdMenu
{ {
private:
int HotkeyState; ///< current hot-key state int HotkeyState; ///< current hot-key state
int HotkeyCode; ///< current hot-key code int HotkeyCode; ///< current hot-key code
void Create(void); ///< create plugin main menu
public: public:
cSoftHdMenu(const char *, int = 0, int = 0, int = 0, int = 0, int = 0); cSoftHdMenu(const char *, int = 0, int = 0, int = 0, int = 0, int = 0);
virtual ~ cSoftHdMenu(); virtual ~ cSoftHdMenu();
virtual eOSState ProcessKey(eKeys); virtual eOSState ProcessKey(eKeys);
}; };
/**
** Create main menu.
*/
void cSoftHdMenu::Create(void)
{
int current;
int missed;
int duped;
int dropped;
int counter;
current = Current(); // get current menu item index
Clear(); // clear the menu
SetHasHotkeys();
Add(new cOsdItem(hk(tr("Suspend SoftHdDevice")), osUser1));
Add(new cOsdItem(NULL, osUnknown, false));
Add(new cOsdItem(NULL, osUnknown, false));
GetStats(&missed, &duped, &dropped, &counter);
Add(new cOsdItem(cString::
sprintf(tr(" Frames missed(%d) duped(%d) dropped(%d) total(%d)"),
missed, duped, dropped, counter), osUnknown, false));
SetCurrent(Get(current)); // restore selected menu entry
Display(); // display build menu
}
/** /**
** Soft device menu constructor. ** Soft device menu constructor.
*/ */
@ -1119,8 +1148,7 @@ cSoftHdMenu::cSoftHdMenu(const char *title, int c0, int c1, int c2, int c3,
{ {
HotkeyState = 0; HotkeyState = 0;
SetHasHotkeys(); Create();
Add(new cOsdItem(hk(tr("Suspend SoftHdDevice")), osUser1));
} }
/** /**
@ -1288,6 +1316,7 @@ eOSState cSoftHdMenu::ProcessKey(eKeys key)
} }
return osEnd; return osEnd;
default: default:
Create();
break; break;
} }
return state; return state;
@ -1581,8 +1610,8 @@ bool cSoftHdDevice::Flush(int timeout_ms)
** Sets the video display format to the given one (only useful if this ** Sets the video display format to the given one (only useful if this
** device has an MPEG decoder). ** device has an MPEG decoder).
*/ */
void cSoftHdDevice:: SetVideoDisplayFormat(eVideoDisplayFormat void cSoftHdDevice::
video_display_format) SetVideoDisplayFormat(eVideoDisplayFormat video_display_format)
{ {
static int last = -1; static int last = -1;

31
video.c
View File

@ -9642,6 +9642,37 @@ uint8_t *VideoGrabService(int *size, int *width, int *height)
return NULL; return NULL;
} }
///
/// Get decoder statistics.
///
/// @param hw_decoder video hardware decoder
/// @param[out] missed missed frames
/// @param[out] duped duped frames
/// @param[out] dropped dropped frames
/// @param[out] count number of decoded frames
///
void VideoGetStats(VideoHwDecoder * hw_decoder, int *missed, int *duped,
int *dropped, int *counter)
{
// FIXME: test to check if working, than make module function
#ifdef USE_VDPAU
if (VideoUsedModule == &VdpauModule) {
*missed = hw_decoder->Vdpau.FramesMissed;
*duped = hw_decoder->Vdpau.FramesDuped;
*dropped = hw_decoder->Vdpau.FramesDropped;
*counter = hw_decoder->Vdpau.FrameCounter;
}
#endif
#ifdef USE_VAPI
if (VideoUsedModule == &VaapiModule) {
*missed = hw_decoder->Vaapi.FramesMissed;
*duped = hw_decoder->Vaapi.FramesDuped;
*dropped = hw_decoder->Vaapi.FramesDropped;
*counter = hw_decoder->Vaapi.FrameCounter;
}
#endif
}
#ifdef USE_SCREENSAVER #ifdef USE_SCREENSAVER
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -174,6 +174,9 @@ extern uint8_t *VideoGrab(int *, int *, int *, int);
/// Grab screen raw. /// Grab screen raw.
extern uint8_t *VideoGrabService(int *, int *, int *); extern uint8_t *VideoGrabService(int *, int *, int *);
/// Get decoder statistics.
extern void VideoGetStats(VideoHwDecoder *, int *, int *, int *, int *);
extern void VideoOsdInit(void); ///< Setup osd. extern void VideoOsdInit(void); ///< Setup osd.
extern void VideoOsdExit(void); ///< Cleanup osd. extern void VideoOsdExit(void); ///< Cleanup osd.