mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
- Completed Croatian language texts (thanks to Drazen Dupor). - New iso8859-2 font to fix the problem with program freezes (thanks to Drazen Dupor). - Implemented a default cRemote::Initialize() that waits 10 seconds for a keypress in order to prevent a "hangup" in case, e.g., the LIRC driver is not loaded (thanks to Helmut Auer). - Updated 'channels.conf.terr' for Hannover (thanks to Peter Waechtler). - cBitmap::DrawBitmap() now also resets the palette if the entire bitmap area is covered (suggested by Sascha Volkenandt). - Fixed setting the title in the replay display of the "Classic VDR" skin in case a shorter title is set after a longer one (thanks to Stefan Huelswitt for reporting this one). - Now using more separate areas in the "ST:TNG Panels" skin to allow a theme to use more independent clrMenu* colors. - Fixed removing the "scanning recordings..." message in case the video directory is empty (thanks to Andreas Regel for reporting this one). - Added SetMessage() functions to the Replay and Channel skin functions. Plugins that implement skins will need to implement these functions. This fixes a missing "Editing process finished" message (thanks to Oliver Endriss for reporting this one). - Fixed the height of the channel display in the "Classic VDR" skin. - Fixed handling descriptor loops in 'libsi', which had sometimes caused invalid CA ids to be added to the channel definitions (thanks to Wayne Keer for reporting this one, and Marcel Wiesweg for fixing it). - Fixed handling colors in cDvbSpuPalette::yuv2rgb() (thanks to Marco Schlüßler). - Made some functions of cFont virtual to allow implementing dummy fonts for the 'curses' skin. - The new plugin 'skincurses' re-implements the functionality that was previously available by compiling VDR with DEBUG_OSD. Some things may not yet work as they should, but it's a starting point.
203 lines
4.4 KiB
C++
203 lines
4.4 KiB
C++
/*
|
|
* SPU decoder for DVB devices
|
|
*
|
|
* Copyright (C) 2001.2002 Andreas Schultz <aschultz@warp10.net>
|
|
*
|
|
* This code is distributed under the terms and conditions of the
|
|
* GNU GENERAL PUBLIC LICENSE. See the file COPYING for details.
|
|
*
|
|
* parts of this file are derived from the OMS program.
|
|
*
|
|
* $Id: dvbspu.h 1.4 2004/05/31 08:49:20 kls Exp $
|
|
*/
|
|
|
|
#ifndef __DVBSPU_H
|
|
#define __DVBSPU_H
|
|
|
|
#include <inttypes.h>
|
|
|
|
#include "osd.h"
|
|
#include "spu.h"
|
|
|
|
typedef struct sDvbSpuPalDescr {
|
|
uint8_t index;
|
|
uint8_t trans;
|
|
|
|
bool operator != (const sDvbSpuPalDescr pd) const {
|
|
return index != pd.index && trans != pd.trans;
|
|
};
|
|
} aDvbSpuPalDescr[4];
|
|
|
|
typedef struct sDvbSpuRect {
|
|
int x1, y1;
|
|
int x2, y2;
|
|
|
|
int width() {
|
|
return x2 - x1 + 1;
|
|
};
|
|
int height() {
|
|
return y2 - y1 + 1;
|
|
};
|
|
|
|
bool operator != (const sDvbSpuRect r) const {
|
|
return r.x1 != x1 || r.y1 != y1 || r.x2 != x2 || r.y2 != y2;
|
|
};
|
|
}
|
|
|
|
sDvbSpuRect;
|
|
|
|
// --- cDvbSpuPalette----------------------------------
|
|
|
|
class cDvbSpuPalette {
|
|
private:
|
|
uint32_t palette[16];
|
|
|
|
private:
|
|
uint32_t yuv2rgb(uint32_t yuv_color);
|
|
|
|
public:
|
|
void setPalette(const uint32_t * pal);
|
|
uint32_t getColor(uint8_t idx, uint8_t trans) const;
|
|
};
|
|
|
|
// --- cDvbSpuBitmap----------------------------------
|
|
|
|
class cDvbSpuBitmap {
|
|
|
|
public:
|
|
private:
|
|
sDvbSpuRect bmpsize;
|
|
sDvbSpuRect minsize[4];
|
|
uint8_t *bmp;
|
|
|
|
private:
|
|
void putPixel(int xp, int yp, int len, uint8_t colorid);
|
|
void putFieldData(int field, uint8_t * data, uint8_t * endp);
|
|
|
|
public:
|
|
cDvbSpuBitmap(sDvbSpuRect size,
|
|
uint8_t * fodd, uint8_t * eodd,
|
|
uint8_t * feven, uint8_t * eeven);
|
|
~cDvbSpuBitmap();
|
|
|
|
bool getMinSize(const aDvbSpuPalDescr paldescr,
|
|
sDvbSpuRect & size) const;
|
|
cBitmap *getBitmap(const aDvbSpuPalDescr paldescr,
|
|
const cDvbSpuPalette & pal,
|
|
sDvbSpuRect & size) const;
|
|
};
|
|
|
|
// --- cDvbSpuDecoder------------------------------------
|
|
|
|
class cDvbSpuDecoder:public cSpuDecoder {
|
|
private:
|
|
cOsd * osd;
|
|
|
|
// processing state
|
|
uint8_t *spu;
|
|
uint32_t spupts;
|
|
bool clean;
|
|
bool ready;
|
|
|
|
enum spFlag { spNONE, spHIDE, spSHOW, spMENU };
|
|
spFlag state;
|
|
|
|
cSpuDecoder::eScaleMode scaleMode;
|
|
|
|
//highligh area
|
|
bool highlight;
|
|
sDvbSpuRect hlpsize;
|
|
aDvbSpuPalDescr hlpDescr;
|
|
|
|
//palette
|
|
cDvbSpuPalette palette;
|
|
|
|
// spu info's
|
|
sDvbSpuRect size;
|
|
aDvbSpuPalDescr palDescr;
|
|
|
|
uint16_t DCSQ_offset;
|
|
uint16_t prev_DCSQ_offset;
|
|
|
|
cDvbSpuBitmap *spubmp;
|
|
private:
|
|
int cmdOffs(void) {
|
|
return ((spu[2] << 8) | spu[3]);
|
|
};
|
|
int spuSize(void) {
|
|
return ((spu[0] << 8) | spu[1]);
|
|
};
|
|
|
|
int ScaleYcoord(int value);
|
|
int ScaleYres(int value);
|
|
void DrawBmp(sDvbSpuRect & size, cBitmap * bmp);
|
|
|
|
void Draw();
|
|
void Hide();
|
|
|
|
public:
|
|
cDvbSpuDecoder();
|
|
~cDvbSpuDecoder();
|
|
|
|
int setTime(uint32_t pts);
|
|
|
|
void setScaleMode(cSpuDecoder::eScaleMode ScaleMode);
|
|
void setPalette(uint32_t * pal);
|
|
void setHighlight(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,
|
|
uint32_t palette);
|
|
void clearHighlight(void);
|
|
void Empty(void);
|
|
void processSPU(uint32_t pts, uint8_t * buf);
|
|
};
|
|
|
|
// --- cDvbSpuPalette -------------------------------------------
|
|
|
|
inline uint32_t cDvbSpuPalette::yuv2rgb(uint32_t yuv_color)
|
|
{
|
|
int Y, Cb, Cr;
|
|
int Ey, Epb, Epr;
|
|
int Eg, Eb, Er;
|
|
|
|
Y = (yuv_color >> 16) & 0xff;
|
|
Cb = (yuv_color) & 0xff;
|
|
Cr = (yuv_color >> 8) & 0xff;
|
|
|
|
Ey = (Y - 16);
|
|
Epb = (Cb - 128);
|
|
Epr = (Cr - 128);
|
|
/* ITU-R 709
|
|
Eg = (298*Ey - 55*Epb - 137*Epr)/256;
|
|
Eb = (298*Ey + 543*Epb)/256;
|
|
Er = (298*Ey + 460*Epr)/256;
|
|
*/
|
|
/* FCC ~= mediaLib */
|
|
Eg = (298 * Ey - 100 * Epb - 208 * Epr) / 256;
|
|
Eb = (298 * Ey + 516 * Epb) / 256;
|
|
Er = (298 * Ey + 408 * Epr) / 256;
|
|
|
|
if (Eg > 255)
|
|
Eg = 255;
|
|
if (Eg < 0)
|
|
Eg = 0;
|
|
|
|
if (Eb > 255)
|
|
Eb = 255;
|
|
if (Eb < 0)
|
|
Eb = 0;
|
|
|
|
if (Er > 255)
|
|
Er = 255;
|
|
if (Er < 0)
|
|
Er = 0;
|
|
|
|
return Eb | (Eg << 8) | (Er << 16);
|
|
}
|
|
|
|
inline uint32_t cDvbSpuPalette::getColor(uint8_t idx, uint8_t trans) const
|
|
{
|
|
uint8_t t = trans == 0x0f ? 0xff : trans << 4;
|
|
return palette[idx] | (t << 24);
|
|
}
|
|
|
|
#endif // __DVBSPU_H
|