From acb81c58c547b0e6155fd61b7914f39deea428ad Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Wed, 5 Mar 2008 06:03:03 +0000 Subject: Port mplex element to 0.10. Fixes bug #520329. Original commit message from CVS: Patch by: Mark Nauwelaerts * configure.ac: * ext/Makefile.am: * ext/mplex/Makefile.am: * ext/mplex/gstmplex.cc: * ext/mplex/gstmplex.hh: * ext/mplex/gstmplexibitstream.cc: * ext/mplex/gstmplexibitstream.hh: * ext/mplex/gstmplexjob.cc: * ext/mplex/gstmplexjob.hh: * ext/mplex/gstmplexoutputstream.cc: * ext/mplex/gstmplexoutputstream.hh: Port mplex element to 0.10. Fixes bug #520329. * tests/check/Makefile.am: * tests/check/elements/mplex.c: (test_sink_event), (setup_src_pad), (teardown_src_pad), (setup_mplex), (cleanup_mplex), (GST_START_TEST), (mplex_suite), (main): Add unit test for the mplex element. --- ext/mplex/gstmplexibitstream.cc | 77 ++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 48 deletions(-) (limited to 'ext/mplex/gstmplexibitstream.cc') diff --git a/ext/mplex/gstmplexibitstream.cc b/ext/mplex/gstmplexibitstream.cc index 0f517703..4249aea3 100644 --- a/ext/mplex/gstmplexibitstream.cc +++ b/ext/mplex/gstmplexibitstream.cc @@ -1,5 +1,6 @@ /* GStreamer mplex (mjpegtools) wrapper * (c) 2003 Ronald Bultje + * (c) 2008 Mark Nauwelaerts * * gstmplexibitstream.hh: gstreamer/mplex input bitstream wrapper * @@ -25,41 +26,23 @@ #include +#include "gstmplex.hh" #include "gstmplexibitstream.hh" /* * Class init/exit functions. */ -GstMplexIBitStream::GstMplexIBitStream (GstPad * _pad, guint buf_size): +GstMplexIBitStream::GstMplexIBitStream (GstMplexPad * _data, guint buf_size): IBitStream () { - guint8 *data; - - pad = _pad; - bs = gst_bytestream_new (pad); + mpad = _data; + mplex = GST_MPLEX (GST_PAD_PARENT (mpad->pad)); eos = FALSE; - streamname = g_strdup (gst_pad_get_name (_pad)); - SetBufSize (buf_size); eobs = false; byteidx = 0; - - /* we peek 1 byte (not even caring about the return value) so we - * are sure that we have data and thus capsnego must be completed - * when we return. */ - gst_bytestream_peek_bytes (bs, &data, 1); - - if (!ReadIntoBuffer () && buffered == 0) { - GST_ELEMENT_ERROR (gst_pad_get_parent (_pad), RESOURCE, READ, (NULL), - ("Failed to read from input pad %s", gst_pad_get_name (pad))); - } -} - -GstMplexIBitStream::~GstMplexIBitStream (void) -{ - gst_bytestream_destroy (bs); } /* @@ -67,47 +50,45 @@ GstMplexIBitStream::~GstMplexIBitStream (void) */ size_t -GstMplexIBitStream::ReadStreamBytes (uint8_t * buf, size_t size) + GstMplexIBitStream::ReadStreamBytes (uint8_t * buf, size_t size = + BUFFER_SIZE) { guint8 *data; - guint read = 0; - - if (eos) - return 0; + GST_MPLEX_MUTEX_LOCK (mplex); - while (!eos && (read = gst_bytestream_peek_bytes (bs, &data, size)) != size) { - GstEvent *event; + GST_DEBUG_OBJECT (mplex, "needing %d bytes", (guint) size); - guint pending; - - gst_bytestream_get_status (bs, &pending, &event); - if (event) { - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - eos = TRUE; - break; - default: - break; - } - gst_event_unref (event); - } + while (gst_adapter_available (mpad->adapter) < size + && !mplex->eos && !mpad->eos) { + mpad->needed = size; + GST_MPLEX_SIGNAL (mplex, mpad); + GST_MPLEX_WAIT (mplex, mpad); } - if (read > 0) { - memcpy (buf, data, read); - gst_bytestream_flush_fast (bs, read); + mpad->needed = 0; + size = MIN (size, gst_adapter_available (mpad->adapter)); + if (size) { + data = gst_adapter_take (mpad->adapter, size); + memcpy (buf, data, size); + g_free (data); } - return read; + GST_MPLEX_MUTEX_UNLOCK (mplex); + + return size; } /* * Are we at EOS? */ -bool -GstMplexIBitStream::EndOfStream (void) +bool GstMplexIBitStream::EndOfStream (void) { return eos; } + +bool GstMplexIBitStream::ReadBuffer () +{ + return ReadIntoBuffer (BUFFER_SIZE); +} -- cgit v1.2.1