diff options
Diffstat (limited to 'isoparser/src/main/java/com/googlecode/mp4parser/h264/read/.svn/text-base/BitstreamReader.java.svn-base')
-rw-r--r-- | isoparser/src/main/java/com/googlecode/mp4parser/h264/read/.svn/text-base/BitstreamReader.java.svn-base | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/isoparser/src/main/java/com/googlecode/mp4parser/h264/read/.svn/text-base/BitstreamReader.java.svn-base b/isoparser/src/main/java/com/googlecode/mp4parser/h264/read/.svn/text-base/BitstreamReader.java.svn-base new file mode 100644 index 0000000..816af6a --- /dev/null +++ b/isoparser/src/main/java/com/googlecode/mp4parser/h264/read/.svn/text-base/BitstreamReader.java.svn-base @@ -0,0 +1,194 @@ +/* +Copyright (c) 2011 Stanislav Vitvitskiy + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. +*/ +package com.googlecode.mp4parser.h264.read; + +import com.googlecode.mp4parser.h264.CharCache; + +import java.io.IOException; +import java.io.InputStream; + +/** + * A dummy implementation of H264 RBSP reading + * + * @author Stanislav Vitvitskiy + */ +public class BitstreamReader { + private InputStream is; + private int curByte; + private int nextByte; + int nBit; + protected static int bitsRead; + + protected CharCache debugBits = new CharCache(50); + + public BitstreamReader(InputStream is) throws IOException { + this.is = is; + curByte = is.read(); + nextByte = is.read(); + } + + /* + * (non-Javadoc) + * + * @see ua.org.jplayer.javcodec.h264.RBSPInputStream#read1Bit() + */ + public int read1Bit() throws IOException { + if (nBit == 8) { + advance(); + if (curByte == -1) { + return -1; + } + } + int res = (curByte >> (7 - nBit)) & 1; + nBit++; + + debugBits.append(res == 0 ? '0' : '1'); + ++bitsRead; + + return res; + } + + /* + * (non-Javadoc) + * + * @see ua.org.jplayer.javcodec.h264.RBSPInputStream#readNBit(int) + */ + public long readNBit(int n) throws IOException { + if (n > 64) + throw new IllegalArgumentException("Can not readByte more then 64 bit"); + + long val = 0; + + for (int i = 0; i < n; i++) { + val <<= 1; + val |= read1Bit(); + } + + return val; + } + + private void advance() throws IOException { + curByte = nextByte; + nextByte = is.read(); + nBit = 0; + } + + /* + * (non-Javadoc) + * + * @see ua.org.jplayer.javcodec.h264.RBSPInputStream#readByte() + */ + public int readByte() throws IOException { + if (nBit > 0) { + advance(); + } + + int res = curByte; + + advance(); + + return res; + } + + /* + * (non-Javadoc) + * + * @see ua.org.jplayer.javcodec.h264.RBSPInputStream#moreRBSPData() + */ + public boolean moreRBSPData() throws IOException { + if (nBit == 8) { + advance(); + } + int tail = 1 << (8 - nBit - 1); + int mask = ((tail << 1) - 1); + boolean hasTail = (curByte & mask) == tail; + + return !(curByte == -1 || (nextByte == -1 && hasTail)); + } + + public long getBitPosition() { + return (bitsRead * 8 + (nBit % 8)); + } + + /* + * (non-Javadoc) + * + * @see ua.org.jplayer.javcodec.h264.RBSPInputStream#readRemainingByte() + */ + public long readRemainingByte() throws IOException { + return readNBit(8 - nBit); + } + + /* + * (non-Javadoc) + * + * @see ua.org.jplayer.javcodec.h264.RBSPInputStream#next_bits(int) + */ + public int peakNextBits(int n) throws IOException { + if (n > 8) + throw new IllegalArgumentException("N should be less then 8"); + if (nBit == 8) { + advance(); + if (curByte == -1) { + return -1; + } + } + int[] bits = new int[16 - nBit]; + + int cnt = 0; + for (int i = nBit; i < 8; i++) { + bits[cnt++] = (curByte >> (7 - i)) & 0x1; + } + + for (int i = 0; i < 8; i++) { + bits[cnt++] = (nextByte >> (7 - i)) & 0x1; + } + + int result = 0; + for (int i = 0; i < n; i++) { + result <<= 1; + result |= bits[i]; + } + + return result; + } + + /* + * (non-Javadoc) + * + * @see ua.org.jplayer.javcodec.h264.RBSPInputStream#byte_aligned() + */ + public boolean isByteAligned() { + return (nBit % 8) == 0; + } + + /* + * (non-Javadoc) + * + * @see ua.org.jplayer.javcodec.h264.RBSPInputStream#close() + */ + public void close() throws IOException { + } + + public int getCurBit() { + return nBit; + } +}
\ No newline at end of file |