Author: kitone
Date: Tue Aug 12 21:13:42 2014
New Revision: 865
URL: http://svn.gna.org/viewcvs/subtitleeditor?rev=865&view=rev
Log:
Port the keyframes generator using frame to gstreamer 1.0.
Modified:
trunk/ChangeLog
trunk/plugins/actions/keyframesmanagement/keyframesgeneratorusingframe.cc
Modified: trunk/ChangeLog
URL:
http://svn.gna.org/viewcvs/subtitleeditor/trunk/ChangeLog?rev=865&r1=864&r2=865&view=diff
==============================================================================
--- trunk/ChangeLog (original)
+++ trunk/ChangeLog Tue Aug 12 21:13:42 2014
@@ -1,3 +1,8 @@
+2014-08-12 kitone <[email protected]>
+
+ * plugins/actions/keyframesmanagement/keyframesgeneratorusingframe.cc
+ Port the keyframes generator using frame to gstreamer 1.0.
+
2014-08-12 kitone <[email protected]>
*
plugins/actions/externalvideoplayer/dialog-external-video-player-preferences.ui
Modified:
trunk/plugins/actions/keyframesmanagement/keyframesgeneratorusingframe.cc
URL:
http://svn.gna.org/viewcvs/subtitleeditor/trunk/plugins/actions/keyframesmanagement/keyframesgeneratorusingframe.cc?rev=865&r1=864&r2=865&view=diff
==============================================================================
--- trunk/plugins/actions/keyframesmanagement/keyframesgeneratorusingframe.cc
(original)
+++ trunk/plugins/actions/keyframesmanagement/keyframesgeneratorusingframe.cc
Tue Aug 12 21:13:42 2014
@@ -4,7 +4,7 @@
* http://home.gna.org/subtitleeditor/
* https://gna.org/projects/subtitleeditor/
*
- * Copyright @ 2005-2012, kitone
+ * Copyright @ 2005-2014, kitone
* 2012, Martin Doucha
*
* This program is free software; you can redistribute it and/or modify
@@ -92,64 +92,58 @@
*/
void on_video_identity_handoff(const Glib::RefPtr<Gst::Buffer>& buf,
const Glib::RefPtr<Gst::Pad>&)
{
- // ignore preroll
- //if(buf->flag_is_set(Gst::BUFFER_FLAG_PREROLL))
- if(GST_BUFFER_FLAG_IS_SET(buf->gobj(), GST_BUFFER_FLAG_LIVE))
- return;
+ GstMapInfo map;
+ gst_buffer_map (GST_BUFFER(buf->gobj()), &map, GST_MAP_READ);
// first frame or change of buffer size, alloc & push
- if (!m_prev_frame || buf->get_size() != m_prev_frame_size)
+ if (!m_prev_frame || map.size != m_prev_frame_size)
{
delete[] m_prev_frame;
- m_prev_frame_size = buf->get_size();
+ m_prev_frame_size = map.size;
m_prev_frame = new guint8[m_prev_frame_size];
- long pos = buf->get_pts() / GST_MSECOND;
- m_values.push_back(pos);
- // continuation frame, compare
- }
- else
- {
- guint64 delta = 0, full = buf->get_size() / 3;
- unsigned long diff, i, j;
- long tmp;
- const guint8 *data = NULL; //buf->get_data();
-
- // calculate difference between frames
- for (i = 0; i < full; i++)
+
+ m_values.push_back( buf->get_pts() / GST_MSECOND );
+ }
+ else if(compare_frame(m_prev_frame, map.data, map.size))
+ {
+ m_values.push_back( buf->get_pts() / GST_MSECOND );
+ }
+ // update the previous frame with this one
+ memcpy(m_prev_frame, map.data, map.size);
+
+ gst_buffer_unmap (GST_BUFFER(buf->gobj()),&map);
+ }
+
+ /*
+ */
+ bool compare_frame(const guint8 *old_frame, const guint8 *new_frame,
gsize size)
+ {
+ guint64 delta = 0;
+ guint64 full = size / 3;
+
+ gulong diff, i, j;
+ long tmp;
+ // calculate difference between frames
+ for (i = 0; i < full; ++i)
+ {
+ diff = 0;
+ // get max difference in individual color channels
+ for (j = 0; j < 3; ++j)
{
- diff = 0;
-
- // get max difference in individual color
channels
- for (j = 0; j < 3; j++)
- {
- tmp = (int)data[3 * i + j] -
(int)m_prev_frame[3 * i + j];
- if (tmp < 0)
- {
- tmp = -tmp;
- }
-
- diff = tmp > diff ? tmp : diff;
- }
-
- // add max color diff to total delta
- delta += diff;
+ tmp = (int)new_frame[3 * i + j] -
(int)old_frame[3 * i + j];
+ if (tmp < 0)
+ tmp = -tmp;
+ diff = tmp > diff ? tmp : diff;
}
-
- full *= 255;
-
- // >20% difference => scene cut
- if ((double)delta / (double)full > m_difference)
- {
- // FIXME: gstreamer 1.0
- //long pos = buf->get_timestamps() /
GST_MSECOND;
- long pos = buf->get_pts() / GST_MSECOND;
- m_values.push_back(pos);
- }
- }
-
- //memcpy(m_prev_frame, buf->get_data(), buf->get_size());
- }
-
+ // add max color diff to total delta
+ delta += diff;
+ }
+ full *= 255;
+
+ // >20% difference => scene cut
+ return ((double)delta / (double)full > m_difference);
+ }
+
/*
* Create video bin
*/
_______________________________________________
Subtitleeditor-commits mailing list
[email protected]
https://mail.gna.org/listinfo/subtitleeditor-commits