@@ -20,16 +20,19 @@ struct DoubleFrameEncoder <: TranscodingStreams.Codec
2020 opened:: Base.RefValue{Bool}
2121 stopped:: Base.RefValue{Bool}
2222 got_stop_msg:: Base.RefValue{Bool}
23+ pledged_in_size:: Base.RefValue{Int64}
24+ in_size_count:: Base.RefValue{Int64}
2325end
2426
25- DoubleFrameEncoder () = DoubleFrameEncoder (Ref (false ), Ref (false ), Ref (false ))
27+ DoubleFrameEncoder () = DoubleFrameEncoder (Ref (false ), Ref (false ), Ref (false ), Ref ( Int64 ( - 1 )), Ref ( Int64 ( 0 )) )
2628
2729function TranscodingStreams. process (
2830 codec :: DoubleFrameEncoder ,
2931 input :: TranscodingStreams.Memory ,
3032 output :: TranscodingStreams.Memory ,
3133 error_ref :: TranscodingStreams.Error ,
3234 )
35+ pledged = codec. pledged_in_size[]
3336 if input. size == 0
3437 codec. got_stop_msg[] = true
3538 end
@@ -45,26 +48,59 @@ function TranscodingStreams.process(
4548 return 0 , 0 , :error
4649 elseif ! codec. opened[]
4750 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
4956 codec. opened[] = true
5057 return 0 , 2 , :ok
5158 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
5266 output[1 ] = UInt8 (' ' )
5367 output[2 ] = UInt8 (' ]' )
5468 codec. stopped[] = true
5569 return 0 , 2 , :end
5670 else
5771 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
5879 while i + 1 ≤ lastindex (input) && j + 2 ≤ lastindex (output)
5980 b = input[i+ 1 ]
6081 i += 1
6182 output[j+ 1 ] = output[j+ 2 ] = b
6283 j += 2
6384 end
85+ codec. in_size_count[] += i
6486 return i, j, :ok
6587 end
6688end
6789
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+
68104function TranscodingStreams. expectedsize (
69105 :: DoubleFrameEncoder ,
70106 input :: TranscodingStreams.Memory )
@@ -81,6 +117,8 @@ function TranscodingStreams.startproc(codec::DoubleFrameEncoder, ::Symbol, error
81117 codec. opened[] = false
82118 codec. got_stop_msg[] = false
83119 codec. stopped[] = false
120+ codec. pledged_in_size[] = - 1
121+ codec. in_size_count[] = 0
84122 return :ok
85123end
86124
@@ -149,7 +187,7 @@ function TranscodingStreams.process(
149187 codec. a[] != UInt8 (' [' ) && error (" expected [" )
150188 @label state2
151189 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 " )
153191 while true
154192 @label state3
155193 do_read (codec. a) || return (codec. state[]= 3 ; (Δin, Δout, :ok ))
@@ -189,12 +227,14 @@ DoubleFrameDecoderStream(stream::IO; kwargs...) = TranscodingStream(DoubleFrameD
189227
190228
191229@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 " ]" ;]
198238
199239 @test_throws Exception transcode (DoubleFrameDecoder, b "" )
200240 @test_throws Exception transcode (DoubleFrameDecoder, b " [" )
0 commit comments