@@ -20,16 +20,19 @@ struct DoubleFrameEncoder <: TranscodingStreams.Codec
20
20
opened:: Base.RefValue{Bool}
21
21
stopped:: Base.RefValue{Bool}
22
22
got_stop_msg:: Base.RefValue{Bool}
23
+ pledged_in_size:: Base.RefValue{Int64}
24
+ in_size_count:: Base.RefValue{Int64}
23
25
end
24
26
25
- DoubleFrameEncoder () = DoubleFrameEncoder (Ref (false ), Ref (false ), Ref (false ))
27
+ DoubleFrameEncoder () = DoubleFrameEncoder (Ref (false ), Ref (false ), Ref (false ), Ref ( Int64 ( - 1 )), Ref ( Int64 ( 0 )) )
26
28
27
29
function TranscodingStreams. process (
28
30
codec :: DoubleFrameEncoder ,
29
31
input :: TranscodingStreams.Memory ,
30
32
output :: TranscodingStreams.Memory ,
31
33
error_ref :: TranscodingStreams.Error ,
32
34
)
35
+ pledged = codec. pledged_in_size[]
33
36
if input. size == 0
34
37
codec. got_stop_msg[] = true
35
38
end
@@ -45,26 +48,59 @@ function TranscodingStreams.process(
45
48
return 0 , 0 , :error
46
49
elseif ! codec. opened[]
47
50
output[1 ] = UInt8 (' [' )
48
- output[2 ] = UInt8 (' ' )
51
+ if pledged ∈ (0 : 9 )
52
+ output[2 ] = UInt8 (' 0' + pledged)
53
+ else
54
+ output[2 ] = UInt8 (' ' )
55
+ end
49
56
codec. opened[] = true
50
57
return 0 , 2 , :ok
51
58
elseif codec. got_stop_msg[]
59
+ # check in_size_count against pledged
60
+ if pledged ∈ (0 : 9 )
61
+ if pledged > codec. in_size_count[]
62
+ error_ref[] = ErrorException (" pledged in size was too big" )
63
+ return 0 , 0 , :error
64
+ end
65
+ end
52
66
output[1 ] = UInt8 (' ' )
53
67
output[2 ] = UInt8 (' ]' )
54
68
codec. stopped[] = true
55
69
return 0 , 2 , :end
56
70
else
57
71
i = j = 0
72
+ # check input.size against pledged
73
+ if pledged ∈ (0 : 9 )
74
+ if input. size > pledged || pledged - input. size < codec. in_size_count[]
75
+ error_ref[] = ErrorException (" pledged in size was too small" )
76
+ return 0 , 0 , :error
77
+ end
78
+ end
58
79
while i + 1 ≤ lastindex (input) && j + 2 ≤ lastindex (output)
59
80
b = input[i+ 1 ]
60
81
i += 1
61
82
output[j+ 1 ] = output[j+ 2 ] = b
62
83
j += 2
63
84
end
85
+ codec. in_size_count[] += i
64
86
return i, j, :ok
65
87
end
66
88
end
67
89
90
+ function TranscodingStreams. pledgeinsize (
91
+ codec:: DoubleFrameEncoder ,
92
+ insize:: Int64 ,
93
+ error:: Error ,
94
+ ):: Symbol
95
+ if codec. opened[]
96
+ error[] = ErrorException (" pledgeinsize called after opening" )
97
+ return :error
98
+ else
99
+ codec. pledged_in_size[] = insize
100
+ return :ok
101
+ end
102
+ end
103
+
68
104
function TranscodingStreams. expectedsize (
69
105
:: DoubleFrameEncoder ,
70
106
input :: TranscodingStreams.Memory )
@@ -81,6 +117,8 @@ function TranscodingStreams.startproc(codec::DoubleFrameEncoder, ::Symbol, error
81
117
codec. opened[] = false
82
118
codec. got_stop_msg[] = false
83
119
codec. stopped[] = false
120
+ codec. pledged_in_size[] = - 1
121
+ codec. in_size_count[] = 0
84
122
return :ok
85
123
end
86
124
@@ -149,7 +187,7 @@ function TranscodingStreams.process(
149
187
codec. a[] != UInt8 (' [' ) && error (" expected [" )
150
188
@label state2
151
189
do_read (codec. a) || return (codec. state[]= 2 ; (Δin, Δout, :ok ))
152
- codec. a[] != UInt8 (' ' ) && error (" expected space" )
190
+ codec. a[] ∉ ( UInt8 (' ' ), UInt8 ( ' 0 ' ) : UInt8 ( ' 9 ' ) ... ) && error (" expected space or size " )
153
191
while true
154
192
@label state3
155
193
do_read (codec. a) || return (codec. state[]= 3 ; (Δin, Δout, :ok ))
@@ -189,12 +227,14 @@ DoubleFrameDecoderStream(stream::IO; kwargs...) = TranscodingStream(DoubleFrameD
189
227
190
228
191
229
@testset " DoubleFrame Codecs" begin
192
- @test transcode (DoubleFrameEncoder, b "" ) == b " [ ]"
193
- @test transcode (DoubleFrameEncoder, b " a" ) == b " [ aa ]"
194
- @test transcode (DoubleFrameEncoder, b " ab" ) == b " [ aabb ]"
195
- @test transcode (DoubleFrameEncoder (), b "" ) == b " [ ]"
196
- @test transcode (DoubleFrameEncoder (), b " a" ) == b " [ aa ]"
197
- @test transcode (DoubleFrameEncoder (), b " ab" ) == b " [ aabb ]"
230
+ @test transcode (DoubleFrameEncoder, b "" ) == b " [0 ]"
231
+ @test transcode (DoubleFrameEncoder, b " a" ) == b " [1aa ]"
232
+ @test transcode (DoubleFrameEncoder, b " ab" ) == b " [2aabb ]"
233
+ @test transcode (DoubleFrameEncoder (), b "" ) == b " [0 ]"
234
+ @test transcode (DoubleFrameEncoder (), b " a" ) == b " [1aa ]"
235
+ @test transcode (DoubleFrameEncoder (), b " ab" ) == b " [2aabb ]"
236
+ @test transcode (DoubleFrameEncoder (), ones (UInt8,9 )) == [b " [9" ; ones (UInt8,18 ); b " ]" ;]
237
+ @test transcode (DoubleFrameEncoder (), ones (UInt8,10 )) == [b " [ " ; ones (UInt8,20 ); b " ]" ;]
198
238
199
239
@test_throws Exception transcode (DoubleFrameDecoder, b "" )
200
240
@test_throws Exception transcode (DoubleFrameDecoder, b " [" )
0 commit comments