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 "teletextreader.h"
00035 #include "vbilut.h"
00036 #include "mythlogging.h"
00037
00044 void TeletextDecoder::Decode(const unsigned char *buf, int vbimode)
00045 {
00046 int err = 0, latin1 = -1, pagenum, subpagenum, lang, flags;
00047 uint magazine, packet, header;
00048
00049 if (!m_teletext_reader)
00050 return;
00051
00052 m_decodertype = vbimode;
00053
00054 switch (vbimode)
00055 {
00056 case VBI_IVTV:
00057 header = hamm16(buf, &err);
00058
00059 if (err & 0xf000)
00060 return;
00061
00062 magazine = header & 7;
00063 packet = (header >> 3) & 0x1f;
00064
00065 buf += 2;
00066 break;
00067
00068 case VBI_DVB:
00069 case VBI_DVB_SUBTITLE:
00070
00071
00072 magazine = 0;
00073 if (buf[0] & 0x40)
00074 magazine += 1;
00075 if (buf[0] & 0x10)
00076 magazine += 2;
00077 if (buf[0] & 0x04)
00078 magazine += 4;
00079
00080 packet = 0;
00081 if (buf[0] & 0x01)
00082 packet += 1;
00083 if (buf[1] & 0x40)
00084 packet += 2;
00085 if (buf[1] & 0x10)
00086 packet += 4;
00087 if (buf[1] & 0x04)
00088 packet += 8;
00089 if (buf[1] & 0x01)
00090 packet += 16;
00091
00092 if (err == 1)
00093 return;
00094
00095 buf += 2;
00096 break;
00097
00098 default:
00099 return;
00100 }
00101
00102 switch (packet)
00103 {
00104 case 0:
00105 int b1, b2, b3, b4;
00106 switch (vbimode)
00107 {
00108 case VBI_IVTV:
00109 b1 = hamm16(buf, &err);
00110 b2 = hamm16(buf+2, &err);
00111 b3 = hamm16(buf+4, &err);
00112 b4 = hamm16(buf+6, &err);
00113 if (err & 0xf000)
00114 return;
00115
00116 break;
00117
00118 case VBI_DVB:
00119 case VBI_DVB_SUBTITLE:
00120 b1 = hamm84(buf+1, &err)*16+hamm84(buf, &err);
00121 b2 = hamm84(buf+3, &err)*16+hamm84(buf+2, &err);
00122 b3 = hamm84(buf+5, &err)*16+hamm84(buf+4, &err);
00123 b4 = hamm84(buf+7, &err)*16+hamm84(buf+6, &err);
00124 if (err == 1)
00125 return;
00126
00127 break;
00128
00129 default:
00130 return;
00131 }
00132
00133 subpagenum= (b2 + b3 * 256) & 0x3f7f;
00134 pagenum = (magazine ? magazine : 8)*256 + b1;
00135
00136 lang = "\0\4\2\6\1\5\3\7"[b4 >> 5] + (latin1 ? 0 : 8);
00137 flags = b4 & 0x1F;
00138 flags |= b3 & 0xC0;
00139 flags |= (b2 & 0x80) >> 2;
00140 m_teletext_reader->AddPageHeader(pagenum, subpagenum, buf,
00141 vbimode, lang, flags);
00142
00143 break;
00144
00145 default:
00146 m_teletext_reader->AddTeletextData((magazine ? magazine : 8), packet,
00147 buf, vbimode);
00148 break;
00149 }
00150 }