From edfb9932c0cd99616b43ba3541c538659456ae6d Mon Sep 17 00:00:00 2001 From: Johns Date: Mon, 12 Dec 2011 17:06:05 +0100 Subject: [PATCH] Add deinterlace/scaling modes to setup. --- ChangeLog | 5 +++++ Todo | 9 +++++++-- softhddev.c | 38 +++++++++++++++++++++++++++++--------- softhddev.h | 4 +++- softhddevice.cpp | 38 ++++++++++++++++++++++++++++++-------- video.h | 6 ++++++ 6 files changed, 80 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1f75198..cd122b2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ User johns +Date: + + DisplayFrame displays now only a single frame. + Add deinterlace/scaling modes to setup. + Date: Sat Dec 10 00:06:46 CET 2011 Release Version 0.0.9 diff --git a/Todo b/Todo index 87122e8..97efc67 100644 --- a/Todo +++ b/Todo @@ -14,8 +14,13 @@ x11: support fullscreen window support fullscreen / window toggle -video/audio asyncron +audio/alsa: + video/audio asyncron -playback of >2 channels on 2 channel hardware + playback of >2 channels on 2 channel hardware + done? + + on some channels it takes long time until sound can be heared. + this channels has packet start not at the beginning of the start packet playback of recording diff --git a/softhddev.c b/softhddev.c index 60187db..b4fc331 100644 --- a/softhddev.c +++ b/softhddev.c @@ -478,26 +478,28 @@ static void StartVideo(void) ** @param data data of exactly one complete PES packet ** @param size size of PES packet ** +** @return number of bytes used, 0 if internal buffer are full. +** ** @note vdr sends incomplete packets, va-api h264 decoder only ** supports complete packets. ** We buffer here until we receive an complete PES Packet, which ** is no problem, the audio is always far behind us. */ -void PlayVideo(const uint8_t * data, int size) +int PlayVideo(const uint8_t * data, int size) { const uint8_t *check; int64_t pts; int n; if (BrokenThreadsAndPlugins) { - return; + return size; } if (Usr1Signal) { // x11 server ready Usr1Signal = 0; StartVideo(); } if (!MyVideoDecoder) { // no x11 video started - return; + return size; } if (NewVideoStream) { Debug(3, "video: new stream %d\n", GetMsTicks() - VideoSwitch); @@ -506,15 +508,15 @@ void PlayVideo(const uint8_t * data, int size) NewVideoStream = 0; } // must be a PES start code - if (data[0] || data[1] || data[2] != 0x01 || size < 9) { + if (size < 9 || data[0] || data[1] || data[2] != 0x01) { Error(_("[softhddev] invalid PES video packet\n")); - return; + return size; } n = data[8]; // header size // wrong size if (size < 9 + n) { Error(_("[softhddev] invalid video packet\n")); - return; + return size; } check = data + 9 + n; @@ -555,7 +557,7 @@ void PlayVideo(const uint8_t * data, int size) // this happens when vdr sends incomplete packets if (VideoCodecID == CODEC_ID_NONE) { Debug(3, "video: not detected\n"); - return; + return size; } if (VideoCodecID == CODEC_ID_MPEG2VIDEO) { // mpeg codec supports incomplete packages @@ -564,8 +566,9 @@ void PlayVideo(const uint8_t * data, int size) } // SKIP PES header - size -= 9 + n; - VideoEnqueue(pts, check, size); + VideoEnqueue(pts, check, size - 9 - n); + + return size; } ////////////////////////////////////////////////////////////////////////////// @@ -591,6 +594,23 @@ void SetPlayMode(void) } } +/** +** Poll if device is ready. Called by replay. +*/ +int Poll(int timeout) +{ + return 1; + // buffers are too full + if (atomic_read(&VideoPacketsFilled) >= VIDEO_PACKET_MAX / 2) { + if (timeout) { + // let display thread work + usleep(timeout * 1000); + } + return atomic_read(&VideoPacketsFilled) < VIDEO_PACKET_MAX / 2; + } + return 0; +} + ////////////////////////////////////////////////////////////////////////////// // OSD ////////////////////////////////////////////////////////////////////////////// diff --git a/softhddev.h b/softhddev.h index 4b82cce..817be2c 100644 --- a/softhddev.h +++ b/softhddev.h @@ -43,12 +43,14 @@ extern "C" extern void SetVolumeDevice(int); /// C plugin play video packet - extern void PlayVideo(const uint8_t *, int); + extern int PlayVideo(const uint8_t *, int); /// C plugin play TS video packet extern void PlayTsVideo(const uint8_t *, int); /// C plugin set play mode extern void SetPlayMode(void); + /// C plugin poll if ready + extern int Poll(int); /// C plugin command line help extern const char *CommandLineHelp(void); diff --git a/softhddevice.cpp b/softhddevice.cpp index d017c0c..dfaddbd 100644 --- a/softhddevice.cpp +++ b/softhddevice.cpp @@ -33,10 +33,13 @@ #include "softhddev.h" #include "softhddevice.h" +extern "C" { + #include "video.h" +} ////////////////////////////////////////////////////////////////////////////// -static const char *const VERSION = "0.0.9"; +static const char *const VERSION = "0.1.0"; static const char *const DESCRIPTION = trNOOP("A software and GPU emulated HD device"); @@ -254,6 +257,8 @@ class cMenuSetupSoft:public cMenuSetupPage { protected: int MakePrimary; + int Deinterlace; + int Scaling; protected: virtual void Store(void); public: @@ -265,10 +270,17 @@ class cMenuSetupSoft:public cMenuSetupPage */ cMenuSetupSoft::cMenuSetupSoft(void) { + static const char * const deinterlace[] = { + "Bob", "Weave", "Temporal", "TemporalSpatial", "Software" }; + static const char * const scaling[] = { + "Normal", "Fast", "HQ", "Anamorphic" }; + // cMenuEditBoolItem cMenuEditBitItem cMenuEditNumItem // cMenuEditStrItem cMenuEditStraItem cMenuEditIntItem Add(new cMenuEditBoolItem(tr("Make primary device"), &MakePrimary, tr("no"), tr("yes"))); + Add(new cMenuEditStraItem(tr("Deinterlace"), &Deinterlace, 5, deinterlace)); + Add(new cMenuEditStraItem(tr("Scaling"), &Scaling, 4, scaling)); } /** @@ -277,6 +289,8 @@ cMenuSetupSoft::cMenuSetupSoft(void) void cMenuSetupSoft::Store(void) { SetupStore("MakePrimary", MakePrimary); + SetupStore("Deinterlace", Deinterlace); + SetupStore("Scaling", Scaling); } ////////////////////////////////////////////////////////////////////////////// @@ -451,11 +465,11 @@ void cSoftHdDevice::StillPicture( } bool cSoftHdDevice::Poll( - __attribute__ ((unused)) cPoller & poller, __attribute__ ((unused)) - int timeout_ms) + __attribute__ ((unused)) cPoller & poller, int timeout_ms) { - dsyslog("[softhddev]%s:\n", __FUNCTION__); - return true; + dsyslog("[softhddev]%s: %d\n", __FUNCTION__, timeout_ms); + + return ::Poll(timeout_ms); } bool cSoftHdDevice::Flush( __attribute__ ((unused)) int timeout_ms) @@ -518,9 +532,7 @@ int cSoftHdDevice::PlayVideo(const uchar * data, int length) { //dsyslog("[softhddev]%s: %p %d\n", __FUNCTION__, data, length); - ::PlayVideo(data, length); - - return length; + return ::PlayVideo(data, length); } #if 0 @@ -728,6 +740,16 @@ bool cPluginSoftHdDevice::SetupParse(const char *name, const char *value) ConfigMakePrimary = atoi(value); return true; } + if (!strcmp(name, "Deinterlace")) { + printf("Deinterlace: %d\n", atoi(value)); + VideoSetDeinterlace(atoi(value)); + return true; + } + if (!strcmp(name, "Scaling")) { + printf("Scaling: %d\n", atoi(value)); + VideoSetScaling(atoi(value)); + return true; + } return false; } diff --git a/video.h b/video.h index 73946d0..87bc181 100644 --- a/video.h +++ b/video.h @@ -71,6 +71,12 @@ extern void VideoDisplayHandler(void); /// set video geometry extern int VideoSetGeometry(const char *); + /// set deinterlace +extern void VideoSetDeinterlace(int); + + /// set scaling +extern void VideoSetScaling(int); + /// Clear OSD extern void VideoOsdClear(void);