summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Schmidt <jan@centricular.com>2014-12-11 21:07:44 +1100
committerJan Schmidt <jan@centricular.com>2015-01-27 04:35:08 +1100
commit5758e82eaf94b652bd0e7fb4638f1e24563aa544 (patch)
treecb205be8e651d10483b6504488048d1eee62f91d
parent99fb9bb2074692d3ca1e78222177c1988a45fbc8 (diff)
avviddec: Implement SKIP and new SKIP_KEY_UNITS_ONLY flags
Respect any skip flags set in the incoming segment. https://bugzilla.gnome.org/show_bug.cgi?id=735666
-rw-r--r--ext/libav/gstavviddec.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c
index 5a1b7ed..219a87c 100644
--- a/ext/libav/gstavviddec.c
+++ b/ext/libav/gstavviddec.c
@@ -1072,12 +1072,22 @@ gst_ffmpegviddec_do_qos (GstFFMpegVidDec * ffmpegdec,
GstVideoCodecFrame * frame, gboolean * mode_switch)
{
GstClockTimeDiff diff;
+ GstSegmentFlags skip_flags =
+ GST_VIDEO_DECODER_INPUT_SEGMENT (ffmpegdec).flags;
*mode_switch = FALSE;
if (frame == NULL)
return;
+ if (skip_flags & GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS) {
+ ffmpegdec->context->skip_frame = AVDISCARD_NONKEY;
+ *mode_switch = TRUE;
+ } else if (skip_flags & GST_SEGMENT_FLAG_TRICKMODE) {
+ ffmpegdec->context->skip_frame = AVDISCARD_NONREF;
+ *mode_switch = TRUE;
+ }
+
diff =
gst_video_decoder_get_max_decode_time (GST_VIDEO_DECODER (ffmpegdec),
frame);
@@ -1088,17 +1098,19 @@ gst_ffmpegviddec_do_qos (GstFFMpegVidDec * ffmpegdec,
GST_DEBUG_OBJECT (ffmpegdec, "decoding time %" G_GINT64_FORMAT, diff);
- if (diff > 0 && ffmpegdec->context->skip_frame != AVDISCARD_DEFAULT) {
- ffmpegdec->context->skip_frame = AVDISCARD_DEFAULT;
- *mode_switch = TRUE;
- GST_DEBUG_OBJECT (ffmpegdec, "QOS: normal mode");
- }
+ if (*mode_switch == FALSE) {
+ if (diff > 0 && ffmpegdec->context->skip_frame != AVDISCARD_DEFAULT) {
+ ffmpegdec->context->skip_frame = AVDISCARD_DEFAULT;
+ *mode_switch = TRUE;
+ GST_DEBUG_OBJECT (ffmpegdec, "QOS: normal mode");
+ }
- else if (diff <= 0 && ffmpegdec->context->skip_frame != AVDISCARD_NONREF) {
- ffmpegdec->context->skip_frame = AVDISCARD_NONREF;
- *mode_switch = TRUE;
- GST_DEBUG_OBJECT (ffmpegdec,
- "QOS: hurry up, diff %" G_GINT64_FORMAT " >= 0", diff);
+ else if (diff <= 0 && ffmpegdec->context->skip_frame != AVDISCARD_NONREF) {
+ ffmpegdec->context->skip_frame = AVDISCARD_NONREF;
+ *mode_switch = TRUE;
+ GST_DEBUG_OBJECT (ffmpegdec,
+ "QOS: hurry up, diff %" G_GINT64_FORMAT " >= 0", diff);
+ }
}
}