summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorJoakim Plate <elupus@ecce.se>2007-04-13 07:50:04 +0000
committerBenoit Fouet <benoit.fouet@free.fr>2007-04-13 07:50:04 +0000
commita74008a4c3b23707e610db0b2f042c2c8347b08f (patch)
treea558adf1257e89c36b0d64864dd9ff19490e9c46 /libavformat
parent946d3b12a14ba661a2cdeaa1e85af224310b5753 (diff)
downloadffmpeg-a74008a4c3b23707e610db0b2f042c2c8347b08f.tar.gz
timestamps generation improvement when parsing avi
patch by Joakim \ elupus chez ecce dot se / original thread: date: 03/19/2007 01:47 AM subject: [Ffmpeg-devel] [RFC] Improvement for the odd timestamp generation when parser is in use. Originally committed as revision 8725 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/avformat.h7
-rw-r--r--libavformat/avidec.c4
-rw-r--r--libavformat/utils.c11
3 files changed, 17 insertions, 5 deletions
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index c5d5df0197..d6525954bb 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -25,8 +25,8 @@
extern "C" {
#endif
-#define LIBAVFORMAT_VERSION_INT ((51<<16)+(12<<8)+0)
-#define LIBAVFORMAT_VERSION 51.12.0
+#define LIBAVFORMAT_VERSION_INT ((51<<16)+(12<<8)+1)
+#define LIBAVFORMAT_VERSION 51.12.1
#define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT
#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION)
@@ -309,7 +309,8 @@ typedef struct AVStream {
char language[4]; /** ISO 639 3-letter language code (empty string if undefined) */
/* av_read_frame() support */
- int need_parsing; ///< 1->full parsing needed, 2->only parse headers dont repack
+#define AVSTREAM_PARSE_TIMESTAMPS 3 /**< full parsing and interpolation of timestamps for frames not starting on packet boundary */
+ int need_parsing; ///< 1->full parsing needed, 2->only parse headers dont repack, 3->full parsing and interpolate timestamps
struct AVCodecParserContext *parser;
int64_t cur_dts;
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 02078bc77b..d434c57181 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -452,8 +452,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
if (size%2) /* 2-aligned (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */
url_fskip(pb, 1);
/* Force parsing as several audio frames can be in
- * one packet. */
- st->need_parsing = 1;
+ * one packet and timestamps refer to packet start*/
+ st->need_parsing = AVSTREAM_PARSE_TIMESTAMPS;
/* ADTS header is in extradata, AAC without header must be stored as exact frames, parser not needed and it will fail */
if (st->codec->codec_id == CODEC_ID_AAC && st->codec->extradata_size)
st->need_parsing = 0;
diff --git a/libavformat/utils.c b/libavformat/utils.c
index c82d7dac84..b748b546ca 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -584,6 +584,7 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
AVCodecParserContext *pc, AVPacket *pkt)
{
int num, den, presentation_delayed, delay, i;
+ int64_t offset;
/* handle wrapping */
if(st->cur_dts != AV_NOPTS_VALUE){
if(pkt->pts != AV_NOPTS_VALUE)
@@ -599,6 +600,16 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
}
}
+ /* correct timestamps with byte offset if demuxers only have timestamps on packet boundaries */
+ if(pc && st->need_parsing == AVSTREAM_PARSE_TIMESTAMPS && pkt->size){
+ /* this will estimate bitrate based on this frame's duration and size */
+ offset = av_rescale(pc->offset, pkt->duration, pkt->size);
+ if(pkt->pts != AV_NOPTS_VALUE)
+ pkt->pts += offset;
+ if(pkt->dts != AV_NOPTS_VALUE)
+ pkt->dts += offset;
+ }
+
if(is_intra_only(st->codec))
pkt->flags |= PKT_FLAG_KEY;