/*
* PS3 Media Server, for streaming any medias to your PS3.
* Copyright (C) 2008 A.Brochard
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package net.pms.util;
import com.sun.jna.Platform;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
import java.io.*;
import java.util.ArrayList;
import net.pms.PMS;
import net.pms.configuration.PmsConfiguration;
import net.pms.dlna.DLNAMediaAudio;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CodecUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(CodecUtil.class);
private static final ArrayList<String> codecs = new ArrayList<>();
static {
// Make sure the list of codecs is initialized before other threads start retrieving it
initCodecs();
}
/**
* Initialize the list of codec formats that are recognized by ffmpeg by
* parsing the "ffmpeg_formats.txt" resource.
*/
private static void initCodecs() {
InputStream is = CodecUtil.class.getClassLoader().getResourceAsStream("resources/ffmpeg_formats.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
try {
while ((line = br.readLine()) != null) {
if (line.contains(" ")) {
codecs.add(line.substring(0, line.indexOf(' ')));
} else {
codecs.add(line);
}
}
br.close();
codecs.add("iso");
} catch (IOException e) {
LOGGER.error("Error while retrieving codec list", e);
}
}
/**
* Return the list of codec formats that will be recognized.
* @return The list of codecs.
*/
public static ArrayList<String> getPossibleCodecs() {
return codecs;
}
public static int getAC3Bitrate(PmsConfiguration configuration, DLNAMediaAudio media) {
int defaultBitrate = configuration.getAudioBitrate();
if (media != null && defaultBitrate >= 384) {
if (media.getAudioProperties().getNumberOfChannels() == 2 || configuration.getAudioChannelCount() == 2) {
defaultBitrate = 448;
} else if (media.getAudioProperties().getNumberOfChannels() == 1) {
defaultBitrate = 192;
}
}
return defaultBitrate;
}
@SuppressFBWarnings("DMI_HARDCODED_ABSOLUTE_FILENAME")
public static String getDefaultFontPath() {
String font = null;
if (Platform.isWindows()) {
// get Windows Arial
String winDir = PMS.get().getRegistry().getWindowsDirectory();
if (winDir != null) {
File winDirFile = new File(winDir);
if (winDirFile.exists()) {
File fontsDir = new File(winDirFile, "Fonts");
if (fontsDir.exists()) {
File arialDir = new File(fontsDir, "Arial.ttf");
if (arialDir.exists()) {
font = arialDir.getAbsolutePath();
} else {
arialDir = new File(fontsDir, "arial.ttf");
if (arialDir.exists()) {
font = arialDir.getAbsolutePath();
}
}
}
}
}
if (font == null) {
font = getFont("C:\\Windows\\Fonts", "Arial.ttf");
}
if (font == null) {
font = getFont("C:\\WINNT\\Fonts", "Arial.ttf");
}
if (font == null) {
font = getFont("D:\\Windows\\Fonts", "Arial.ttf");
}
if (font == null) {
font = getFont(".\\win32\\mplayer\\", "subfont.ttf");
}
return font;
} else if (Platform.isLinux()) {
// get Linux default font
font = getFont("/usr/share/fonts/truetype/msttcorefonts/", "Arial.ttf");
if (font == null) {
font = getFont("/usr/share/fonts/truetype/ttf-bitstream-veras/", "Vera.ttf");
}
if (font == null) {
font = getFont("/usr/share/fonts/truetype/ttf-dejavu/", "DejaVuSans.ttf");
}
return font;
} else if (Platform.isMac()) {
// get default osx font
font = getFont("/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/fonts/", "LucidaSansRegular.ttf");
return font;
}
return null;
}
private static String getFont(String path, String name) {
File f = new File(path, name);
if (f.exists()) {
return f.getAbsolutePath();
}
return null;
}
/**
* Check the font file or font name if registered in the OS
*
* @param fontName font represented by font file or by the font name
*
* @return the registered font name or null when not found
*/
public static String isFontRegisteredInOS(String fontName) {
if (isNotBlank(fontName)) {
File fontFile = new File(fontName);
if (fontFile.exists()) { // Test if the font is specified by the file.
try {
fontName = Font.createFont(Font.TRUETYPE_FONT, fontFile).getFontName();
} catch (FontFormatException | IOException e) {
LOGGER.debug("Exception when implementing the custom font: ", e.getMessage());
}
}
// The font is specified by the name. Check if it is registered in the OS.
String fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
for (String font : fonts) {
if (font.equals(fontName)) {
return font;
}
}
}
LOGGER.debug("Font name not found. Check if it is properly specified or installed in the OS");
return null;
}
}