#!/usr/bin/env python

from __future__ import division
from sstv import byte_to_freq, FREQ_BLACK
from grayscale import GrayscaleSSTV

class ColorSSTV(GrayscaleSSTV):
	RED, GREEN, BLUE = range(3)

	def encode_line(self, line):
		cs = self.COLOR_SEQ
		msec_pixel = self.SCAN / self.WIDTH
		image = self.image
		for index in cs:
			for item in self.before_channel(index):
				yield item
			for col in xrange(self.WIDTH):
				pixel = image.getpixel((col, line))
				freq_pixel = byte_to_freq(pixel[index])
				yield freq_pixel, msec_pixel
			for item in self.after_channel(index):
				yield item

	def before_channel(self, index):
		return []

	after_channel = before_channel


class MartinM1(ColorSSTV):
	COLOR_SEQ = (ColorSSTV.GREEN, ColorSSTV.BLUE, ColorSSTV.RED)
	VIS_CODE = 0x2c
	WIDTH = 320
	HEIGHT = 256
	SYNC = 4.862
	SCAN = 146.432
	INTER_CH_GAP = 0.572

	def before_channel(self, index):
		if index == ColorSSTV.GREEN:
			yield FREQ_BLACK, self.INTER_CH_GAP

	def after_channel(self, index):
		yield FREQ_BLACK, self.INTER_CH_GAP


class MartinM2(MartinM1):
	VIS_CODE = 0x28
	WIDTH = 160
	SCAN = 73.216


class ScottieS1(MartinM1):
	VIS_CODE = 0x3c
	SYNC = 9
	SCAN = 138.24
	INTER_CH_GAP = 1.5

	def horizontal_sync(self):
		return []

	def before_channel(self, index):
		if index != ColorSSTV.RED:
			for item in MartinM1.horizontal_sync(self):
				yield item
		yield FREQ_BLACK, self.INTER_CH_GAP


class ScottieS2(ScottieS1):
	VIS_CODE = 0x38
	SCAN = 88.064
	WIDTH = 160

#!/usr/bin/env python

from __future__ import division
from sstv import byte_to_freq, FREQ_BLACK
from grayscale import GrayscaleSSTV

class ColorSSTV(GrayscaleSSTV):
	RED, GREEN, BLUE = range(3)

	def encode_line(self, line):
		cs = self.COLOR_SEQ
		msec_pixel = self.SCAN / self.WIDTH
		image = self.image
		for index in cs:
			for item in self.before_channel(index):
				yield item
			for col in xrange(self.WIDTH):
				pixel = image.getpixel((col, line))
				freq_pixel = byte_to_freq(pixel[index])
				yield freq_pixel, msec_pixel
			for item in self.after_channel(index):
				yield item

	def before_channel(self, index):
		return []

	after_channel = before_channel


class MartinM1(ColorSSTV):
	COLOR_SEQ = (ColorSSTV.GREEN, ColorSSTV.BLUE, ColorSSTV.RED)
	VIS_CODE = 0x2c
	WIDTH = 320
	HEIGHT = 256
	SYNC = 4.862
	SCAN = 146.432
	INTER_CH_GAP = 0.572

	def before_channel(self, index):
		if index == ColorSSTV.GREEN:
			yield FREQ_BLACK, self.INTER_CH_GAP

	def after_channel(self, index):
		yield FREQ_BLACK, self.INTER_CH_GAP


class MartinM2(MartinM1):
	VIS_CODE = 0x28
	WIDTH = 160
	SCAN = 73.216


class ScottieS1(MartinM1):
	VIS_CODE = 0x3c
	SYNC = 9
	INTER_CH_GAP = 1.5
	SCAN = 138.24 - INTER_CH_GAP

	def horizontal_sync(self):
		return []

	def before_channel(self, index):
		if index != ColorSSTV.RED:
			for item in MartinM1.horizontal_sync(self):
				yield item
		yield FREQ_BLACK, self.INTER_CH_GAP


class ScottieS2(ScottieS1):
	VIS_CODE = 0x38
	SCAN = 88.064 - ScottieS1.INTER_CH_GAP
	WIDTH = 160

subtract INTER_CH_GAP from SCAN for Scottie