View Javadoc

1   /**
2    * Copyright (c) 2011, The University of Southampton and the individual contributors.
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without modification,
6    * are permitted provided that the following conditions are met:
7    *
8    *   * 	Redistributions of source code must retain the above copyright notice,
9    * 	this list of conditions and the following disclaimer.
10   *
11   *   *	Redistributions in binary form must reproduce the above copyright notice,
12   * 	this list of conditions and the following disclaimer in the documentation
13   * 	and/or other materials provided with the distribution.
14   *
15   *   *	Neither the name of the University of Southampton nor the names of its
16   * 	contributors may be used to endorse or promote products derived from this
17   * 	software without specific prior written permission.
18   *
19   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23   * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26   * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29   */
30  package org.openimaj.tools.imagecollection.collection.video.selection;
31  
32  import java.text.ParseException;
33  
34  import org.openimaj.image.MBFImage;
35  import org.openimaj.tools.imagecollection.collection.ImageCollectionEntrySelection;
36  import org.openimaj.tools.imagecollection.collection.config.ImageCollectionConfig;
37  import org.openimaj.video.xuggle.XuggleVideo;
38  
39  public abstract class XuggleVideoFrameSelection implements ImageCollectionEntrySelection<MBFImage> {
40  	public static class Proxy extends XuggleVideoFrameSelection {
41  		private ImageCollectionEntrySelection<MBFImage> proxy;
42  
43  		public Proxy(ImageCollectionEntrySelection<MBFImage> proxy) {
44  			this.proxy = proxy;
45  		}
46  		
47  		@Override
48  		public boolean acceptEntry(MBFImage image){
49  			return proxy.acceptEntry(image);
50  		}
51  	}
52  	public XuggleVideoFrameSelection(ImageCollectionConfig config){
53  		
54  	}
55  	
56  	public XuggleVideoFrameSelection() {
57  	}
58  
59  	@Override
60  	public boolean acceptEntry(MBFImage image){
61  		return true;
62  	}
63  
64  	public void init(XuggleVideo video){
65  		
66  	}
67  	public static class All extends XuggleVideoFrameSelection{
68  
69  		public All(ImageCollectionConfig config) {
70  			super(config);
71  		}
72  	}
73  	
74  	public static class FramesPerSecond extends XuggleVideoFrameSelection{
75  
76  		private Integer framesPerSecond;
77  		private int framesToSkip;
78  		private int framesCount;
79  
80  		public FramesPerSecond(ImageCollectionConfig config) throws ParseException {
81  			super(config);
82  			this.framesPerSecond = config.read("video.framespersecond");
83  			if(this.framesPerSecond  == null){
84  				this.framesPerSecond = 2;
85  			}
86  		}
87  		
88  		@Override
89  		public void init(XuggleVideo video){
90  			this.framesToSkip = (int) (video.getFPS() / this.framesPerSecond);
91  			if(this.framesToSkip < 1) this.framesToSkip = 1;
92  			this.framesCount = 0;
93  		}
94  		
95  		@Override
96  		public boolean acceptEntry(MBFImage image){
97  			boolean good = (this.framesCount % this.framesToSkip) == 0;
98  			this.framesCount++;
99  			return good;
100 		}
101 	}
102 	
103 	private enum Styles{
104 		ALL {
105 			@Override
106 			public XuggleVideoFrameSelection style(ImageCollectionConfig config) {
107 				return new XuggleVideoFrameSelection.All(config);
108 			}
109 		},FRAMESPERSECOND {
110 			@Override
111 			public XuggleVideoFrameSelection style(ImageCollectionConfig config) throws ParseException {
112 				return new XuggleVideoFrameSelection.FramesPerSecond(config);
113 			}
114 		}
115 //		,KEYFRAMES {
116 //			@Override
117 //			public FrameStyle style(ImageCollectionConfig config) {
118 //				return new FrameStyle.KeyFrames(config);
119 //			}
120 //		}
121 		;
122 		public abstract XuggleVideoFrameSelection style(ImageCollectionConfig config) throws ParseException;
123 	}
124 	public static XuggleVideoFrameSelection byName(String read,ImageCollectionConfig config) throws ParseException {
125 		return Styles.valueOf(read).style(config);
126 	}
127 
128 }