/**
* This file is part of jFlvTool.
*
* jFlvTool 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 3 of the License, or
* (at your option) any later version.
*
* jFlvTool 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, see <http://www.gnu.org/licenses/>.
*
*
* file name : VideoTag.java
* authors : Jon Keys
* created : June 28, 2007, 1:40 PM
* copyright : Sony Digital Authoring Services
*
* modifications:
* Date: Name: Description:
* ---------- --------------- ----------------------------------------------
* June 28, 2007 Jon Keys Creation
*/
package edu.washington.cs.oneswarm.ui.gwt.server.ffmpeg.jflv.tags;
import edu.washington.cs.oneswarm.ui.gwt.server.ffmpeg.jflv.io.BufferHelper;
import edu.washington.cs.oneswarm.ui.gwt.server.ffmpeg.jflv.io.IOHelper;
/**
*
* @author Jon Keys
*/
public class VideoTag extends FlvTag {
public static final int H263VIDEOPACKET = 2;
public static final int SCREENVIDEOPACKET = 3;
public static final int ON2VP6 = 4;
public static final int KEYFRAME = 1;
public static final int INTERFRAME = 2;
public static final int DISPOSABLEINTERFRAME = 3;
private BufferHelper bh;
private int pos;
private String bits;
private int width;
private int height;
private long byteOffset;
private int codecIdFrameType;
private int frameType;
private int codecId;
/** Creates a new instance of VideoTag */
public VideoTag() {
bh = new BufferHelper();
pos = 0;
bits = null;
width = 0;
height = 0;
byteOffset = 0;
codecIdFrameType = 0;
frameType = 0;
codecId = 0;
}
public VideoTag(IOHelper ioh) {
super(ioh);
bh = ioh.getBufferHelper();
pos = 0;
codecIdFrameType = bh.readInt(super.getData(), pos, 1);
pos += 1;
frameType = codecIdFrameType >> 4;
codecId = codecIdFrameType & 0xf;
bits = padBitSequence(bh.readBinaryString(super.getData(), pos, 9));
super.clearData();
pos += 9;
if (codecId == H263VIDEOPACKET) {
int hwCheck = bh.bit2uint(bits.substring(30, 33).toCharArray());
width = findWidth(hwCheck);
height = findHeight(hwCheck);
} else if (codecId == SCREENVIDEOPACKET) {
width = bh.bit2uint(bits.substring(4, 16).toCharArray());
height = bh.bit2uint(bits.substring(16, 28).toCharArray());
}
}// VideoTag()
private String padBitSequence(String bitSrc) {
String bitSeq = bitSrc;
int pad = 72 - bitSeq.length();
if (pad > 0) {
for (int i = 0; i < pad; i++) {
bitSeq = "0" + bitSeq;
}
}
return bitSeq;
}// padBitSequence()
private int findWidth(int hwCheck) {
int width = 0;
switch (hwCheck) {
case 0:
width = bh.bit2uint(bits.substring(33, 41).toCharArray());
break;
case 1:
width = bh.bit2uint(bits.substring(33, 49).toCharArray());
break;
case 2:
width = 352;
break;
case 3:
width = 176;
break;
case 4:
width = 128;
break;
case 5:
width = 320;
break;
case 6:
width = 160;
break;
}
return width;
}// getWidth()
private int findHeight(int hwCheck) {
int height = 0;
switch (hwCheck) {
case 0:
height = bh.bit2uint(bits.substring(41, 49).toCharArray());
break;
case 1:
height = bh.bit2uint(bits.substring(49, 65).toCharArray());
break;
case 2:
height = 288;
break;
case 3:
height = 144;
break;
case 4:
height = 96;
break;
case 5:
height = 240;
break;
case 6:
height = 120;
break;
}
return height;
}// findHeight()
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getCodecIdFrameType() {
return codecIdFrameType;
}
public int getFrameType() {
return frameType;
}
public int getCodecId() {
return codecId;
}
public long getByteOffset() {
return byteOffset;
}
public void setByteOffset(long byteOffset) {
this.byteOffset = byteOffset;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setCodecIdFrameType(int codecIdFrameType) {
this.codecIdFrameType = codecIdFrameType;
}
public void setFrameType(int frameType) {
this.frameType = frameType;
}
public void setCodecId(int codecId) {
this.codecId = codecId;
}
}// VideoTag