testing dvb subtitles

git-svn-id: file:///home/bas/coolstream_public_svn/THIRDPARTY/applications/neutrino-experimental@126 e54a6e83-5905-42d5-8d5c-058d10e6a962
This commit is contained in:
focus
2009-12-29 18:33:45 +00:00
parent 474790557f
commit cacfc2360b
4 changed files with 80 additions and 28 deletions

View File

@@ -1,3 +1,5 @@
#include <sys/timeb.h>
#include <time.h>
#include <cstdio> #include <cstdio>
#include <cstdarg> #include <cstdarg>
#include "Debug.hpp" #include "Debug.hpp"
@@ -29,13 +31,26 @@ FILE* Debug::set_file(char* file)
return fp_; return fp_;
} }
void Debug::print(int /*level*/, const char *fmt, ...) void Debug::print(int level, const char *fmt, ...)
{ {
va_list argp; va_list argp;
struct timeb tp;
char buf[1024];
char tbuf[20];
int len;
struct tm tv;
if (level < level_) {
ftime(&tp);
localtime_r (&tp.time, &tv);
strftime (tbuf, 14, "%H:%M:%S", &tv);
len = sprintf(buf, "[ %s.%03d ] ", tbuf, tp.millitm);
va_start(argp, fmt); va_start(argp, fmt);
// if (level < level_) { //vfprintf(fp_, fmt, argp);
vfprintf(fp_, fmt, argp); vsnprintf (&buf[len], 512, fmt, argp);
// }
va_end(argp); va_end(argp);
fprintf(fp_, "%s", buf);
}
} }

View File

@@ -47,7 +47,7 @@ cDvbSubtitleConverter *dvbSubtitleConverter;
int dvbsub_init() { int dvbsub_init() {
int trc; int trc;
sub_debug.set_level(42); sub_debug.set_level(3);
reader_running = true; reader_running = true;
// reader-Thread starten // reader-Thread starten
@@ -149,7 +149,7 @@ int dvbsub_close()
static cDemux * dmx; static cDemux * dmx;
void* reader_thread(void */*arg*/) void* reader_thread(void * /*arg*/)
{ {
uint8_t tmp[16]; /* actually 6 should be enough */ uint8_t tmp[16]; /* actually 6 should be enough */
int count; int count;
@@ -243,7 +243,7 @@ void* reader_thread(void */*arg*/)
} }
} }
if(!dvbsub_paused) { if(!dvbsub_paused) {
printf("[subtitles] adding packet, len %d\n", count); sub_debug.print(Debug::VERBOSE, "[subtitles] adding packet, len %d\n", count);
/* Packet now in memory */ /* Packet now in memory */
packet_queue.push(buf); packet_queue.push(buf);
/* TODO: allocation exception */ /* TODO: allocation exception */
@@ -274,6 +274,7 @@ void* dvbsub_thread(void* /*arg*/)
if (!dvbSubtitleConverter) if (!dvbSubtitleConverter)
dvbSubtitleConverter = new cDvbSubtitleConverter; dvbSubtitleConverter = new cDvbSubtitleConverter;
int timeout = 1000000;
while(dvbsub_running) { while(dvbsub_running) {
uint8_t* packet; uint8_t* packet;
int64_t pts; int64_t pts;
@@ -282,10 +283,30 @@ void* dvbsub_thread(void* /*arg*/)
int packlen; int packlen;
gettimeofday(&now, NULL); gettimeofday(&now, NULL);
TIMEVAL_TO_TIMESPEC(&now, &restartWait);
restartWait.tv_sec += 1;
int ret = 0; int ret = 0;
#if 1
now.tv_usec += (timeout == 0) ? 1000000 : timeout; // add the timeout
while (now.tv_usec >= 1000000) { // take care of an overflow
now.tv_sec++;
now.tv_usec -= 1000000;
}
restartWait.tv_sec = now.tv_sec; // seconds
restartWait.tv_nsec = now.tv_usec * 1000; // nano seconds
pthread_mutex_lock( &packetMutex );
ret = pthread_cond_timedwait( &packetCond, &packetMutex, &restartWait );
pthread_mutex_unlock( &packetMutex );
timeout = dvbSubtitleConverter->Action();
if(packet_queue.size() == 0) {
continue;
}
#else
TIMEVAL_TO_TIMESPEC(&now, &restartWait);
restartWait.tv_sec += 1;
if(packet_queue.size() == 0) { if(packet_queue.size() == 0) {
pthread_mutex_lock( &packetMutex ); pthread_mutex_lock( &packetMutex );
ret = pthread_cond_timedwait( &packetCond, &packetMutex, &restartWait ); ret = pthread_cond_timedwait( &packetCond, &packetMutex, &restartWait );
@@ -300,7 +321,8 @@ void* dvbsub_thread(void* /*arg*/)
{ {
sub_debug.print(Debug::VERBOSE, "pthread_cond_timedwait fails with %s\n", strerror(errno)); sub_debug.print(Debug::VERBOSE, "pthread_cond_timedwait fails with %s\n", strerror(errno));
} }
sub_debug.print(Debug::VERBOSE, "\nPES: Wakeup, queue size %d\n", packet_queue.size()); #endif
sub_debug.print(Debug::VERBOSE, "PES: Wakeup, queue size %d\n\n", packet_queue.size());
if(dvbsub_paused) { if(dvbsub_paused) {
do { do {
packet = packet_queue.pop(); packet = packet_queue.pop();
@@ -350,7 +372,7 @@ void* dvbsub_thread(void* /*arg*/)
} else { } else {
sub_debug.print(Debug::INFO, "End_of_PES is missing\n"); sub_debug.print(Debug::INFO, "End_of_PES is missing\n");
} }
dvbSubtitleConverter->Action(); timeout = dvbSubtitleConverter->Action();
next_round: next_round:
delete[] packet; delete[] packet;

View File

@@ -20,6 +20,7 @@ extern "C" {
#include <sys/mman.h> #include <sys/mman.h>
} }
#include "driver/framebuffer.h" #include "driver/framebuffer.h"
#include "Debug.hpp"
#define FB "/dev/fb/0" #define FB "/dev/fb/0"
extern int fb_fd; extern int fb_fd;
@@ -49,12 +50,21 @@ static bool DebugObjects = true;
static bool DebugCluts = true; static bool DebugCluts = true;
#endif #endif
#if 0
#define dbgconverter(a...) if (DebugConverter) fprintf(stderr, a) #define dbgconverter(a...) if (DebugConverter) fprintf(stderr, a)
#define dbgsegments(a...) if (DebugSegments) fprintf(stderr, a) #define dbgsegments(a...) if (DebugSegments) fprintf(stderr, a)
#define dbgpages(a...) if (DebugPages) fprintf(stderr, a) #define dbgpages(a...) if (DebugPages) fprintf(stderr, a)
#define dbgregions(a...) if (DebugRegions) fprintf(stderr, a) #define dbgregions(a...) if (DebugRegions) fprintf(stderr, a)
#define dbgobjects(a...) if (DebugObjects) fprintf(stderr, a) #define dbgobjects(a...) if (DebugObjects) fprintf(stderr, a)
#define dbgcluts(a...) if (DebugCluts) fprintf(stderr, a) #define dbgcluts(a...) if (DebugCluts) fprintf(stderr, a)
#endif
#define dbgconverter(a...) if (DebugConverter) sub_debug.print(Debug::VERBOSE, a)
#define dbgsegments(a...) if (DebugSegments) sub_debug.print(Debug::VERBOSE, a)
#define dbgpages(a...) if (DebugPages) sub_debug.print(Debug::VERBOSE, a)
#define dbgregions(a...) if (DebugRegions) sub_debug.print(Debug::VERBOSE, a)
#define dbgobjects(a...) if (DebugObjects) sub_debug.print(Debug::VERBOSE, a)
#define dbgcluts(a...) if (DebugCluts) sub_debug.print(Debug::VERBOSE, a)
int SubtitleFgTransparency = 0; int SubtitleFgTransparency = 0;
int SubtitleBgTransparency = 0; int SubtitleBgTransparency = 0;
@@ -673,10 +683,11 @@ static int max_x = 0, max_y = 0;
void cDvbSubtitleBitmaps::Clear() void cDvbSubtitleBitmaps::Clear()
{ {
dbgconverter("cDvbSubtitleBitmaps::Draw: clear x=% d y= %d, w= %d, h= %d\n", min_x, min_y, max_x-min_x, max_y-min_y); dbgconverter("cDvbSubtitleBitmaps::Clear: x=% d y= %d, w= %d, h= %d\n", min_x, min_y, max_x-min_x, max_y-min_y);
if(max_x && max_y) { if(max_x && max_y) {
CFrameBuffer::getInstance()->paintBackgroundBoxRel (min_x, min_y, max_x-min_x, max_y-min_y); CFrameBuffer::getInstance()->paintBackgroundBoxRel (min_x, min_y-10, max_x-min_x, max_y-min_y+10);
max_x = max_y = 0; max_x = max_y = 0;
min_x = min_y = 0xFFFF;
} }
} }
@@ -708,7 +719,7 @@ void cDvbSubtitleBitmaps::Draw()
int yoff = (yend - (576-bitmaps[i]->Y0()))*stride; int yoff = (yend - (576-bitmaps[i]->Y0()))*stride;
int ys = yend - (576-bitmaps[i]->Y0()); int ys = yend - (576-bitmaps[i]->Y0());
dbgconverter("cDvbSubtitleBitmaps::Draw %d colors= %d at %d,%d (x=%d y=%d) size %dx%d\n", dbgconverter("cDvbSubtitleBitmaps::Draw num %d colors= %d at %d,%d (x=%d y=%d) size %dx%d\n",
i, NumColors, bitmaps[i]->X0(), bitmaps[i]->Y0(), xoff, ys, bitmaps[i]->Width(), bitmaps[i]->Height()); i, NumColors, bitmaps[i]->X0(), bitmaps[i]->Y0(), xoff, ys, bitmaps[i]->Width(), bitmaps[i]->Height());
for (int y2 = 0; y2 < bitmaps[i]->Height(); y2++) { for (int y2 = 0; y2 < bitmaps[i]->Height(); y2++) {
@@ -787,9 +798,10 @@ void cDvbSubtitleConverter::Pause(bool pause)
void cDvbSubtitleConverter::Clear(void) void cDvbSubtitleConverter::Clear(void)
{ {
if(max_x && max_y) { if(max_x && max_y) {
dbgconverter("cDvbSubtitleConverter::Draw: 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);
CFrameBuffer::getInstance()->paintBackgroundBoxRel (min_x, min_y, max_x-min_x, max_y-min_y); CFrameBuffer::getInstance()->paintBackgroundBoxRel (min_x, min_y-10, max_x-min_x, max_y-min_y+10);
max_x = max_y = 0; max_x = max_y = 0;
min_x = min_y = 0xFFFF;
} }
} }
@@ -896,13 +908,13 @@ int cDvbSubtitleConverter::Convert(const uchar *Data, int Length, int64_t pts)
void dvbsub_get_stc(int64_t * STC); void dvbsub_get_stc(int64_t * STC);
void cDvbSubtitleConverter::Action(void) int cDvbSubtitleConverter::Action(void)
{ {
static cTimeMs Timeout(0xFFFF*1000); static cTimeMs Timeout(0xFFFF*1000);
int WaitMs = 100; int WaitMs = 500;
if(!running) if(!running)
return; return 0;
Lock(); Lock();
if (cDvbSubtitleBitmaps *sb = bitmaps->First()) { if (cDvbSubtitleBitmaps *sb = bitmaps->First()) {
@@ -910,17 +922,18 @@ void cDvbSubtitleConverter::Action(void)
dvbsub_get_stc(&STC); dvbsub_get_stc(&STC);
int64_t Delta = 0; int64_t Delta = 0;
Delta = sb->Pts() - STC; Delta = LimitTo32Bit(sb->Pts()) - LimitTo32Bit(STC);
Delta /= 90; // STC and PTS are in 1/90000s Delta /= 90; // STC and PTS are in 1/90000s
dbgconverter("cDvbSubtitleConverter::Action: PTS: %lld STC: %lld (%lld) timeout: %d\n", sb->Pts(), STC, Delta, sb->Timeout()); dbgconverter("cDvbSubtitleConverter::Action: PTS: %lld STC: %lld (%lld) timeout: %d\n", sb->Pts(), STC, Delta, sb->Timeout());
#if 0
if(Delta > 1800) { if(Delta > 1800) {
Unlock(); Unlock();
usleep((Delta-500)*1000); usleep((Delta-500)*1000);
Lock(); Lock();
if(!running) { if(!running) {
Unlock(); Unlock();
return; return 0;
} }
#if 1 // debug #if 1 // debug
dvbsub_get_stc(&STC); dvbsub_get_stc(&STC);
@@ -928,13 +941,13 @@ void cDvbSubtitleConverter::Action(void)
dbgconverter("cDvbSubtitleConverter::Action: PTS: %lld STC: %lld (%lld) timeout: %d after sleep\n", sb->Pts(), STC, Delta/90, sb->Timeout()); dbgconverter("cDvbSubtitleConverter::Action: PTS: %lld STC: %lld (%lld) timeout: %d after sleep\n", sb->Pts(), STC, Delta/90, sb->Timeout());
#endif #endif
} }
Delta = 0; #endif
if (Delta <= MAXDELTA) { if (Delta <= MAXDELTA) {
if (Delta <= 0) { if (Delta <= 0) {
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) {
sb->Draw(); sb->Draw();
Timeout.Set(sb->Timeout() * 100);//max: was 1000 and timeout seems in 1/10 of sec ?? Timeout.Set(sb->Timeout() * 1000);//max: was 1000 and timeout seems in 1/10 of sec ??
} }
bitmaps->Del(sb, true); bitmaps->Del(sb, true);
} }
@@ -946,12 +959,14 @@ void cDvbSubtitleConverter::Action(void)
} else { } else {
//printf("cDvbSubtitleConverter::Action: timeout elapsed %lld\n", Timeout.Elapsed()); //printf("cDvbSubtitleConverter::Action: timeout elapsed %lld\n", Timeout.Elapsed());
if (Timeout.TimedOut()) { if (Timeout.TimedOut()) {
//printf("************************************ cDvbSubtitleConverter::Action: we timed out\n"); dbgconverter("cDvbSubtitleConverter::Action: timeout, elapsed %lld\n", Timeout.Elapsed());
Timeout.Set(0xFFFF*1000);
Clear(); Clear();
Timeout.Set(0xFFFF*1000);
} }
} }
Unlock(); Unlock();
dbgconverter("cDvbSubtitleConverter::Action: finish, WaitMs %d\n", WaitMs);
return WaitMs*1000;
} }
tColor cDvbSubtitleConverter::yuv2rgb(int Y, int Cb, int Cr) tColor cDvbSubtitleConverter::yuv2rgb(int Y, int Cb, int Cr)

View File

@@ -35,7 +35,7 @@ private:
public: public:
cDvbSubtitleConverter(void); cDvbSubtitleConverter(void);
virtual ~cDvbSubtitleConverter(); virtual ~cDvbSubtitleConverter();
void Action(void); int Action(void);
void Reset(void); void Reset(void);
void Clear(void); void Clear(void);
void Pause(bool pause); void Pause(bool pause);