mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
basevideodecoder: subsume skip_frame into finish_frame
This commit is contained in:
parent
0230143cb8
commit
7862d9ed35
3 changed files with 15 additions and 77 deletions
|
@ -381,7 +381,7 @@ gst_vp8_dec_handle_frame (GstBaseVideoDecoder * decoder, GstVideoFrame * frame)
|
||||||
|
|
||||||
if (status != VPX_CODEC_OK || !stream_info.is_kf) {
|
if (status != VPX_CODEC_OK || !stream_info.is_kf) {
|
||||||
GST_WARNING_OBJECT (decoder, "No keyframe, skipping");
|
GST_WARNING_OBJECT (decoder, "No keyframe, skipping");
|
||||||
gst_base_video_decoder_skip_frame (decoder, frame);
|
gst_base_video_decoder_finish_frame (decoder, frame);
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,7 +469,7 @@ gst_vp8_dec_handle_frame (GstBaseVideoDecoder * decoder, GstVideoFrame * frame)
|
||||||
if (deadline < 0) {
|
if (deadline < 0) {
|
||||||
GST_LOG_OBJECT (dec, "Skipping late frame (%f s past deadline)",
|
GST_LOG_OBJECT (dec, "Skipping late frame (%f s past deadline)",
|
||||||
(double) -deadline / GST_SECOND);
|
(double) -deadline / GST_SECOND);
|
||||||
gst_base_video_decoder_skip_frame (decoder, frame);
|
gst_base_video_decoder_finish_frame (decoder, frame);
|
||||||
} else {
|
} else {
|
||||||
ret = gst_base_video_decoder_alloc_src_frame (decoder, frame);
|
ret = gst_base_video_decoder_alloc_src_frame (decoder, frame);
|
||||||
|
|
||||||
|
@ -477,7 +477,7 @@ gst_vp8_dec_handle_frame (GstBaseVideoDecoder * decoder, GstVideoFrame * frame)
|
||||||
gst_vp8_dec_image_to_buffer (dec, img, frame->src_buffer);
|
gst_vp8_dec_image_to_buffer (dec, img, frame->src_buffer);
|
||||||
gst_base_video_decoder_finish_frame (decoder, frame);
|
gst_base_video_decoder_finish_frame (decoder, frame);
|
||||||
} else {
|
} else {
|
||||||
gst_base_video_decoder_skip_frame (decoder, frame);
|
gst_base_video_decoder_finish_frame (decoder, frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,7 +489,7 @@ gst_vp8_dec_handle_frame (GstBaseVideoDecoder * decoder, GstVideoFrame * frame)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Invisible frame */
|
/* Invisible frame */
|
||||||
gst_base_video_decoder_skip_frame (decoder, frame);
|
gst_base_video_decoder_finish_frame (decoder, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -901,6 +901,7 @@ gst_base_video_decoder_finish_frame (GstBaseVideoDecoder * base_video_decoder,
|
||||||
{
|
{
|
||||||
GstVideoState *state = &GST_BASE_VIDEO_CODEC (base_video_decoder)->state;
|
GstVideoState *state = &GST_BASE_VIDEO_CODEC (base_video_decoder)->state;
|
||||||
GstBuffer *src_buffer;
|
GstBuffer *src_buffer;
|
||||||
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (base_video_decoder, "finish frame");
|
GST_DEBUG_OBJECT (base_video_decoder, "finish frame");
|
||||||
GST_DEBUG_OBJECT (base_video_decoder, "n %d in %d out %d",
|
GST_DEBUG_OBJECT (base_video_decoder, "n %d in %d out %d",
|
||||||
|
@ -969,6 +970,13 @@ gst_base_video_decoder_finish_frame (GstBaseVideoDecoder * base_video_decoder,
|
||||||
}
|
}
|
||||||
base_video_decoder->last_timestamp = frame->presentation_timestamp;
|
base_video_decoder->last_timestamp = frame->presentation_timestamp;
|
||||||
|
|
||||||
|
/* no buffer data means this frame is skipped/dropped */
|
||||||
|
if (!frame->src_buffer) {
|
||||||
|
GST_DEBUG_OBJECT (base_video_decoder, "skipping frame %" GST_TIME_FORMAT,
|
||||||
|
GST_TIME_ARGS (frame->presentation_timestamp));
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
src_buffer = gst_buffer_make_metadata_writable (frame->src_buffer);
|
src_buffer = gst_buffer_make_metadata_writable (frame->src_buffer);
|
||||||
frame->src_buffer = NULL;
|
frame->src_buffer = NULL;
|
||||||
|
|
||||||
|
@ -1005,15 +1013,10 @@ gst_base_video_decoder_finish_frame (GstBaseVideoDecoder * base_video_decoder,
|
||||||
GST_DEBUG_OBJECT (base_video_decoder, "pushing frame %" GST_TIME_FORMAT,
|
GST_DEBUG_OBJECT (base_video_decoder, "pushing frame %" GST_TIME_FORMAT,
|
||||||
GST_TIME_ARGS (frame->presentation_timestamp));
|
GST_TIME_ARGS (frame->presentation_timestamp));
|
||||||
|
|
||||||
GST_BASE_VIDEO_CODEC (base_video_decoder)->frames =
|
|
||||||
g_list_remove (GST_BASE_VIDEO_CODEC (base_video_decoder)->frames, frame);
|
|
||||||
|
|
||||||
gst_base_video_decoder_set_src_caps (base_video_decoder);
|
gst_base_video_decoder_set_src_caps (base_video_decoder);
|
||||||
gst_buffer_set_caps (src_buffer,
|
gst_buffer_set_caps (src_buffer,
|
||||||
GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder)));
|
GST_PAD_CAPS (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder)));
|
||||||
|
|
||||||
gst_base_video_decoder_free_frame (frame);
|
|
||||||
|
|
||||||
if (base_video_decoder->sink_clipping) {
|
if (base_video_decoder->sink_clipping) {
|
||||||
gint64 start = GST_BUFFER_TIMESTAMP (src_buffer);
|
gint64 start = GST_BUFFER_TIMESTAMP (src_buffer);
|
||||||
gint64 stop = GST_BUFFER_TIMESTAMP (src_buffer) +
|
gint64 stop = GST_BUFFER_TIMESTAMP (src_buffer) +
|
||||||
|
@ -1049,78 +1052,15 @@ gst_base_video_decoder_finish_frame (GstBaseVideoDecoder * base_video_decoder,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return gst_pad_push (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder),
|
ret = gst_pad_push (GST_BASE_VIDEO_CODEC_SRC_PAD (base_video_decoder),
|
||||||
src_buffer);
|
src_buffer);
|
||||||
}
|
|
||||||
|
|
||||||
GstFlowReturn
|
|
||||||
gst_base_video_decoder_skip_frame (GstBaseVideoDecoder * base_video_decoder,
|
|
||||||
GstVideoFrame * frame)
|
|
||||||
{
|
|
||||||
GST_DEBUG_OBJECT (base_video_decoder, "finish frame");
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (base_video_decoder,
|
|
||||||
"finish frame sync=%d pts=%" GST_TIME_FORMAT, frame->is_sync_point,
|
|
||||||
GST_TIME_ARGS (frame->presentation_timestamp));
|
|
||||||
|
|
||||||
if (GST_CLOCK_TIME_IS_VALID (frame->presentation_timestamp)) {
|
|
||||||
if (frame->presentation_timestamp != base_video_decoder->timestamp_offset) {
|
|
||||||
GST_DEBUG_OBJECT (base_video_decoder,
|
|
||||||
"sync timestamp %" GST_TIME_FORMAT " diff %" GST_TIME_FORMAT,
|
|
||||||
GST_TIME_ARGS (frame->presentation_timestamp),
|
|
||||||
GST_TIME_ARGS (frame->presentation_timestamp -
|
|
||||||
GST_BASE_VIDEO_CODEC (base_video_decoder)->segment.start));
|
|
||||||
base_video_decoder->timestamp_offset = frame->presentation_timestamp;
|
|
||||||
base_video_decoder->field_index = 0;
|
|
||||||
} else {
|
|
||||||
/* This case is for one initial timestamp and no others, e.g.,
|
|
||||||
* filesrc ! decoder ! xvimagesink */
|
|
||||||
GST_WARNING_OBJECT (base_video_decoder,
|
|
||||||
"sync timestamp didn't change, ignoring");
|
|
||||||
frame->presentation_timestamp = GST_CLOCK_TIME_NONE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (frame->is_sync_point) {
|
|
||||||
GST_WARNING_OBJECT (base_video_decoder,
|
|
||||||
"sync point doesn't have timestamp");
|
|
||||||
if (GST_CLOCK_TIME_IS_VALID (base_video_decoder->timestamp_offset)) {
|
|
||||||
GST_WARNING_OBJECT (base_video_decoder,
|
|
||||||
"No base timestamp. Assuming frames start at segment start");
|
|
||||||
base_video_decoder->timestamp_offset =
|
|
||||||
GST_BASE_VIDEO_CODEC (base_video_decoder)->segment.start;
|
|
||||||
base_video_decoder->field_index = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
frame->field_index = base_video_decoder->field_index;
|
|
||||||
base_video_decoder->field_index += frame->n_fields;
|
|
||||||
|
|
||||||
if (frame->presentation_timestamp == GST_CLOCK_TIME_NONE) {
|
|
||||||
frame->presentation_timestamp =
|
|
||||||
gst_base_video_decoder_get_field_timestamp (base_video_decoder,
|
|
||||||
frame->field_index);
|
|
||||||
frame->presentation_duration = GST_CLOCK_TIME_NONE;
|
|
||||||
frame->decode_timestamp =
|
|
||||||
gst_base_video_decoder_get_timestamp (base_video_decoder,
|
|
||||||
frame->decode_frame_number);
|
|
||||||
}
|
|
||||||
if (frame->presentation_duration == GST_CLOCK_TIME_NONE) {
|
|
||||||
frame->presentation_duration =
|
|
||||||
gst_base_video_decoder_get_field_duration (base_video_decoder,
|
|
||||||
frame->n_fields);
|
|
||||||
}
|
|
||||||
|
|
||||||
base_video_decoder->last_timestamp = frame->presentation_timestamp;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (base_video_decoder, "skipping frame %" GST_TIME_FORMAT,
|
|
||||||
GST_TIME_ARGS (frame->presentation_timestamp));
|
|
||||||
|
|
||||||
|
done:
|
||||||
GST_BASE_VIDEO_CODEC (base_video_decoder)->frames =
|
GST_BASE_VIDEO_CODEC (base_video_decoder)->frames =
|
||||||
g_list_remove (GST_BASE_VIDEO_CODEC (base_video_decoder)->frames, frame);
|
g_list_remove (GST_BASE_VIDEO_CODEC (base_video_decoder)->frames, frame);
|
||||||
|
|
||||||
gst_base_video_decoder_free_frame (frame);
|
gst_base_video_decoder_free_frame (frame);
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -149,8 +149,6 @@ void gst_base_video_decoder_add_to_frame (GstBaseVideoDecoder *base_video_decode
|
||||||
int n_bytes);
|
int n_bytes);
|
||||||
GstFlowReturn gst_base_video_decoder_finish_frame (GstBaseVideoDecoder *base_video_decoder,
|
GstFlowReturn gst_base_video_decoder_finish_frame (GstBaseVideoDecoder *base_video_decoder,
|
||||||
GstVideoFrame *frame);
|
GstVideoFrame *frame);
|
||||||
GstFlowReturn gst_base_video_decoder_skip_frame (GstBaseVideoDecoder * base_video_decoder,
|
|
||||||
GstVideoFrame * frame);
|
|
||||||
GstFlowReturn
|
GstFlowReturn
|
||||||
gst_base_video_decoder_have_frame (GstBaseVideoDecoder *base_video_decoder);
|
gst_base_video_decoder_have_frame (GstBaseVideoDecoder *base_video_decoder);
|
||||||
GstVideoState * gst_base_video_decoder_get_state (GstBaseVideoDecoder *base_video_decoder);
|
GstVideoState * gst_base_video_decoder_get_state (GstBaseVideoDecoder *base_video_decoder);
|
||||||
|
|
Loading…
Reference in a new issue