Created
July 26, 2012 16:42
-
-
Save j0sh/3183133 to your computer and use it in GitHub Desktop.
[PATCH] avf: introduce nobuffer option
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| From 4faf41262ac6a9397aeb2ef09373b3963a3ed308 Mon Sep 17 00:00:00 2001 | |
| From: Luca Barbato <lu_zero@gentoo.org> | |
| Date: Thu, 26 Jul 2012 09:39:55 -0700 | |
| Subject: [PATCH] avf: introduce nobuffer option | |
| Useful in cases where a significant analyzeduration is | |
| still needed, while minimizing buffering before output. | |
| An example is processing low-latency streams where all | |
| media types won't necessarily come in if the | |
| analyzeduration is small. | |
| --- | |
| libavformat/avformat.h | 1 + | |
| libavformat/options_table.h | 1 + | |
| libavformat/utils.c | 12 ++++++++---- | |
| 3 files changed, 10 insertions(+), 4 deletions(-) | |
| diff --git a/libavformat/avformat.h b/libavformat/avformat.h | |
| index e292206..7c97ada 100644 | |
| --- a/libavformat/avformat.h | |
| +++ b/libavformat/avformat.h | |
| @@ -887,6 +887,7 @@ typedef struct AVFormatContext { | |
| #define AVFMT_FLAG_IGNDTS 0x0008 ///< Ignore DTS on frames that contain both DTS & PTS | |
| #define AVFMT_FLAG_NOFILLIN 0x0010 ///< Do not infer any values from other values, just return what is stored in the container | |
| #define AVFMT_FLAG_NOPARSE 0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled | |
| +#define AVFMT_FLAG_NOBUFFER 0x0040 ///< Do not buffer frames when possible | |
| #define AVFMT_FLAG_CUSTOM_IO 0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it. | |
| #define AVFMT_FLAG_DISCARD_CORRUPT 0x0100 ///< Discard frames marked corrupted | |
| diff --git a/libavformat/options_table.h b/libavformat/options_table.h | |
| index 58f3dcf..f3384ca 100644 | |
| --- a/libavformat/options_table.h | |
| +++ b/libavformat/options_table.h | |
| @@ -40,6 +40,7 @@ static const AVOption options[]={ | |
| {"noparse", "disable AVParsers, this needs nofillin too", 0, AV_OPT_TYPE_CONST, {.dbl = AVFMT_FLAG_NOPARSE }, INT_MIN, INT_MAX, D, "fflags"}, | |
| {"igndts", "ignore dts", 0, AV_OPT_TYPE_CONST, {.dbl = AVFMT_FLAG_IGNDTS }, INT_MIN, INT_MAX, D, "fflags"}, | |
| {"discardcorrupt", "discard corrupted frames", 0, AV_OPT_TYPE_CONST, {.dbl = AVFMT_FLAG_DISCARD_CORRUPT }, INT_MIN, INT_MAX, D, "fflags"}, | |
| +{"nobuffer", "reduce the latency introduced by optional buffering", 0, AV_OPT_TYPE_CONST, {.dbl = AVFMT_FLAG_NOBUFFER }, 0, INT_MAX, D, "fflags"}, | |
| {"analyzeduration", "how many microseconds are analyzed to estimate duration", OFFSET(max_analyze_duration), AV_OPT_TYPE_INT, {.dbl = 5*AV_TIME_BASE }, 0, INT_MAX, D}, | |
| {"cryptokey", "decryption key", OFFSET(key), AV_OPT_TYPE_BINARY, {.dbl = 0}, 0, 0, D}, | |
| {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), AV_OPT_TYPE_INT, {.dbl = 1<<20 }, 0, INT_MAX, D}, | |
| diff --git a/libavformat/utils.c b/libavformat/utils.c | |
| index 156c527..dee5a14 100644 | |
| --- a/libavformat/utils.c | |
| +++ b/libavformat/utils.c | |
| @@ -2382,10 +2382,14 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) | |
| break; | |
| } | |
| - pkt= add_to_pktbuf(&ic->packet_buffer, &pkt1, &ic->packet_buffer_end); | |
| - if ((ret = av_dup_packet(pkt)) < 0) | |
| - goto find_stream_info_err; | |
| - | |
| + if (ic->flags & AVFMT_FLAG_NOBUFFER) { | |
| + pkt = &pkt1; | |
| + } else { | |
| + pkt = add_to_pktbuf(&ic->packet_buffer, &pkt1, | |
| + &ic->packet_buffer_end); | |
| + if ((ret = av_dup_packet(pkt)) < 0) | |
| + goto find_stream_info_err; | |
| + } | |
| read_size += pkt->size; | |
| st = ic->streams[pkt->stream_index]; | |
| -- | |
| 1.7.9.5 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment