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}