39 #define DEBUG(format, args...) printf (format, ## args)
41 #define DEBUG(format, args...)
48 for (
int i = 0; i < 16; i++)
54 #define setMin(a, b) if (a > b) a = b
55 #define setMax(a, b) if (a < b) a = b
60 #define revRect(r1, r2) { r1.x1 = r2.x2; r1.y1 = r2.y2; r1.x2 = r2.x1; r1.y2 = r2.y1; }
63 uint8_t * fodd, uint8_t * eodd,
64 uint8_t * feven, uint8_t * eeven)
78 bmp =
new uint8_t[MemSize];
81 memset(bmp, 0, MemSize);
109 for (
int i = 0; i < 4; i++) {
111 pal.
getColor(paldescr[i].index, paldescr[i].trans);
117 for (
int yp = 0; yp < h; yp++) {
118 for (
int xp = 0; xp < w; xp++) {
132 for (
int i = 0; i < 4; i++) {
133 if (paldescr[i].trans != 0) {
146 DEBUG(
"MinSize: (%d, %d) x (%d, %d)\n",
147 size.
x1, size.
y1, size.
x2, size.
y2);
148 if (size.
x1 > size.
x2 || size.
y1 > size.
y2)
157 memset(
bmp +
spuXres * yp + xp, colorid, len);
164 static uint8_t
getBits(uint8_t * &data, uint8_t & bitf)
182 while (data < endp) {
183 uint16_t vlc =
getBits(data, bitf);
185 vlc = (vlc << 4) |
getBits(data, bitf);
187 vlc = (vlc << 4) |
getBits(data, bitf);
189 vlc = (vlc << 4) |
getBits(data, bitf);
194 uint8_t color = vlc & 0x03;
217 #define CMD_SPU_MENU 0x00
218 #define CMD_SPU_SHOW 0x01
219 #define CMD_SPU_HIDE 0x02
220 #define CMD_SPU_SET_PALETTE 0x03
221 #define CMD_SPU_SET_ALPHA 0x04
222 #define CMD_SPU_SET_SIZE 0x05
223 #define CMD_SPU_SET_PXD_OFFSET 0x06
224 #define CMD_SPU_CHG_COLCON 0x07
225 #define CMD_SPU_EOF 0xff
227 #define spuU32(i) ((spu[i] << 8) + spu[i+1])
250 DEBUG(
"SPU pushData: pts: %d\n", pts);
276 uint16_t ex, uint16_t ey,
280 for (
int i = 0; i < 4; i++) {
281 pld[i].
index = 0xf & (palette >> (16 + 4 * i));
282 pld[i].trans = 0xf & (palette >> (4 * i));
291 DEBUG(
"setHighlight: %d,%d x %d,%d\n", sx, sy, ex, ey);
315 if (fgbmp && bgbmp) {
345 for (
int i = 0; i < 4; i++) {
346 if (paldescr[i].trans != 0) {
350 return col > 2 ? 2 : 1;
388 if (!fg || !bg || !
osd)
403 bool setarea =
false;
412 if (hlsize.
x1 > hlsize.
x2 || hlsize.
y1 > hlsize.
y2) {
413 hlsize.
x1 = hlsize.
x2 = hlsize.
y1 = hlsize.
y2 = 0;
418 #define DIV(a, b) (a/b)?:1
419 for (
int d = 1; !setarea && d <= 2; d++) {
424 if ((Area.
Width() & 7) != 0)
425 Area.
x2 += 8 - (Area.
Width() & 7);
432 if (!setarea && fg && bg) {
433 tArea Area_Both [2] = {
437 if (!Area_Both[0].Intersects(Area_Both[1])) {
439 Area_Both[1].
x1 = hlsize.x1;
440 Area_Both[1].
y1 = hlsize.y1;
441 Area_Both[1].
x2 = hlsize.x2;
442 Area_Both[1].
y2 = hlsize.y2;
444 if ((Area_Both[0].Width() & 7) != 0)
445 Area_Both[0].
x2 += 8 - (Area_Both[0].
Width() & 7);
446 if ((Area_Both[1].Width() & 7) != 0)
447 Area_Both[1].x2 += 8 - (Area_Both[1].Width() & 7);
455 dsyslog(
"dvbspu: AreaSize (%d, %d) (%d, %d) Bpp %d", areaSize.
x1, areaSize.
y1, areaSize.
x2, areaSize.
y2, (fg && bg) ? 4 : 2 );
507 if ((pts != 0) && (exec_time > pts))
509 DEBUG(
"offs = %d, rel = %d, time = %d, pts = %d, diff = %d\n",
510 i,
spuU32(i) * 1024, exec_time, pts, exec_time - pts);
520 DEBUG(
"offs = %d, DCSQ = %d, prev_DCSQ = %d\n",
527 DEBUG(
"\tshow subpicture\n");
533 DEBUG(
"\thide subpicture\n");
561 DEBUG(
"\t(%d, %d) x (%d, %d)\n",
569 DEBUG(
"\todd = %d even = %d\n", fodd, feven);
580 DEBUG(
"\tspu menu\n");
587 esyslog(
"invalid sequence in control header (%.2x)",
593 if (fodd != 0 && feven != 0) {