diff options
author | Tobias Grimm <tobias@e-tobi.loc> | 2008-12-13 10:51:16 +0100 |
---|---|---|
committer | Tobias Grimm <tobias@e-tobi.loc> | 2008-12-13 10:51:16 +0100 |
commit | b4047ea57428a788456ecb02bc3fc6c5d83bf232 (patch) | |
tree | f346c1181b786177c9e67469ad0cf759dfd42ddf | |
parent | e98281852544a159522de0e561ac64c23c447468 (diff) | |
download | vdr-plugin-ttxtsubs-0.0.3c.tar.gz vdr-plugin-ttxtsubs-0.0.3c.tar.bz2 |
- Fixed problems when used with more than one device (I hope)v0.0.3c
-rw-r--r-- | HISTORY | 3 | ||||
-rw-r--r-- | siinfo.c | 30 | ||||
-rw-r--r-- | siinfo.h | 4 | ||||
-rw-r--r-- | ttxtsubs.c | 56 | ||||
-rw-r--r-- | ttxtsubsdisplay.c | 10 | ||||
-rw-r--r-- | ttxtsubsdisplay.h | 2 | ||||
-rw-r--r-- | ttxtsubsdisplayer.c | 2 | ||||
-rw-r--r-- | ttxtsubsfilter.c | 5 | ||||
-rw-r--r-- | ttxtsubsfilter.h | 2 | ||||
-rw-r--r-- | ttxtsubsrecorder.c | 2 |
10 files changed, 73 insertions, 43 deletions
@@ -1,6 +1,9 @@ VDR Plugin 'ttxtsubs' Revision History -------------------------------------- +2003-07-10: Version 0.0.3c +- Fixed problems when used with more than one device (I hope) + 2003-06-22: Version 0.0.3b - Work around for problem with stray segments at channel (frequency) change with driver in hw_sections=0 mode @@ -429,6 +429,7 @@ static int FindTtxtInfoInPMT(int card_no, int pid, int vpid, struct ttxtinfo *in return ret; } +#if 0 /* * Get dvb device number from device index * this is needed for those having cards which aren't dvb cards, like @@ -448,14 +449,14 @@ int DeviceToCardNo(int device_no) return card_no; } - +#endif /* * find the ttxt_info in the PMT via the PAT, try first with the SID * and if that fails with the VPID * return <> 0 on error; */ -int GetTtxtInfo(int device_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *info) +int GetTtxtInfo(int card_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *info) { int ret; char *patsects[256]; @@ -464,7 +465,6 @@ int GetTtxtInfo(int device_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *inf int j; uint16_t pmt_pid = 0; int foundinfo = 0; - int card_no; int retry; memset((char *) info, 0, sizeof(*info)); @@ -473,12 +473,10 @@ int GetTtxtInfo(int device_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *inf // printf("GetTtxtInfo A sid: %d, vpid: %d\n", sid, vpid); // XXXX - card_no = DeviceToCardNo(device_no); - if(card_no == -1) { - fprintf(stderr, "ttxtsubs: GetTtxtInfo - couldn't find a card for device %d\n", card_no); - } - +#if 1 + // firmware fixed now? DiscardBufferedSections(card_no, 0, 0); +#endif ret = CollectSections(card_no, 0, 0, patsects, &numsects); if(ret) @@ -559,6 +557,22 @@ void FreeTtxtInfoData(struct ttxtinfo *info) } +void DupTtxtInfo(struct ttxtinfo *in, struct ttxtinfo *out) +{ + int i; + + out->pidcount = in->pidcount; + out->p = (struct ttxtpidinfo *) malloc(sizeof(out->p[0]) * in->pidcount); + + for(i = 0; i < in->pidcount; i++) { + out->p[i].pid = in->p[i].pid; + out->p[i].pagecount = in->p[i].pagecount; + out->p[i].i = (struct ttxtpageinfo *) malloc(sizeof(out->p[0].i[0]) * in->p[i].pagecount); + memcpy((void *) out->p[i].i, (void *) in->p[i].i, sizeof(out->p[0].i[0]) * in->p[i].pagecount); + } +} + + struct ttxtpidinfo *FindSubs(struct ttxtinfo *info, char *lang, int HI, int *pid, int *pageno) { struct ttxtpidinfo *foundNonHIInfo = NULL; @@ -19,6 +19,7 @@ struct ttxtpidinfo { struct ttxtpageinfo *i; }; +// XXX should be an object instead and use c++ vectors etc struct ttxtinfo { int pidcount; struct ttxtpidinfo *p; @@ -29,8 +30,9 @@ struct ttxtinfo { * and if that fails with the VPID * return <> 0 on error; */ -int GetTtxtInfo(int device_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *info); +int GetTtxtInfo(int card_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *info); void FreeTtxtInfoData(struct ttxtinfo *info); +void DupTtxtInfo(struct ttxtinfo *in, struct ttxtinfo *out); struct ttxtpidinfo *FindSubs(struct ttxtinfo *info, char *lang, int HI, int *pid, int *pageno); @@ -3,7 +3,7 @@ * * See the README file for copyright information and how to reach the author. * - * $Id: ttxtsubs.c,v 1.16 2003/06/22 23:24:41 ragge Exp $ + * $Id: ttxtsubs.c,v 1.17 2003/07/10 02:36:17 ragge Exp ragge $ */ #include <vdr/plugin.h> @@ -18,7 +18,7 @@ #include "siinfo.h" #include "ttxtsubs.h" -static const char *VERSION = "0.0.3b"; +static const char *VERSION = "0.0.3c"; static const char *DESCRIPTION = "Teletext subtitles"; //static const char *MAINMENUENTRY = "Ttxtsubs"; @@ -211,31 +211,35 @@ bool cPluginTtxtsubs::SetupParse(const char *Name, const char *Value) void cPluginTtxtsubs::ChannelSwitch(const cDevice *Device, int ChannelNumber) { - if(ChannelNumber) { - cChannel *c = Channels.GetByNumber(ChannelNumber); - if(c) { - struct ttxtinfo info; - int pid, page; - - if(GetTtxtInfo(Device->DeviceNumber(), c->Sid(), c->Vpid(), &info)) { - fprintf(stderr, "ttxtsubs: Error: GetTtxtInfo failed!\n"); - } else { - if(FindSubs(&info, mLanguage, mHearingImpaired, &pid, &page)) { - //fprintf(stderr, "CHANNELSWITCH, pid: %d page: %x\n", pid, page); - mPage = page; // XXX remember this for playback (temporary hack)! - StartTtxtLive(Device, pid, page); + if(Device->IsPrimaryDevice()) { + if(ChannelNumber) { + cChannel *c = Channels.GetByNumber(ChannelNumber); + if(c) { + struct ttxtinfo info; + int pid, page; + + if(GetTtxtInfo(Device->ActualDevice()->CardIndex(), c->Sid(), c->Vpid(), &info)) { + fprintf(stderr, "ttxtsubs: Error: GetTtxtInfo failed!\n"); + } else { + if(FindSubs(&info, mLanguage, mHearingImpaired, &pid, &page)) { + //fprintf(stderr, "CHANNELSWITCH, pid: %d page: %x\n", pid, page); + mPage = page; // XXX remember this for playback (temporary hack)! + StartTtxtLive(Device, pid, page); + } + FreeTtxtInfoData(&info); } - FreeTtxtInfoData(&info); } - } - } else - StopTtxt(); + } else + StopTtxt(); + } } void cPluginTtxtsubs::Replaying(const cControl *Control, const char *Name) { StopTtxt(); - StartTtxtPlay(mPage); // XXX should get page in some other way! + StartTtxtPlay(mPage); + // XXX this page number is just a fallback for old recordings which + // don't have a index page } void cPluginTtxtsubs::PlayerTeletextData(uint8_t *p, int length) @@ -265,6 +269,12 @@ void cPluginTtxtsubs::StartTtxtLive(const cDevice *Device, int pid, int page) { //dprint("cPluginTtxtsubs::StartTtxtLive\n"); + fprintf(stderr, "cPluginTtxtsubs::StartTtxtLive(%d, %d, %03x)\n", + Device->DeviceNumber(), pid, page); + fprintf(stderr, + "cPluginTtxtsubs::StartTtxtLive CurrChan: %d Prim:%d Card:%d MPG:%d HasProg:%d\n", + cDevice::CurrentChannel(), Device->IsPrimaryDevice(), Device->CardIndex(), + Device->HasDecoder(), const_cast < cDevice * >( Device )->HasProgramme()); #if 0 return; // XXX TEST - No live subs #endif @@ -273,7 +283,7 @@ void cPluginTtxtsubs::StartTtxtLive(const cDevice *Device, int pid, int page) cTtxtSubsLiveReceiver *r; //dprint("teletext subtitles started on pid %d\n", pid); mRec = r = new cTtxtSubsLiveReceiver(pid, page); - if(!cDevice::PrimaryDevice()->AttachReceiver(r)) + if(!cDevice::PrimaryDevice()->ActualDevice()->AttachReceiver(r)) fprintf(stderr, "ttxtsubs: Error: AttachReceiver failed!\n"); // } else fprintf(stderr, "ttxtsubs: Error: StartTtxtLive called when already started!\n"); @@ -281,7 +291,7 @@ void cPluginTtxtsubs::StartTtxtLive(const cDevice *Device, int pid, int page) void cPluginTtxtsubs::StartTtxtPlay(int backup_page) { - //dprint("cPluginTtxtsubs::StartTtxtPlay\n"); + dprint("cPluginTtxtsubs::StartTtxtPlay\n"); if(!mRec) { dprint("ttxtsubs: teletext subtitles replayer started with initial page %03x\n", backup_page); @@ -292,7 +302,7 @@ void cPluginTtxtsubs::StartTtxtPlay(int backup_page) void cPluginTtxtsubs::StopTtxt(void) { - //dprint("cPluginTtxtsubs::StopTtxt\n"); + dprint("cPluginTtxtsubs::StopTtxt\n"); if(mRec) { HideTtxt(); diff --git a/ttxtsubsdisplay.c b/ttxtsubsdisplay.c index d44729e..817bdb4 100644 --- a/ttxtsubsdisplay.c +++ b/ttxtsubsdisplay.c @@ -44,7 +44,7 @@ cTtxtSubsDisplay::~cTtxtSubsDisplay(void) } -void cTtxtSubsDisplay::SetPage(int Pageno) +void cTtxtSubsDisplay::SetPage(int Pageno) // Pageno is 0x000 to 0x799 { Clear(); @@ -140,14 +140,16 @@ void cTtxtSubsDisplay::TtxtData(const uint8_t *Data) page.flags = 0; page.national_charset = 0; - if(fi[3] & 0x80) { // Newsflash + if(fi[3] & 0x80) { // Erase Page page.flags |= erasepage; memset(&page.data, 0, sizeof(page.data)); // only if erasepage is set? } - if(fi[5] & 0x20) // Subtitle + if(fi[5] & 0x20) // Newsflash page.flags |= newsflash; - if(fi[5] & 0x80) // Suppress Header + if(fi[5] & 0x80) // Subtitle page.flags |= subtitle; + if(fi[6] & 0x02) // Suppress Header + page.flags |= suppress_header; // if(fi[6] & 0x08) // Update Indicator // if(fi[6] & 0x20) // Interrupted Sequence if(fi[6] & 0x80) // Inhibit Display diff --git a/ttxtsubsdisplay.h b/ttxtsubsdisplay.h index 42905ff..d515cd0 100644 --- a/ttxtsubsdisplay.h +++ b/ttxtsubsdisplay.h @@ -13,7 +13,7 @@ class cTtxtSubsDisplay { cTtxtSubsDisplay(void); ~cTtxtSubsDisplay(void); - void SetPage(int Pageno); + void SetPage(int Pageno); // Pageno is 0x000 to 0x799 void Hide(void); void Show(void); void Clear(void); diff --git a/ttxtsubsdisplayer.c b/ttxtsubsdisplayer.c index de9348c..5f2f0a6 100644 --- a/ttxtsubsdisplayer.c +++ b/ttxtsubsdisplayer.c @@ -224,7 +224,7 @@ void cTtxtSubsPlayer::SearchLanguagePage(uint8_t *p, int len) ((buf[i+4] - '0') << 8) + ((buf[i+5] - '0') << 4) + (buf[i+6] - '0'); - if(page >= 0x100 && page <= 0x900) { + if(page >= 0x100 && page < 0x900) { if(page >= 0x800) page -= 0x800; diff --git a/ttxtsubsfilter.c b/ttxtsubsfilter.c index b997e82..9271215 100644 --- a/ttxtsubsfilter.c +++ b/ttxtsubsfilter.c @@ -24,7 +24,7 @@ cTtxtSubsFilter::~cTtxtSubsFilter(void) } -void cTtxtSubsFilter::SetPages(int count, uint16_t *pages) +void cTtxtSubsFilter::SetPages(size_t count, uint16_t *pages) { FreePages(); @@ -35,9 +35,8 @@ void cTtxtSubsFilter::SetPages(int count, uint16_t *pages) mCount = count; if(0) { - int i; fprintf(stderr, "SetPages: %d, ", count); - for(i = 0; i < count; i++) + for(size_t i = 0; i < count; i++) fprintf(stderr, "%03x ", pages[i]); fprintf(stderr, "\n"); } diff --git a/ttxtsubsfilter.h b/ttxtsubsfilter.h index 3e09b20..ed1d0e8 100644 --- a/ttxtsubsfilter.h +++ b/ttxtsubsfilter.h @@ -8,7 +8,7 @@ class cTtxtSubsFilter cTtxtSubsFilter(void); virtual ~cTtxtSubsFilter(void); - void SetPages(int count, uint16_t *pages); + void SetPages(size_t count, uint16_t *pages); // indata and outdata are pointers to a ttxt data row buffers, // if return value <> 0 outdata countains data to pass on diff --git a/ttxtsubsrecorder.c b/ttxtsubsrecorder.c index b6719af..19c7b6f 100644 --- a/ttxtsubsrecorder.c +++ b/ttxtsubsrecorder.c @@ -32,7 +32,7 @@ cTtxtSubsRecorder::cTtxtSubsRecorder(cDevice *dev, const cChannel *ch, char *lan struct ttxtpidinfo *pi = NULL; int pid, page; - if(GetTtxtInfo(dev->DeviceNumber(), ch->Sid(), ch->Vpid(), mTtxtinfo)) { + if(GetTtxtInfo(dev->CardIndex(), ch->Sid(), ch->Vpid(), mTtxtinfo)) { fprintf(stderr, "cTtxtSubsRecorder::cTtxtSubsRecorder: GetTtxtSubtitleInfo error!\n"); } else { pi = FindSubs(mTtxtinfo, lang, HI, &pid, &page); |