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