summaryrefslogtreecommitdiff
path: root/gst/mxf/mxfaes-bwf.c
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2009-03-26 08:11:20 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-03-26 08:11:20 +0100
commit3b88dce4d1bf82e290cbac5a68df2d6fc189b205 (patch)
tree04b65888aa4f7a26d9647e46e2e4becdb9034ddd /gst/mxf/mxfaes-bwf.c
parent7146c027fe35beae3bc801e77c8881926dc30000 (diff)
downloadgstreamer-plugins-bad-3b88dce4d1bf82e290cbac5a68df2d6fc189b205.tar.gz
mxfmux: Fix handling of buffers with more than one edit unit and EOS handling
Diffstat (limited to 'gst/mxf/mxfaes-bwf.c')
-rw-r--r--gst/mxf/mxfaes-bwf.c66
1 files changed, 24 insertions, 42 deletions
diff --git a/gst/mxf/mxfaes-bwf.c b/gst/mxf/mxfaes-bwf.c
index cf61ea7e5..df9c0047b 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));