diff options
Diffstat (limited to 'isoparser/src/main/java/com/googlecode/mp4parser/authoring/builder/.svn/text-base/TwoSecondIntersectionFinder.java.svn-base')
-rw-r--r-- | isoparser/src/main/java/com/googlecode/mp4parser/authoring/builder/.svn/text-base/TwoSecondIntersectionFinder.java.svn-base | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/isoparser/src/main/java/com/googlecode/mp4parser/authoring/builder/.svn/text-base/TwoSecondIntersectionFinder.java.svn-base b/isoparser/src/main/java/com/googlecode/mp4parser/authoring/builder/.svn/text-base/TwoSecondIntersectionFinder.java.svn-base new file mode 100644 index 0000000..88aa4ab --- /dev/null +++ b/isoparser/src/main/java/com/googlecode/mp4parser/authoring/builder/.svn/text-base/TwoSecondIntersectionFinder.java.svn-base @@ -0,0 +1,86 @@ +/* + * Copyright 2012 Sebastian Annies, Hamburg + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.googlecode.mp4parser.authoring.builder; + +import com.coremedia.iso.boxes.TimeToSampleBox; +import com.googlecode.mp4parser.authoring.Movie; +import com.googlecode.mp4parser.authoring.Track; + +import java.util.Arrays; +import java.util.List; + +/** + * This <code>FragmentIntersectionFinder</code> cuts the input movie in 2 second + * snippets. + */ +public class TwoSecondIntersectionFinder implements FragmentIntersectionFinder { + + protected long getDuration(Track track) { + long duration = 0; + for (TimeToSampleBox.Entry entry : track.getDecodingTimeEntries()) { + duration += entry.getCount() * entry.getDelta(); + } + return duration; + } + + /** + * {@inheritDoc} + */ + public long[] sampleNumbers(Track track, Movie movie) { + List<TimeToSampleBox.Entry> entries = track.getDecodingTimeEntries(); + + double trackLength = 0; + for (Track thisTrack : movie.getTracks()) { + double thisTracksLength = getDuration(thisTrack) / thisTrack.getTrackMetaData().getTimescale(); + if (trackLength < thisTracksLength) { + trackLength = thisTracksLength; + } + } + + int fragmentCount = (int)Math.ceil(trackLength / 2) - 1; + if (fragmentCount < 1) { + fragmentCount = 1; + } + + long fragments[] = new long[fragmentCount]; + Arrays.fill(fragments, -1); + fragments[0] = 1; + + long time = 0; + int samples = 0; + for (TimeToSampleBox.Entry entry : entries) { + for (int i = 0; i < entry.getCount(); i++) { + int currentFragment = (int) (time / track.getTrackMetaData().getTimescale() / 2) + 1; + if (currentFragment >= fragments.length) { + break; + } + fragments[currentFragment] = samples++ + 1; + time += entry.getDelta(); + } + } + long last = samples + 1; + // fill all -1 ones. + for (int i = fragments.length - 1; i >= 0; i--) { + if (fragments[i] == -1) { + fragments[i] = last ; + } + last = fragments[i]; + } + return fragments; + + } + +} |