This is a replacement for previously proposed API av_bprint_fd_contents(). Side-effect: lavfi input device now accepts any URL as "graph_file" option value. --- libavdevice/lavfi.c | 30 +++++++++++++++--------------- libavformat/avio.h | 8 ++++++++ libavformat/aviobuf.c | 16 ++++++++++++++++ 3 files changed, 39 insertions(+), 15 deletions(-)
diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c index d1904dd..0388a86 100644 --- a/libavdevice/lavfi.c +++ b/libavdevice/lavfi.c @@ -115,23 +115,23 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx) } if (lavfi->graph_filename) { - uint8_t *file_buf, *graph_buf; - size_t file_bufsize; - ret = av_file_map(lavfi->graph_filename, - &file_buf, &file_bufsize, 0, avctx); + AVBPrint graph_file_pb; + AVIOContext *avio = NULL; + ret = avio_open(&avio, lavfi->graph_filename, AVIO_FLAG_READ); if (ret < 0) - goto end; - - /* create a 0-terminated string based on the read file */ - graph_buf = av_malloc(file_bufsize + 1); - if (!graph_buf) { - av_file_unmap(file_buf, file_bufsize); - FAIL(AVERROR(ENOMEM)); + FAIL(ret); + av_bprint_init(&graph_file_pb, 0, AV_BPRINT_SIZE_UNLIMITED); + ret = avio_dump_contents(avio, &graph_file_pb); + avio_close(avio); + av_bprint_chars(&graph_file_pb, '\0', 1); + if (!ret && !av_bprint_is_complete(&graph_file_pb)) + ret = AVERROR(ENOMEM); + if (ret) { + av_bprint_finalize(&graph_file_pb, NULL); + FAIL(ret); } - memcpy(graph_buf, file_buf, file_bufsize); - graph_buf[file_bufsize] = 0; - av_file_unmap(file_buf, file_bufsize); - lavfi->graph_str = graph_buf; + if ((ret = av_bprint_finalize(&graph_file_pb, &lavfi->graph_str))) + FAIL(ret); } if (!lavfi->graph_str) diff --git a/libavformat/avio.h b/libavformat/avio.h index 4004b6f..7f608fa 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -31,6 +31,7 @@ #include "libavutil/common.h" #include "libavutil/dict.h" #include "libavutil/log.h" +#include "libavutil/bprint.h" #include "libavformat/version.h" @@ -500,4 +501,11 @@ int avio_pause(AVIOContext *h, int pause); int64_t avio_seek_time(AVIOContext *h, int stream_index, int64_t timestamp, int flags); +/** + * Read contents of h into print buffer up to EOF. + * + * @return 0 for success, error code otherwise + */ +int avio_dump_contents(AVIOContext *h, AVBPrint *pb); + #endif /* AVFORMAT_AVIO_H */ diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 738459e..ba84873 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -953,6 +953,22 @@ int64_t avio_seek_time(AVIOContext *s, int stream_index, return ret; } +int avio_dump_contents(AVIOContext *h, AVBPrint *pb) +{ + int ret; + char buf[1024]; + while (1) { + ret = avio_read(h, buf, sizeof(buf)); + if (ret == AVERROR_EOF) + return 0; + if (ret <= 0) + return ret; + av_bprint_append_data(pb, buf, ret); + if (!av_bprint_is_complete(pb)) + return AVERROR(ENOMEM); + } +} + /* output in a dynamic buffer */ typedef struct DynBuffer { -- 1.8.5.5 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel