GstFlowReturn gst_base_video_decoder_have_frame (GstBaseVideoDecoder * base_video_decoder, gboolean include_current_buf, GstVideoFrame ** new_frame) { GstVideoFrame *frame = base_video_decoder->current_frame; GstBaseVideoDecoderClass *klass; guint64 frame_end_offset; GstClockTime timestamp, duration; GstClockTime running_time; GstClockTimeDiff deadline; GstFlowReturn ret; klass = GST_BASE_VIDEO_DECODER_GET_CLASS (base_video_decoder); if (include_current_buf) frame_end_offset = base_video_decoder->current_buf_offset; else frame_end_offset = base_video_decoder->prev_buf_offset; gst_base_video_decoder_get_timestamp_at_offset (base_video_decoder, frame_end_offset, ×tamp, &duration); frame->presentation_timestamp = timestamp; frame->presentation_duration = duration; if (GST_VIDEO_FRAME_FLAG_IS_SET (frame, GST_VIDEO_FRAME_FLAG_SYNC_POINT)) base_video_decoder->distance_from_sync = 0; frame->distance_from_sync = base_video_decoder->distance_from_sync; base_video_decoder->distance_from_sync++; GST_DEBUG ("pts %" GST_TIME_FORMAT, GST_TIME_ARGS (frame->presentation_timestamp)); GST_DEBUG ("dts %" GST_TIME_FORMAT, GST_TIME_ARGS (frame->decode_timestamp)); GST_DEBUG ("dist %d", frame->distance_from_sync); running_time = gst_segment_to_running_time (&base_video_decoder->segment, GST_FORMAT_TIME, frame->presentation_timestamp); if (GST_CLOCK_TIME_IS_VALID (base_video_decoder->earliest_time)) deadline = GST_CLOCK_DIFF (base_video_decoder->earliest_time, running_time); else deadline = G_MAXINT64; /* do something with frame */ ret = klass->handle_frame (base_video_decoder, frame, deadline); if (!GST_FLOW_IS_SUCCESS (ret)) { GST_DEBUG ("flow error!"); } /* create new frame */ base_video_decoder->current_frame = gst_base_video_decoder_new_frame (base_video_decoder); if (new_frame) *new_frame = base_video_decoder->current_frame; return ret; }
GstFlowReturn gst_base_video_decoder_have_frame (GstBaseVideoDecoder * base_video_decoder) { GstBuffer *buffer; int n_available; GstClockTime timestamp; GstClockTime duration; GST_DEBUG ("have_frame"); n_available = gst_adapter_available (base_video_decoder->output_adapter); if (n_available) { buffer = gst_adapter_take_buffer (base_video_decoder->output_adapter, n_available); } else { buffer = gst_buffer_new_and_alloc (0); } base_video_decoder->current_frame->sink_buffer = buffer; gst_base_video_decoder_get_timestamp_at_offset (base_video_decoder, base_video_decoder->frame_offset, ×tamp, &duration); GST_BUFFER_TIMESTAMP (buffer) = timestamp; GST_BUFFER_DURATION (buffer) = duration; return gst_base_video_decoder_have_frame_2 (base_video_decoder); }