001package net.bramp.ffmpeg.progress;
002
003import static com.google.common.base.Preconditions.checkNotNull;
004
005import java.io.BufferedReader;
006import java.io.IOException;
007import java.io.InputStream;
008import java.io.InputStreamReader;
009import java.io.Reader;
010import java.nio.charset.StandardCharsets;
011
012/** Parses FFmpeg progress output from an input stream. */
013public class StreamProgressParser {
014
015  final ProgressListener listener;
016
017  /** Constructs a new stream progress parser with the given listener. */
018  public StreamProgressParser(ProgressListener listener) {
019    this.listener = checkNotNull(listener);
020  }
021
022  private static BufferedReader wrapInBufferedReader(Reader reader) {
023    checkNotNull(reader);
024
025    if (reader instanceof BufferedReader) {
026      return (BufferedReader) reader;
027    }
028
029    return new BufferedReader(reader);
030  }
031
032  /** Parses FFmpeg progress output from the given input stream. */
033  public void processStream(InputStream stream) throws IOException {
034    checkNotNull(stream);
035    processReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
036  }
037
038  /** Processes progress output from the given reader. */
039  public void processReader(Reader reader) throws IOException {
040    final BufferedReader in = wrapInBufferedReader(reader);
041
042    String line;
043    Progress p = new Progress();
044    while ((line = in.readLine()) != null) {
045      if (p.parseLine(line)) {
046        listener.progress(p);
047        p = new Progress();
048      }
049    }
050  }
051}