[FFmpeg-devel] [PATCH 4/4] libavdevice/avfoundation: use pts/dts provided by the CMSampleBuffer API
matthieu.bouron at gmail.com
matthieu.bouron at gmail.com
Fri Mar 13 20:16:55 CET 2015
From: Matthieu Bouron <matthieu.bouron at gmail.com>
---
libavdevice/avfoundation.m | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/libavdevice/avfoundation.m b/libavdevice/avfoundation.m
index 8112229..5bcd6a4 100644
--- a/libavdevice/avfoundation.m
+++ b/libavdevice/avfoundation.m
@@ -881,9 +881,14 @@ static int avf_read_packet(AVFormatContext *s, AVPacket *pkt)
return AVERROR(EIO);
}
- pkt->pts = pkt->dts = av_rescale_q(av_gettime() - ctx->first_pts,
- AV_TIME_BASE_Q,
- avf_time_base_q);
+ CMItemCount count;
+ CMSampleTimingInfo timing_info;
+
+ if (CMSampleBufferGetOutputSampleTimingInfoArray(ctx->current_frame, 1, &timing_info, &count) == noErr) {
+ AVRational timebase_q = av_make_q(1, timing_info.presentationTimeStamp.timescale);
+ pkt->pts = pkt->dts = av_rescale_q(timing_info.presentationTimeStamp.value, timebase_q, avf_time_base_q);
+ }
+
pkt->stream_index = ctx->video_stream_index;
pkt->flags |= AV_PKT_FLAG_KEY;
@@ -911,9 +916,13 @@ static int avf_read_packet(AVFormatContext *s, AVPacket *pkt)
return AVERROR(EIO);
}
- pkt->pts = pkt->dts = av_rescale_q(av_gettime() - ctx->first_audio_pts,
- AV_TIME_BASE_Q,
- avf_time_base_q);
+ CMItemCount count;
+ CMSampleTimingInfo timing_info;
+
+ if (CMSampleBufferGetOutputSampleTimingInfoArray(ctx->current_audio_frame, 1, &timing_info, &count) == noErr) {
+ AVRational timebase_q = av_make_q(1, timing_info.presentationTimeStamp.timescale);
+ pkt->pts = pkt->dts = av_rescale_q(timing_info.presentationTimeStamp.value, timebase_q, avf_time_base_q);
+ }
pkt->stream_index = ctx->audio_stream_index;
pkt->flags |= AV_PKT_FLAG_KEY;
--
2.3.2
More information about the ffmpeg-devel
mailing list