Mercurial > libavformat.hg
comparison utils.c @ 4569:0000335f1eba libavformat
Add timestamp computation if values are exported by decoder.
Patch by Ivan Schreter, schreter gmx net
author | cehoyos |
---|---|
date | Tue, 24 Feb 2009 22:19:09 +0000 |
parents | 9b00d2a02fa1 |
children | d80ca49779b1 |
comparison
equal
deleted
inserted
replaced
4568:9b00d2a02fa1 | 4569:0000335f1eba |
---|---|
832 pkt->pts += offset; | 832 pkt->pts += offset; |
833 if(pkt->dts != AV_NOPTS_VALUE) | 833 if(pkt->dts != AV_NOPTS_VALUE) |
834 pkt->dts += offset; | 834 pkt->dts += offset; |
835 } | 835 } |
836 | 836 |
837 if (pc && pc->dts_sync_point >= 0) { | |
838 // we have synchronization info from the parser | |
839 int64_t den = st->codec->time_base.den * (int64_t) st->time_base.num; | |
840 if (den > 0) { | |
841 int64_t num = st->codec->time_base.num * (int64_t) st->time_base.den; | |
842 if (pkt->dts != AV_NOPTS_VALUE) { | |
843 // got DTS from the stream, update reference timestamp | |
844 st->reference_dts = pkt->dts - pc->dts_ref_dts_delta * num / den; | |
845 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den; | |
846 } else if (st->reference_dts != AV_NOPTS_VALUE) { | |
847 // compute DTS based on reference timestamp | |
848 pkt->dts = st->reference_dts + pc->dts_ref_dts_delta * num / den; | |
849 pkt->pts = pkt->dts + pc->pts_dts_delta * num / den; | |
850 } | |
851 if (pc->dts_sync_point > 0) | |
852 st->reference_dts = pkt->dts; // new reference | |
853 } | |
854 } | |
855 | |
837 /* This may be redundant, but it should not hurt. */ | 856 /* This may be redundant, but it should not hurt. */ |
838 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts) | 857 if(pkt->dts != AV_NOPTS_VALUE && pkt->pts != AV_NOPTS_VALUE && pkt->pts > pkt->dts) |
839 presentation_delayed = 1; | 858 presentation_delayed = 1; |
840 | 859 |
841 // av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64" st:%d pc:%p\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts, pkt->stream_index, pc); | 860 // av_log(NULL, AV_LOG_DEBUG, "IN delayed:%d pts:%"PRId64", dts:%"PRId64" cur_dts:%"PRId64" st:%d pc:%p\n", presentation_delayed, pkt->pts, pkt->dts, st->cur_dts, pkt->stream_index, pc); |
1155 st->parser = NULL; | 1174 st->parser = NULL; |
1156 av_free_packet(&st->cur_pkt); | 1175 av_free_packet(&st->cur_pkt); |
1157 } | 1176 } |
1158 st->last_IP_pts = AV_NOPTS_VALUE; | 1177 st->last_IP_pts = AV_NOPTS_VALUE; |
1159 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */ | 1178 st->cur_dts = AV_NOPTS_VALUE; /* we set the current DTS to an unspecified origin */ |
1179 st->reference_dts = AV_NOPTS_VALUE; | |
1160 /* fail safe */ | 1180 /* fail safe */ |
1161 st->cur_ptr = NULL; | 1181 st->cur_ptr = NULL; |
1162 st->cur_len = 0; | 1182 st->cur_len = 0; |
1163 } | 1183 } |
1164 } | 1184 } |
2330 /* default pts setting is MPEG-like */ | 2350 /* default pts setting is MPEG-like */ |
2331 av_set_pts_info(st, 33, 1, 90000); | 2351 av_set_pts_info(st, 33, 1, 90000); |
2332 st->last_IP_pts = AV_NOPTS_VALUE; | 2352 st->last_IP_pts = AV_NOPTS_VALUE; |
2333 for(i=0; i<MAX_REORDER_DELAY+1; i++) | 2353 for(i=0; i<MAX_REORDER_DELAY+1; i++) |
2334 st->pts_buffer[i]= AV_NOPTS_VALUE; | 2354 st->pts_buffer[i]= AV_NOPTS_VALUE; |
2355 st->reference_dts = AV_NOPTS_VALUE; | |
2335 | 2356 |
2336 st->sample_aspect_ratio = (AVRational){0,1}; | 2357 st->sample_aspect_ratio = (AVRational){0,1}; |
2337 | 2358 |
2338 s->streams[s->nb_streams++] = st; | 2359 s->streams[s->nb_streams++] = st; |
2339 return st; | 2360 return st; |