libdvbsub: port usefull code from Neutrino-MP to make dvbsub nice again

Origin commit data
------------------
Branch: ni/coolstream
Commit: 8cb54f4922
Author: vanhofen <vanhofen@gmx.de>
Date: 2017-06-16 (Fri, 16 Jun 2017)

Origin message was:
------------------
- libdvbsub: port usefull code from Neutrino-MP to make dvbsub nice again

------------------
No further description and justification available within origin commit message!

------------------
This commit was generated by Migit
This commit is contained in:
vanhofen
2017-06-16 11:10:31 +02:00
parent 98bed6910a
commit afc4d55652
2 changed files with 57 additions and 10 deletions

View File

@@ -50,7 +50,7 @@ static void clear_queue();
int dvbsub_init() { int dvbsub_init() {
int trc; int trc;
sub_debug.set_level(0); //NI sub_debug.set_level(2);
reader_running = true; reader_running = true;
dvbsub_stopped = 1; dvbsub_stopped = 1;
@@ -103,8 +103,8 @@ int dvbsub_start(int pid)
pid_change_req = 1; pid_change_req = 1;
} }
} }
printf("[dvb-sub] ***************************************** start, stopped %d pid %x\n", dvbsub_stopped, dvbsub_pid);
#if 0 #if 0
printf("[dvb-sub] ***************************************** start, stopped %d pid %x\n", dvbsub_stopped, dvbsub_pid);
while(!dvbsub_stopped) while(!dvbsub_stopped)
usleep(10); usleep(10);
#endif #endif
@@ -244,11 +244,15 @@ static void* reader_thread(void * /*arg*/)
int len; int len;
uint16_t packlen; uint16_t packlen;
uint8_t* buf; uint8_t* buf;
bool bad_startcode = false;
set_threadname("dvbsub:reader"); set_threadname("dvbsub:reader");
dmx = new cDemux(0); dmx = new cDemux(0);
#if HAVE_TRIPLEDRAGON
dmx->Open(DMX_PES_CHANNEL, NULL, 16*1024);
#else
dmx->Open(DMX_PES_CHANNEL, NULL, 64*1024); dmx->Open(DMX_PES_CHANNEL, NULL, 64*1024);
#endif
while (reader_running) { while (reader_running) {
if(dvbsub_stopped /*dvbsub_paused*/) { if(dvbsub_stopped /*dvbsub_paused*/) {
sub_debug.print(Debug::VERBOSE, "%s stopped\n", __FUNCTION__); sub_debug.print(Debug::VERBOSE, "%s stopped\n", __FUNCTION__);
@@ -283,9 +287,13 @@ static void* reader_thread(void * /*arg*/)
continue; continue;
if(memcmp(tmp, "\x00\x00\x01\xbd", 4)) { if(memcmp(tmp, "\x00\x00\x01\xbd", 4)) {
sub_debug.print(Debug::VERBOSE, "[subtitles] bad start code: %02x%02x%02x%02x\n", tmp[0], tmp[1], tmp[2], tmp[3]); if (!bad_startcode) {
sub_debug.print(Debug::VERBOSE, "[subtitles] bad start code: %02x%02x%02x%02x\n", tmp[0], tmp[1], tmp[2], tmp[3]);
bad_startcode = true;
}
continue; continue;
} }
bad_startcode = false;
count = 6; count = 6;
packlen = getbits(tmp, 4*8, 16) + 6; packlen = getbits(tmp, 4*8, 16) + 6;
@@ -372,7 +380,7 @@ static void* dvbsub_thread(void* /*arg*/)
if(packet_queue.size() == 0) { if(packet_queue.size() == 0) {
continue; continue;
} }
sub_debug.print(Debug::VERBOSE, "PES: Wakeup, queue size %d\n\n", packet_queue.size()); sub_debug.print(Debug::VERBOSE, "PES: Wakeup, queue size %d\n", packet_queue.size());
if(dvbsub_stopped /*dvbsub_paused*/) { if(dvbsub_stopped /*dvbsub_paused*/) {
clear_queue(); clear_queue();
continue; continue;

View File

@@ -32,7 +32,7 @@ extern "C" {
#endif #endif
// Set these to 'true' for debug output: // Set these to 'true' for debug output:
static bool DebugConverter = false; //NI static bool DebugConverter = true;
#define dbgconverter(a...) if (DebugConverter) sub_debug.print(Debug::VERBOSE, a) #define dbgconverter(a...) if (DebugConverter) sub_debug.print(Debug::VERBOSE, a)
@@ -88,12 +88,16 @@ fb_pixel_t * simple_resize32(uint8_t * orgin, uint32_t * colors, int nb_colors,
fb_pixel_t *cr,*l; fb_pixel_t *cr,*l;
int i,j,k,ip; int i,j,k,ip;
#ifndef HAVE_SPARK_HARDWARE
cr = (fb_pixel_t *) malloc(dx*dy*sizeof(fb_pixel_t)); cr = (fb_pixel_t *) malloc(dx*dy*sizeof(fb_pixel_t));
if(cr == NULL) { if(cr == NULL) {
printf("Error: malloc\n"); printf("Error: malloc\n");
return NULL; return NULL;
} }
#else
cr = CFrameBuffer::getInstance()->getBackBufferPointer();
#endif
l = cr; l = cr;
for(j = 0; j < dy; j++, l += dx) for(j = 0; j < dy; j++, l += dx)
@@ -112,19 +116,29 @@ fb_pixel_t * simple_resize32(uint8_t * orgin, uint32_t * colors, int nb_colors,
void cDvbSubtitleBitmaps::Draw(int &min_x, int &min_y, int &max_x, int &max_y) void cDvbSubtitleBitmaps::Draw(int &min_x, int &min_y, int &max_x, int &max_y)
{ {
int i; int i;
#ifndef HAVE_SPARK_HARDWARE
int stride = CFrameBuffer::getInstance()->getScreenWidth(true); int stride = CFrameBuffer::getInstance()->getScreenWidth(true);
#if 0
int wd = CFrameBuffer::getInstance()->getScreenWidth(); int wd = CFrameBuffer::getInstance()->getScreenWidth();
int xstart = CFrameBuffer::getInstance()->getScreenX(); int xstart = CFrameBuffer::getInstance()->getScreenX();
int yend = CFrameBuffer::getInstance()->getScreenY() + CFrameBuffer::getInstance()->getScreenHeight(); int yend = CFrameBuffer::getInstance()->getScreenY() + CFrameBuffer::getInstance()->getScreenHeight();
int ystart = CFrameBuffer::getInstance()->getScreenY(); int ystart = CFrameBuffer::getInstance()->getScreenY();
#endif
uint32_t *sublfb = CFrameBuffer::getInstance()->getFrameBufferPointer(); uint32_t *sublfb = CFrameBuffer::getInstance()->getFrameBufferPointer();
#endif
#if 0
dbgconverter("cDvbSubtitleBitmaps::Draw: %d bitmaps, x= %d, width= %d yend=%d stride %d\n", Count(), xstart, wd, yend, stride); dbgconverter("cDvbSubtitleBitmaps::Draw: %d bitmaps, x= %d, width= %d yend=%d stride %d\n", Count(), xstart, wd, yend, stride);
#endif
int sw = CFrameBuffer::getInstance()->getScreenWidth(true);
int sh = CFrameBuffer::getInstance()->getScreenHeight(true);
#if 0
double xc = (double) CFrameBuffer::getInstance()->getScreenWidth(true)/(double) 720; double xc = (double) CFrameBuffer::getInstance()->getScreenWidth(true)/(double) 720;
double yc = (double) CFrameBuffer::getInstance()->getScreenHeight(true)/(double) 576; double yc = (double) CFrameBuffer::getInstance()->getScreenHeight(true)/(double) 576;
xc = yc; //FIXME should we scale also to full width ? xc = yc; //FIXME should we scale also to full width ?
int xf = int(xc * (double) 720); int xf = int(xc * (double) 720);
#endif
for (i = 0; i < Count(); i++) { for (i = 0; i < Count(); i++) {
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 5, 0) #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 5, 0)
@@ -136,6 +150,7 @@ void cDvbSubtitleBitmaps::Draw(int &min_x, int &min_y, int &max_x, int &max_y)
int height = sub.rects[i]->h; int height = sub.rects[i]->h;
int xoff, yoff; int xoff, yoff;
#if 0
int nw = int(width == 1280 ? ((double) width / xc) : ((double) width * xc)); int nw = int(width == 1280 ? ((double) width / xc) : ((double) width * xc));
int nh = int((double) height * yc); int nh = int((double) height * yc);
@@ -148,14 +163,26 @@ void cDvbSubtitleBitmaps::Draw(int &min_x, int &min_y, int &max_x, int &max_y)
if(yoff < ystart) if(yoff < ystart)
yoff = ystart; yoff = ystart;
} }
#endif
int h2 = (width == 1280) ? 720 : 576;
xoff = sub.rects[i]->x * sw / width;
yoff = sub.rects[i]->y * sh / h2;
int nw = width * sw / width;
int nh = height * sh / h2;
dbgconverter("cDvbSubtitleBitmaps::Draw: #%d at %d,%d size %dx%d colors %d (x=%d y=%d w=%d h=%d) \n", i+1, dbgconverter("cDvbSubtitleBitmaps::Draw: #%d at %d,%d size %dx%d colors %d (x=%d y=%d w=%d h=%d) \n", i+1,
sub.rects[i]->x, sub.rects[i]->y, sub.rects[i]->w, sub.rects[i]->h, sub.rects[i]->nb_colors, xoff, yoff, nw, nh); sub.rects[i]->x, sub.rects[i]->y, sub.rects[i]->w, sub.rects[i]->h, sub.rects[i]->nb_colors, xoff, yoff, nw, nh);
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 5, 0) #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57, 5, 0)
fb_pixel_t * newdata = simple_resize32 (sub.rects[i]->pict.data[0], colors, sub.rects[i]->nb_colors, width, height, nw, nh); fb_pixel_t * newdata = simple_resize32 (sub.rects[i]->pict.data[0], colors, sub.rects[i]->nb_colors, width, height, nw, nh);
#else #else
fb_pixel_t * newdata = simple_resize32 (sub.rects[i]->data[0], colors, sub.rects[i]->nb_colors, width, height, nw, nh); fb_pixel_t * newdata = simple_resize32 (sub.rects[i]->data[0], colors, sub.rects[i]->nb_colors, width, height, nw, nh);
#endif #endif
#ifdef HAVE_SPARK_HARDWARE
// CFrameBuffer::getInstance()->waitForIdle();
CFrameBuffer::getInstance()->blit2FB(newdata, nw, nh, xoff, yoff, 0, 0);
#else
fb_pixel_t * ptr = newdata; fb_pixel_t * ptr = newdata;
for (int y2 = 0; y2 < nh; y2++) { for (int y2 = 0; y2 < nh; y2++) {
int y = (yoff + y2) * stride; int y = (yoff + y2) * stride;
@@ -163,6 +190,7 @@ void cDvbSubtitleBitmaps::Draw(int &min_x, int &min_y, int &max_x, int &max_y)
*(sublfb + xoff + x2 + y) = *ptr++; *(sublfb + xoff + x2 + y) = *ptr++;
} }
free(newdata); free(newdata);
#endif
if(min_x > xoff) if(min_x > xoff)
min_x = xoff; min_x = xoff;
@@ -173,11 +201,13 @@ void cDvbSubtitleBitmaps::Draw(int &min_x, int &min_y, int &max_x, int &max_y)
if(max_y < (yoff + nh)) if(max_y < (yoff + nh))
max_y = yoff + nh; max_y = yoff + nh;
} }
if(Count()) if(Count())
dbgconverter("cDvbSubtitleBitmaps::Draw: finish, min/max screen: x=% d y= %d, w= %d, h= %d\n", min_x, min_y, max_x-min_x, max_y-min_y); dbgconverter("cDvbSubtitleBitmaps::Draw: finish, min/max screen: x=% d y= %d, w= %d, h= %d\n", min_x, min_y, max_x-min_x, max_y-min_y);
dbgconverter("\n"); dbgconverter("\n");
} }
static int screen_w, screen_h, screen_x, screen_y;
// --- cDvbSubtitleConverter ------------------------------------------------- // --- cDvbSubtitleConverter -------------------------------------------------
cDvbSubtitleConverter::cDvbSubtitleConverter(void) cDvbSubtitleConverter::cDvbSubtitleConverter(void)
@@ -208,10 +238,10 @@ cDvbSubtitleConverter::cDvbSubtitleConverter(void)
//if(DebugConverter) //if(DebugConverter)
// av_log_set_level(AV_LOG_INFO); // av_log_set_level(AV_LOG_INFO);
min_x = CFrameBuffer::getInstance()->getScreenWidth(); screen_w = min_x = CFrameBuffer::getInstance()->getScreenWidth();
min_y = CFrameBuffer::getInstance()->getScreenHeight(); screen_h = min_y = CFrameBuffer::getInstance()->getScreenHeight();
max_x = CFrameBuffer::getInstance()->getScreenX(); screen_x = max_x = CFrameBuffer::getInstance()->getScreenX();
max_y = CFrameBuffer::getInstance()->getScreenY(); screen_y = max_y = CFrameBuffer::getInstance()->getScreenY();
Timeout.Set(0xFFFF*1000); Timeout.Set(0xFFFF*1000);
} }
@@ -257,6 +287,11 @@ void cDvbSubtitleConverter::Clear(void)
dbgconverter("cDvbSubtitleConverter::Clear: x=% d y= %d, w= %d, h= %d\n", min_x, min_y, max_x-min_x, max_y-min_y); dbgconverter("cDvbSubtitleConverter::Clear: x=% d y= %d, w= %d, h= %d\n", min_x, min_y, max_x-min_x, max_y-min_y);
if(running && (max_x-min_x > 0) && (max_y-min_y > 0)) { if(running && (max_x-min_x > 0) && (max_y-min_y > 0)) {
CFrameBuffer::getInstance()->paintBackgroundBoxRel (min_x, min_y, max_x-min_x, max_y-min_y); CFrameBuffer::getInstance()->paintBackgroundBoxRel (min_x, min_y, max_x-min_x, max_y-min_y);
/* reset area to clear */
min_x = screen_w;
min_y = screen_h;
max_x = screen_x;
max_y = screen_h;
//CFrameBuffer::getInstance()->paintBackground(); //CFrameBuffer::getInstance()->paintBackground();
} }
} }
@@ -343,6 +378,7 @@ int cDvbSubtitleConverter::Action(void)
if (Delta <= MAXDELTA) { if (Delta <= MAXDELTA) {
if (Delta <= SHOW_DELTA) { if (Delta <= SHOW_DELTA) {
dbgconverter("cDvbSubtitleConverter::Action: PTS: %012llx STC: %012llx (%lld) timeout: %d bmp %d/%d\n", sb->Pts(), STC, Delta, sb->Timeout(), bitmaps->Count(), sb->Index() + 1);
dbgconverter("cDvbSubtitleConverter::Action: Got %d bitmaps, showing #%d\n", bitmaps->Count(), sb->Index() + 1); dbgconverter("cDvbSubtitleConverter::Action: Got %d bitmaps, showing #%d\n", bitmaps->Count(), sb->Index() + 1);
if (running) { if (running) {
Clear(); Clear();
@@ -357,7 +393,10 @@ int cDvbSubtitleConverter::Action(void)
WaitMs = int((Delta > SHOW_DELTA) ? Delta - SHOW_DELTA : Delta); WaitMs = int((Delta > SHOW_DELTA) ? Delta - SHOW_DELTA : Delta);
} }
else else
{
dbgconverter("deleted because delta (%lld) > MAXDELTA (%d)\n", Delta, MAXDELTA);
bitmaps->Del(sb, true); bitmaps->Del(sb, true);
}
} else { } else {
if (Timeout.TimedOut()) { if (Timeout.TimedOut()) {
dbgconverter("cDvbSubtitleConverter::Action: timeout, elapsed %lld\n", Timeout.Elapsed()); dbgconverter("cDvbSubtitleConverter::Action: timeout, elapsed %lld\n", Timeout.Elapsed());