From 3b88dce4d1bf82e290cbac5a68df2d6fc189b205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 26 Mar 2009 08:11:20 +0100 Subject: mxfmux: Fix handling of buffers with more than one edit unit and EOS handling --- gst/mxf/mxfaes-bwf.c | 66 +++++++++++++++++++--------------------------------- 1 file changed, 24 insertions(+), 42 deletions(-) (limited to 'gst/mxf/mxfaes-bwf.c') diff --git a/gst/mxf/mxfaes-bwf.c b/gst/mxf/mxfaes-bwf.c index cf61ea7e..df9c0047 100644 --- a/gst/mxf/mxfaes-bwf.c +++ b/gst/mxf/mxfaes-bwf.c @@ -1406,28 +1406,34 @@ mxf_bwf_write_func (GstBuffer * buffer, GstCaps * caps, gpointer mapping_data, { BWFMappingData *md = mapping_data; guint bytes; + guint64 speu = + gst_util_uint64_scale (md->rate, md->edit_rate.d, md->edit_rate.n); - if (buffer) { - guint64 speu = - gst_util_uint64_scale (md->rate, md->edit_rate.d, md->edit_rate.n); - - md->error += (GST_SECOND * md->edit_rate.d * md->rate) % (md->edit_rate.n); - if (md->error >= md->edit_rate.n) { - md->error = 0; - speu += 1; - } + md->error += (md->edit_rate.d * md->rate) % (md->edit_rate.n); + if (md->error >= md->edit_rate.n) { + md->error = 0; + speu += 1; + } - bytes = (speu * md->channels * md->width) / 8; + bytes = (speu * md->channels * md->width) / 8; + if (buffer) gst_adapter_push (adapter, buffer); - if (gst_adapter_available (adapter) >= bytes) { - *outbuf = gst_adapter_take_buffer (adapter, bytes); - } - } else if (flush && (bytes = gst_adapter_available (adapter))) { + + if (gst_adapter_available (adapter) == 0) + return GST_FLOW_OK; + + if (flush) + bytes = MIN (gst_adapter_available (adapter), bytes); + + if (gst_adapter_available (adapter) >= bytes) { *outbuf = gst_adapter_take_buffer (adapter, bytes); } - return GST_FLOW_OK; + if (gst_adapter_available (adapter) >= bytes) + return GST_FLOW_CUSTOM_SUCCESS; + else + return GST_FLOW_OK; } static const guint8 bwf_essence_container_ul[] = { @@ -1493,19 +1499,6 @@ mxf_bwf_update_descriptor (MXFMetadataFileDescriptor * d, GstCaps * caps, return; } -static guint -gst_greatest_common_divisor (guint a, guint b) -{ - while (b != 0) { - guint temp = a; - - a = b; - b = temp % b; - } - - return a; -} - static void mxf_bwf_get_edit_rate (MXFMetadataFileDescriptor * a, GstCaps * caps, gpointer mapping_data, GstBuffer * buf, MXFMetadataSourcePackage * package, @@ -1513,8 +1506,6 @@ mxf_bwf_get_edit_rate (MXFMetadataFileDescriptor * a, GstCaps * caps, { guint i; gdouble min = G_MAXDOUBLE; - MXFMetadataWaveAudioEssenceDescriptor *d = - MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR (a); BWFMappingData *md = mapping_data; for (i = 0; i < package->parent.n_tracks; i++) { @@ -1532,18 +1523,9 @@ mxf_bwf_get_edit_rate (MXFMetadataFileDescriptor * a, GstCaps * caps, } if (min == G_MAXDOUBLE) { - guint32 nu, de; - guint gcd; - - /* 50ms edit units */ - nu = d->parent.audio_sampling_rate.n; - de = d->parent.audio_sampling_rate.d * 20; - gcd = gst_greatest_common_divisor (nu, de); - nu /= gcd; - de /= gcd; - - (*edit_rate).n = nu; - (*edit_rate).d = de; + /* 100ms edit units */ + edit_rate->n = 10; + edit_rate->d = 1; } memcpy (&md->edit_rate, edit_rate, sizeof (MXFFraction)); -- cgit v1.2.1