Home | History | Annotate | Download | only in tracks
      1 /*
      2  * Copyright 2012 Sebastian Annies, Hamburg
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the License);
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an AS IS BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.googlecode.mp4parser.authoring.tracks;
     17 
     18 import com.coremedia.iso.boxes.*;
     19 import com.googlecode.mp4parser.authoring.AbstractTrack;
     20 import com.googlecode.mp4parser.authoring.Track;
     21 import com.googlecode.mp4parser.authoring.TrackMetaData;
     22 
     23 import java.nio.ByteBuffer;
     24 import java.util.AbstractList;
     25 import java.util.LinkedList;
     26 import java.util.List;
     27 
     28 /**
     29  * Generates a Track where a single sample has been replaced by a given <code>ByteBuffer</code>.
     30  */
     31 
     32 public class ReplaceSampleTrack extends AbstractTrack {
     33     Track origTrack;
     34     private long sampleNumber;
     35     private ByteBuffer sampleContent;
     36     private List<ByteBuffer>  samples;
     37 
     38     public ReplaceSampleTrack(Track origTrack, long sampleNumber, ByteBuffer content) {
     39         this.origTrack = origTrack;
     40         this.sampleNumber = sampleNumber;
     41         this.sampleContent = content;
     42         this.samples = new ReplaceASingleEntryList();
     43 
     44     }
     45 
     46     public List<ByteBuffer> getSamples() {
     47         return samples;
     48     }
     49 
     50     public SampleDescriptionBox getSampleDescriptionBox() {
     51         return origTrack.getSampleDescriptionBox();
     52     }
     53 
     54     public List<TimeToSampleBox.Entry> getDecodingTimeEntries() {
     55         return origTrack.getDecodingTimeEntries();
     56 
     57     }
     58 
     59     public List<CompositionTimeToSample.Entry> getCompositionTimeEntries() {
     60         return origTrack.getCompositionTimeEntries();
     61 
     62     }
     63 
     64     synchronized public long[] getSyncSamples() {
     65         return origTrack.getSyncSamples();
     66     }
     67 
     68     public List<SampleDependencyTypeBox.Entry> getSampleDependencies() {
     69         return origTrack.getSampleDependencies();
     70     }
     71 
     72     public TrackMetaData getTrackMetaData() {
     73         return origTrack.getTrackMetaData();
     74     }
     75 
     76     public String getHandler() {
     77         return origTrack.getHandler();
     78     }
     79 
     80     public Box getMediaHeaderBox() {
     81         return origTrack.getMediaHeaderBox();
     82     }
     83 
     84     public SubSampleInformationBox getSubsampleInformationBox() {
     85         return origTrack.getSubsampleInformationBox();
     86     }
     87 
     88     private class ReplaceASingleEntryList extends AbstractList<ByteBuffer> {
     89         @Override
     90         public ByteBuffer get(int index) {
     91             if (ReplaceSampleTrack.this.sampleNumber == index) {
     92                 return ReplaceSampleTrack.this.sampleContent;
     93             } else {
     94                 return ReplaceSampleTrack.this.origTrack.getSamples().get(index);
     95             }
     96         }
     97 
     98         @Override
     99         public int size() {
    100             return ReplaceSampleTrack.this.origTrack.getSamples().size();
    101         }
    102     }
    103 
    104 }
    105