/*
* @(#)BitrateMonitor.java
*
* Copyright (c) 2002-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
*
*/
/*
* the base code was derived from MemoryMonitor.java 1.26 99/04/23
*
* Copyright (c) 1998, 1999 by Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/
package net.sourceforge.dvb.projectx.gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class BitrateMonitor extends JPanel {
private int w = 110;
private int h = 32;
private int divisor = 695;
private BufferedImage bimg;
private Graphics2D big;
private Font font = new Font("Times New Roman", Font.PLAIN, 11);
private int columnInc;
private int pts[];
private int ptNum;
private int ascent;
private int descent;
private int bitrate;
private int maxbitrate = 0;
private int minbitrate = 37500;
private Rectangle graphOutlineRect = new Rectangle();
private Color graphColor = new Color(46, 139, 87);
private String usedStr;
private String timeStr="00:00:00";
private boolean first = true;
private boolean greatgop = false;
private Color[] GOP = { Color.black, Color.cyan, Color.magenta, Color.white, Color.green, Color.red, Color.red, Color.red, Color.yellow };
private byte[] frame = new byte[0];
private int maxbitrate_index = 22500;
/**
*
*/
public BitrateMonitor()
{
bimg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
big = bimg.createGraphics();
big.setFont(font);
FontMetrics fm = big.getFontMetrics(font);
ascent = (int) fm.getAscent();
descent = (int) fm.getDescent();
reset();
setLayout(new BorderLayout());
setBackground(Color.black);
setVisible(true);
}
/**
*
*/
public Dimension getMinimumSize()
{
return getPreferredSize();
}
/**
*
*/
public Dimension getMaximumSize()
{
return getPreferredSize();
}
/**
*
*/
public Dimension getPreferredSize()
{
return new Dimension(w, h);
}
/**
*
*/
public void paint(Graphics g)
{
if (big == null)
return;
g.drawImage(bimg, 0, 0, this);
}
/**
*
*/
private void refresh()
{
if (big == null)
return;
big.setColor(Color.black);
big.clearRect(0, 0, w, h);
// .. Draw bitrate string ..
big.setColor(Color.white);
usedStr = String.valueOf(bitrate * 400 / 1000) + "kbps ";
big.drawString(usedStr, 60, h - descent - 9 - descent);
big.drawString(timeStr, 60, h - descent);
// .. Draw History Graph ..
int graphX = 2;
int graphY = 1;
int graphW = 50; // w =55
int graphH = 30; // h=55. 48
big.setColor(graphColor);
graphOutlineRect.setRect(graphX, graphY, graphW, graphH);
big.draw(graphOutlineRect);
int graphRow = graphH / 5;
big.setColor(graphColor);
// .. Draw row ..
for (int j = graphY; j <= graphH + graphY; j += graphRow)
big.drawLine(graphX, j, graphX + graphW, j);
// .. Draw animated column movement ..
int graphColumn = graphW / 5;
for (int j = graphX; j < graphW + graphX; j += graphColumn)
big.drawLine(j, graphY, j, graphY + graphH);
//.. frametypegraph
int b = frame.length > 17 ? 17 : frame.length;
for (int a = 0; a < b; a++)
{
big.setColor(GOP[0xF & frame[a]]);
if ((0x80 & frame[a]) != 0)
{ // progressive frame
big.fillRect(60 + (a * 3), 2, 2, 5);
}
else
{ // interlaced frame
big.fillRect(60 + (a * 3), 2, 2, 2);
big.fillRect(60 + (a * 3), 5, 2, 2);
}
}
if (frame.length > 16)
greatgop = true;
if (greatgop)
{
big.setColor(Color.red);
big.fillRect(52, 40, 2, 5);
}
if (pts == null)
{
pts = new int[graphW];
ptNum = 0;
}
else
{
big.setColor(Color.yellow);
pts[ptNum] = ( graphY + graphH - (bitrate / divisor) );
if (pts[ptNum] < 1)
pts[ptNum] = 0;
for (int j = graphX + graphW - ptNum, k = 0; k < ptNum; k++, j++)
if (k != 0)
big.drawLine(j - 1, graphH, j - 1, pts[k]);
if (ptNum + 2 == pts.length)
{
// throw out oldest point
for (int j = 1; j < ptNum; j++)
pts[j - 1] = pts[j];
--ptNum;
}
else
ptNum++;
}
//.. 9Mbps
big.setColor(Color.red);
big.drawLine(2, 5, 52, 5);
//.. 2.5Mbps
big.setColor(Color.magenta);
big.drawLine(2, 28, 52, 28);
//.. max,min Mbps
big.setColor(Color.white);
big.drawLine(52, (graphY + graphH - (maxbitrate / divisor)), 56, (graphY + graphH - (maxbitrate / 695)));
big.drawLine(52, (graphY + graphH - (minbitrate / divisor)), 56, (graphY + graphH - (minbitrate / 695)));
}
/**
*
*/
public void reset()
{
greatgop = false;
maxbitrate = 0;
minbitrate = 37500;
timeStr = "00:00:00";
bitrate = 0;
frame = new byte[0];
refresh();
repaint();
}
/**
*
*/
public void update(int _bitrate, byte[] _frames, String str)
{
bitrate = _bitrate;
if (bitrate > maxbitrate)
maxbitrate = bitrate;
if (bitrate < minbitrate)
minbitrate = bitrate;
timeStr = str;
frame = _frames;
refresh();
repaint();
}
}