From 1b57f1950905c4e3432312108cab19dd1b8446a0 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sun, 13 Sep 2009 12:01:27 -0700 Subject: dvdemux: Fix detection of new media There are 5 or 6 AAUX source control packs in a frame, and any of them could have REC_ST cleared, indicating a recording start point. libdv only checks the first. --- ext/dv/gstdvdemux.c | 33 ++++++++++++++++++++++++++++++++- ext/dv/gstdvdemux.h | 1 + 2 files changed, 33 insertions(+), 1 deletion(-) (limited to 'ext') diff --git a/ext/dv/gstdvdemux.c b/ext/dv/gstdvdemux.c index 6f33ac60..22afd851 100644 --- a/ext/dv/gstdvdemux.c +++ b/ext/dv/gstdvdemux.c @@ -1356,6 +1356,31 @@ gst_dvdemux_demux_video (GstDVDemux * dvdemux, GstBuffer * buffer, return ret; } +static gboolean +gst_dvdemux_is_new_media (GstDVDemux * dvdemux, GstBuffer * buffer) +{ + guint8 *data = GST_BUFFER_DATA (buffer); + int aaux_offset; + int dif; + int n_difs; + + n_difs = dvdemux->PAL ? 12 : 10; + + for (dif = 0; dif < n_difs; dif++) { + if (dif & 1) { + aaux_offset = (dif * 12000) + (6 + 16 * 1) * 80 + 3; + } else { + aaux_offset = (dif * 12000) + (6 + 16 * 4) * 80 + 3; + } + if (data[aaux_offset + 0] == 0x51) { + if ((data[aaux_offset + 2] & 0x80) == 0) + return TRUE; + } + } + + return FALSE; +} + /* takes ownership of buffer */ static GstFlowReturn gst_dvdemux_demux_frame (GstDVDemux * dvdemux, GstBuffer * buffer) @@ -1410,7 +1435,13 @@ gst_dvdemux_demux_frame (GstDVDemux * dvdemux, GstBuffer * buffer) data = GST_BUFFER_DATA (buffer); dv_parse_packs (dvdemux->decoder, data); - dvdemux->new_media = dv_is_new_recording (dvdemux->decoder, data); + dvdemux->new_media = FALSE; + if (gst_dvdemux_is_new_media (dvdemux, buffer) && + dvdemux->frames_since_new_media > 2) { + dvdemux->new_media = TRUE; + dvdemux->frames_since_new_media = 0; + } + dvdemux->frames_since_new_media++; /* does not take ownership of buffer */ aret = ret = gst_dvdemux_demux_audio (dvdemux, buffer, duration); diff --git a/ext/dv/gstdvdemux.h b/ext/dv/gstdvdemux.h index e7dd0c6d..b77f4f46 100644 --- a/ext/dv/gstdvdemux.h +++ b/ext/dv/gstdvdemux.h @@ -80,6 +80,7 @@ struct _GstDVDemux { gboolean running; gboolean need_segment; gboolean new_media; + int frames_since_new_media; gint found_header; /* ATOMIC */ GstEvent *seek_event; -- cgit