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;