@@ -2,15 +2,19 @@ use std::fs::File;
22use std:: path:: Path ;
33
44use numpy:: ndarray:: Array ;
5- use numpy:: { IntoPyArray , PyArray2 } ;
5+ use numpy:: { IntoPyArray , PyArray1 , PyArray2 , PyArrayMethods , PyReadonlyArrayDyn } ;
66use pyo3:: prelude:: * ;
77
8- use codec:: decode:: CptvDecoder ;
8+ use codec:: decode:: { CptvDecoder , CptvStreamDecoder } ;
99
1010#[ pyclass]
1111struct CptvReader {
1212 inner : CptvDecoder < File > ,
1313}
14+ #[ pyclass]
15+ struct CptvStreamReader {
16+ inner : CptvStreamDecoder ,
17+ }
1418
1519#[ pyclass( frozen) ]
1620struct CptvHeader {
@@ -77,15 +81,46 @@ struct CptvFrame {
7781}
7882
7983#[ pymethods]
80- impl CptvReader {
81- #[ staticmethod]
82- pub fn new_optional_header ( path : String , has_header : bool ) -> CptvReader {
83- CptvReader {
84- inner : CptvDecoder :: < File > :: from_path_optional_header ( Path :: new ( & path) , has_header)
85- . unwrap ( ) ,
84+ impl CptvStreamReader {
85+ #[ new]
86+ pub fn new ( ) -> CptvStreamReader {
87+ CptvStreamReader {
88+ inner : CptvStreamDecoder :: new ( ) ,
8689 }
8790 }
8891
92+ pub fn next_frame_from_data < ' py > (
93+ & mut self ,
94+ py : Python < ' py > ,
95+ data : & Bound < ' py , PyArray1 < u8 > > ,
96+ ) -> Option < ( CptvFrame , usize ) > {
97+ let slice: & [ u8 ] = unsafe { data. as_slice ( ) . unwrap ( ) } ;
98+
99+ if let Ok ( ( frame_ref, data_used) ) = self . inner . next_frame_from_data ( slice) {
100+ let chunk: numpy:: ndarray:: ArrayBase <
101+ numpy:: ndarray:: OwnedRepr < u16 > ,
102+ numpy:: ndarray:: Dim < [ usize ; 2 ] > ,
103+ > = Array :: from_shape_vec ( ( 120 , 160 ) , frame_ref. image_data . data ( ) . to_vec ( ) ) . unwrap ( ) ;
104+
105+ Some ( (
106+ CptvFrame {
107+ time_on : frame_ref. time_on ,
108+ last_ffc_time : frame_ref. last_ffc_time ,
109+ temp_c : frame_ref. frame_temp_c ,
110+ last_ffc_temp_c : frame_ref. last_ffc_temp_c ,
111+ background_frame : frame_ref. is_background_frame ,
112+ pix : Bound :: unbind ( chunk. into_pyarray_bound ( py) ) ,
113+ } ,
114+ data_used,
115+ ) )
116+ } else {
117+ None
118+ }
119+ }
120+ }
121+
122+ #[ pymethods]
123+ impl CptvReader {
89124 #[ new]
90125 pub fn new ( path : String ) -> CptvReader {
91126 CptvReader {
@@ -148,5 +183,6 @@ impl CptvReader {
148183#[ pymodule]
149184fn cptv_rs_python_bindings ( _py : Python , m : & PyModule ) -> PyResult < ( ) > {
150185 m. add_class :: < CptvReader > ( ) ?;
186+ m. add_class :: < CptvStreamReader > ( ) ?;
151187 Ok ( ( ) )
152188}
0 commit comments