aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Converse <alex.converse@gmail.com>2010-05-26 04:20:32 +0000
committerAlex Converse <alex.converse@gmail.com>2010-05-26 04:20:32 +0000
commit74a6df59e3bc206931e8e7270c4bb6af77c6e5dc (patch)
treed18c34e54a3c4e7546dba4ad2004463faaeac263
parent9069b7d35fba37e0e0d9dbb44f03c10ff2e50acf (diff)
downloadffmpeg-74a6df59e3bc206931e8e7270c4bb6af77c6e5dc.tar.gz
Add an AVSTREAM_PARSE_FULL_ONCE parsing mode to parse headers and combine packets once and only once.
Originally committed as revision 23332 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/avcodec.h3
-rw-r--r--libavcodec/h264_parser.c3
-rw-r--r--libavformat/avformat.h3
-rw-r--r--libavformat/utils.c2
4 files changed, 9 insertions, 2 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 435b0fb702..239f605b65 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -30,7 +30,7 @@
#include "libavutil/avutil.h"
#define LIBAVCODEC_VERSION_MAJOR 52
-#define LIBAVCODEC_VERSION_MINOR 69
+#define LIBAVCODEC_VERSION_MINOR 70
#define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
@@ -3649,6 +3649,7 @@ typedef struct AVCodecParserContext {
int flags;
#define PARSER_FLAG_COMPLETE_FRAMES 0x0001
+#define PARSER_FLAG_ONCE 0x0002
int64_t offset; ///< byte offset from starting packet start
int64_t cur_frame_end[AV_PARSER_PTS_NB];
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
index a3cbe3b39c..88529505af 100644
--- a/libavcodec/h264_parser.c
+++ b/libavcodec/h264_parser.c
@@ -272,6 +272,9 @@ static int h264_parse(AVCodecParserContext *s,
s->dts_ref_dts_delta = INT_MIN;
s->pts_dts_delta = INT_MIN;
}
+ if (s->flags & PARSER_FLAG_ONCE) {
+ s->flags &= PARSER_FLAG_COMPLETE_FRAMES;
+ }
}
*poutbuf = buf;
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 47b017815b..0b122d1a02 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -22,7 +22,7 @@
#define AVFORMAT_AVFORMAT_H
#define LIBAVFORMAT_VERSION_MAJOR 52
-#define LIBAVFORMAT_VERSION_MINOR 65
+#define LIBAVFORMAT_VERSION_MINOR 66
#define LIBAVFORMAT_VERSION_MICRO 0
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
@@ -377,6 +377,7 @@ enum AVStreamParseType {
AVSTREAM_PARSE_FULL, /**< full parsing and repack */
AVSTREAM_PARSE_HEADERS, /**< Only parse headers, do not repack. */
AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */
+ AVSTREAM_PARSE_FULL_ONCE, /**< full parsing and repack of the first frame only, only implemented for H.264 currently */
};
typedef struct AVIndexEntry {
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 62c56e490c..d1b77705e5 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -1117,6 +1117,8 @@ static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
st->need_parsing = AVSTREAM_PARSE_NONE;
}else if(st->need_parsing == AVSTREAM_PARSE_HEADERS){
st->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;
+ }else if(st->need_parsing == AVSTREAM_PARSE_FULL_ONCE){
+ st->parser->flags |= PARSER_FLAG_ONCE;
}
if(st->parser && (s->iformat->flags & AVFMT_GENERIC_INDEX)){
st->parser->next_frame_offset=