diff options
author | Christian Gmeiner <christian.gmeiner@gmail.com> | 2009-09-22 00:51:47 +0200 |
---|---|---|
committer | Christian Gmeiner <christian.gmeiner@gmail.com> | 2009-09-22 00:51:47 +0200 |
commit | ec3c948a30852562051022fa6bd3dc48501af416 (patch) | |
tree | 62e48268525675d33bddf2218eae6d835b19339e /spuencoder.c | |
parent | 2674ee01561d08865a99e25420cd6798227eaf42 (diff) | |
download | vdr-plugin-dxr3-ec3c948a30852562051022fa6bd3dc48501af416.tar.gz vdr-plugin-dxr3-ec3c948a30852562051022fa6bd3dc48501af416.tar.bz2 |
add method to write region information data and switch to a std::vector to hold regions
Diffstat (limited to 'spuencoder.c')
-rw-r--r-- | spuencoder.c | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/spuencoder.c b/spuencoder.c index 2fbce2a..71ba6c0 100644 --- a/spuencoder.c +++ b/spuencoder.c @@ -97,7 +97,7 @@ void cSpuEncoder::encode(cBitmap *bmap, int top, int left) reg->addColIndex(bitmap->Index(colors[i])); } - regions.push(reg); + regions.push_back(reg); dsyslog("[dxr3-spuencoder] rle data"); @@ -157,6 +157,52 @@ void cSpuEncoder::writeColorAndAlpha(sSection &sec, bool withCMD) spu[written++] = (opacity[sec.colIndex[2]] << 4) | (opacity[sec.colIndex[3]] & 0x0f); } +void cSpuEncoder::writeRegionInformation() +{ + dsyslog("writting region definitions"); + + spu[written++] = CMD_CHG_COLCON; + + int32_t size_fill = written; + + spu[written++] = 0x00; // total size of parameter area + spu[written++] = 0x00; // will be filled later + + for (size_t i = 1; i < regions.size(); i++) { + cSpuRegion *reg = regions[i]; + + // define region (LN_CTLI) + spu[written++] = (reg->startLine >> 8); + spu[written++] = reg->startLine & 0xff; + spu[written++] = (((reg->openSections() & 0x0f) << 4)| ((reg->endLine >> 8) & 0x0f)); + spu[written++] = reg->endLine & 0xff; + + for (size_t j = 0; j <= reg->openSections(); j++) { + + sSection sec = reg->sections[i]; + + // define section (PXCTLI) + spu[written++] = (sec.startColumn >> 8) & 0x0f; + spu[written++] = sec.startColumn & 0xff; + + // write color and alpha + writeColorAndAlpha(sec, false); + } + } + + spu[written++] = 0x0f; // end of parameter area + spu[written++] = 0xff; + spu[written++] = 0xff; + spu[written++] = 0xff; + + // update size of 0x07 command + int32_t s = written - size_fill - 1; + dsyslog("size of 07 command %d", s); + + spu[size_fill++] = s >> 8; + spu[size_fill++] = s & 0xff; +} + void cSpuEncoder::generateColorPalette() { // we need to convert the color we get from @@ -259,11 +305,10 @@ void cSpuEncoder::generateSpuData(bool topAndBottom) throw (char const* ) void cSpuEncoder::clearRegions() { - while (!regions.empty()) { - cSpuRegion *reg = regions.front(); - delete reg; - regions.pop(); + for (size_t i = 0; i < regions.size(); i++) { + delete regions[i]; } + regions.clear(); } void cSpuEncoder::rle4colors() |