[vlc-commits] demux: add moving average helper
Francois Cartegnie
git at videolan.org
Mon Oct 22 20:27:28 CEST 2018
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Aug 1 11:44:38 2018 +0200| [4f8d222038e58d6e3e00fca86ce2fd035cc8ec9b] | committer: Francois Cartegnie
demux: add moving average helper
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4f8d222038e58d6e3e00fca86ce2fd035cc8ec9b
---
modules/demux/moving_avg.h | 100 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 100 insertions(+)
diff --git a/modules/demux/moving_avg.h b/modules/demux/moving_avg.h
new file mode 100644
index 0000000000..cb4cf9e62b
--- /dev/null
+++ b/modules/demux/moving_avg.h
@@ -0,0 +1,100 @@
+/*****************************************************************************
+ * moving_avg.h: Moving average helper
+ *****************************************************************************
+ * Copyright © 2018 VideoLabs, VideoLAN, VLC authors
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+#ifndef VLC_MOVING_AVG_H
+#define VLC_MOVING_AVG_H
+
+#ifndef MVA_PACKETS
+ #define MVA_PACKETS 6
+#endif
+
+struct mva_packet_s
+{
+ vlc_tick_t duration;
+ vlc_tick_t dts;
+ vlc_tick_t diff;
+};
+
+struct moving_average_s
+{
+ struct mva_packet_s packets[MVA_PACKETS];
+ unsigned i_packet;
+};
+
+static void mva_init(struct moving_average_s *m)
+{
+ m->i_packet = 0;
+}
+
+static vlc_tick_t mva_get(const struct moving_average_s *m);
+
+static void mva_add(struct moving_average_s *m,
+ vlc_tick_t dts, vlc_tick_t duration)
+{
+ m->packets[m->i_packet % MVA_PACKETS].dts = dts;
+ m->packets[m->i_packet % MVA_PACKETS].duration = duration;
+ m->packets[m->i_packet % MVA_PACKETS].diff = duration; /* will erase, last one */
+ m->i_packet++;
+}
+
+static vlc_tick_t mva_get(const struct moving_average_s *m)
+{
+ unsigned start;
+ const struct mva_packet_s *min = NULL, *max = NULL;
+
+ if(likely(m->i_packet >= MVA_PACKETS))
+ {
+ start = m->i_packet - MVA_PACKETS;
+ for(unsigned i = start; i < m->i_packet; i++)
+ {
+ if(!min || m->packets[i % MVA_PACKETS].diff < min->diff)
+ min = &m->packets[i % MVA_PACKETS];
+
+ if(!max || m->packets[i % MVA_PACKETS].diff > max->diff)
+ max = &m->packets[i % MVA_PACKETS];
+ }
+ }
+ else start = 0;
+
+ unsigned count = 0;
+ vlc_tick_t avgdiff = 0;
+ for(unsigned i = start; i < m->i_packet; i++)
+ {
+ if(&m->packets[i % MVA_PACKETS] == min ||
+ &m->packets[i % MVA_PACKETS] == max)
+ continue;
+ avgdiff += m->packets[i % MVA_PACKETS].diff;
+ count++;
+ }
+
+ return count ? avgdiff / count : 0;
+}
+
+static struct mva_packet_s * mva_getLastPacket(struct moving_average_s *m)
+{
+ return m->i_packet > 0 ? &m->packets[(m->i_packet - 1) % MVA_PACKETS] : NULL;
+}
+
+static vlc_tick_t mva_getLastDTS(struct moving_average_s *m)
+{
+ struct mva_packet_s *p = mva_getLastPacket(m);
+ return p ? p->dts : 0;
+}
+
+#endif
More information about the vlc-commits
mailing list