vdr 2.8.1
dvbspu.h
Go to the documentation of this file.
1/*
2 * SPU decoder for DVB devices
3 *
4 * Copyright (C) 2001.2002 Andreas Schultz <aschultz@warp10.net>
5 *
6 * This code is distributed under the terms and conditions of the
7 * GNU GENERAL PUBLIC LICENSE. See the file COPYING for details.
8 *
9 * parts of this file are derived from the OMS program.
10 *
11 * $Id: dvbspu.h 5.2 2026/03/09 20:08:29 kls Exp $
12 */
13
14#ifndef __DVBSPU_H
15#define __DVBSPU_H
16
17#include <inttypes.h>
18#include "device.h"
19#include "osd.h"
20#include "spu.h"
21#include "thread.h"
22
23typedef struct sDvbSpuPalDescr {
24 uint8_t index;
25 uint8_t trans;
26
27 bool operator != (const sDvbSpuPalDescr pd) const {
28 return index != pd.index && trans != pd.trans;
29 };
31
32typedef struct sDvbSpuRect {
33 int x1, y1;
34 int x2, y2;
35
37 x1 = y1 = x2 = y2 = 0;
38 };
39 int width() const {
40 return x2 - x1 + 1;
41 };
42 int height() const {
43 return y2 - y1 + 1;
44 };
45
46 bool operator != (const sDvbSpuRect r) const {
47 return r.x1 != x1 || r.y1 != y1 || r.x2 != x2 || r.y2 != y2;
48 };
49}
50
52
53// --- cDvbSpuPalette---------------------------------------------------------
54
56 private:
57 uint32_t palette[16];
58
59 private:
60 uint32_t yuv2rgb(uint32_t yuv_color);
61
62 public:
63 void setPalette(const uint32_t * pal);
64 uint32_t getColor(uint8_t idx, uint8_t trans) const;
65};
66
67// --- cDvbSpuBitmap----------------------------------------------------------
68
70 private:
73 uint8_t *bmp;
74
75 private:
76 void putPixel(int xp, int yp, int len, uint8_t colorid);
77 void putFieldData(int field, uint8_t * data, uint8_t * endp);
78
79 public:
81 uint8_t * fodd, uint8_t * eodd,
82 uint8_t * feven, uint8_t * eeven);
84
85 bool getMinSize(const aDvbSpuPalDescr paldescr,
86 sDvbSpuRect & size) const;
87 int getMinBpp(const aDvbSpuPalDescr paldescr);
88 cBitmap *getBitmap(const aDvbSpuPalDescr paldescr,
89 const cDvbSpuPalette & pal,
90 sDvbSpuRect & size) const;
91};
92
93// --- cDvbSpuDecoder---------------------------------------------------------
94
96 private:
99
100 // processing state
101 uint8_t *spu;
102 uint32_t spupts;
103 bool clean;
105
108
110 int xres, yres;
112
113 //highligh area
117
118 //palette
120
121 // spu info's
124
125 uint16_t DCSQ_offset;
127
130 private:
131 int cmdOffs(void) {
132 return ((spu[2] << 8) | spu[3]);
133 };
134 int spuSize(void) {
135 return ((spu[0] << 8) | spu[1]);
136 };
137
138 void SetSpuScaling(void);
139 sDvbSpuRect CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDvbSpuRect bgsize, cBitmap *bgbmp);
140 int CalcAreaBpp(cBitmap *fgbmp, cBitmap *bgbmp);
141
142 public:
145
146 int setTime(uint32_t pts);
147
150 void setResolution(int Xres, int Yres);
151 void setPalette(uint32_t * pal);
152 void setHighlight(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey,
153 uint32_t palette);
154 void clearHighlight(void);
155 void Empty(void);
156 void Hide(void);
157 void Draw(void);
158 bool IsVisible(void) { return osd != NULL; }
159 void processSPU(uint32_t pts, uint8_t * buf, bool AllowedShow);
160};
161
162// --- cDvbSpuPalette --------------------------------------------------------
163
164inline uint32_t cDvbSpuPalette::yuv2rgb(uint32_t yuv_color)
165{
166 int Y, Cb, Cr;
167 int Ey, Epb, Epr;
168 int Eg, Eb, Er;
169
170 Y = (yuv_color >> 16) & 0xff;
171 Cb = (yuv_color) & 0xff;
172 Cr = (yuv_color >> 8) & 0xff;
173
174 Ey = (Y - 16);
175 Epb = (Cb - 128);
176 Epr = (Cr - 128);
177 /* ITU-R 709
178 Eg = (298*Ey - 55*Epb - 137*Epr)/256;
179 Eb = (298*Ey + 543*Epb)/256;
180 Er = (298*Ey + 460*Epr)/256;
181 */
182 /* FCC ~= mediaLib */
183 Eg = (298 * Ey - 100 * Epb - 208 * Epr) / 256;
184 Eb = (298 * Ey + 516 * Epb) / 256;
185 Er = (298 * Ey + 408 * Epr) / 256;
186
187 if (Eg > 255)
188 Eg = 255;
189 if (Eg < 0)
190 Eg = 0;
191
192 if (Eb > 255)
193 Eb = 255;
194 if (Eb < 0)
195 Eb = 0;
196
197 if (Er > 255)
198 Er = 255;
199 if (Er < 0)
200 Er = 0;
201
202 return Eb | (Eg << 8) | (Er << 16);
203}
204
205inline uint32_t cDvbSpuPalette::getColor(uint8_t idx, uint8_t trans) const
206{
207 return palette[idx] | ((trans == 0x0f) ? 0xff000000 : (trans << 28));
208}
209
210#endif //__DVBSPU_H
Definition osd.h:170
uint8_t * bmp
Definition dvbspu.h:73
int getMinBpp(const aDvbSpuPalDescr paldescr)
Definition dvbspu.c:384
void putFieldData(int field, uint8_t *data, uint8_t *endp)
Definition dvbspu.c:177
sDvbSpuRect bmpsize
Definition dvbspu.h:71
void putPixel(int xp, int yp, int len, uint8_t colorid)
Definition dvbspu.c:155
bool getMinSize(const aDvbSpuPalDescr paldescr, sDvbSpuRect &size) const
Definition dvbspu.c:129
cBitmap * getBitmap(const aDvbSpuPalDescr paldescr, const cDvbSpuPalette &pal, sDvbSpuRect &size) const
Definition dvbspu.c:92
~cDvbSpuBitmap()
Definition dvbspu.c:87
cDvbSpuBitmap(sDvbSpuRect size, uint8_t *fodd, uint8_t *eodd, uint8_t *feven, uint8_t *eeven)
Definition dvbspu.c:63
sDvbSpuRect minsize[4]
Definition dvbspu.h:72
uint16_t prev_DCSQ_offset
Definition dvbspu.h:126
cSpuDecoder::eScaleMode getScaleMode(void)
Definition dvbspu.h:148
void Hide(void)
Definition dvbspu.c:536
bool IsVisible(void)
Definition dvbspu.h:158
void processSPU(uint32_t pts, uint8_t *buf, bool AllowedShow)
Definition dvbspu.c:279
void SetSpuScaling(void)
Definition dvbspu.c:251
void Draw(void)
Definition dvbspu.c:412
bool highlight
Definition dvbspu.h:114
void setHighlight(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t palette)
Definition dvbspu.c:316
bool restricted_osd
Definition dvbspu.h:104
void setPalette(uint32_t *pal)
Definition dvbspu.c:311
void clearHighlight(void)
Definition dvbspu.c:344
cMutex mutex
Definition dvbspu.h:98
int setTime(uint32_t pts)
Definition dvbspu.c:557
aDvbSpuPalDescr hlpDescr
Definition dvbspu.h:116
void setScaleMode(cSpuDecoder::eScaleMode ScaleMode)
Definition dvbspu.c:298
bool allowedShow
Definition dvbspu.h:129
void Empty(void)
Definition dvbspu.c:543
cDvbSpuBitmap * spubmp
Definition dvbspu.h:128
spFlag state
Definition dvbspu.h:107
double yscaling
Definition dvbspu.h:111
double xscaling
Definition dvbspu.h:111
cOsd * osd
Definition dvbspu.h:97
uint8_t * spu
Definition dvbspu.h:101
int spuSize(void)
Definition dvbspu.h:134
int CalcAreaBpp(cBitmap *fgbmp, cBitmap *bgbmp)
Definition dvbspu.c:395
int cmdOffs(void)
Definition dvbspu.h:131
sDvbSpuRect CalcAreaSize(sDvbSpuRect fgsize, cBitmap *fgbmp, sDvbSpuRect bgsize, cBitmap *bgbmp)
Definition dvbspu.c:354
void setResolution(int Xres, int Yres)
Definition dvbspu.c:303
sDvbSpuRect size
Definition dvbspu.h:122
cSpuDecoder::eScaleMode scaleMode
Definition dvbspu.h:109
sDvbSpuRect hlpsize
Definition dvbspu.h:115
cDvbSpuPalette palette
Definition dvbspu.h:119
uint16_t DCSQ_offset
Definition dvbspu.h:125
uint32_t spupts
Definition dvbspu.h:102
aDvbSpuPalDescr palDescr
Definition dvbspu.h:123
uint32_t palette[16]
Definition dvbspu.h:57
void setPalette(const uint32_t *pal)
Definition dvbspu.c:46
uint32_t yuv2rgb(uint32_t yuv_color)
Definition dvbspu.h:164
uint32_t getColor(uint8_t idx, uint8_t trans) const
Definition dvbspu.h:205
The cOsd class is the interface to the "On Screen Display".
Definition osd.h:756
eScaleMode
Definition spu.h:21
struct sDvbSpuPalDescr aDvbSpuPalDescr[4]
uint8_t trans
Definition dvbspu.h:25
uint8_t index
Definition dvbspu.h:24
bool operator!=(const sDvbSpuPalDescr pd) const
Definition dvbspu.h:27
int width() const
Definition dvbspu.h:39
bool operator!=(const sDvbSpuRect r) const
Definition dvbspu.h:46
sDvbSpuRect(void)
Definition dvbspu.h:36
int height() const
Definition dvbspu.h:42