basevideodecoder: subsume skip_frame into finish_frame

This commit is contained in:
Mark Nauwelaerts 2011-03-28 08:59:20 +02:00
parent 0230143cb8
commit 7862d9ed35
3 changed files with 15 additions and 77 deletions

View file

@ -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;

View file

@ -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

View file

@ -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);