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}