summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2010-03-31 12:55:16 +0000
committerMichael Niedermayer <michaelni@gmx.at>2010-03-31 12:55:16 +0000
commitfe8344a276aa3179bac6807e543fd86cd6ee5aa8 (patch)
tree9f26c796d3b7ad469e10e14f52804f0fb83f32f7
parentcc947f04cc16033d651fda5aab91e4a3c4b6bd4d (diff)
Add AVFMT_FLAG_NOFILLIN and AVFMT_FLAG_NOPARSE.
Originally committed as revision 22745 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/avformat.h2
-rw-r--r--libavformat/options.c2
-rw-r--r--libavformat/utils.c7
3 files changed, 9 insertions, 2 deletions
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 65e32bb043..d306355fb6 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -648,6 +648,8 @@ typedef struct AVFormatContext {
#define AVFMT_FLAG_IGNIDX 0x0002 ///< Ignore index.
#define AVFMT_FLAG_NONBLOCK 0x0004 ///< Do not block when reading packets from input.
#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
int loop_input;
/** decoding: size of data to probe; encoding: unused. */
diff --git a/libavformat/options.c b/libavformat/options.c
index e595d22cca..e8fb7cc5e8 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -46,6 +46,8 @@ static const AVOption options[]={
{"fflags", NULL, OFFSET(flags), FF_OPT_TYPE_FLAGS, DEFAULT, INT_MIN, INT_MAX, D|E, "fflags"},
{"ignidx", "ignore index", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNIDX, INT_MIN, INT_MAX, D, "fflags"},
{"genpts", "generate pts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_GENPTS, INT_MIN, INT_MAX, D, "fflags"},
+{"nofillin", "do not fill in missing values that can be exactly calculated", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_NOFILLIN, INT_MIN, INT_MAX, D, "fflags"},
+{"noparse", "disable AVParsers, this needs nofillin too", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_NOPARSE, INT_MIN, INT_MAX, D, "fflags"},
{"igndts", "ingore dts", 0, FF_OPT_TYPE_CONST, AVFMT_FLAG_IGNDTS, INT_MIN, INT_MAX, D, "fflags"},
#if LIBAVFORMAT_VERSION_INT < (53<<16)
{"track", " set the track number", OFFSET(track), FF_OPT_TYPE_INT, DEFAULT, 0, INT_MAX, E},
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 9b83fdd355..929f5a418c 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -851,6 +851,9 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
int num, den, presentation_delayed, delay, i;
int64_t offset;
+ if (s->flags & AVFMT_FLAG_NOFILLIN)
+ return;
+
if((s->flags & AVFMT_FLAG_IGNDTS) && pkt->pts != AV_NOPTS_VALUE)
pkt->dts= AV_NOPTS_VALUE;
@@ -1108,7 +1111,7 @@ static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
s->cur_st = st;
st->cur_ptr = st->cur_pkt.data;
st->cur_len = st->cur_pkt.size;
- if (st->need_parsing && !st->parser) {
+ if (st->need_parsing && !st->parser && !(s->flags & AVFMT_FLAG_NOPARSE)) {
st->parser = av_parser_init(st->codec->codec_id);
if (!st->parser) {
/* no parser available: just output the raw packets */
@@ -2139,7 +2142,7 @@ int av_find_stream_info(AVFormatContext *ic)
st->codec->time_base= st->time_base;
}
//only for the split stuff
- if (!st->parser) {
+ if (!st->parser && !(ic->flags & AVFMT_FLAG_NOPARSE)) {
st->parser = av_parser_init(st->codec->codec_id);
if(st->need_parsing == AVSTREAM_PARSE_HEADERS && st->parser){
st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;