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}