|
1 | 1 | """JPEG encoder functionality"""
|
2 | 2 |
|
3 |
| -import simplejpeg |
| 3 | +import turbojpeg |
4 | 4 |
|
5 | 5 | from picamera2.encoders import Quality
|
6 | 6 | from picamera2.encoders.multi_encoder import MultiEncoder
|
|
9 | 9 | class JpegEncoder(MultiEncoder):
|
10 | 10 | """Uses functionality from MultiEncoder"""
|
11 | 11 |
|
12 |
| - FORMAT_TABLE = {"XBGR8888": "RGBX", |
13 |
| - "XRGB8888": "BGRX", |
14 |
| - "BGR888": "RGB", |
15 |
| - "RGB888": "BGR"} |
| 12 | + FORMAT_TABLE = {"XBGR8888": turbojpeg.TJPF_RGBX, |
| 13 | + "XRGB8888": turbojpeg.TJPF_BGRX, |
| 14 | + "BGR888": turbojpeg.TJPF_RGB, |
| 15 | + "RGB888": turbojpeg.TJPF_BGR} |
| 16 | + COLOUR_SUBSAMPLING_TABLE = {"420": turbojpeg.TJSAMP_420, |
| 17 | + "422": turbojpeg.TJSAMP_422, |
| 18 | + "444": turbojpeg.TJSAMP_444} |
16 | 19 |
|
17 | 20 | def __init__(self, num_threads=4, q=None, colour_space=None, colour_subsampling='420'):
|
| 21 | + self.jpeg = turbojpeg.TurboJPEG() |
18 | 22 | """Initialises Jpeg encoder
|
19 | 23 |
|
20 | 24 | :param num_threads: Number of threads to use, defaults to 4
|
@@ -45,8 +49,8 @@ def encode_func(self, request, name):
|
45 | 49 | if self.colour_space is None:
|
46 | 50 | self.colour_space = self.FORMAT_TABLE[request.config[name]["format"]]
|
47 | 51 | array = request.make_array(name)
|
48 |
| - return simplejpeg.encode_jpeg(array, quality=self.q, colorspace=self.colour_space, |
49 |
| - colorsubsampling=self.colour_subsampling) |
| 52 | + return self.jpeg.encode(array, quality=self.q, colorspace=self.colour_space, |
| 53 | + colorsubsampling=self.COLOUR_SUBSAMPLING_TABLE[self.colour_subsampling]) |
50 | 54 |
|
51 | 55 | def _setup(self, quality):
|
52 | 56 | # If an explicit quality was specified, use it, otherwise try to preserve any q value
|
|
0 commit comments