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}