001package net.bramp.ffmpeg.builder;
002
003import com.google.common.collect.ImmutableList;
004import javax.annotation.CheckReturnValue;
005import net.bramp.ffmpeg.options.EncodingOptions;
006import net.bramp.ffmpeg.probe.FFmpegProbeResult;
007
008public abstract class AbstractFFmpegInputBuilder<T extends AbstractFFmpegInputBuilder<T>>
009    extends AbstractFFmpegStreamBuilder<T> {
010  private final FFmpegProbeResult probeResult;
011
012  private boolean readAtNativeFrameRate;
013
014  /**
015   * Number of times input stream shall be looped. Loop 0 means no loop, loop -1 means infinite
016   * loop.
017   */
018  private int streamLoop;
019
020  protected AbstractFFmpegInputBuilder(FFmpegBuilder parent, String filename) {
021    this(parent, null, filename);
022  }
023
024  protected AbstractFFmpegInputBuilder(
025      FFmpegBuilder parent, FFmpegProbeResult probeResult, String filename) {
026    super(parent, filename);
027    this.probeResult = probeResult;
028  }
029
030  public T readAtNativeFrameRate() {
031    this.readAtNativeFrameRate = true;
032    return getThis();
033  }
034
035  /**
036   * Sets number of times input stream shall be looped. Loop 0 means no loop, loop -1 means infinite
037   * loop.
038   *
039   * @param streamLoop loop counter
040   * @return this
041   */
042  public T setStreamLoop(int streamLoop) {
043    this.streamLoop = streamLoop;
044
045    return getThis();
046  }
047
048  public FFmpegProbeResult getProbeResult() {
049    return probeResult;
050  }
051
052  @Override
053  @CheckReturnValue
054  @SuppressWarnings("unchecked")
055  protected T getThis() {
056    return (T) this;
057  }
058
059  @Override
060  public EncodingOptions buildOptions() {
061    return null;
062  }
063
064  @Override
065  protected void addGlobalFlags(FFmpegBuilder parent, ImmutableList.Builder<String> args) {
066    if (this.readAtNativeFrameRate) {
067      args.add("-re");
068    }
069
070    if (this.streamLoop != 0) {
071      args.add("-stream_loop", Integer.toString(this.streamLoop));
072    }
073
074    super.addGlobalFlags(parent, args);
075  }
076
077  public int getStreamLoop() {
078    return streamLoop;
079  }
080}