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}