001
014
015 package com.liferay.portlet.documentlibrary.util;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019
020 import com.xuggle.xuggler.IAudioResampler;
021 import com.xuggle.xuggler.IAudioSamples;
022 import com.xuggle.xuggler.ICodec;
023 import com.xuggle.xuggler.IContainer;
024 import com.xuggle.xuggler.IPacket;
025 import com.xuggle.xuggler.IStream;
026 import com.xuggle.xuggler.IStreamCoder;
027
028
033 public class LiferayAudioConverter extends LiferayConverter {
034
035 public LiferayAudioConverter(String inputURL, String outputURL) {
036 _inputURL = inputURL;
037 _outputURL = outputURL;
038 }
039
040 @Override
041 public void convert() throws Exception {
042 try {
043 doConvert();
044 }
045 finally {
046 if (_inputIContainer.isOpened()) {
047 _inputIContainer.close();
048 }
049
050 if (_outputIContainer.isOpened()) {
051 _outputIContainer.close();
052 }
053 }
054 }
055
056 protected void doConvert() throws Exception {
057 _inputIContainer = IContainer.make();
058 _outputIContainer = IContainer.make();
059
060 openContainer(_inputIContainer, _inputURL, false);
061 openContainer(_outputIContainer, _outputURL, true);
062
063 int inputStreamsCount = _inputIContainer.getNumStreams();
064
065 if (inputStreamsCount < 0) {
066 throw new RuntimeException("Input URL does not have any streams");
067 }
068
069 IAudioResampler[] iAudioResamplers =
070 new IAudioResampler[inputStreamsCount];
071
072 IAudioSamples[] inputIAudioSamples =
073 new IAudioSamples[inputStreamsCount];
074 IAudioSamples[] outputIAudioSamples =
075 new IAudioSamples[inputStreamsCount];
076
077 IStream[] outputIStreams = new IStream[inputStreamsCount];
078
079 IStreamCoder[] inputIStreamCoders = new IStreamCoder[inputStreamsCount];
080 IStreamCoder[] outputIStreamCoders =
081 new IStreamCoder[inputStreamsCount];
082
083 for (int i = 0; i < inputStreamsCount; i++) {
084 IStream inputIStream = _inputIContainer.getStream(i);
085
086 IStreamCoder inputIStreamCoder = inputIStream.getStreamCoder();
087
088 inputIStreamCoders[i] = inputIStreamCoder;
089
090 ICodec.Type inputICodecType = inputIStreamCoder.getCodecType();
091
092 if (inputICodecType == ICodec.Type.CODEC_TYPE_AUDIO) {
093 prepareAudio(
094 iAudioResamplers, inputIAudioSamples, outputIAudioSamples,
095 inputIStreamCoder, outputIStreamCoders, _outputIContainer,
096 outputIStreams, inputICodecType, _outputURL, i);
097 }
098
099 openStreamCoder(inputIStreamCoders[i]);
100 openStreamCoder(outputIStreamCoders[i]);
101 }
102
103 if (_outputIContainer.writeHeader() < 0) {
104 throw new RuntimeException("Unable to write container header");
105 }
106
107 IPacket inputIPacket = IPacket.make();
108 IPacket outputIPacket = IPacket.make();
109
110 int previousPacketSize = -1;
111
112 _inputIContainer.readNextPacket(inputIPacket);
113
114 while (_inputIContainer.readNextPacket(inputIPacket) == 0) {
115 if (_log.isDebugEnabled()) {
116 _log.debug("Current packet size " + inputIPacket.getSize());
117 }
118
119 int streamIndex = inputIPacket.getStreamIndex();
120
121 IStreamCoder inputIStreamCoder = inputIStreamCoders[streamIndex];
122 IStreamCoder outputIStreamCoder = outputIStreamCoders[streamIndex];
123
124 if (outputIStreamCoder == null) {
125 continue;
126 }
127
128 if (inputIStreamCoder.getCodecType() ==
129 ICodec.Type.CODEC_TYPE_AUDIO) {
130
131 IStream iStream = _inputIContainer.getStream(streamIndex);
132
133 long timeStampOffset = getStreamTimeStampOffset(iStream);
134
135 decodeAudio(
136 iAudioResamplers[streamIndex],
137 inputIAudioSamples[streamIndex],
138 outputIAudioSamples[streamIndex], inputIPacket,
139 outputIPacket, inputIStreamCoder, outputIStreamCoder,
140 _outputIContainer, inputIPacket.getSize(),
141 previousPacketSize, streamIndex, timeStampOffset);
142 }
143
144 previousPacketSize = inputIPacket.getSize();
145 }
146
147 flush(outputIStreamCoders, _outputIContainer);
148
149 if (_outputIContainer.writeTrailer() < 0) {
150 throw new RuntimeException(
151 "Unable to write trailer to output file");
152 }
153
154 cleanUp(iAudioResamplers, null);
155 cleanUp(inputIAudioSamples, outputIAudioSamples);
156 cleanUp(inputIStreamCoders, outputIStreamCoders);
157 cleanUp(inputIPacket, outputIPacket);
158 }
159
160 @Override
161 protected IContainer getInputIContainer() {
162 return _inputIContainer;
163 }
164
165 private static Log _log = LogFactoryUtil.getLog(
166 LiferayAudioConverter.class);
167
168 private IContainer _inputIContainer;
169 private String _inputURL;
170 private IContainer _outputIContainer;
171 private String _outputURL;
172
173 }