mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Fixed plugin arguments corruption with glibc 2.11 on x86_64
This commit is contained in:
parent
af494287cf
commit
2cc10815ed
@ -2264,6 +2264,7 @@ Anssi Hannula <anssi.hannula@gmail.com>
|
|||||||
to "./locale", so that internationalization works by default when running VDR
|
to "./locale", so that internationalization works by default when running VDR
|
||||||
from within its source directory
|
from within its source directory
|
||||||
for fixing stopping subtitle display when switching the primary device
|
for fixing stopping subtitle display when switching the primary device
|
||||||
|
for fixing plugin arguments corruption with glibc 2.11 on x86_64
|
||||||
|
|
||||||
Antti Hartikainen <ami+vdr@ah.fi>
|
Antti Hartikainen <ami+vdr@ah.fi>
|
||||||
for updating 'S13E' in 'sources.conf'
|
for updating 'S13E' in 'sources.conf'
|
||||||
|
4
HISTORY
4
HISTORY
@ -6197,7 +6197,7 @@ Video Disk Recorder Revision History
|
|||||||
- Fixed the default value for "Pause key handling" in the MANUAL (reported by
|
- Fixed the default value for "Pause key handling" in the MANUAL (reported by
|
||||||
Diego Pierotto).
|
Diego Pierotto).
|
||||||
|
|
||||||
2010-01-04: Version 1.7.11
|
2010-01-06: Version 1.7.11
|
||||||
|
|
||||||
- Fixed resetting the file size when regenerating the index file.
|
- Fixed resetting the file size when regenerating the index file.
|
||||||
- The new function cDevice::PatPmtParser() can be used in derived devices to access
|
- The new function cDevice::PatPmtParser() can be used in derived devices to access
|
||||||
@ -6273,3 +6273,5 @@ Video Disk Recorder Revision History
|
|||||||
- Added support for DVB cards with multiple fontends. Note that this only
|
- Added support for DVB cards with multiple fontends. Note that this only
|
||||||
works for DVB cards where each frontend can be used independently of all
|
works for DVB cards where each frontend can be used independently of all
|
||||||
the others on the same adapter.
|
the others on the same adapter.
|
||||||
|
- Fixed plugin arguments corruption with glibc 2.11 on x86_64 (thanks to
|
||||||
|
Anssi Hannula).
|
||||||
|
215
dvbosd.c
215
dvbosd.c
@ -1,215 +0,0 @@
|
|||||||
/*
|
|
||||||
* dvbosd.c: Implementation of the DVB On Screen Display
|
|
||||||
*
|
|
||||||
* See the main source file 'vdr.c' for copyright information and
|
|
||||||
* how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: dvbosd.c 1.32 2007/09/16 08:55:54 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "dvbosd.h"
|
|
||||||
#include <linux/dvb/osd.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/unistd.h>
|
|
||||||
#include "dvbdevice.h"
|
|
||||||
#include "tools.h"
|
|
||||||
|
|
||||||
// --- cDvbOsd ---------------------------------------------------------------
|
|
||||||
|
|
||||||
#define MAXNUMWINDOWS 7 // OSD windows are counted 1...7
|
|
||||||
#define MAXOSDMEMORY 92000 // number of bytes available to the OSD (for unmodified DVB cards)
|
|
||||||
|
|
||||||
class cDvbOsd : public cOsd {
|
|
||||||
private:
|
|
||||||
int osdDev;
|
|
||||||
int osdMem;
|
|
||||||
bool shown;
|
|
||||||
void Cmd(OSD_Command cmd, int color = 0, int x0 = 0, int y0 = 0, int x1 = 0, int y1 = 0, const void *data = NULL);
|
|
||||||
protected:
|
|
||||||
virtual void SetActive(bool On);
|
|
||||||
public:
|
|
||||||
cDvbOsd(int Left, int Top, int OsdDev, uint Level);
|
|
||||||
virtual ~cDvbOsd();
|
|
||||||
virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas);
|
|
||||||
virtual eOsdError SetAreas(const tArea *Areas, int NumAreas);
|
|
||||||
virtual void Flush(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
cDvbOsd::cDvbOsd(int Left, int Top, int OsdDev, uint Level)
|
|
||||||
:cOsd(Left, Top, Level)
|
|
||||||
{
|
|
||||||
osdDev = OsdDev;
|
|
||||||
shown = false;
|
|
||||||
if (osdDev < 0)
|
|
||||||
esyslog("ERROR: invalid OSD device handle (%d)!", osdDev);
|
|
||||||
else {
|
|
||||||
osdMem = MAXOSDMEMORY;
|
|
||||||
#ifdef OSD_CAP_MEMSIZE
|
|
||||||
// modified DVB cards may have more OSD memory:
|
|
||||||
osd_cap_t cap;
|
|
||||||
cap.cmd = OSD_CAP_MEMSIZE;
|
|
||||||
if (ioctl(osdDev, OSD_GET_CAPABILITY, &cap) == 0)
|
|
||||||
osdMem = cap.val;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cDvbOsd::~cDvbOsd()
|
|
||||||
{
|
|
||||||
SetActive(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbOsd::SetActive(bool On)
|
|
||||||
{
|
|
||||||
if (On != Active()) {
|
|
||||||
cOsd::SetActive(On);
|
|
||||||
if (On) {
|
|
||||||
// must clear all windows here to avoid flashing effects - doesn't work if done
|
|
||||||
// in Flush() only for the windows that are actually used...
|
|
||||||
for (int i = 0; i < MAXNUMWINDOWS; i++) {
|
|
||||||
Cmd(OSD_SetWindow, 0, i + 1);
|
|
||||||
Cmd(OSD_Clear);
|
|
||||||
}
|
|
||||||
if (GetBitmap(0)) // only flush here if there are already bitmaps
|
|
||||||
Flush();
|
|
||||||
}
|
|
||||||
else if (shown) {
|
|
||||||
cBitmap *Bitmap;
|
|
||||||
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
|
|
||||||
Cmd(OSD_SetWindow, 0, i + 1);
|
|
||||||
Cmd(OSD_Close);
|
|
||||||
}
|
|
||||||
shown = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eOsdError cDvbOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
|
|
||||||
{
|
|
||||||
eOsdError Result = cOsd::CanHandleAreas(Areas, NumAreas);
|
|
||||||
if (Result == oeOk) {
|
|
||||||
if (NumAreas > MAXNUMWINDOWS)
|
|
||||||
return oeTooManyAreas;
|
|
||||||
int TotalMemory = 0;
|
|
||||||
for (int i = 0; i < NumAreas; i++) {
|
|
||||||
if (Areas[i].bpp != 1 && Areas[i].bpp != 2 && Areas[i].bpp != 4 && Areas[i].bpp != 8)
|
|
||||||
return oeBppNotSupported;
|
|
||||||
if ((Areas[i].Width() & (8 / Areas[i].bpp - 1)) != 0)
|
|
||||||
return oeWrongAlignment;
|
|
||||||
if (Areas[i].Width() < 1 || Areas[i].Height() < 1 || Areas[i].Width() > 720 || Areas[i].Height() > 576)
|
|
||||||
return oeWrongAreaSize;
|
|
||||||
TotalMemory += Areas[i].Width() * Areas[i].Height() / (8 / Areas[i].bpp);
|
|
||||||
}
|
|
||||||
if (TotalMemory > osdMem)
|
|
||||||
return oeOutOfMemory;
|
|
||||||
}
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
eOsdError cDvbOsd::SetAreas(const tArea *Areas, int NumAreas)
|
|
||||||
{
|
|
||||||
if (shown) {
|
|
||||||
cBitmap *Bitmap;
|
|
||||||
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
|
|
||||||
Cmd(OSD_SetWindow, 0, i + 1);
|
|
||||||
Cmd(OSD_Close);
|
|
||||||
}
|
|
||||||
shown = false;
|
|
||||||
}
|
|
||||||
return cOsd::SetAreas(Areas, NumAreas);
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data)
|
|
||||||
{
|
|
||||||
if (osdDev >= 0) {
|
|
||||||
osd_cmd_t dc;
|
|
||||||
dc.cmd = cmd;
|
|
||||||
dc.color = color;
|
|
||||||
dc.x0 = x0;
|
|
||||||
dc.y0 = y0;
|
|
||||||
dc.x1 = x1;
|
|
||||||
dc.y1 = y1;
|
|
||||||
dc.data = (void *)data;
|
|
||||||
ioctl(osdDev, OSD_SEND_CMD, &dc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cDvbOsd::Flush(void)
|
|
||||||
{
|
|
||||||
if (!Active())
|
|
||||||
return;
|
|
||||||
cBitmap *Bitmap;
|
|
||||||
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
|
|
||||||
Cmd(OSD_SetWindow, 0, i + 1);
|
|
||||||
if (!shown)
|
|
||||||
Cmd(OSD_Open, Bitmap->Bpp(), Left() + Bitmap->X0(), Top() + Bitmap->Y0(), Left() + Bitmap->X0() + Bitmap->Width() - 1, Top() + Bitmap->Y0() + Bitmap->Height() - 1, (void *)1); // initially hidden!
|
|
||||||
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
|
|
||||||
if (!shown || Bitmap->Dirty(x1, y1, x2, y2)) {
|
|
||||||
if (!shown) {
|
|
||||||
x1 = y1 = 0;
|
|
||||||
x2 = Bitmap->Width() - 1;
|
|
||||||
y2 = Bitmap->Height() - 1;
|
|
||||||
}
|
|
||||||
//TODO Workaround: apparently the bitmap sent to the driver always has to be a multiple
|
|
||||||
//TODO of 8 bits wide, and (dx * dy) also has to be a multiple of 8.
|
|
||||||
//TODO Fix driver (should be able to handle any size bitmaps!)
|
|
||||||
while ((x1 > 0 || x2 < Bitmap->Width() - 1) && ((x2 - x1) & 7) != 7) {
|
|
||||||
if (x2 < Bitmap->Width() - 1)
|
|
||||||
x2++;
|
|
||||||
else if (x1 > 0)
|
|
||||||
x1--;
|
|
||||||
}
|
|
||||||
//TODO "... / 2" <==> Bpp???
|
|
||||||
while ((y1 > 0 || y2 < Bitmap->Height() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) {
|
|
||||||
if (y2 < Bitmap->Height() - 1)
|
|
||||||
y2++;
|
|
||||||
else if (y1 > 0)
|
|
||||||
y1--;
|
|
||||||
}
|
|
||||||
while ((x1 > 0 || x2 < Bitmap->Width() - 1) && (((x2 - x1 + 1) * (y2 - y1 + 1) / 2) & 7) != 0) {
|
|
||||||
if (x2 < Bitmap->Width() - 1)
|
|
||||||
x2++;
|
|
||||||
else if (x1 > 0)
|
|
||||||
x1--;
|
|
||||||
}
|
|
||||||
// commit colors:
|
|
||||||
int NumColors;
|
|
||||||
const tColor *Colors = Bitmap->Colors(NumColors);
|
|
||||||
if (Colors) {
|
|
||||||
//TODO this should be fixed in the driver!
|
|
||||||
tColor colors[NumColors];
|
|
||||||
for (int i = 0; i < NumColors; i++) {
|
|
||||||
// convert AARRGGBB to AABBGGRR (the driver expects the colors the wrong way):
|
|
||||||
colors[i] = (Colors[i] & 0xFF000000) | ((Colors[i] & 0x0000FF) << 16) | (Colors[i] & 0x00FF00) | ((Colors[i] & 0xFF0000) >> 16);
|
|
||||||
}
|
|
||||||
Colors = colors;
|
|
||||||
//TODO end of stuff that should be fixed in the driver
|
|
||||||
Cmd(OSD_SetPalette, 0, NumColors - 1, 0, 0, 0, Colors);
|
|
||||||
}
|
|
||||||
// commit modified data:
|
|
||||||
Cmd(OSD_SetBlock, Bitmap->Width(), x1, y1, x2, y2, Bitmap->Data(x1, y1));
|
|
||||||
}
|
|
||||||
Bitmap->Clean();
|
|
||||||
}
|
|
||||||
if (!shown) {
|
|
||||||
// Showing the windows in a separate loop to avoid seeing them come up one after another
|
|
||||||
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
|
|
||||||
Cmd(OSD_SetWindow, 0, i + 1);
|
|
||||||
Cmd(OSD_MoveWindow, 0, Left() + Bitmap->X0(), Top() + Bitmap->Y0());
|
|
||||||
}
|
|
||||||
shown = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cDvbOsdProvider -------------------------------------------------------
|
|
||||||
|
|
||||||
cDvbOsdProvider::cDvbOsdProvider(int OsdDev)
|
|
||||||
{
|
|
||||||
osdDev = OsdDev;
|
|
||||||
}
|
|
||||||
|
|
||||||
cOsd *cDvbOsdProvider::CreateOsd(int Left, int Top, uint Level)
|
|
||||||
{
|
|
||||||
return new cDvbOsd(Left, Top, osdDev, Level);
|
|
||||||
}
|
|
23
dvbosd.h
23
dvbosd.h
@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* dvbosd.h: Implementation of the DVB On Screen Display
|
|
||||||
*
|
|
||||||
* See the main source file 'vdr.c' for copyright information and
|
|
||||||
* how to reach the author.
|
|
||||||
*
|
|
||||||
* $Id: dvbosd.h 1.19 2007/08/25 13:49:34 kls Exp $
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __DVBOSD_H
|
|
||||||
#define __DVBOSD_H
|
|
||||||
|
|
||||||
#include "osd.h"
|
|
||||||
|
|
||||||
class cDvbOsdProvider : public cOsdProvider {
|
|
||||||
private:
|
|
||||||
int osdDev;
|
|
||||||
public:
|
|
||||||
cDvbOsdProvider(int OsdDev);
|
|
||||||
virtual cOsd *CreateOsd(int Left, int Top, uint Level);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //__DVBOSD_H
|
|
10
plugin.c
10
plugin.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: plugin.c 2.1 2009/04/05 10:21:20 kls Exp $
|
* $Id: plugin.c 2.2 2010/01/06 11:36:46 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
@ -172,15 +172,15 @@ cDll::~cDll()
|
|||||||
static char *SkipQuote(char *s)
|
static char *SkipQuote(char *s)
|
||||||
{
|
{
|
||||||
char c = *s;
|
char c = *s;
|
||||||
strcpy(s, s + 1);
|
memmove(s, s + 1, strlen(s));
|
||||||
while (*s && *s != c) {
|
while (*s && *s != c) {
|
||||||
if (*s == '\\')
|
if (*s == '\\')
|
||||||
strcpy(s, s + 1);
|
memmove(s, s + 1, strlen(s));
|
||||||
if (*s)
|
if (*s)
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
if (*s) {
|
if (*s) {
|
||||||
strcpy(s, s + 1);
|
memmove(s, s + 1, strlen(s));
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
esyslog("ERROR: missing closing %c", c);
|
esyslog("ERROR: missing closing %c", c);
|
||||||
@ -215,7 +215,7 @@ bool cDll::Load(bool Log)
|
|||||||
if (!q)
|
if (!q)
|
||||||
q = p;
|
q = p;
|
||||||
switch (*p) {
|
switch (*p) {
|
||||||
case '\\': strcpy(p, p + 1);
|
case '\\': memmove(p, p + 1, strlen(p));
|
||||||
if (*p)
|
if (*p)
|
||||||
p++;
|
p++;
|
||||||
else {
|
else {
|
||||||
|
Loading…
Reference in New Issue
Block a user