@@ -5,7 +5,7 @@ use crate::error::Result;
5
5
use crate :: idct:: dequantize_and_idct_block;
6
6
use crate :: parser:: Component ;
7
7
8
- use std:: sync:: { Arc , Mutex } ;
8
+ use std:: sync:: Arc ;
9
9
10
10
use super :: { RowData , Worker } ;
11
11
@@ -29,14 +29,12 @@ struct ComponentMetadata {
29
29
}
30
30
31
31
pub struct Scoped {
32
- inner : Mutex < ImmediateWorker > ,
32
+ inner : ImmediateWorker ,
33
33
}
34
34
35
35
pub fn with_rayon < T > ( f : impl FnOnce ( & mut dyn Worker ) -> T ) -> T {
36
36
let inner = ImmediateWorker :: default ( ) ;
37
- f ( & mut Scoped {
38
- inner : Mutex :: new ( inner) ,
39
- } )
37
+ f ( & mut Scoped { inner } )
40
38
}
41
39
42
40
impl ImmediateWorker {
@@ -74,24 +72,16 @@ impl ImmediateWorker {
74
72
pub fn append_row_locked (
75
73
quantization_table : Arc < [ u16 ; 64 ] > ,
76
74
metadata : ComponentMetadata ,
77
- ( index, data) : ( usize , Vec < i16 > ) ,
78
- result_offset : usize ,
75
+ data : Vec < i16 > ,
79
76
result_block : & mut [ u8 ] ,
80
77
) {
81
78
// Convert coefficients from a MCU row to samples.
82
- let block_count;
83
- let line_stride;
84
- let block_width;
85
- let dct_scale;
86
-
87
- {
88
- let metadata = metadata;
89
-
90
- block_width = metadata. block_width ;
91
- block_count = metadata. block_count ;
92
- line_stride = metadata. line_stride ;
93
- dct_scale = metadata. dct_scale ;
94
- }
79
+ let ComponentMetadata {
80
+ block_count,
81
+ line_stride,
82
+ block_width,
83
+ dct_scale,
84
+ } = metadata;
95
85
96
86
assert_eq ! ( data. len( ) , block_count * 64 ) ;
97
87
@@ -128,45 +118,31 @@ impl ImmediateWorker {
128
118
129
119
impl super :: Worker for Scoped {
130
120
fn start ( & mut self , row_data : RowData ) -> Result < ( ) > {
131
- self . inner . get_mut ( ) . unwrap ( ) . start_immediate ( row_data) ;
121
+ self . inner . start_immediate ( row_data) ;
132
122
Ok ( ( ) )
133
123
}
134
124
135
125
fn append_row ( & mut self , row : ( usize , Vec < i16 > ) ) -> Result < ( ) > {
136
- let quantization_table;
137
- let metadata;
126
+ let ref mut inner = self . inner ;
138
127
let ( index, data) = row;
139
- let result_offset;
140
- let result_block;
141
128
142
- {
143
- let mut inner = self . inner . get_mut ( ) . unwrap ( ) ;
144
- quantization_table = inner. quantization_tables [ index] . as_ref ( ) . unwrap ( ) . clone ( ) ;
145
- metadata = inner . component_metadata ( index ) . unwrap ( ) ;
129
+ let quantization_table = inner . quantization_tables [ index ] . as_ref ( ) . unwrap ( ) . clone ( ) ;
130
+ let metadata = inner. component_metadata ( index ) . unwrap ( ) ;
131
+ let result_block = & mut inner. results [ index] [ inner . offsets [ index ] .. ] ;
132
+ inner . offsets [ index ] += metadata . bytes_used ( ) ;
146
133
147
- result_offset = inner. offsets [ index] ;
148
- result_block = & mut inner. results [ index] [ inner. offsets [ index] ..] ;
149
- inner. offsets [ index] += metadata. bytes_used ( ) ;
150
- }
151
-
152
- ImmediateWorker :: append_row_locked (
153
- quantization_table,
154
- metadata,
155
- ( index, data) ,
156
- result_offset,
157
- result_block,
158
- ) ;
134
+ ImmediateWorker :: append_row_locked ( quantization_table, metadata, data, result_block) ;
159
135
Ok ( ( ) )
160
136
}
161
137
162
138
fn get_result ( & mut self , index : usize ) -> Result < Vec < u8 > > {
163
- let result = self . inner . get_mut ( ) . unwrap ( ) . get_result_immediate ( index) ;
139
+ let result = self . inner . get_result_immediate ( index) ;
164
140
Ok ( result)
165
141
}
166
142
167
143
// Magic sauce, these _may_ run in parallel.
168
144
fn append_rows ( & mut self , iter : & mut dyn Iterator < Item = ( usize , Vec < i16 > ) > ) -> Result < ( ) > {
169
- let inner = self . inner . get_mut ( ) . unwrap ( ) ;
145
+ let ref mut inner = self . inner ;
170
146
rayon:: in_place_scope ( |scope| {
171
147
let metadatas = [
172
148
inner. component_metadata ( 0 ) ,
@@ -193,18 +169,16 @@ impl super::Worker for Scoped {
193
169
let metadata = metadatas[ index] . unwrap ( ) ;
194
170
let quantization_table = inner. quantization_tables [ index] . as_ref ( ) . unwrap ( ) . clone ( ) ;
195
171
196
- let result_offset = inner. offsets [ index] ;
197
- let ( result_block, tail) = core:: mem:: replace ( & mut result_blocks[ index] , & mut [ ] )
172
+ inner. offsets [ index] += metadata . bytes_used ( ) ;
173
+ let ( result_block, tail) = core:: mem:: take ( & mut result_blocks[ index] )
198
174
. split_at_mut ( metadata. bytes_used ( ) ) ;
199
175
result_blocks[ index] = tail;
200
- inner. offsets [ index] += metadata. bytes_used ( ) ;
201
176
202
177
scope. spawn ( move |_| {
203
178
ImmediateWorker :: append_row_locked (
204
179
quantization_table,
205
180
metadata,
206
- ( index, data) ,
207
- result_offset,
181
+ data,
208
182
result_block,
209
183
)
210
184
} ) ;
0 commit comments