diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-03-31 21:49:02 +0100 |
---|---|---|
committer | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2016-04-03 13:04:17 -0400 |
commit | 6518cbc52a8c59f8f590405a852385adbc47ed62 (patch) | |
tree | 8190319ae6f22317b30f92d65c804e7733712860 | |
parent | 06c4ed0c0e349602ae6ca31c39693f73bce9bf61 (diff) | |
download | ffmpeg-6518cbc52a8c59f8f590405a852385adbc47ed62.tar.gz |
lavc/utils: Introduce ff_bprint_to_codecpar_extradata for avformat
It will be used by text subtitle demuxers to construct format instructions
straight into extradata. They all currently a similar function that accepts
an AVCodecContext instead.
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
-rw-r--r-- | libavformat/internal.h | 7 | ||||
-rw-r--r-- | libavformat/utils.c | 23 |
2 files changed, 30 insertions, 0 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h index 7defce88a7..cd390ddf70 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -22,6 +22,8 @@ #define AVFORMAT_INTERNAL_H #include <stdint.h> + +#include "libavutil/bprint.h" #include "avformat.h" #include "os_support.h" @@ -596,4 +598,9 @@ int ff_reshuffle_raw_rgb(AVFormatContext *s, AVPacket **ppkt, AVCodecContext *en */ int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t *palette); +/** + * Finalize buf into extradata and set its size appropriately. + */ +int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf); + #endif /* AVFORMAT_INTERNAL_H */ diff --git a/libavformat/utils.c b/libavformat/utils.c index 3bd2df3013..3bf96adaab 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4866,3 +4866,26 @@ int ff_get_packet_palette(AVFormatContext *s, AVPacket *pkt, int ret, uint32_t * return 0; } + +int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf) +{ + int ret; + char *str; + + ret = av_bprint_finalize(buf, &str); + if (ret < 0) + return ret; + if (!av_bprint_is_complete(buf)) { + av_free(str); + return AVERROR(ENOMEM); + } + + par->extradata = str; + /* Note: the string is NUL terminated (so extradata can be read as a + * string), but the ending character is not accounted in the size (in + * binary formats you are likely not supposed to mux that character). When + * extradata is copied, it is also padded with AV_INPUT_BUFFER_PADDING_SIZE + * zeros. */ + par->extradata_size = buf->len; + return 0; +} |