diff options
author | Jon Bergli Heier <snakebite@jvnv.net> | 2011-01-02 22:17:26 +0100 |
---|---|---|
committer | Jon Bergli Heier <snakebite@jvnv.net> | 2011-01-02 22:17:40 +0100 |
commit | 237c3e226b7c2ac391b0e8d354e5fc6f587a41ba (patch) | |
tree | e1f0c89792e2baccb1d1ed21b913445d6e330715 /transcode.cpp | |
parent | b72175dab679c14be80b6e5db7129f8d3b518079 (diff) |
Use a filtering_istream with custom filters to chain file -> decoder -> encoder.
Diffstat (limited to 'transcode.cpp')
-rw-r--r-- | transcode.cpp | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/transcode.cpp b/transcode.cpp index 249ffb3..5244627 100644 --- a/transcode.cpp +++ b/transcode.cpp @@ -1,20 +1,25 @@ #include "transcode.h" -Transcoder::Transcoder(std::istream& i, HTTPResponse& r, DecoderBase& d, EncoderBase& e) : is(i), res(r), decoder(d), encoder(e) { +#include <boost/iostreams/device/file.hpp> +#include <boost/iostreams/filtering_stream.hpp> + +Transcoder::Transcoder(std::string p, HTTPResponse& r, DecoderBase& d, EncoderBase& e) : path(p), res(r), decoder(d), encoder(e) { } void Transcoder::run() { + const std::streamsize buffer_size = 0x1000; + boost::iostreams::file_source is(path, std::ios::in | std::ios::binary); + boost::iostreams::filtering_istream s; + s.push(EncoderFilter(encoder), buffer_size); + s.push(DecoderFilter(decoder), buffer_size); + s.push(is, buffer_size); + char data[0x1000]; - bool encoding_fone = false; - while(!encoding_fone) { - size_t decoded_size = 0; - char decoded_data[0x1000]; - if(is.good()) { - is.read(data, 0x1000); - decoded_size = decoder.decode((uint8_t*)data, is.gcount(), (uint8_t*)decoded_data, 0x1000); - } - char encoded_data[0x1000]; - size_t encoded_size = encoder.encode((uint8_t*)decoded_data, decoded_size, (uint8_t*)encoded_data, 0x1000); - res.write(encoded_data, encoded_size); + std::streamsize size = 1; + while(size) { + s.read(data, 0x1000); + size = s.gcount(); + if(size > 0) + res.write(data, size); } } |