2 * Copyright (c) 2012 Martin Storsjo
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "libavutil/time.h"
25 #include "libavformat/avformat.h"
27 static int usage(const char *argv0
, int ret
)
29 fprintf(stderr
, "%s [-b bytespersec] [-d duration] input_url output_url\n", argv0
);
33 int main(int argc
, char **argv
)
35 int bps
= 0, duration
= 0, ret
, i
;
36 const char *input_url
= NULL
, *output_url
= NULL
;
37 int64_t stream_pos
= 0;
40 AVIOContext
*input
, *output
;
43 avformat_network_init();
45 for (i
= 1; i
< argc
; i
++) {
46 if (!strcmp(argv
[i
], "-b") && i
+ 1 < argc
) {
47 bps
= atoi(argv
[i
+ 1]);
49 } else if (!strcmp(argv
[i
], "-d") && i
+ 1 < argc
) {
50 duration
= atoi(argv
[i
+ 1]);
52 } else if (!input_url
) {
54 } else if (!output_url
) {
57 return usage(argv
[0], 1);
61 return usage(argv
[0], 1);
63 ret
= avio_open2(&input
, input_url
, AVIO_FLAG_READ
, NULL
, NULL
);
65 av_strerror(ret
, errbuf
, sizeof(errbuf
));
66 fprintf(stderr
, "Unable to open %s: %s\n", input_url
, errbuf
);
69 if (duration
&& !bps
) {
70 int64_t size
= avio_size(input
);
72 av_strerror(ret
, errbuf
, sizeof(errbuf
));
73 fprintf(stderr
, "Unable to get size of %s: %s\n", input_url
, errbuf
);
76 bps
= size
/ duration
;
78 ret
= avio_open2(&output
, output_url
, AVIO_FLAG_WRITE
, NULL
, NULL
);
80 av_strerror(ret
, errbuf
, sizeof(errbuf
));
81 fprintf(stderr
, "Unable to open %s: %s\n", output_url
, errbuf
);
85 start_time
= av_gettime_relative();
89 n
= avio_read(input
, buf
, sizeof(buf
));
92 avio_write(output
, buf
, n
);
96 while ((av_gettime_relative() - start_time
) * bps
/ AV_TIME_BASE
< stream_pos
)
106 avformat_network_deinit();