diff options
author | Aleksey Lim <alsroot@member.fsf.org> | 2009-04-25 04:23:32 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@member.fsf.org> | 2009-04-25 04:23:32 (GMT) |
commit | c6e113145409bf5ea5868b270507083462be64d1 (patch) | |
tree | c59bfcbd7fe8f8a835cf1a5efa4a0aea82f973c0 | |
parent | 3082ebf9d266a9c11802a1744c99e682001c80e3 (diff) |
Let theoraenc treat first buffer as a buffer with keyframe
-rw-r--r-- | gst/gstvideorate.c | 11 | ||||
-rw-r--r-- | gst/gstvideorate.h | 4 |
2 files changed, 15 insertions, 0 deletions
diff --git a/gst/gstvideorate.c b/gst/gstvideorate.c index 8ba9ede..b728357 100644 --- a/gst/gstvideorate.c +++ b/gst/gstvideorate.c @@ -396,6 +396,8 @@ gst_video_rate_init (GstVideoRate * videorate, GstVideoRateClass * klass) videorate->from_rate_denominator = 0; videorate->to_rate_numerator = 0; videorate->to_rate_denominator = 0; + + videorate->first_pass_buffer = TRUE; } /* flush the oldest buffer */ @@ -714,6 +716,13 @@ gst_video_rate_chain (GstPad * pad, GstBuffer * buffer) gst_buffer_unref (buffer); goto done; } + + // XXX let downstream theoraenc treat first buffer + // as a buffer with keyframe + if (videorate->first_pass_buffer == TRUE) { + videorate->first_pass_buffer = FALSE; + break; + } } /* continue while the first one was the best */ } @@ -842,6 +851,8 @@ gst_video_rate_change_state (GstElement * element, GstStateChange transition) case GST_STATE_CHANGE_PAUSED_TO_READY: gst_video_rate_reset (videorate); break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + videorate->first_pass_buffer = TRUE; default: break; } diff --git a/gst/gstvideorate.h b/gst/gstvideorate.h index 76e690d..01abcae 100644 --- a/gst/gstvideorate.h +++ b/gst/gstvideorate.h @@ -65,6 +65,10 @@ struct _GstVideoRate gboolean silent; gdouble new_pref; gboolean skip_to_first; + + // XXX let downstream theoraenc treat first buffer + // as a buffer with keyframe + gboolean first_pass_buffer; }; struct _GstVideoRateClass |