Add timestamp computation if values are exported by decoder.
Patch by Ivan Schreter, schreter gmx net Originally committed as revision 17574 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
4d8f830125
commit
27ca0a79c9
4 changed files with 78 additions and 3 deletions
|
|
@ -22,8 +22,8 @@
|
|||
#define AVFORMAT_AVFORMAT_H
|
||||
|
||||
#define LIBAVFORMAT_VERSION_MAJOR 52
|
||||
#define LIBAVFORMAT_VERSION_MINOR 29
|
||||
#define LIBAVFORMAT_VERSION_MICRO 2
|
||||
#define LIBAVFORMAT_VERSION_MINOR 30
|
||||
#define LIBAVFORMAT_VERSION_MICRO 0
|
||||
|
||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||
LIBAVFORMAT_VERSION_MINOR, \
|
||||
|
|
@ -494,6 +494,16 @@ typedef struct AVStream {
|
|||
const uint8_t *cur_ptr;
|
||||
int cur_len;
|
||||
AVPacket cur_pkt;
|
||||
|
||||
// Timestamp generation support:
|
||||
/**
|
||||
* Timestamp corresponding to the last dts sync point.
|
||||
*
|
||||
* Initialized when AVCodecParserContext.dts_sync_point >= 0 and
|
||||
* a DTS is received from the underlying container. Otherwise set to
|
||||
* AV_NOPTS_VALUE by default.
|
||||
*/
|
||||
int64_t reference_dts;
|
||||
} AVStream;
|
||||
|
||||
#define AV_PROGRAM_RUNNING 1
|
||||
|
|
|
|||
|
|
@ -834,6 +834,25 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
|
|||
pkt->dts += offset;
|
||||
}
|
||||
|
||||
if (pc && pc->dts_sync_point >= 0) {
|
||||
// we have synchronization info from the parser
|
||||
int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num;
|
||||
if (den > 0) {
|
||||
int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den;
|
||||
if (pkt->dts != AV_NOPTS_VALUE) {
|
||||
// got DTS from the stream, update reference timestamp
|
||||
st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den;
|
||||
pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
|
||||
} else if (st->reference_dts != AV_NOPTS_VALUE) {
|
||||
// compute DTS based on reference timestamp
|
||||
pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den;
|
||||
pkt->pts = pkt->dts + pc->pts_dts_delta * num / den;
|
||||
}
|
||||
if (pc->dts_sync_point > 0)
|
||||
st->reference_dts = pkt->dts; // new reference
|
||||
}
|
||||
}
|
||||
|
||||
/* This may be redundant, but it should not hurt. */
|
||||
if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts)
|
||||
presentation_delayed = 1;
|
||||
|
|
@ -1157,6 +1176,7 @@ static void av_read_frame_flush(AVFormatContext *s)
|
|||
}
|
||||
st->last_IP_pts = AV_NOPTS_VALUE;
|
||||
st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */
|
||||
st->reference_dts = AV_NOPTS_VALUE;
|
||||
/* fail safe */
|
||||
st->cur_ptr = NULL;
|
||||
st->cur_len = 0;
|
||||
|
|
@ -2332,6 +2352,7 @@ AVStream *av_new_stream(AVFormatContext *s, int id)
|
|||
st->last_IP_pts = AV_NOPTS_VALUE;
|
||||
for(i=0; i<MAX_REORDER_DELAY+1; i++)
|
||||
st->pts_buffer[i]= AV_NOPTS_VALUE;
|
||||
st->reference_dts = AV_NOPTS_VALUE;
|
||||
|
||||
st->sample_aspect_ratio = (AVRational){0,1};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue