/* * @(#)Video.java - some video constants * * Copyright (c) 2003-2005 by dvb.matt, All Rights Reserved. * * This file is part of ProjectX, a free Java based demux utility. * By the authors, ProjectX is intended for educational purposes only, * as a non-commercial test project. * * * 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; either version 2 of the License, or * (at your option) any later version. * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package net.sourceforge.dvb.projectx.video; import java.util.StringTokenizer; public class Video extends Object { private final static String[] aspectratio_table_strings = { "res." , "1:1" , "4:3" , "16:9" , "2.21:1" , "0.8055" , "0.8437" , "0.9375" , "0.9815" , "1.0255" , "1.0695" , "1.1250" , "1.1575" , "1.2015" , "res." , "res." }; private final static String[] framerate_table_strings = { "forbidden fps" , "23.976fps" , "24fps" , "25fps" , "29.97fps" , "30fps" , "50fps" , "59.94fps" , "60fps" , "n.def." , "n.def." , "n.def." , "n.def." , "n.def." , "n.def." , "n.def." }; private final static float[] aspectratio_table = { 1.0f, 1.0f, 1.3333f, 1.7778f, 2.21f, 0.8055f, 0.8437f, 0.9375f, 0.9815f, 1.0255f, 1.0695f, 1.125f, 1.1575f, 1.2015f, 1.0f, 1.0f }; private final static int[] framerate_table = { -1, 23976, 24000, 25000, 29970, 30000, 50000, 59940, 60000, -1, -1, -1, -1, -1, -1, -1 }; /** * returns aspectratio as string * * @return */ public static String getAspectRatio(int index) { return aspectratio_table_strings[index]; } /** * returns aspectratio as string * * @return */ public static float getAspectRatioValue(int index) { return aspectratio_table[index]; } /** * returns framerate as string * * @return */ public static int getFrameRate(int index) { return framerate_table[index]; } /** * returns formatted display from sequence header * * @param1 - source array * @return - string */ public static String getVideoformatfromBytes(byte[] gop) { return "" + ((0xFF & gop[4])<<4 | (0xF0 & gop[5])>>>4) + "*" + ((0xF & gop[5])<<8 | (0xFF & gop[6])) + ", " + framerate_table_strings[0xF & gop[7]] + ", " + aspectratio_table_strings[(0xFF & gop[7])>>>4] + ", " + ( ((0xFF & gop[8])<<10 | (0xFF & gop[9])<<2 | (0xC0 & gop[10])>>>6) * 400 ) + "bps, vbv " + ( (0x1F & gop[10])<<5 | (0xF8 & gop[11])>>>3 ); } /** * returns Sequence End Code as array * * @return */ public static byte[] getSequenceEndCode() { byte[] b = { 0, 0, 1, (byte)0xB7 }; return b; } /** * returns Sequence End Code as array * * @return */ public static byte[] getSequenceStartCode() { byte[] b = { 0, 0, 1, (byte)0xB3 }; return b; } /** * returns std Sequence Display Ext as array * * @return */ public static byte[] setSequenceDisplayExtension( String str, String[] videobasics) { byte[] b = { 0, 0, 1, (byte)0xB5, 0x2B, 2, 2, 2, 0, 0, 0, 0 }; setSequenceDisplayExtension( b, 0, str, videobasics); return b; } /** * returns std Sequence Display Ext as array * * @return */ public static void setSequenceDisplayExtension( byte[] b, int offs, String str, String[] videobasics) throws ArrayIndexOutOfBoundsException { int[] size = getHVSize( str, videobasics); offs += (1 & b[offs + 4]) != 0 ? 8 : 5; b[offs] = (byte) (0xFF & size[0]>>>6); b[offs + 1] = (byte) (0xFC & size[0]<<2); b[offs + 1] |= 2; b[offs + 1] |= (byte) (1 & size[0]>>>13); b[offs + 2] = (byte) (0xFF & size[1]>>>5); b[offs + 3] = (byte) (0xF8 & size[1]<<3); } private static int[] getHVSize(String str, String[] videobasics) { StringTokenizer st = new StringTokenizer(str, "*"); int[] tokens = { 720, 576 }; for (int i = 0, val; i < 2; i++) { try { val = Integer.parseInt(videobasics[i].trim()); tokens[i] = val; } catch (Exception e) { } } for (int i = 0, val; st.hasMoreTokens() && i < 2; i++) { try { val = Integer.parseInt(st.nextElement().toString().trim()); tokens[i] = val; } catch (Exception e) { } } return tokens; } }