diff options
Diffstat (limited to 'dvbsubtitle.c')
-rw-r--r-- | dvbsubtitle.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/dvbsubtitle.c b/dvbsubtitle.c index a02a01f..6ecb3b7 100644 --- a/dvbsubtitle.c +++ b/dvbsubtitle.c @@ -7,7 +7,7 @@ * Original author: Marco Schlüßler <marco@lordzodiac.de> * With some input from the "subtitle plugin" by Pekka Virtanen <pekka.virtanen@sci.fi> * - * $Id: dvbsubtitle.c 2.4 2010/02/07 12:08:13 kls Exp $ + * $Id: dvbsubtitle.c 2.6 2010/06/05 14:03:55 kls Exp $ */ #include "dvbsubtitle.h" @@ -17,6 +17,7 @@ #define REGION_COMPOSITION_SEGMENT 0x11 #define CLUT_DEFINITION_SEGMENT 0x12 #define OBJECT_DATA_SEGMENT 0x13 +#define DISPLAY_DEFINITION_SEGMENT 0x14 #define END_OF_DISPLAY_SET_SEGMENT 0x80 // Set these to 'true' for debug output: @@ -659,6 +660,11 @@ cDvbSubtitleConverter::cDvbSubtitleConverter(void) dvbSubtitleAssembler = new cDvbSubtitleAssembler; osd = NULL; frozen = false; + ddsVersionNumber = 0; + displayWidth = 720; + displayHeight = 576; + displayHorizontalOffset = 0; + displayVerticalOffset = 0; pages = new cList<cDvbSubtitlePage>; bitmaps = new cList<cDvbSubtitleBitmaps>; Start(); @@ -687,6 +693,11 @@ void cDvbSubtitleConverter::Reset(void) bitmaps->Clear(); DELETENULL(osd); frozen = false; + ddsVersionNumber = 0; + displayWidth = 720; + displayHeight = 576; + displayHorizontalOffset = 0; + displayVerticalOffset = 0; Unlock(); } @@ -842,7 +853,7 @@ tColor cDvbSubtitleConverter::yuv2rgb(int Y, int Cb, int Cr) bool cDvbSubtitleConverter::AssertOsd(void) { - return osd || (osd = cOsdProvider::NewOsd(0, Setup.SubtitleOffset, OSD_LEVEL_SUBTITLES)); + return osd || (osd = cOsdProvider::NewOsd(displayHorizontalOffset, displayVerticalOffset + Setup.SubtitleOffset, OSD_LEVEL_SUBTITLES)); } int cDvbSubtitleConverter::ExtractSegment(const uchar *Data, int Length, int64_t Pts) @@ -1001,6 +1012,26 @@ int cDvbSubtitleConverter::ExtractSegment(const uchar *Data, int Length, int64_t } break; } + case DISPLAY_DEFINITION_SEGMENT: { + dbgsegments("DISPLAY_DEFINITION_SEGMENT\n"); + int version = (Data[6] & 0xF0) >> 4; + if (version != ddsVersionNumber) { + int displayWindowFlag = (Data[6] & 0x08) >> 3; + displayHorizontalOffset = 0; + displayVerticalOffset = 0; + displayWidth = ((Data[7] << 8) | Data[8]) + 1; + displayHeight = ((Data[9] << 8) | Data[10]) + 1; + if (displayWindowFlag) { + displayHorizontalOffset = (Data[11] << 8) | Data[12]; // displayWindowHorizontalPositionMinimum + displayWidth = ((Data[13] << 8) | Data[14]) - displayHorizontalOffset + 1; // displayWindowHorizontalPositionMaximum + displayVerticalOffset = (Data[15] << 8) | Data[16]; // displayWindowVerticalPositionMinimum + displayHeight = ((Data[17] << 8) | Data[18]) - displayVerticalOffset + 1; // displayWindowVerticalPositionMaximum + } + SetupChanged(); + ddsVersionNumber = version; + } + break; + } case END_OF_DISPLAY_SET_SEGMENT: { dbgsegments("END_OF_DISPLAY_SET_SEGMENT\n"); FinishPage(page); |