Fix bug: 100% cpu use with plugins like mp3.

This commit is contained in:
Johns 2012-02-23 15:32:43 +01:00
parent 2561214c3e
commit c17af0e958
4 changed files with 22 additions and 12 deletions

View File

@ -1,6 +1,7 @@
User johns User johns
Date: Date:
Fix bug: 100% cpu use with plugins like mp3.
Wakeup display thread on channel switch, osd can now be shown without Wakeup display thread on channel switch, osd can now be shown without
video. video.
Makes 60Hz display mode configurable with setup.conf. Makes 60Hz display mode configurable with setup.conf.

View File

@ -75,6 +75,8 @@ static AudioDecoder *MyAudioDecoder; ///< audio decoder
static enum CodecID AudioCodecID; ///< current codec id static enum CodecID AudioCodecID; ///< current codec id
static int AudioChannelID; ///< current audio channel id static int AudioChannelID; ///< current audio channel id
/// Minimum free space in audio buffer 8 packets for 8 channels
#define AUDIO_MIN_BUFFER_FREE (3072 * 8 * 8)
#define AUDIO_BUFFER_SIZE (512 * 1024) ///< audio PES buffer default size #define AUDIO_BUFFER_SIZE (512 * 1024) ///< audio PES buffer default size
static AVPacket AudioAvPkt[1]; ///< audio a/v packet static AVPacket AudioAvPkt[1]; ///< audio a/v packet
@ -864,7 +866,7 @@ int PlayAudio(const uint8_t * data, int size, uint8_t id)
NewAudioStream = 0; NewAudioStream = 0;
} }
// Don't overrun audio buffers on replay // Don't overrun audio buffers on replay
if (AudioFreeBytes() < 3072 * 8 * 8) { // 8 channels 8 packets if (AudioFreeBytes() < AUDIO_MIN_BUFFER_FREE) {
return 0; return 0;
} }
// PES header 0x00 0x00 0x01 ID // PES header 0x00 0x00 0x01 ID
@ -1058,7 +1060,7 @@ int PlayTsAudio(const uint8_t * data, int size)
return size; return size;
} }
// Don't overrun audio buffers on replay // Don't overrun audio buffers on replay
if (AudioFreeBytes() < 3072 * 8 * 8) { // 8 channels 8 packets if (AudioFreeBytes() < AUDIO_MIN_BUFFER_FREE) {
return 0; return 0;
} }
@ -1827,7 +1829,7 @@ uint8_t *GrabImage(int *size, int jpeg, int quality, int width, int height)
/** /**
** Set play mode, called on channel switch. ** Set play mode, called on channel switch.
*/ */
void SetPlayMode(void) int SetPlayMode(int play_mode)
{ {
if (ConfigStartSuspended) { // ignore first call, if start suspended if (ConfigStartSuspended) { // ignore first call, if start suspended
ConfigStartSuspended = 0; ConfigStartSuspended = 0;
@ -1835,18 +1837,23 @@ void SetPlayMode(void)
} }
Resume(); Resume();
VideoDisplayWakeup(); VideoDisplayWakeup();
if (MyVideoDecoder) { if (MyVideoDecoder) { // tell video parser we have new stream
if (VideoCodecID != CODEC_ID_NONE) { if (VideoCodecID != CODEC_ID_NONE) {
NewVideoStream = 1; NewVideoStream = 1;
VideoSwitch = GetMsTicks(); VideoSwitch = GetMsTicks();
} }
} }
if (MyAudioDecoder) { if (MyAudioDecoder) { // tell audio parser we have new stream
if (AudioCodecID != CODEC_ID_NONE) { if (AudioCodecID != CODEC_ID_NONE) {
NewAudioStream = 1; NewAudioStream = 1;
} }
} }
if (play_mode == 2 || play_mode == 3 ) {
Debug(3, "softhddev: FIXME: audio only, silence video errors\n");
}
Play(); Play();
return 1;
} }
/** /**
@ -1990,11 +1997,13 @@ void StillPicture(const uint8_t * data, int size)
int Poll(int timeout) int Poll(int timeout)
{ {
// buffers are too full // buffers are too full
if (atomic_read(&VideoPacketsFilled) >= VIDEO_PACKET_MAX * 2 / 3) { if ( atomic_read(&VideoPacketsFilled) >= VIDEO_PACKET_MAX * 2 / 3
|| AudioFreeBytes() < AUDIO_MIN_BUFFER_FREE * 2) {
if (timeout) { // let display thread work if (timeout) { // let display thread work
usleep(timeout * 1000); usleep(timeout * 1000);
} }
return atomic_read(&VideoPacketsFilled) < VIDEO_PACKET_MAX * 2 / 3; return atomic_read(&VideoPacketsFilled) < VIDEO_PACKET_MAX * 2 / 3
&& AudioFreeBytes() > AUDIO_MIN_BUFFER_FREE;
} }
return 1; return 1;
} }

View File

@ -50,7 +50,7 @@ extern "C"
extern uint8_t *GrabImage(int *, int, int, int, int); extern uint8_t *GrabImage(int *, int, int, int, int);
/// C plugin set play mode /// C plugin set play mode
extern void SetPlayMode(void); extern int SetPlayMode(int);
/// C plugin set trick speed /// C plugin set trick speed
extern void TrickSpeed(int); extern void TrickSpeed(int);
/// C plugin clears all video and audio data from the device /// C plugin clears all video and audio data from the device

View File

@ -295,7 +295,7 @@ void cSoftOsd::Flush(void)
} }
#ifdef DEBUG #ifdef DEBUG
if (w > bitmap->Width() || h > bitmap->Height()) { if (w > bitmap->Width() || h > bitmap->Height()) {
esyslog(tr("softhddev: dirty area too big\n")); esyslog(tr("[softhddev]: dirty area too big\n"));
abort(); abort();
} }
#endif #endif
@ -742,7 +742,7 @@ static void HandleHotkey(int code)
CodecSetAudioPassthrough(ConfigAudioPassthrough ^= 1); CodecSetAudioPassthrough(ConfigAudioPassthrough ^= 1);
break; break;
default: default:
esyslog(tr("softhddev: hot key %d is not supported\n"), code); esyslog(tr("[softhddev]: hot key %d is not supported\n"), code);
break; break;
} }
} }
@ -954,8 +954,8 @@ bool cSoftHdDevice::SetPlayMode(ePlayMode play_mode)
dsyslog("[softhddev] playmode not implemented... %d\n", play_mode); dsyslog("[softhddev] playmode not implemented... %d\n", play_mode);
break; break;
} }
::SetPlayMode();
return true; return ::SetPlayMode(play_mode);
} }
/** /**