1c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen/* 2c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * Copyright (C) 2015 The Android Open Source Project 3c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * 4c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * Licensed under the Apache License, Version 2.0 (the "License"); 5c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * you may not use this file except in compliance with the License. 6c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * You may obtain a copy of the License at 7c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * 8c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * http://www.apache.org/licenses/LICENSE-2.0 9c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * 10c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * Unless required by applicable law or agreed to in writing, software 11c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * distributed under the License is distributed on an "AS IS" BASIS, 12c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * See the License for the specific language governing permissions and 14c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen * limitations under the License. 15c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen */ 16c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 17c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen#include <new> 18c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen#include <memory> 19c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen#include <fstream> 20c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen#include <iostream> 21c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen#include <fec/io.h> 22c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 23c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanenusing namespace std; 24c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanenconst unsigned bufsize = 2 * 1024 * FEC_BLOCKSIZE; 25c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 26c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanenint main(int argc, char **argv) 27c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen{ 28c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen if (argc != 3) { 29c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen cerr << "usage: " << argv[0] << " input output" << endl; 30c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen return 1; 31c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen } 32c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 33c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen unique_ptr<uint8_t[]> buffer(new (nothrow) uint8_t[bufsize]); 34c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 35c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen if (!buffer) { 36c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen cerr << "failed to allocate buffer" << endl; 37c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen return 1; 38c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen } 39c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 40c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen fec::io input(argv[1]); 41c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 42c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen if (!input) { 43c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen return 1; 44c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen } 45c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 46c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen ofstream output(argv[2], ios::binary | ios::trunc); 47c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 48c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen if (!output) { 49c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen cerr << "failed to open " << argv[2] << endl; 50c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen return 1; 51c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen } 52c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 53c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen ssize_t count; 54c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 55c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen do { 56c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen count = input.read(buffer.get(), bufsize); 57c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 58c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen if (count == -1) { 59c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen return 1; 60c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen } else if (count > 0) { 61c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen output.write(reinterpret_cast<const char *>(buffer.get()), count); 62c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 63c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen if (!output) { 64c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen cerr << "write" << endl; 65c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen return 1; 66c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen } 67c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen } 68c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen } while (count > 0); 69c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen 70c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen return 0; 71c54a33db7505976a3530aa76ebd5602f12923c4dSami Tolvanen} 72