winlin

refine flv codec, rename fast encoder to flv vod stream decoder

@@ -304,7 +304,7 @@ int SrsHttpVhost::response_flv_file2(SrsSocket* skt, SrsHttpMessage* req, string @@ -304,7 +304,7 @@ int SrsHttpVhost::response_flv_file2(SrsSocket* skt, SrsHttpMessage* req, string
304 return ret; 304 return ret;
305 } 305 }
306 306
307 - SrsFlvFastDecoder ffd; 307 + SrsFlvVodStreamDecoder ffd;
308 308
309 // open fast decoder 309 // open fast decoder
310 if ((ret = ffd.initialize(&fs)) != ERROR_SUCCESS) { 310 if ((ret = ffd.initialize(&fs)) != ERROR_SUCCESS) {
@@ -225,18 +225,123 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s @@ -225,18 +225,123 @@ int SrsFlvEncoder::write_tag(char* header, int header_size, char* tag, int tag_s
225 return ret; 225 return ret;
226 } 226 }
227 227
228 -SrsFlvFastDecoder::SrsFlvFastDecoder() 228 +SrsFlvDecoder::SrsFlvDecoder()
  229 +{
  230 + _fs = NULL;
  231 + tag_stream = new SrsStream();
  232 +}
  233 +
  234 +SrsFlvDecoder::~SrsFlvDecoder()
  235 +{
  236 + srs_freep(tag_stream);
  237 +}
  238 +
  239 +int SrsFlvDecoder::initialize(SrsFileReader* fs)
  240 +{
  241 + int ret = ERROR_SUCCESS;
  242 +
  243 + _fs = fs;
  244 +
  245 + return ret;
  246 +}
  247 +
  248 +int SrsFlvDecoder::read_header(char header[9])
  249 +{
  250 + int ret = ERROR_SUCCESS;
  251 +
  252 + if ((ret = _fs->read(header, 9, NULL)) != ERROR_SUCCESS) {
  253 + return ret;
  254 + }
  255 +
  256 + char* h = header;
  257 + if (h[0] != 'F' || h[1] != 'L' || h[2] != 'V') {
  258 + ret = ERROR_SYSTEM_FLV_HEADER;
  259 + srs_warn("flv header must start with FLV. ret=%d", ret);
  260 + return ret;
  261 + }
  262 +
  263 + return ret;
  264 +}
  265 +
  266 +int SrsFlvDecoder::read_tag_header(char* ptype, int32_t* pdata_size, u_int32_t* ptime)
  267 +{
  268 + int ret = ERROR_SUCCESS;
  269 +
  270 + char th[11]; // tag header
  271 +
  272 + // read tag header
  273 + if ((ret = _fs->read(th, 11, NULL)) != ERROR_SUCCESS) {
  274 + if (ret != ERROR_SYSTEM_FILE_EOF) {
  275 + srs_error("read flv tag header failed. ret=%d", ret);
  276 + }
  277 + return ret;
  278 + }
  279 +
  280 + // Reserved UB [2]
  281 + // Filter UB [1]
  282 + // TagType UB [5]
  283 + *ptype = (int)(th[0] & 0x1F);
  284 +
  285 + // DataSize UI24
  286 + char* pp = (char*)pdata_size;
  287 + pp[2] = th[1];
  288 + pp[1] = th[2];
  289 + pp[0] = th[3];
  290 +
  291 + // Timestamp UI24
  292 + pp = (char*)ptime;
  293 + pp[2] = th[4];
  294 + pp[1] = th[5];
  295 + pp[0] = th[6];
  296 +
  297 + // TimestampExtended UI8
  298 + pp[3] = th[7];
  299 +
  300 + return ret;
  301 +}
  302 +
  303 +int SrsFlvDecoder::read_tag_data(char* data, int32_t size)
  304 +{
  305 + int ret = ERROR_SUCCESS;
  306 +
  307 + if ((ret = _fs->read(data, size, NULL)) != ERROR_SUCCESS) {
  308 + if (ret != ERROR_SYSTEM_FILE_EOF) {
  309 + srs_error("read flv tag header failed. ret=%d", ret);
  310 + }
  311 + return ret;
  312 + }
  313 +
  314 + return ret;
  315 +
  316 +}
  317 +
  318 +int SrsFlvDecoder::read_previous_tag_size(char ts[4])
  319 +{
  320 + int ret = ERROR_SUCCESS;
  321 +
  322 + // ignore 4bytes tag size.
  323 + if ((ret = _fs->read(ts, 4, NULL)) != ERROR_SUCCESS) {
  324 + if (ret != ERROR_SYSTEM_FILE_EOF) {
  325 + srs_error("read flv previous tag size failed. ret=%d", ret);
  326 + }
  327 + return ret;
  328 + }
  329 +
  330 + return ret;
  331 +}
  332 +
  333 +SrsFlvVodStreamDecoder::SrsFlvVodStreamDecoder()
229 { 334 {
230 _fs = NULL; 335 _fs = NULL;
231 tag_stream = new SrsStream(); 336 tag_stream = new SrsStream();
232 } 337 }
233 338
234 -SrsFlvFastDecoder::~SrsFlvFastDecoder() 339 +SrsFlvVodStreamDecoder::~SrsFlvVodStreamDecoder()
235 { 340 {
236 srs_freep(tag_stream); 341 srs_freep(tag_stream);
237 } 342 }
238 343
239 -int SrsFlvFastDecoder::initialize(SrsFileReader* fs) 344 +int SrsFlvVodStreamDecoder::initialize(SrsFileReader* fs)
240 { 345 {
241 int ret = ERROR_SUCCESS; 346 int ret = ERROR_SUCCESS;
242 347
@@ -245,7 +350,7 @@ int SrsFlvFastDecoder::initialize(SrsFileReader* fs) @@ -245,7 +350,7 @@ int SrsFlvFastDecoder::initialize(SrsFileReader* fs)
245 return ret; 350 return ret;
246 } 351 }
247 352
248 -int SrsFlvFastDecoder::read_header(char** pdata, int* psize) 353 +int SrsFlvVodStreamDecoder::read_header(char** pdata, int* psize)
249 { 354 {
250 *pdata = NULL; 355 *pdata = NULL;
251 *psize = 0; 356 *psize = 0;
@@ -268,7 +373,7 @@ int SrsFlvFastDecoder::read_header(char** pdata, int* psize) @@ -268,7 +373,7 @@ int SrsFlvFastDecoder::read_header(char** pdata, int* psize)
268 return ret; 373 return ret;
269 } 374 }
270 375
271 -int SrsFlvFastDecoder::read_sequence_header(int64_t* pstart, int* psize) 376 +int SrsFlvVodStreamDecoder::read_sequence_header(int64_t* pstart, int* psize)
272 { 377 {
273 *pstart = 0; 378 *pstart = 0;
274 *psize = 0; 379 *psize = 0;
@@ -361,7 +466,7 @@ int SrsFlvFastDecoder::read_sequence_header(int64_t* pstart, int* psize) @@ -361,7 +466,7 @@ int SrsFlvFastDecoder::read_sequence_header(int64_t* pstart, int* psize)
361 return ret; 466 return ret;
362 } 467 }
363 468
364 -int SrsFlvFastDecoder::lseek(int64_t offset) 469 +int SrsFlvVodStreamDecoder::lseek(int64_t offset)
365 { 470 {
366 int ret = ERROR_SUCCESS; 471 int ret = ERROR_SUCCESS;
367 472
@@ -386,108 +491,3 @@ int SrsFlvFastDecoder::lseek(int64_t offset) @@ -386,108 +491,3 @@ int SrsFlvFastDecoder::lseek(int64_t offset)
386 return ret; 491 return ret;
387 } 492 }
388 493
389 -SrsFlvDecoder::SrsFlvDecoder()  
390 -{  
391 - _fs = NULL;  
392 - tag_stream = new SrsStream();  
393 -}  
394 -  
395 -SrsFlvDecoder::~SrsFlvDecoder()  
396 -{  
397 - srs_freep(tag_stream);  
398 -}  
399 -  
400 -int SrsFlvDecoder::initialize(SrsFileReader* fs)  
401 -{  
402 - int ret = ERROR_SUCCESS;  
403 -  
404 - _fs = fs;  
405 -  
406 - return ret;  
407 -}  
408 -  
409 -int SrsFlvDecoder::read_header(char header[9])  
410 -{  
411 - int ret = ERROR_SUCCESS;  
412 -  
413 - if ((ret = _fs->read(header, 9, NULL)) != ERROR_SUCCESS) {  
414 - return ret;  
415 - }  
416 -  
417 - char* h = header;  
418 - if (h[0] != 'F' || h[1] != 'L' || h[2] != 'V') {  
419 - ret = ERROR_SYSTEM_FLV_HEADER;  
420 - srs_warn("flv header must start with FLV. ret=%d", ret);  
421 - return ret;  
422 - }  
423 -  
424 - return ret;  
425 -}  
426 -  
427 -int SrsFlvDecoder::read_tag_header(char* ptype, int32_t* pdata_size, u_int32_t* ptime)  
428 -{  
429 - int ret = ERROR_SUCCESS;  
430 -  
431 - char th[11]; // tag header  
432 -  
433 - // read tag header  
434 - if ((ret = _fs->read(th, 11, NULL)) != ERROR_SUCCESS) {  
435 - if (ret != ERROR_SYSTEM_FILE_EOF) {  
436 - srs_error("read flv tag header failed. ret=%d", ret);  
437 - }  
438 - return ret;  
439 - }  
440 -  
441 - // Reserved UB [2]  
442 - // Filter UB [1]  
443 - // TagType UB [5]  
444 - *ptype = (int)(th[0] & 0x1F);  
445 -  
446 - // DataSize UI24  
447 - char* pp = (char*)pdata_size;  
448 - pp[2] = th[1];  
449 - pp[1] = th[2];  
450 - pp[0] = th[3];  
451 -  
452 - // Timestamp UI24  
453 - pp = (char*)ptime;  
454 - pp[2] = th[4];  
455 - pp[1] = th[5];  
456 - pp[0] = th[6];  
457 -  
458 - // TimestampExtended UI8  
459 - pp[3] = th[7];  
460 -  
461 - return ret;  
462 -}  
463 -  
464 -int SrsFlvDecoder::read_tag_data(char* data, int32_t size)  
465 -{  
466 - int ret = ERROR_SUCCESS;  
467 -  
468 - if ((ret = _fs->read(data, size, NULL)) != ERROR_SUCCESS) {  
469 - if (ret != ERROR_SYSTEM_FILE_EOF) {  
470 - srs_error("read flv tag header failed. ret=%d", ret);  
471 - }  
472 - return ret;  
473 - }  
474 -  
475 - return ret;  
476 -  
477 -}  
478 -  
479 -int SrsFlvDecoder::read_previous_tag_size(char ts[4])  
480 -{  
481 - int ret = ERROR_SUCCESS;  
482 -  
483 - // ignore 4bytes tag size.  
484 - if ((ret = _fs->read(ts, 4, NULL)) != ERROR_SUCCESS) {  
485 - if (ret != ERROR_SYSTEM_FILE_EOF) {  
486 - srs_error("read flv previous tag size failed. ret=%d", ret);  
487 - }  
488 - return ret;  
489 - }  
490 -  
491 - return ret;  
492 -}  
493 -  
@@ -49,8 +49,9 @@ public: @@ -49,8 +49,9 @@ public:
49 virtual ~SrsFlvEncoder(); 49 virtual ~SrsFlvEncoder();
50 public: 50 public:
51 /** 51 /**
52 - * initialize the underlayer file stream,  
53 - * user can initialize multiple times to encode multiple flv files. 52 + * initialize the underlayer file stream.
  53 + * @remark user can initialize multiple times to encode multiple flv files.
  54 + * @remark, user must free the fs, flv encoder never close/free it.
54 */ 55 */
55 virtual int initialize(SrsFileWriter* fs); 56 virtual int initialize(SrsFileWriter* fs);
56 public: 57 public:
@@ -85,62 +86,66 @@ private: @@ -85,62 +86,66 @@ private:
85 }; 86 };
86 87
87 /** 88 /**
88 -* decode flv fast by only decoding the header and tag. 89 +* decode flv file.
89 */ 90 */
90 -class SrsFlvFastDecoder 91 +class SrsFlvDecoder
91 { 92 {
92 private: 93 private:
93 SrsFileReader* _fs; 94 SrsFileReader* _fs;
94 private: 95 private:
95 SrsStream* tag_stream; 96 SrsStream* tag_stream;
96 public: 97 public:
97 - SrsFlvFastDecoder();  
98 - virtual ~SrsFlvFastDecoder(); 98 + SrsFlvDecoder();
  99 + virtual ~SrsFlvDecoder();
99 public: 100 public:
100 /** 101 /**
101 - * initialize the underlayer file stream,  
102 - * user can initialize multiple times to encode multiple flv files. 102 + * initialize the underlayer file stream
  103 + * @remark user can initialize multiple times to decode multiple flv files.
  104 + * @remark, user must free the fs, flv decoder never close/free it.
103 */ 105 */
104 virtual int initialize(SrsFileReader* fs); 106 virtual int initialize(SrsFileReader* fs);
105 public: 107 public:
106 - /**  
107 - * read the flv header and size.  
108 - */  
109 - virtual int read_header(char** pdata, int* psize);  
110 - /**  
111 - * read the sequence header and size.  
112 - */  
113 - virtual int read_sequence_header(int64_t* pstart, int* psize);  
114 -public:  
115 - /**  
116 - * for start offset, seed to this position and response flv stream.  
117 - */  
118 - virtual int lseek(int64_t offset); 108 + virtual int read_header(char header[9]);
  109 + virtual int read_tag_header(char* ptype, int32_t* pdata_size, u_int32_t* ptime);
  110 + virtual int read_tag_data(char* data, int32_t size);
  111 + virtual int read_previous_tag_size(char ts[4]);
119 }; 112 };
120 113
121 /** 114 /**
122 -* decode flv file. 115 +* decode flv fast by only decoding the header and tag.
  116 +* used for vod flv stream to read the header and sequence header,
  117 +* then seek to specified offset.
123 */ 118 */
124 -class SrsFlvDecoder 119 +class SrsFlvVodStreamDecoder
125 { 120 {
126 private: 121 private:
127 SrsFileReader* _fs; 122 SrsFileReader* _fs;
128 private: 123 private:
129 SrsStream* tag_stream; 124 SrsStream* tag_stream;
130 public: 125 public:
131 - SrsFlvDecoder();  
132 - virtual ~SrsFlvDecoder(); 126 + SrsFlvVodStreamDecoder();
  127 + virtual ~SrsFlvVodStreamDecoder();
133 public: 128 public:
134 /** 129 /**
135 - * initialize the underlayer file stream,  
136 - * user can initialize multiple times to decode multiple flv files. 130 + * initialize the underlayer file stream
  131 + * @remark user can initialize multiple times to decode multiple flv files.
  132 + * @remark, user must free the fs, flv decoder never close/free it.
137 */ 133 */
138 virtual int initialize(SrsFileReader* fs); 134 virtual int initialize(SrsFileReader* fs);
139 public: 135 public:
140 - virtual int read_header(char header[9]);  
141 - virtual int read_tag_header(char* ptype, int32_t* pdata_size, u_int32_t* ptime);  
142 - virtual int read_tag_data(char* data, int32_t size);  
143 - virtual int read_previous_tag_size(char ts[4]); 136 + /**
  137 + * read the flv header and size.
  138 + */
  139 + virtual int read_header(char** pdata, int* psize);
  140 + /**
  141 + * read the sequence header and size.
  142 + */
  143 + virtual int read_sequence_header(int64_t* pstart, int* psize);
  144 +public:
  145 + /**
  146 + * for start offset, seed to this position and response flv stream.
  147 + */
  148 + virtual int lseek(int64_t offset);
144 }; 149 };
145 150
146 #endif 151 #endif
@@ -26,88 +26,7 @@ using namespace std; @@ -26,88 +26,7 @@ using namespace std;
26 26
27 #include <srs_kernel_error.hpp> 27 #include <srs_kernel_error.hpp>
28 #include <srs_kernel_codec.hpp> 28 #include <srs_kernel_codec.hpp>
29 -  
30 -VOID TEST(KernelCodecTest, IsKeyFrame)  
31 -{  
32 - int8_t data;  
33 -  
34 - data = 0x10;  
35 - EXPECT_TRUE(SrsFlvCodec::video_is_keyframe(&data, 1));  
36 - EXPECT_FALSE(SrsFlvCodec::video_is_keyframe(&data, 0));  
37 -  
38 - data = 0x20;  
39 - EXPECT_FALSE(SrsFlvCodec::video_is_keyframe(&data, 1));  
40 -}  
41 -  
42 -VOID TEST(KernelCodecTest, IsH264)  
43 -{  
44 - int8_t data;  
45 -  
46 - EXPECT_FALSE(SrsFlvCodec::video_is_h264(&data, 0));  
47 -  
48 - data = 0x17;  
49 - EXPECT_TRUE(SrsFlvCodec::video_is_h264(&data, 1));  
50 -  
51 - data = 0x07;  
52 - EXPECT_TRUE(SrsFlvCodec::video_is_h264(&data, 1));  
53 -  
54 - data = 0x08;  
55 - EXPECT_FALSE(SrsFlvCodec::video_is_h264(&data, 1));  
56 -}  
57 -  
58 -VOID TEST(KernelCodecTest, IsSequenceHeader)  
59 -{  
60 - int16_t data;  
61 - char* pp = (char*)&data;  
62 -  
63 - EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 0));  
64 - EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 1));  
65 -  
66 - pp[0] = 0x17;  
67 - pp[1] = 0x00;  
68 - EXPECT_TRUE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));  
69 - pp[0] = 0x18;  
70 - EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));  
71 - pp[0] = 0x27;  
72 - EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));  
73 - pp[0] = 0x17;  
74 - pp[1] = 0x01;  
75 - EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));  
76 -}  
77 -  
78 -VOID TEST(KernelCodecTest, IsAAC)  
79 -{  
80 - int8_t data;  
81 -  
82 - EXPECT_FALSE(SrsFlvCodec::audio_is_aac(&data, 0));  
83 -  
84 - data = 0xa0;  
85 - EXPECT_TRUE(SrsFlvCodec::audio_is_aac(&data, 1));  
86 -  
87 - data = 0xa7;  
88 - EXPECT_TRUE(SrsFlvCodec::audio_is_aac(&data, 1));  
89 -  
90 - data = 0x00;  
91 - EXPECT_FALSE(SrsFlvCodec::audio_is_aac(&data, 1));  
92 -}  
93 -  
94 -VOID TEST(KernelCodecTest, IsAudioSequenceHeader)  
95 -{  
96 - int16_t data;  
97 - char* pp = (char*)&data;  
98 -  
99 - EXPECT_FALSE(SrsFlvCodec::audio_is_sequence_header((int8_t*)pp, 0));  
100 - EXPECT_FALSE(SrsFlvCodec::audio_is_sequence_header((int8_t*)pp, 1));  
101 -  
102 - pp[0] = 0xa0;  
103 - pp[1] = 0x00;  
104 - EXPECT_TRUE(SrsFlvCodec::audio_is_sequence_header((int8_t*)pp, 2));  
105 - pp[0] = 0x00;  
106 - EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));  
107 - pp[0] = 0xa0;  
108 - pp[1] = 0x01;  
109 - EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));  
110 -} 29 +#include <srs_kernel_flv.hpp>
111 30
112 MockSrsFileWriter::MockSrsFileWriter() 31 MockSrsFileWriter::MockSrsFileWriter()
113 { 32 {
@@ -194,3 +113,92 @@ int MockSrsFileReader::read(void* buf, size_t count, ssize_t* pnread) @@ -194,3 +113,92 @@ int MockSrsFileReader::read(void* buf, size_t count, ssize_t* pnread)
194 int ret = ERROR_SUCCESS; 113 int ret = ERROR_SUCCESS;
195 return ret; 114 return ret;
196 } 115 }
  116 +
  117 +VOID TEST(KernelCodecTest, IsKeyFrame)
  118 +{
  119 + int8_t data;
  120 +
  121 + data = 0x10;
  122 + EXPECT_TRUE(SrsFlvCodec::video_is_keyframe(&data, 1));
  123 + EXPECT_FALSE(SrsFlvCodec::video_is_keyframe(&data, 0));
  124 +
  125 + data = 0x20;
  126 + EXPECT_FALSE(SrsFlvCodec::video_is_keyframe(&data, 1));
  127 +}
  128 +
  129 +VOID TEST(KernelCodecTest, IsH264)
  130 +{
  131 + int8_t data;
  132 +
  133 + EXPECT_FALSE(SrsFlvCodec::video_is_h264(&data, 0));
  134 +
  135 + data = 0x17;
  136 + EXPECT_TRUE(SrsFlvCodec::video_is_h264(&data, 1));
  137 +
  138 + data = 0x07;
  139 + EXPECT_TRUE(SrsFlvCodec::video_is_h264(&data, 1));
  140 +
  141 + data = 0x08;
  142 + EXPECT_FALSE(SrsFlvCodec::video_is_h264(&data, 1));
  143 +}
  144 +
  145 +VOID TEST(KernelCodecTest, IsSequenceHeader)
  146 +{
  147 + int16_t data;
  148 + char* pp = (char*)&data;
  149 +
  150 + EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 0));
  151 + EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 1));
  152 +
  153 + pp[0] = 0x17;
  154 + pp[1] = 0x00;
  155 + EXPECT_TRUE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));
  156 + pp[0] = 0x18;
  157 + EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));
  158 + pp[0] = 0x27;
  159 + EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));
  160 + pp[0] = 0x17;
  161 + pp[1] = 0x01;
  162 + EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));
  163 +}
  164 +
  165 +VOID TEST(KernelCodecTest, IsAAC)
  166 +{
  167 + int8_t data;
  168 +
  169 + EXPECT_FALSE(SrsFlvCodec::audio_is_aac(&data, 0));
  170 +
  171 + data = 0xa0;
  172 + EXPECT_TRUE(SrsFlvCodec::audio_is_aac(&data, 1));
  173 +
  174 + data = 0xa7;
  175 + EXPECT_TRUE(SrsFlvCodec::audio_is_aac(&data, 1));
  176 +
  177 + data = 0x00;
  178 + EXPECT_FALSE(SrsFlvCodec::audio_is_aac(&data, 1));
  179 +}
  180 +
  181 +VOID TEST(KernelCodecTest, IsAudioSequenceHeader)
  182 +{
  183 + int16_t data;
  184 + char* pp = (char*)&data;
  185 +
  186 + EXPECT_FALSE(SrsFlvCodec::audio_is_sequence_header((int8_t*)pp, 0));
  187 + EXPECT_FALSE(SrsFlvCodec::audio_is_sequence_header((int8_t*)pp, 1));
  188 +
  189 + pp[0] = 0xa0;
  190 + pp[1] = 0x00;
  191 + EXPECT_TRUE(SrsFlvCodec::audio_is_sequence_header((int8_t*)pp, 2));
  192 + pp[0] = 0x00;
  193 + EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));
  194 + pp[0] = 0xa0;
  195 + pp[1] = 0x01;
  196 + EXPECT_FALSE(SrsFlvCodec::video_is_sequence_header((int8_t*)pp, 2));
  197 +}
  198 +
  199 +VOID TEST(KernelFlvTest, IsAudioSequenceHeader)
  200 +{
  201 + MockSrsFileWriter fs;
  202 + SrsFlvEncoder enc;
  203 + ASSERT_TRUE(ERROR_SUCCESS == enc.initialize(&fs));
  204 +}