mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
ajasrc: Move frame drop detection after the frame transfer
Otherwise there's a small window between querying the state and doing the transfer in which a frame could be dropped, and we would then output the frame right after the dropped one as if it was the dropped frame. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6208>
This commit is contained in:
parent
170bf0cc8e
commit
86e3009448
1 changed files with 27 additions and 26 deletions
|
@ -2515,32 +2515,6 @@ restart:
|
||||||
GST_TIME_ARGS(status.acRDTSCCurrentTime * 100),
|
GST_TIME_ARGS(status.acRDTSCCurrentTime * 100),
|
||||||
status.acFramesProcessed, status.acFramesDropped, status.acBufferLevel);
|
status.acFramesProcessed, status.acFramesDropped, status.acBufferLevel);
|
||||||
|
|
||||||
if (frames_dropped_last == G_MAXUINT64) {
|
|
||||||
frames_dropped_last = status.acFramesDropped;
|
|
||||||
} else if (frames_dropped_last < status.acFramesDropped) {
|
|
||||||
GST_WARNING_OBJECT(self, "Dropped %" G_GUINT64_FORMAT " frames",
|
|
||||||
status.acFramesDropped - frames_dropped_last);
|
|
||||||
|
|
||||||
GstClockTime timestamp =
|
|
||||||
gst_util_uint64_scale(status.acFramesProcessed + frames_dropped_last,
|
|
||||||
self->configured_info.fps_n,
|
|
||||||
self->configured_info.fps_d * GST_SECOND);
|
|
||||||
GstClockTime timestamp_end = gst_util_uint64_scale(
|
|
||||||
status.acFramesProcessed + status.acFramesDropped,
|
|
||||||
self->configured_info.fps_n,
|
|
||||||
self->configured_info.fps_d * GST_SECOND);
|
|
||||||
|
|
||||||
QueueItem item = {.type = QUEUE_ITEM_TYPE_FRAMES_DROPPED,
|
|
||||||
.frames_dropped = {.driver_side = TRUE,
|
|
||||||
.timestamp_start = timestamp,
|
|
||||||
.timestamp_end = timestamp_end}};
|
|
||||||
gst_queue_array_push_tail_struct(self->queue, &item);
|
|
||||||
g_cond_signal(&self->queue_cond);
|
|
||||||
|
|
||||||
frames_dropped_last = status.acFramesDropped;
|
|
||||||
discont = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status.IsRunning() && status.acBufferLevel > 1) {
|
if (status.IsRunning() && status.acBufferLevel > 1) {
|
||||||
GstBuffer *video_buffer = NULL;
|
GstBuffer *video_buffer = NULL;
|
||||||
GstBuffer *audio_buffer = NULL;
|
GstBuffer *audio_buffer = NULL;
|
||||||
|
@ -2671,6 +2645,33 @@ restart:
|
||||||
transfer_status.acFramesDropped,
|
transfer_status.acFramesDropped,
|
||||||
transfer_status.acBufferLevel);
|
transfer_status.acBufferLevel);
|
||||||
|
|
||||||
|
if (frames_dropped_last == G_MAXUINT64) {
|
||||||
|
frames_dropped_last = transfer_status.acFramesDropped;
|
||||||
|
} else if (frames_dropped_last < transfer_status.acFramesDropped) {
|
||||||
|
GST_WARNING_OBJECT(
|
||||||
|
self, "Dropped %" G_GUINT64_FORMAT " frames",
|
||||||
|
transfer_status.acFramesDropped - frames_dropped_last);
|
||||||
|
|
||||||
|
GstClockTime timestamp = gst_util_uint64_scale(
|
||||||
|
transfer_status.acFramesProcessed + frames_dropped_last,
|
||||||
|
self->configured_info.fps_n,
|
||||||
|
self->configured_info.fps_d * GST_SECOND);
|
||||||
|
GstClockTime timestamp_end = gst_util_uint64_scale(
|
||||||
|
transfer_status.acFramesProcessed + transfer_status.acFramesDropped,
|
||||||
|
self->configured_info.fps_n,
|
||||||
|
self->configured_info.fps_d * GST_SECOND);
|
||||||
|
|
||||||
|
QueueItem item = {.type = QUEUE_ITEM_TYPE_FRAMES_DROPPED,
|
||||||
|
.frames_dropped = {.driver_side = TRUE,
|
||||||
|
.timestamp_start = timestamp,
|
||||||
|
.timestamp_end = timestamp_end}};
|
||||||
|
gst_queue_array_push_tail_struct(self->queue, &item);
|
||||||
|
g_cond_signal(&self->queue_cond);
|
||||||
|
|
||||||
|
frames_dropped_last = transfer_status.acFramesDropped;
|
||||||
|
discont = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
gst_buffer_set_size(audio_buffer, transfer.GetCapturedAudioByteCount());
|
gst_buffer_set_size(audio_buffer, transfer.GetCapturedAudioByteCount());
|
||||||
if (anc_buffer)
|
if (anc_buffer)
|
||||||
gst_buffer_set_size(anc_buffer,
|
gst_buffer_set_size(anc_buffer,
|
||||||
|
|
Loading…
Reference in a new issue