mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-softhddevice.git
				synced 2023-10-10 17:16:51 +00:00 
			
		
		
		
	Fix bug: broken device plugin stop and exit.
This commit is contained in:
		| @@ -1,6 +1,7 @@ | ||||
| User johns | ||||
| Data: | ||||
|  | ||||
|     Fix bug: broken device plugin stop and exit. | ||||
|     Show transparent cursor to hide cursor. | ||||
|     VDPAU: Add color standard support. | ||||
|     VDPAU: Add denoise and sharpness support. | ||||
|   | ||||
							
								
								
									
										94
									
								
								softhddev.c
									
									
									
									
									
								
							
							
						
						
									
										94
									
								
								softhddev.c
									
									
									
									
									
								
							| @@ -42,7 +42,9 @@ | ||||
| #include "video.h" | ||||
| #include "codec.h" | ||||
|  | ||||
| static char BrokenThreadsAndPlugins;	///< broken vdr threads and plugins | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| //	Variables | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| #ifdef USE_VDPAU | ||||
| static char ConfigVdpauDecoder = 1;	///< use vdpau decoder, if possible | ||||
| @@ -50,6 +52,8 @@ static char ConfigVdpauDecoder = 1;	///< use vdpau decoder, if possible | ||||
| #define ConfigVdpauDecoder 0		///< no vdpau decoder configured | ||||
| #endif | ||||
|  | ||||
| static const char DeviceStopped = 1;	///< flag device stopped | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| //	Audio | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -189,9 +193,6 @@ void PlayAudio(const uint8_t * data, int size, | ||||
|     int n; | ||||
|     AVPacket avpkt[1]; | ||||
|  | ||||
|     if (BrokenThreadsAndPlugins) { | ||||
| 	return; | ||||
|     } | ||||
|     // channel switch: SetAudioChannelDevice: SetDigitalAudioDevice: | ||||
|  | ||||
|     if (NewAudioStream) { | ||||
| @@ -301,9 +302,6 @@ void PlayAudio(const uint8_t * data, int size, | ||||
| */ | ||||
| void Mute(void) | ||||
| { | ||||
|     if (BrokenThreadsAndPlugins) { | ||||
| 	return; | ||||
|     } | ||||
|     AudioSetVolume(0); | ||||
| } | ||||
|  | ||||
| @@ -314,9 +312,6 @@ void Mute(void) | ||||
| */ | ||||
| void SetVolumeDevice(int volume) | ||||
| { | ||||
|     if (BrokenThreadsAndPlugins) { | ||||
| 	return; | ||||
|     } | ||||
|     AudioSetVolume((volume * 100) / 255); | ||||
| } | ||||
|  | ||||
| @@ -439,6 +434,8 @@ static void VideoEnqueue(int64_t pts, const void *data, int size) | ||||
|  | ||||
| /** | ||||
| **	Finish current packet advance to next. | ||||
| ** | ||||
| **	@param codec_id	codec id of packet (MPEG/H264) | ||||
| */ | ||||
| static void VideoNextPacket(int codec_id) | ||||
| { | ||||
| @@ -637,9 +634,6 @@ int PlayVideo(const uint8_t * data, int size) | ||||
|     int64_t pts; | ||||
|     int n; | ||||
|  | ||||
|     if (BrokenThreadsAndPlugins) { | ||||
| 	return size; | ||||
|     } | ||||
|     if (Usr1Signal) {			// x11 server ready | ||||
| 	Usr1Signal = 0; | ||||
| 	StartVideo(); | ||||
| @@ -760,9 +754,6 @@ int PlayVideo(const uint8_t * data, int size) | ||||
| */ | ||||
| void SetPlayMode(void) | ||||
| { | ||||
|     if (BrokenThreadsAndPlugins) { | ||||
| 	return; | ||||
|     } | ||||
|     if (MyVideoDecoder) { | ||||
| 	if (VideoCodecID != CODEC_ID_NONE) { | ||||
| 	    NewVideoStream = 1; | ||||
| @@ -850,9 +841,6 @@ void GetOsdSize(int *width, int *height, double *aspect) | ||||
| */ | ||||
| void OsdClose(void) | ||||
| { | ||||
|     if (BrokenThreadsAndPlugins) { | ||||
| 	return; | ||||
|     } | ||||
|     VideoOsdClear(); | ||||
| } | ||||
|  | ||||
| @@ -861,9 +849,6 @@ void OsdClose(void) | ||||
| */ | ||||
| void OsdDrawARGB(int x, int y, int height, int width, const uint8_t * argb) | ||||
| { | ||||
|     if (BrokenThreadsAndPlugins) { | ||||
| 	return; | ||||
|     } | ||||
|     VideoOsdDrawARGB(x, y, height, width, argb); | ||||
| } | ||||
|  | ||||
| @@ -1030,39 +1015,6 @@ static void StartXServer(void) | ||||
| */ | ||||
| void SoftHdDeviceExit(void) | ||||
| { | ||||
| } | ||||
|  | ||||
| /** | ||||
| **	Prepare plugin. | ||||
| */ | ||||
| void Start(void) | ||||
| { | ||||
|     if (StartX11Server) { | ||||
| 	StartXServer(); | ||||
|     } | ||||
|     CodecInit(); | ||||
|     // FIXME: AudioInit for HDMI after X11 startup | ||||
|     AudioInit(); | ||||
|     if (!StartX11Server) { | ||||
| 	StartVideo(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
| **	Stop plugin. | ||||
| */ | ||||
| void Stop(void) | ||||
| { | ||||
| #ifdef DEBUG | ||||
|     Debug(3, "video: max used PES packet size: %d\n", VideoMaxPacketSize); | ||||
| #endif | ||||
|  | ||||
|     // FIXME: | ||||
|     // don't let any thread enter our plugin, but can still crash, when | ||||
|     // a thread has called any function, while Stop is called. | ||||
|     BrokenThreadsAndPlugins = 1; | ||||
|     usleep(2 * 1000); | ||||
|  | ||||
|     // lets hope that vdr does a good thead cleanup | ||||
|     // no it doesn't do a good thread cleanup | ||||
|     if (MyVideoDecoder) { | ||||
| @@ -1091,10 +1043,40 @@ void Stop(void) | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
| **	Prepare plugin. | ||||
| */ | ||||
| void Start(void) | ||||
| { | ||||
|     if (StartX11Server) { | ||||
| 	StartXServer(); | ||||
|     } | ||||
|     CodecInit(); | ||||
|     // FIXME: AudioInit for HDMI after X11 startup | ||||
|     AudioInit(); | ||||
|     if (!StartX11Server) { | ||||
| 	StartVideo(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
| **	Stop plugin. | ||||
| ** | ||||
| **	@note stop everything, but don't cleanup, module is still called. | ||||
| */ | ||||
| void Stop(void) | ||||
| { | ||||
| #ifdef DEBUG | ||||
|     Debug(3, "video: max used PES packet size: %d\n", VideoMaxPacketSize); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /** | ||||
| **	Main thread hook, periodic called from main thread. | ||||
| */ | ||||
| void MainThreadHook(void) | ||||
| { | ||||
|     VideoDisplayHandler(); | ||||
|     if (!DeviceStopped) { | ||||
| 	VideoDisplayHandler(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -33,14 +33,15 @@ | ||||
|  | ||||
| #include "softhddev.h" | ||||
| #include "softhddevice.h" | ||||
| extern "C" { | ||||
|     #include "video.h" | ||||
| extern "C" | ||||
| { | ||||
| #include "video.h" | ||||
|     extern void AudioPoller(void); | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| static const char *const VERSION = "0.1.5"; | ||||
| static const char *const VERSION = "0.2.0"; | ||||
| static const char *const DESCRIPTION = | ||||
| trNOOP("A software and GPU emulated HD device"); | ||||
|  | ||||
| @@ -56,7 +57,7 @@ static int ConfigVideoDenoise;		///< config denoise | ||||
| static int ConfigVideoSharpen;		///< config sharpen | ||||
| static char ConfigVideoScaling;		///< config scaling | ||||
| static int ConfigVideoAudioDelay;	///< config audio delay | ||||
| static char DoMakePrimary;		///< flag switch primary | ||||
| static volatile char DoMakePrimary;	///< flag switch primary | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| @@ -129,7 +130,7 @@ cSoftOsd::cSoftOsd(int left, int top, uint level) | ||||
|  | ||||
| cSoftOsd::~cSoftOsd(void) | ||||
| { | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     SetActive(false); | ||||
|  | ||||
|     OsdClose(); | ||||
| @@ -206,8 +207,10 @@ void cSoftOsd::Flush(void) | ||||
| 	w = pm->ViewPort().Width(); | ||||
| 	h = pm->ViewPort().Height(); | ||||
|  | ||||
| 	dsyslog("[softhddev]%s: draw %dx%d+%d+%d %p\n", __FUNCTION__, w, h, x, | ||||
| 	    y, pm->Data()); | ||||
| 	/* | ||||
| 	   dsyslog("[softhddev]%s: draw %dx%d+%d+%d %p\n", __FUNCTION__, w, h, x, | ||||
| 	   y, pm->Data()); | ||||
| 	 */ | ||||
|  | ||||
| 	OsdDrawARGB(x, y, w, h, pm->Data()); | ||||
|  | ||||
| @@ -236,7 +239,7 @@ cOsd *cSoftOsdProvider::Osd;		///< single osd | ||||
| */ | ||||
| cOsd *cSoftOsdProvider::CreateOsd(int left, int top, uint level) | ||||
| { | ||||
|     dsyslog("[softhddev]%s: %d, %d, %d\n", __FUNCTION__, left, top, level); | ||||
|     //dsyslog("[softhddev]%s: %d, %d, %d\n", __FUNCTION__, left, top, level); | ||||
|  | ||||
|     Osd = new cSoftOsd(left, top, level); | ||||
|     return Osd; | ||||
| @@ -253,7 +256,7 @@ bool cSoftOsdProvider::ProvidesTrueColor(void) | ||||
| cSoftOsdProvider::cSoftOsdProvider(void) | ||||
| :  cOsdProvider() | ||||
| { | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
| } | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -386,14 +389,14 @@ class cSoftHdDevice:public cDevice | ||||
|  | ||||
| cSoftHdDevice::cSoftHdDevice(void) | ||||
| { | ||||
|     dsyslog("[softhddev]%s\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s\n", __FUNCTION__); | ||||
|  | ||||
|     spuDecoder = NULL; | ||||
| } | ||||
|  | ||||
| cSoftHdDevice::~cSoftHdDevice(void) | ||||
| { | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
| } | ||||
|  | ||||
| void cSoftHdDevice::MakePrimaryDevice(bool on) | ||||
| @@ -409,7 +412,7 @@ void cSoftHdDevice::MakePrimaryDevice(bool on) | ||||
| int cSoftHdDevice::ProvidesCa( | ||||
|     __attribute__ ((unused)) const cChannel * channel) const | ||||
| { | ||||
|     dsyslog("[softhddev]%s: %p\n", __FUNCTION__, channel); | ||||
|     //dsyslog("[softhddev]%s: %p\n", __FUNCTION__, channel); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
| @@ -505,7 +508,7 @@ void cSoftHdDevice::Mute(void) | ||||
|  | ||||
| void cSoftHdDevice::SetVolumeDevice(int volume) | ||||
| { | ||||
|     dsyslog("[softhddev]%s: %d\n", __FUNCTION__, volume); | ||||
|     //dsyslog("[softhddev]%s: %d\n", __FUNCTION__, volume); | ||||
|  | ||||
|     ::SetVolumeDevice(volume); | ||||
| } | ||||
| @@ -558,22 +561,23 @@ int cSoftHdDevice::PlayAudio(const uchar * data, int length, uchar id) | ||||
| void cSoftHdDevice::SetAudioTrackDevice( | ||||
|     __attribute__ ((unused)) eTrackType type) | ||||
| { | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
| } | ||||
|  | ||||
| void cSoftHdDevice::SetDigitalAudioDevice(bool on) | ||||
| void cSoftHdDevice::SetDigitalAudioDevice( __attribute__ ((unused)) bool on) | ||||
| { | ||||
|     dsyslog("[softhddev]%s: %s\n", __FUNCTION__, on ? "true" : "false"); | ||||
|     //dsyslog("[softhddev]%s: %s\n", __FUNCTION__, on ? "true" : "false"); | ||||
| } | ||||
|  | ||||
| void cSoftHdDevice::SetAudioChannelDevice(int audio_channel) | ||||
| void cSoftHdDevice::SetAudioChannelDevice( __attribute__ ((unused)) | ||||
|     int audio_channel) | ||||
| { | ||||
|     dsyslog("[softhddev]%s: %d\n", __FUNCTION__, audio_channel); | ||||
|     //dsyslog("[softhddev]%s: %d\n", __FUNCTION__, audio_channel); | ||||
| } | ||||
|  | ||||
| int cSoftHdDevice::GetAudioChannelDevice(void) | ||||
| { | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| @@ -652,13 +656,13 @@ cPluginSoftHdDevice::cPluginSoftHdDevice(void) | ||||
|     // Initialize any member variables here. | ||||
|     // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL | ||||
|     // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT! | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
| } | ||||
|  | ||||
| cPluginSoftHdDevice::~cPluginSoftHdDevice(void) | ||||
| { | ||||
|     // Clean up after yourself! | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|  | ||||
|     ::SoftHdDeviceExit(); | ||||
| } | ||||
| @@ -686,7 +690,7 @@ const char *cPluginSoftHdDevice::CommandLineHelp(void) | ||||
| */ | ||||
| bool cPluginSoftHdDevice::ProcessArgs(int argc, char *argv[]) | ||||
| { | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|  | ||||
|     return::ProcessArgs(argc, argv); | ||||
| } | ||||
| @@ -694,7 +698,7 @@ bool cPluginSoftHdDevice::ProcessArgs(int argc, char *argv[]) | ||||
| bool cPluginSoftHdDevice::Initialize(void) | ||||
| { | ||||
|     // Start any background activities the plugin shall perform. | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|  | ||||
|     MyDevice = new cSoftHdDevice(); | ||||
|  | ||||
| @@ -706,7 +710,7 @@ bool cPluginSoftHdDevice::Start(void) | ||||
|     const cDevice *primary; | ||||
|  | ||||
|     // Start any background activities the plugin shall perform. | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|  | ||||
|     primary = cDevice::PrimaryDevice(); | ||||
|     if (MyDevice != primary) { | ||||
| @@ -729,7 +733,7 @@ bool cPluginSoftHdDevice::Start(void) | ||||
|  | ||||
| void cPluginSoftHdDevice::Stop(void) | ||||
| { | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|  | ||||
|     ::Stop(); | ||||
| } | ||||
| @@ -743,7 +747,7 @@ void cPluginSoftHdDevice::Housekeeping(void) | ||||
|  | ||||
| const char *cPluginSoftHdDevice::MainMenuEntry(void) | ||||
| { | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     return tr(MAINMENUENTRY); | ||||
|     return NULL; | ||||
| } | ||||
| @@ -756,7 +760,7 @@ const char *cPluginSoftHdDevice::MainMenuEntry(void) | ||||
| */ | ||||
| void cPluginSoftHdDevice::MainThreadHook(void) | ||||
| { | ||||
|     // dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|  | ||||
|     if (DoMakePrimary && MyDevice) { | ||||
| 	dsyslog("[softhddev]%s: switching primary device\n", __FUNCTION__); | ||||
| @@ -791,7 +795,7 @@ cOsdObject *cPluginSoftHdDevice::MainMenuAction(void) | ||||
| */ | ||||
| cMenuSetupPage *cPluginSoftHdDevice::SetupMenu(void) | ||||
| { | ||||
|     dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|     //dsyslog("[softhddev]%s:\n", __FUNCTION__); | ||||
|  | ||||
|     return new cMenuSetupSoft; | ||||
| } | ||||
| @@ -801,7 +805,7 @@ cMenuSetupPage *cPluginSoftHdDevice::SetupMenu(void) | ||||
| */ | ||||
| bool cPluginSoftHdDevice::SetupParse(const char *name, const char *value) | ||||
| { | ||||
|     dsyslog("[softhddev]%s: '%s' = '%s'\n", __FUNCTION__, name, value); | ||||
|     //dsyslog("[softhddev]%s: '%s' = '%s'\n", __FUNCTION__, name, value); | ||||
|  | ||||
|     // FIXME: handle the values | ||||
|     if (!strcmp(name, "MakePrimary")) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user