⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 teletext.java

📁 优秀的MPEG2-TS流分析软件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
					{
						active_set = CharSet.getActive_G0_Set(primary_set_mapping, primary_national_set_mapping, row);
						active_national_set = CharSet.getActiveNationalSubset(primary_set_mapping, primary_national_set_mapping, row);
					}
					else
					{
						active_set = CharSet.getActive_G0_Set(secondary_set_mapping, secondary_national_set_mapping, row);
						active_national_set = CharSet.getActiveNationalSubset(secondary_set_mapping, secondary_national_set_mapping, row);
					}
					toggle = !toggle;
					break;

				case 0x1C:
					active_color &= 0xF;
					break;

				case 0x1D:
					active_color |= (0xF & active_color)<<4;
				}

				chars[i] = active_set[32]<<8 | active_color; 
				continue; 
			}
			else if (char_value == 0x7F) //0x7F
			{ 
				chars[i] = active_set[32]<<8 | active_color; 
				continue; 
			}

			if (!ascii)
			{ 
				chars[i] = active_set[32]<<8 | active_color; 
				continue; 
			}

			if (active_national_set != null)
			{
				// all chars 0x20..7F    special characters
				switch (char_value)
				{ 
				case 0x23: 
					chars[i] = active_color | active_national_set[0]<<8;  
					continue; 
				case 0x24: 
					chars[i] = active_color | active_national_set[1]<<8;  
					continue; 
				case 0x40:
					chars[i] = active_color | active_national_set[2]<<8;  
					continue; 
				case 0x5b:
					chars[i] = active_color | active_national_set[3]<<8;  
					continue; 
				case 0x5c: 
					chars[i] = active_color | active_national_set[4]<<8;  
					continue; 
				case 0x5d: 
					chars[i] = active_color | active_national_set[5]<<8;  
					continue; 
				case 0x5e: 
					chars[i] = active_color | active_national_set[6]<<8;  
					continue; 
				case 0x5f: 
					chars[i] = active_color | active_national_set[7]<<8;  
					continue; 
				case 0x60: 
					chars[i] = active_color | active_national_set[8]<<8;  
					continue; 
				case 0x7b: 
					chars[i] = active_color | active_national_set[9]<<8;  
					continue; 
				case 0x7c:
					chars[i] = active_color | active_national_set[10]<<8; 
					continue; 
				case 0x7d:
					chars[i] = active_color | active_national_set[11]<<8; 
					continue; 
				case 0x7e:
					chars[i] = active_color | active_national_set[12]<<8; 
					continue; 
				}
			}

			chars[i] = active_color | active_set[char_value]<<8; 
			continue; 
		}

		String test = "";

		for (int s = 0; s < chars.length; s++) 
			test += (char)(chars[s]>>>8);

		if (test.trim().length() == 0) 
			return null;

		return chars;
	}


	/******************************
	 * make strings from teletext *
	 ******************************/
	//DM24072004 081.7 int07 changed
	//DM09082004 081.7 int08 changed
	public static String makestring(byte[] packet, int offset, int len, int row, int character_set, int color, boolean checkParity)
	{
		boolean ascii = true, toggle = false;
		String text = "";

		int primary_set_mapping = X.getForcedTTXLanguage() < 0 ? 0 : X.getForcedTTXLanguage();
		int primary_national_set_mapping = character_set;

		int secondary_set_mapping = primary_set_mapping;
		int secondary_national_set_mapping = primary_national_set_mapping;

		if (page_modifications.containsKey("primary_set"))
			secondary_set_mapping = primary_set_mapping = Integer.parseInt(page_modifications.get("primary_set").toString());

		if (page_modifications.containsKey("primary_national_set"))
			secondary_national_set_mapping = primary_national_set_mapping = Integer.parseInt(page_modifications.get("primary_national_set").toString());

		if (page_modifications.containsKey("secondary_set"))
		{
			secondary_set_mapping = Integer.parseInt(page_modifications.get("secondary_set").toString());
			secondary_national_set_mapping = Integer.parseInt(page_modifications.get("secondary_national_set").toString());
		}

		active_set = CharSet.getActive_G0_Set(primary_set_mapping, primary_national_set_mapping, row);
		active_national_set = CharSet.getActiveNationalSubset(primary_set_mapping, primary_national_set_mapping, row);

		loopi:
		for (int c = offset, val, i = 0; i < len; c++, i++)
		{
			val = row<<16 | i;

			if (page_modifications.containsKey("" + val))
			{
				text += page_modifications.get("" + val).toString();
				continue;
			}

			if (checkParity && !cparity(packet[c])) 
				packet[c] = 8; //if error, switch to graphics mode (= space), by loosing all following chars

			int char_value = 0x7F & bytereverse(packet[c]);

			if (char_value>>>3 == 0)  //0x0..7
			{ 
				ascii = true; 
				text += ((color==1) ? colors[char_value] : "") + (char)active_set[32]; 
				continue; 
			}
			else if (char_value>>>4 == 0)   //0x8..F
			{ 
				text += (char)active_set[32]; 
				continue; 
			}
			else if (char_value>>>7 == 1)  //0x80..FF
			{ 
				text += (char)active_set[32]; 
				continue; 
			}
			else if (char_value < 27)  //0x10..1A
			{ 
				ascii = false; 
				text += (char)active_set[32]; 
				continue; 
			}
			else if (char_value < 32) //0x1B..1F
			{  
				if (char_value == 0x1B) //ESC
				{
					if (toggle)
					{
						active_set = CharSet.getActive_G0_Set(primary_set_mapping, primary_national_set_mapping, row);
						active_national_set = CharSet.getActiveNationalSubset(primary_set_mapping, primary_national_set_mapping, row);
					}
					else
					{
						active_set = CharSet.getActive_G0_Set(secondary_set_mapping, secondary_national_set_mapping, row);
						active_national_set = CharSet.getActiveNationalSubset(secondary_set_mapping, secondary_national_set_mapping, row);
					}
					toggle = !toggle;
				}

				text += (char)active_set[32]; 
				continue; 
			}
			else if (char_value == 0x7F) //0x7F
			{  
				text += (char)active_set[32]; 
				continue; 
			}

			if (!ascii)
			{ 
				text += (char)active_set[32]; 
				continue; 
			}


			if (active_national_set != null)
			{
				// all chars 0x20..7F
				switch (char_value)  // special national characters
				{
				case 0x23:
					text += (char)active_national_set[0]; 
					continue loopi; 
				case 0x24:
					text += (char)active_national_set[1]; 
					continue loopi; 
				case 0x40:
					text += (char)active_national_set[2]; 
					continue loopi; 
				case 0x5b:
					text += (char)active_national_set[3]; 
					continue loopi; 
				case 0x5c:
					text += (char)active_national_set[4]; 
					continue loopi; 
				case 0x5d:
					text += (char)active_national_set[5]; 
					continue loopi; 
				case 0x5e:
					text += (char)active_national_set[6]; 
					continue loopi; 
				case 0x5f:
					text += (char)active_national_set[7]; 
					continue loopi; 
				case 0x60:
					text += (char)active_national_set[8]; 
					continue loopi; 
				case 0x7b:
					text += (char)active_national_set[9]; 
					continue loopi; 
				case 0x7c:
					text += (char)active_national_set[10]; 
					continue loopi; 
				case 0x7d:
					text += (char)active_national_set[11]; 
					continue loopi; 
				case 0x7e:
					text += (char)active_national_set[12]; 
					continue loopi; 
				}
			}

			text += (char)active_set[char_value]; 
			continue loopi; 
		}

		if (color==1) 
			return colors[7] + text.trim();

		else 
			return text;
	}

	//DM30072004 081.7 int07 add
	private static Hashtable page_modifications = new Hashtable();
	private static boolean use = false;
	private static int display_row = 0, display_column = 0;
	private static short active_set[];
	private static short active_national_set[];


	//DM30072004 081.7 int07 add
	public static void clearEnhancements()
	{
		page_modifications.clear();
		use = false;
		display_row = 0;
		display_column = 0;
		active_set = CharSet.getActive_G0_Set(0, 0, 0);
		active_national_set = CharSet.getActiveNationalSubset(0, 0, 0);
	}

	//analyze triplets etc.
	//DM30072004 081.7 int07 add
	public static void setEnhancements(byte packet[], int row, int character_set)
	{
		int val, mapping, position = 0, code;
		byte address, mode, data, designation;

		designation = bytereverse((byte)((0xF & hamming_decode(packet[6]))<<4));

		//X.Msg("row " + row + " /designation " + designation);

		if ((row == 29 && designation == 0) || (row == 29 && designation == 4) || (row == 28 && designation == 4))
		{
			// read triplet 1
			val = hamming24_18(packet, 7);
			code = val<<3;

			if (row == 28 && designation == 0 && (0x3F800 & val) != 0)
				return;  // not X/28/0 format 1

			// read triplet 2
			val = hamming24_18(packet, 10);
			code |= (7 & val>>15);

			//primary set
			mapping = 0xFE & bytereverse((byte)(0x7F & code>>7));

			page_modifications.put("primary_set", "" + (0xF & mapping>>4));

			if (row != 29)
				page_modifications.put("primary_national_set", "" + character_set);

			//secondary set
			mapping = 0xFE & bytereverse((byte)(0x7F & code));

			page_modifications.put("secondary_set", "" + (0xF & mapping>>4));
			page_modifications.put("secondary_national_set", "" + (7 & mapping>>1));
		}

		if (row != 26)
			return;

		for (int a = 7; a < 46; a += 3)
		{
			val = hamming24_18(packet, a);
			address = bytereverse( (byte)(0xFC & val>>10));
			mode = bytereverse( (byte)(0xF8 & val>>4));
			data = bytereverse( (byte)(0xFE & val<<1));

		/**
			X.Msg("triplet " + a + " / " + Integer.toBinaryString(val));
			X.Msg("  address " + address );
			X.Msg("  mode " + mode );
			X.Msg("  data " + data );
		**/

			if (address >= 40)  //40..63 means row 24,1..23
			{
				if (address == 63 && mode == 31) //termination
					break;

				if (mode != 4 && mode != 1)
				{
					use = false;
					continue;
				}

				display_row = address == 40 ? 0 : address - 40;
				display_column = mode == 1 ? 0 : data;
				use = true;
			}
			else //0..39 means column 0..39
			{
				if (!use)
					continue;

				display_column = address;
				String str = "";

				if (mode == 15) //char from G2 set
					str += (char)CharSet.getActive_G2_Set(0, character_set, display_row)[data];

				else if (mode == 16) //char from G0 set w/o diacr.
					str += (char)CharSet.getActive_G0_Set(0, character_set, display_row)[data];

				//combination fixed table (because it won't work here when combine unicode chars)
				else if (mode > 16) //char from G0 set w/ diacr.
					str += (char)CharSet.getCombinedCharacter(data, mode & 0xF);

				else
					continue;

				position = display_row<<16 | display_column;

				page_modifications.put("" + position, str);

				//X.Msg("replaced char " + str + " /m " + mode);
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -