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.googlecode.mp4parser.authoring.builder;
17dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
18dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.ByteBuffer;
19dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.nio.MappedByteBuffer;
20dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.ArrayList;
21dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhuimport java.util.List;
22dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu
23dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu/**
24dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu * Used to merge adjacent byte buffers.
25dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu */
26dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhupublic class ByteBufferHelper {
27dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    public static List<ByteBuffer> mergeAdjacentBuffers(List<ByteBuffer> samples) {
28dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        ArrayList<ByteBuffer> nuSamples = new ArrayList<ByteBuffer>(samples.size());
29dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        for (ByteBuffer buffer : samples) {
30dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            int lastIndex = nuSamples.size() - 1;
31dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            if (lastIndex >= 0 && buffer.hasArray() && nuSamples.get(lastIndex).hasArray() && buffer.array() == nuSamples.get(lastIndex).array() &&
32dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    nuSamples.get(lastIndex).arrayOffset() + nuSamples.get(lastIndex).limit() == buffer.arrayOffset()) {
33dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ByteBuffer oldBuffer = nuSamples.remove(lastIndex);
34dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ByteBuffer nu = ByteBuffer.wrap(buffer.array(), oldBuffer.arrayOffset(), oldBuffer.limit() + buffer.limit()).slice();
35dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                // We need to slice here since wrap([], offset, length) just sets position and not the arrayOffset.
36dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                nuSamples.add(nu);
37dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else if (lastIndex >= 0 &&
38dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    buffer instanceof MappedByteBuffer && nuSamples.get(lastIndex) instanceof MappedByteBuffer &&
39dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                    nuSamples.get(lastIndex).limit() == nuSamples.get(lastIndex).capacity() - buffer.capacity()) {
40dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                // This can go wrong - but will it?
41dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                ByteBuffer oldBuffer = nuSamples.get(lastIndex);
42dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                oldBuffer.limit(buffer.limit() + oldBuffer.limit());
43dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            } else {
44dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                buffer.rewind();
45dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu                nuSamples.add(buffer);
46dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu            }
47dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        }
48dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu        return nuSamples;
49dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu    }
50dd9eb897ee7c7b507cbdcf80263bb4b5de6966bfTeng-Hui Zhu}
51