00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <cstring>
00020
00021 #include <stdint.h>
00022 #include <ctype.h>
00023
00024 extern "C" {
00025 #include <inttypes.h>
00026 #include "ivtv_myth.h"
00027 #include "vbitext/vt.h"
00028 }
00029
00030 using namespace std;
00031
00032 #include "osd.h"
00033 #include "teletextdecoder.h"
00034 #include "vbilut.h"
00035 #include "mythcontext.h"
00036
00037
00038
00039
00040
00047 void TeletextDecoder::Decode(const unsigned char *buf, int vbimode)
00048 {
00049 int err = 0, latin1 = -1, zahl1, pagenum, subpagenum, lang, flags;
00050 uint magazine, packet, header;
00051
00052 if (!m_teletextviewer)
00053 {
00054 VERBOSE(VB_VBI, "TeletextDecoder: No Teletext Viewer defined!");
00055 return;
00056 }
00057
00058 m_decodertype = vbimode;
00059
00060 switch (vbimode)
00061 {
00062 case VBI_IVTV:
00063 header = hamm16(buf, &err);
00064
00065 if (err & 0xf000)
00066 return;
00067
00068 magazine = header & 7;
00069 packet = (header >> 3) & 0x1f;
00070
00071 buf += 2;
00072 break;
00073
00074 case VBI_DVB:
00075 case VBI_DVB_SUBTITLE:
00076 zahl1 = hamm84(buf,&err) * 16 + hamm84(buf+1,&err);
00077
00078 magazine = 0;
00079 if (buf[0] & 0x40)
00080 magazine += 1;
00081 if (buf[0] & 0x10)
00082 magazine += 2;
00083 if (buf[0] & 0x04)
00084 magazine += 4;
00085
00086 packet = 0;
00087 if (buf[0] & 0x01)
00088 packet += 1;
00089 if (buf[1] & 0x40)
00090 packet += 2;
00091 if (buf[1] & 0x10)
00092 packet += 4;
00093 if (buf[1] & 0x04)
00094 packet += 8;
00095 if (buf[1] & 0x01)
00096 packet += 16;
00097
00098 if (err == 1)
00099 return;
00100
00101 buf += 2;
00102 break;
00103
00104 default:
00105 return;
00106 }
00107
00108 switch (packet)
00109 {
00110 case 0:
00111 int b1, b2, b3, b4;
00112 switch (vbimode)
00113 {
00114 case VBI_IVTV:
00115 b1 = hamm16(buf, &err);
00116 b2 = hamm16(buf+2, &err);
00117 b3 = hamm16(buf+4, &err);
00118 b4 = hamm16(buf+6, &err);
00119 if (err & 0xf000)
00120 return;
00121
00122 break;
00123
00124 case VBI_DVB:
00125 case VBI_DVB_SUBTITLE:
00126 b1 = hamm84(buf+1, &err)*16+hamm84(buf, &err);
00127 b2 = hamm84(buf+3, &err)*16+hamm84(buf+2, &err);
00128 b3 = hamm84(buf+5, &err)*16+hamm84(buf+4, &err);
00129 b4 = hamm84(buf+7, &err)*16+hamm84(buf+6, &err);
00130 if (err == 1)
00131 return;
00132
00133 break;
00134
00135 default:
00136 return;
00137 }
00138
00139 VERBOSE(VB_VBI, QString("Page Header found: "
00140 "Magazine %1, Page Number %2")
00141 .arg(magazine).arg(b1));
00142 subpagenum= (b2 + b3 * 256) & 0x3f7f;
00143 pagenum = (magazine?:8)*256 + b1;
00144
00145 lang = "\0\4\2\6\1\5\3\7"[b4 >> 5] + (latin1 ? 0 : 8);
00146 flags = b4 & 0x1F;
00147 flags |= b3 & 0xC0;
00148 flags |= (b2 & 0x80) >> 2;
00149 m_teletextviewer->AddPageHeader(pagenum, subpagenum, buf,
00150 vbimode, lang, flags);
00151
00152 break;
00153
00154 default:
00155 m_teletextviewer->AddTeletextData((magazine?:8), packet,
00156 buf, vbimode);
00157 break;
00158 }
00159 }