1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/* 2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuCopyright (c) 2011 Stanislav Vitvitskiy 3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuPermission is hereby granted, free of charge, to any person obtaining a copy of this 5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhusoftware and associated documentation files (the "Software"), to deal in the Software 6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuwithout restriction, including without limitation the rights to use, copy, modify, 7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhumerge, publish, distribute, sublicense, and/or sell copies of the Software, and to 8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupermit persons to whom the Software is furnished to do so, subject to the following 9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuconditions: 10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuThe above copyright notice and this permission notice shall be included in all copies or 12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhusubstantial portions of the Software. 13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuFOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui ZhuOR OTHER DEALINGS IN THE SOFTWARE. 20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu*/ 21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.googlecode.mp4parser.h264.write; 22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport com.googlecode.mp4parser.h264.Debug; 24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException; 26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.OutputStream; 27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/** 29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * A dummy implementation of H264 RBSP output stream 30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * @author Stanislav Vitvitskiy 32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class BitstreamWriter { 34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private final OutputStream os; 36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private int[] curByte = new int[8]; 37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private int curBit; 38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public BitstreamWriter(OutputStream out) { 40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu this.os = out; 41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu /* 44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * (non-Javadoc) 45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * @see ua.org.jplayer.javcodec.h264.H264BitOutputStream#flush() 47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void flush() throws IOException { 49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (int i = curBit; i < 8; i++) { 50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu curByte[i] = 0; 51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu curBit = 0; 53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writeCurByte(); 54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu private void writeCurByte() throws IOException { 57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int toWrite = (curByte[0] << 7) | (curByte[1] << 6) | (curByte[2] << 5) 58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu | (curByte[3] << 4) | (curByte[4] << 3) | (curByte[5] << 2) 59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu | (curByte[6] << 1) | curByte[7]; 60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu os.write(toWrite); 61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu /* 64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * (non-Javadoc) 65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * @see ua.org.jplayer.javcodec.h264.H264BitOutputStream#write1Bit(int) 67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void write1Bit(int value) throws IOException { 69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu Debug.print(value); 70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (curBit == 8) { 71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu curBit = 0; 72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writeCurByte(); 73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu curByte[curBit++] = value; 75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu /* 78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * (non-Javadoc) 79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * @see ua.org.jplayer.javcodec.h264.H264BitOutputStream#writeNBit(long, 81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * int) 82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void writeNBit(long value, int n) throws IOException { 84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu for (int i = 0; i < n; i++) { 85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu write1Bit((int) (value >> (n - i - 1)) & 0x1); 86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu /* 90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * (non-Javadoc) 91dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 92dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * @see 93dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * ua.org.jplayer.javcodec.h264.H264BitOutputStream#writeRemainingZero() 94dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 95dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void writeRemainingZero() throws IOException { 96dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu writeNBit(0, 8 - curBit); 97dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 98dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 99dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu /* 100dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * (non-Javadoc) 101dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 102dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * @see ua.org.jplayer.javcodec.h264.H264BitOutputStream#writeByte(int) 103dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 104dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public void writeByte(int b) throws IOException { 105dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu os.write(b); 106dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 107dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 108dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}