yading@11: /* yading@11: * Copyright (c) 2012 Martin Storsjo yading@11: * yading@11: * This file is part of Libav. yading@11: * yading@11: * Libav is free software; you can redistribute it and/or yading@11: * modify it under the terms of the GNU Lesser General Public yading@11: * License as published by the Free Software Foundation; either yading@11: * version 2.1 of the License, or (at your option) any later version. yading@11: * yading@11: * Libav is distributed in the hope that it will be useful, yading@11: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@11: * Lesser General Public License for more details. yading@11: * yading@11: * You should have received a copy of the GNU Lesser General Public yading@11: * License along with Libav; if not, write to the Free Software yading@11: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@11: */ yading@11: yading@11: #include yading@11: #include yading@11: yading@11: #include "libavutil/time.h" yading@11: #include "libavformat/avformat.h" yading@11: yading@11: static int usage(const char *argv0, int ret) yading@11: { yading@11: fprintf(stderr, "%s [-b bytespersec] input_url output_url\n", argv0); yading@11: return ret; yading@11: } yading@11: yading@11: int main(int argc, char **argv) yading@11: { yading@11: int bps = 0, ret, i; yading@11: const char *input_url = NULL, *output_url = NULL; yading@11: int64_t stream_pos = 0; yading@11: int64_t start_time; yading@11: char errbuf[50]; yading@11: AVIOContext *input, *output; yading@11: yading@11: av_register_all(); yading@11: avformat_network_init(); yading@11: yading@11: for (i = 1; i < argc; i++) { yading@11: if (!strcmp(argv[i], "-b")) { yading@11: bps = atoi(argv[i + 1]); yading@11: i++; yading@11: } else if (!input_url) { yading@11: input_url = argv[i]; yading@11: } else if (!output_url) { yading@11: output_url = argv[i]; yading@11: } else { yading@11: return usage(argv[0], 1); yading@11: } yading@11: } yading@11: if (!output_url) yading@11: return usage(argv[0], 1); yading@11: yading@11: ret = avio_open2(&input, input_url, AVIO_FLAG_READ, NULL, NULL); yading@11: if (ret) { yading@11: av_strerror(ret, errbuf, sizeof(errbuf)); yading@11: fprintf(stderr, "Unable to open %s: %s\n", input_url, errbuf); yading@11: return 1; yading@11: } yading@11: ret = avio_open2(&output, output_url, AVIO_FLAG_WRITE, NULL, NULL); yading@11: if (ret) { yading@11: av_strerror(ret, errbuf, sizeof(errbuf)); yading@11: fprintf(stderr, "Unable to open %s: %s\n", output_url, errbuf); yading@11: goto fail; yading@11: } yading@11: yading@11: start_time = av_gettime(); yading@11: while (1) { yading@11: uint8_t buf[1024]; yading@11: int n; yading@11: n = avio_read(input, buf, sizeof(buf)); yading@11: if (n <= 0) yading@11: break; yading@11: avio_write(output, buf, n); yading@11: stream_pos += n; yading@11: if (bps) { yading@11: avio_flush(output); yading@11: while ((av_gettime() - start_time) * bps / AV_TIME_BASE < stream_pos) yading@11: av_usleep(50 * 1000); yading@11: } yading@11: } yading@11: yading@11: avio_flush(output); yading@11: avio_close(output); yading@11: yading@11: fail: yading@11: avio_close(input); yading@11: avformat_network_deinit(); yading@11: return ret ? 1 : 0; yading@11: }