001/*
002 * ModeShape (http://www.modeshape.org)
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *       http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.modeshape.sequencer.video;
017
018import static org.hamcrest.core.Is.is;
019import static org.junit.Assert.assertThat;
020import static org.modeshape.sequencer.video.VideoMetadataLexicon.CHANNELS;
021import static org.modeshape.sequencer.video.VideoMetadataLexicon.CODEC;
022import static org.modeshape.sequencer.video.VideoMetadataLexicon.COMMENT;
023import static org.modeshape.sequencer.video.VideoMetadataLexicon.DURATION;
024import static org.modeshape.sequencer.video.VideoMetadataLexicon.ENCODER;
025import static org.modeshape.sequencer.video.VideoMetadataLexicon.FRAMERATE;
026import static org.modeshape.sequencer.video.VideoMetadataLexicon.HEIGHT;
027import static org.modeshape.sequencer.video.VideoMetadataLexicon.SAMPLERATE;
028import static org.modeshape.sequencer.video.VideoMetadataLexicon.STREAM_NODE;
029import static org.modeshape.sequencer.video.VideoMetadataLexicon.STREAM_TYPE;
030import static org.modeshape.sequencer.video.VideoMetadataLexicon.TITLE;
031import static org.modeshape.sequencer.video.VideoMetadataLexicon.WIDTH;
032
033import javax.jcr.Node;
034
035import org.junit.Test;
036import org.modeshape.jcr.api.JcrConstants;
037import org.modeshape.jcr.sequencer.AbstractSequencerTest;
038
039/**
040 * Unit test for {@link VideoMetadataSequencer}.
041 */
042public class VideoMetadataSequencerTest extends AbstractSequencerTest {
043
044    @Test
045    public void shouldSequenceAvi() throws Exception {
046        // GIVEN
047        String filename = "sample.avi";
048
049        // WHEN
050        createNodeWithContentFromFile(filename, filename);
051
052        // THEN
053        Node sequencedNode = getOutputNode(rootNode, "sequenced/video/" + filename);
054        assertThat(sequencedNode.getProperty(JcrConstants.JCR_MIME_TYPE).getString(), is("video/x-msvideo"));
055        assertThat(sequencedNode.getProperty(DURATION).getDouble(), is(3.0));
056        assertThat(sequencedNode.getProperty(TITLE).getString(), is("Title"));
057        assertThat(sequencedNode.getProperty(COMMENT).getString(), is("Comment"));
058        assertThat(sequencedNode.getProperty(ENCODER).getString(), is("Lavf56.25.101"));
059
060        Node videoStream = sequencedNode.getNode(STREAM_NODE + "0");
061        assertThat(videoStream.getProperty(STREAM_TYPE).getString(), is("video"));
062        assertThat(videoStream.getProperty(CODEC).getString(), is("mpeg4"));
063        assertThat(videoStream.getProperty(WIDTH).getLong(), is(320L));
064        assertThat(videoStream.getProperty(HEIGHT).getLong(), is(240L));
065        assertThat(videoStream.getProperty(FRAMERATE).getDouble(), is(15.0));
066
067        Node audioStream = sequencedNode.getNode(STREAM_NODE + "1");
068        assertThat(audioStream.getProperty(STREAM_TYPE).getString(), is("audio"));
069        assertThat(audioStream.getProperty(CODEC).getString(), is("mp3"));
070        assertThat(audioStream.getProperty(SAMPLERATE).getLong(), is(48000L));
071        assertThat(audioStream.getProperty(CHANNELS).getLong(), is(2L));
072    }
073
074    @Test
075    public void shouldSequenceMp4() throws Exception {
076        // GIVEN
077        String filename = "sample.mp4";
078
079        // WHEN
080        createNodeWithContentFromFile(filename, filename);
081
082        // THEN
083        Node sequencedNode = getOutputNode(rootNode, "sequenced/video/" + filename);
084        assertThat(sequencedNode.getProperty(JcrConstants.JCR_MIME_TYPE).getString(), is("video/mp4"));
085        assertThat(sequencedNode.getProperty(TITLE).getString(), is("Title"));
086        assertThat(sequencedNode.getProperty(COMMENT).getString(), is("Comment"));
087        assertThat(sequencedNode.getProperty(ENCODER).getString(), is("Lavf56.25.101"));
088
089        Node videoStream = sequencedNode.getNode(STREAM_NODE + "0");
090        assertThat(videoStream.getProperty(STREAM_TYPE).getString(), is("video"));
091        assertThat(videoStream.getProperty(CODEC).getString(), is("h264"));
092        assertThat(videoStream.getProperty(HEIGHT).getLong(), is(240L));
093        assertThat(videoStream.getProperty(FRAMERATE).getDouble(), is(30.0));
094
095        Node audioStream = sequencedNode.getNode(STREAM_NODE + "1");
096        assertThat(audioStream.getProperty(STREAM_TYPE).getString(), is("audio"));
097        assertThat(audioStream.getProperty(CODEC).getString(), is("aac"));
098        assertThat(audioStream.getProperty(SAMPLERATE).getLong(), is(48000L));
099        assertThat(audioStream.getProperty(CHANNELS).getLong(), is(6L));
100    }
101
102    @Test
103    public void shouldSequenceMkv() throws Exception {
104        // GIVEN
105        String filename = "sample.mkv";
106
107        // WHEN
108        createNodeWithContentFromFile(filename, filename);
109
110        // THEN
111        Node sequencedNode = getOutputNode(rootNode, "sequenced/video/" + filename);
112        assertThat(sequencedNode.getProperty(JcrConstants.JCR_MIME_TYPE).getString(), is("video/x-matroska"));
113        assertThat(sequencedNode.getProperty(TITLE).getString(), is("Title"));
114        assertThat(sequencedNode.getProperty(ENCODER).getString(), is("Lavf56.25.101"));
115
116        Node videoStream = sequencedNode.getNode(STREAM_NODE + "0");
117        assertThat(videoStream.getProperty(STREAM_TYPE).getString(), is("video"));
118        assertThat(videoStream.getProperty(CODEC).getString(), is("h264"));
119        assertThat(videoStream.getProperty(HEIGHT).getLong(), is(240L));
120        assertThat(videoStream.getProperty(FRAMERATE).getDouble(), is(50.0));
121
122        Node audioStream = sequencedNode.getNode(STREAM_NODE + "1");
123        assertThat(audioStream.getProperty(STREAM_TYPE).getString(), is("audio"));
124        assertThat(audioStream.getProperty(CODEC).getString(), is("aac"));
125        assertThat(audioStream.getProperty(SAMPLERATE).getLong(), is(48000L));
126        assertThat(audioStream.getProperty(CHANNELS).getLong(), is(6L));
127    }
128}