From 03ac531ff54b3bd83bfef23d4fb8f7f09b9b213d Mon Sep 17 00:00:00 2001 From: Boris Grozev <boris@jitsi.org> Date: Tue, 17 Jun 2014 15:39:14 +0200 Subject: [PATCH] Allows the MP3 encoder's buffer to be flushed. --- .../neomedia/codec/audio/mp3/JNIEncoder.java | 43 ++++++++++++++++--- .../neomedia/control/FlushableControl.java | 23 ++++++++++ 2 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 src/org/jitsi/service/neomedia/control/FlushableControl.java diff --git a/src/org/jitsi/impl/neomedia/codec/audio/mp3/JNIEncoder.java b/src/org/jitsi/impl/neomedia/codec/audio/mp3/JNIEncoder.java index 3a479e89..94420949 100644 --- a/src/org/jitsi/impl/neomedia/codec/audio/mp3/JNIEncoder.java +++ b/src/org/jitsi/impl/neomedia/codec/audio/mp3/JNIEncoder.java @@ -12,15 +12,20 @@ import net.sf.fmj.media.*; import org.jitsi.impl.neomedia.codec.*; +import org.jitsi.service.neomedia.control.*; import org.jitsi.util.*; +import java.awt.*; + /** * Implements a MP3 encoder using the native FFmpeg library. * * @author Lyubomir Marinov + * @author Boris Grozev */ public class JNIEncoder extends AbstractCodec2 + implements FlushableControl { /** * The <tt>Logger</tt> used by the <tt>JNIEncoder</tt> class and its @@ -89,6 +94,11 @@ public class JNIEncoder */ private int prevInputLength; + /** + * Synchronize access to <tt>prevInput</tt> and <tt>prevInputLength</tt> + */ + private Object prevInputSyncRoot = new Object(); + /** * Initializes a new <tt>JNIEncoder</tt> instance. */ @@ -97,12 +107,14 @@ public JNIEncoder() super("MP3 JNI Encoder", AudioFormat.class, SUPPORTED_OUTPUT_FORMATS); inputFormats = SUPPORTED_INPUT_FORMATS; + + addControl(this); } /** - * Implements {@link AbstractCodecExt#doClose()}. + * Implements {@link AbstractCodec2#doClose()}. * - * @see AbstractCodecExt#doClose() + * @see AbstractCodec2#doClose() */ @Override protected synchronized void doClose() @@ -127,7 +139,7 @@ protected synchronized void doClose() * * @throws ResourceUnavailableException if any of the resources that this * <tt>Codec</tt> needs to operate cannot be acquired - * @see AbstractCodecExt#doOpen() + * @see AbstractCodec2#doOpen() */ @Override protected synchronized void doOpen() @@ -200,11 +212,11 @@ protected synchronized void doOpen() } /** - * Implements {@link AbstractCodecExt#doProcess(Buffer, Buffer)}. + * Implements {@link AbstractCodec2#doProcess(Buffer, Buffer)}. * * @param inputBuffer * @param outputBuffer - * @see AbstractCodecExt#doProcess(Buffer, Buffer) + * @see AbstractCodec2#doProcess(Buffer, Buffer) */ @Override protected synchronized int doProcess( @@ -215,6 +227,8 @@ protected synchronized int doProcess( int inputLength = inputBuffer.getLength(); int inputOffset = inputBuffer.getOffset(); + synchronized (prevInputSyncRoot) + { if ((prevInputLength > 0) || (inputLength < frameSizeInBytes)) { int newPrevInputLength @@ -288,5 +302,24 @@ protected synchronized int doProcess( else return BUFFER_PROCESSED_OK; } + } //synchronized + } + + @Override + public void flush() + { + synchronized (prevInputSyncRoot) + { + prevInputLength = 0; + } + } + + /** + * Implements {@link javax.media.Control#getControlComponent()}. + */ + @Override + public Component getControlComponent() + { + return null; } } diff --git a/src/org/jitsi/service/neomedia/control/FlushableControl.java b/src/org/jitsi/service/neomedia/control/FlushableControl.java new file mode 100644 index 00000000..5df2378d --- /dev/null +++ b/src/org/jitsi/service/neomedia/control/FlushableControl.java @@ -0,0 +1,23 @@ +/* + * Jitsi, the OpenSource Java VoIP and Instant Messaging client. + * + * Distributable under LGPL license. + * See terms of license at gnu.org. + */ +package org.jitsi.service.neomedia.control; + +import javax.media.*; + +/** + * An interface which allows to flush a buffer. + * + * @author Boris Grozev + */ +public interface FlushableControl extends Control +{ + /** + * Flushes the buffer. + */ + public void flush(); +} + -- GitLab