001package net.bramp.ffmpeg.progress;
002
003import java.io.IOException;
004import java.net.InetAddress;
005import java.net.ServerSocket;
006import java.net.URI;
007import java.net.URISyntaxException;
008import java.util.concurrent.CountDownLatch;
009
010/** Parses FFmpeg progress output over a TCP socket connection. */
011public class TcpProgressParser extends AbstractSocketProgressParser {
012
013  final ServerSocket server;
014  final URI address;
015
016  /** Constructs a TCP progress parser listening on a random available port. */
017  public TcpProgressParser(ProgressListener listener) throws IOException, URISyntaxException {
018    this(listener, 0, InetAddress.getLoopbackAddress());
019  }
020
021  /** Creates a new TCP progress parser bound to the given port and address. */
022  public TcpProgressParser(ProgressListener listener, int port, InetAddress addr)
023      throws IOException, URISyntaxException {
024    super(listener);
025    this.server = new ServerSocket(port, 0, addr);
026    this.address = createUri("tcp", server.getInetAddress(), server.getLocalPort());
027  }
028
029  @Override
030  public synchronized void stop() throws IOException {
031    if (server.isClosed()) {
032      // Allow double stop, and ignore
033      return;
034    }
035
036    server.close(); // This unblocks server.accept();
037    super.stop();
038  }
039
040  @Override
041  protected String getThreadName() {
042    return "TcpProgressParser";
043  }
044
045  @Override
046  protected Runnable getRunnable(CountDownLatch startSignal) {
047    return new TcpProgressParserRunnable(parser, server, startSignal);
048  }
049
050  @Override
051  public URI getUri() {
052    return address;
053  }
054}