25
25
*/
26
26
27
27
#include "py/obj.h"
28
+ #include "py/builtin.h"
28
29
#include "py/runtime.h"
29
30
30
31
#include "shared-bindings/displayio/Bitmap.h"
35
36
//| class JpegDecoder:
36
37
//| """A JPEG decoder
37
38
//|
38
- //| A JPEG decoder allocates a few thousand bytes of memory. To reduce memory fragmentation,
39
+ //| A JpegDecoder allocates a few thousand bytes of memory. To reduce memory fragmentation,
39
40
//| create a single JpegDecoder object and use it anytime a JPEG image needs to be decoded.
41
+ //|
42
+ //| Example::
43
+ //|
44
+ //| from jpegio import JpegDecoder
45
+ //| from displayio import Bitmap
46
+ //|
47
+ //| decoder = JpegDecoder()
48
+ //| width, height = decoder.open("/sd/example.jpg")
49
+ //| bitmap = Bitmap(width, height)
50
+ //| decoder.decode(bitmap)
51
+ //| # .. do something with bitmap
40
52
//| """
41
53
//|
42
54
//| def __init__(self) -> None: ...
@@ -54,51 +66,88 @@ STATIC mp_obj_t jpegio_jpegdecoder_make_new(const mp_obj_type_t *type, size_t n_
54
66
return MP_OBJ_FROM_PTR (self );
55
67
}
56
68
69
+ //| @overload
70
+ //| def open(self, filename: str) -> Tuple[int, int]: ...
71
+ //| @overload
72
+ //| def open(self, buffer: ReadableBuffer) -> Tuple[int, int]: ...
73
+ //| @overload
74
+ //| def open(self, bytesio: io.BytesIO) -> Tuple[int, int]:
75
+ //| """Use the specified object as the JPEG data source.
76
+ //|
77
+ //| The source may be a filename, a binary buffer in memory, or an opened binary stream.
78
+ //|
79
+ //| The single parameter is positional-only (write ``open(f)``, not
80
+ //| ``open(filename=f)`` but due to technical limitations this is
81
+ //| not shown in the function signature in the documentation.
82
+ //|
83
+ //| Returns the image size as the tuple ``(width, height)``."""
84
+ STATIC mp_obj_t jpegio_jpegdecoder_open (mp_obj_t self_in , mp_obj_t arg ) {
85
+ jpegio_jpegdecoder_obj_t * self = MP_OBJ_TO_PTR (self_in );
86
+ if (mp_obj_is_str (arg )) {
87
+ arg = mp_call_function_2 (
88
+ MP_OBJ_FROM_PTR (& mp_builtin_open_obj ),
89
+ arg ,
90
+ MP_OBJ_NEW_QSTR (MP_QSTR_rb ));
91
+ }
92
+
93
+ mp_buffer_info_t bufinfo ;
94
+ const mp_stream_p_t * proto = mp_get_stream (arg );
95
+
96
+ if (proto && proto -> read && !proto -> is_text ) {
97
+ return common_hal_jpegio_jpegdecoder_set_source_file (self , arg );
98
+ } else if (mp_get_buffer (arg , & bufinfo , MP_BUFFER_READ )) {
99
+ return common_hal_jpegio_jpegdecoder_set_source_buffer (self , arg );
100
+ }
101
+ mp_raise_TypeError_varg (MP_ERROR_TEXT ("%q must be of type %q, %q, or %q, not %q" ), MP_QSTR_data_source , MP_QSTR_str , MP_QSTR_BytesIO , MP_QSTR_ReadableBuffer );
102
+ }
103
+ MP_DEFINE_CONST_FUN_OBJ_2 (jpegio_jpegdecoder_open_obj , jpegio_jpegdecoder_open );
104
+
57
105
//| def decode(
58
- //| self, data: ReadableBuffer, bitmap: displayio.Bitmap | None = None, scale=0
59
- //| ) -> tuple[int, int]:
106
+ //| self,
107
+ //| bitmap: displayio.Bitmap,
108
+ //| scale: int = 0,
109
+ //| ) -> None:
60
110
//| """Decode JPEG data
61
111
//|
62
- //| If ``bitmap`` is None, only the header is decoded.
63
- //| Otherwise, the bitmap must be large enough to contain the decoded image.
112
+ //| The bitmap must be large enough to contain the decoded image.
64
113
//| The pixel data is stored in the `displayio.Colorspace.RGB565_SWAPPED` colorspace.
65
114
//|
66
115
//| The image is optionally downscaled by a factor of ``2**scale``.
67
116
//| Scaling by a factor of 8 (scale=3) is particularly efficient in terms of decoding time.
68
117
//|
69
- //| :param ReadableBuffer data: Data in JPEG format
118
+ //| After a call to ``decode``, you must ``open`` a new JPEG. It is not
119
+ //| possible to repeatedly ``decode`` the same jpeg data, even if it is to
120
+ //| select different scales or crop regions from it.
121
+ //|
70
122
//| :param Bitmap bitmap: Optional output buffer
71
- //| :param int scale: Scale factor from 0 to 3.
72
- //| :returns: The size of the (possibly scaled) image as ``width, height``
123
+ //| :param int scale: Scale factor from 0 to 3, inclusive.
73
124
//| """
74
125
//|
75
126
STATIC mp_obj_t jpegio_jpegdecoder_decode (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
76
127
jpegio_jpegdecoder_obj_t * self = MP_OBJ_TO_PTR (pos_args [0 ]);
77
128
78
- enum { ARG_data , ARG_bitmap , ARG_scale };
129
+ enum { ARG_bitmap , ARG_scale };
79
130
static const mp_arg_t allowed_args [] = {
80
- { MP_QSTR_data , MP_ARG_OBJ | MP_ARG_REQUIRED , {.u_obj = mp_const_none } },
81
- { MP_QSTR_bitmap , MP_ARG_OBJ , {.u_obj = mp_const_none } },
131
+ { MP_QSTR_bitmap , MP_ARG_OBJ | MP_ARG_REQUIRED , {.u_obj = mp_const_none } },
82
132
{ MP_QSTR_scale , MP_ARG_INT , {.u_int = 0 } },
83
133
};
84
134
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
85
135
mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
86
136
87
- mp_buffer_info_t bufinfo ;
88
- mp_get_buffer_raise (args [ARG_data ].u_obj , & bufinfo , MP_BUFFER_READ );
89
-
90
137
mp_obj_t bitmap_in = args [ARG_bitmap ].u_obj ;
91
- mp_arg_validate_type_or_none (bitmap_in , & displayio_bitmap_type , MP_QSTR_bitmap );
92
- displayio_bitmap_t * bitmap = ( args [ ARG_bitmap ]. u_obj != mp_const_none ) ? MP_OBJ_TO_PTR (args [ARG_bitmap ].u_obj ) : NULL ;
138
+ mp_arg_validate_type (bitmap_in , & displayio_bitmap_type , MP_QSTR_bitmap );
139
+ displayio_bitmap_t * bitmap = MP_OBJ_TO_PTR (args [ARG_bitmap ].u_obj );
93
140
94
141
int scale = args [ARG_scale ].u_int ;
95
142
mp_arg_validate_int_range (scale , 0 , 3 , MP_QSTR_scale );
96
143
97
- return common_hal_jpegio_jpegdecoder_decode (self , bitmap , & bufinfo , scale );
144
+ common_hal_jpegio_jpegdecoder_decode_into (self , bitmap , scale );
145
+ return mp_const_none ;
98
146
}
99
- STATIC MP_DEFINE_CONST_FUN_OBJ_KW (jpegio_jpegdecoder_decode_obj , 2 , jpegio_jpegdecoder_decode );
147
+ STATIC MP_DEFINE_CONST_FUN_OBJ_KW (jpegio_jpegdecoder_decode_obj , 1 , jpegio_jpegdecoder_decode );
100
148
101
149
STATIC const mp_rom_map_elem_t jpegio_jpegdecoder_locals_dict_table [] = {
150
+ { MP_ROM_QSTR (MP_QSTR_open ), MP_ROM_PTR (& jpegio_jpegdecoder_open_obj ) },
102
151
{ MP_ROM_QSTR (MP_QSTR_decode ), MP_ROM_PTR (& jpegio_jpegdecoder_decode_obj ) },
103
152
};
104
153
STATIC MP_DEFINE_CONST_DICT (jpegio_jpegdecoder_locals_dict , jpegio_jpegdecoder_locals_dict_table );
0 commit comments