001package net.bramp.ffmpeg.info;
002
003import com.google.common.base.Splitter;
004import java.io.BufferedReader;
005import java.io.IOException;
006import java.util.*;
007
008public final class InfoParser {
009  private InfoParser() {
010    throw new AssertionError("No instances for you!");
011  }
012
013  public static List<ChannelLayout> parseLayouts(BufferedReader r) throws IOException {
014    Map<String, IndividualChannel> individualChannelLookup = new HashMap<>();
015    List<ChannelLayout> channelLayouts = new ArrayList<>();
016
017    String line;
018    boolean parsingIndividualChannels = false;
019    boolean parsingChannelLayouts = false;
020
021    while ((line = r.readLine()) != null) {
022      if (line.startsWith("NAME") || line.isEmpty()) {
023        // Skip header and empty lines
024      } else if (line.equals("Individual channels:")) {
025        parsingIndividualChannels = true;
026        parsingChannelLayouts = false;
027      } else if (line.equals("Standard channel layouts:")) {
028        parsingIndividualChannels = false;
029        parsingChannelLayouts = true;
030      } else if (parsingIndividualChannels) {
031        String[] s = line.split(" ", 2);
032        IndividualChannel individualChannel = new IndividualChannel(s[0], s[1].trim());
033        channelLayouts.add(individualChannel);
034        individualChannelLookup.put(individualChannel.getName(), individualChannel);
035      } else if (parsingChannelLayouts) {
036        String[] s = line.split(" ", 2);
037        List<IndividualChannel> decomposition = new ArrayList<>();
038        for (String channelName : Splitter.on('+').split(s[1].trim())) {
039          decomposition.add(individualChannelLookup.get(channelName));
040        }
041
042        channelLayouts.add(
043            new StandardChannelLayout(s[0], Collections.unmodifiableList(decomposition)));
044      }
045    }
046
047    return channelLayouts;
048  }
049}