1dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/* 2dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Copyright 2012 Sebastian Annies, Hamburg 3dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 4dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Licensed under the Apache License, Version 2.0 (the License); 5dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * you may not use this file except in compliance with the License. 6dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * You may obtain a copy of the License at 7dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 8dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * http://www.apache.org/licenses/LICENSE-2.0 9dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * 10dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Unless required by applicable law or agreed to in writing, software 11dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * distributed under the License is distributed on an AS IS BASIS, 12dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * See the License for the specific language governing permissions and 14dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * limitations under the License. 15dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */ 16dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupackage com.coremedia.iso; 17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.EOFException; 19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.io.IOException; 20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer; 21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.channels.FileChannel; 22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.channels.ReadableByteChannel; 23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.channels.SelectionKey; 24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.channels.WritableByteChannel; 25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport static com.googlecode.mp4parser.util.CastUtils.l2i; 27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class ChannelHelper { 30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static ByteBuffer readFully(final ReadableByteChannel channel, long size) throws IOException { 31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (channel instanceof FileChannel && size > 1024 * 1024) { 33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ByteBuffer bb = ((FileChannel) channel).map(FileChannel.MapMode.READ_ONLY, ((FileChannel) channel).position(), size); 34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ((FileChannel) channel).position(((FileChannel) channel).position() + size); 35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return bb; 36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } else { 37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu ByteBuffer buf = ByteBuffer.allocate(l2i(size)); 38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu readFully(channel, buf, buf.limit()); 39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu buf.rewind(); 40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu assert buf.limit() == size; 41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return buf; 43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static void readFully(final ReadableByteChannel channel, final ByteBuffer buf) 49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throws IOException { 50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu readFully(channel, buf, buf.remaining()); 51dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 52dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 53dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static int readFully(final ReadableByteChannel channel, final ByteBuffer buf, final int length) 54dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throws IOException { 55dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int n, count = 0; 56dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu while (-1 != (n = channel.read(buf))) { 57dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu count += n; 58dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (count == length) { 59dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu break; 60dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 61dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 62dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (n == -1) { 63dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throw new EOFException("End of file. No more boxes."); 64dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 65dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu return count; 66dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 67dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 68dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 69dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static void writeFully(final WritableByteChannel channel, final ByteBuffer buf) 70dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throws IOException { 71dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu do { 72dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu int written = channel.write(buf); 73dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu if (written < 0) { 74dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu throw new EOFException(); 75dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 76dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } while (buf.hasRemaining()); 77dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 78dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 79dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 80dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu public static void close(SelectionKey key) { 81dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu try { 82dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu key.channel().close(); 83dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } catch (IOException e) { 84dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu // nop 85dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 86dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 87dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu } 88dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 89dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu 90dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}