/**
*
* @author pquiring
*
* Created : Sept 20, 2013
*/
import java.io.*;
import javaforce.*;
import javaforce.media.*;
public class Transcoder implements MediaIO {
MediaEncoder encoder = new MediaEncoder();
MediaDecoder decoder = new MediaDecoder();
RandomAccessFile fin, fout;
public boolean transcode(String in, String out, String outCodec) {
int chs, freq;
try {
fin = new RandomAccessFile(in, "r");
fout = new RandomAccessFile(out, "rw");
fout.setLength(0);
if (!decoder.start(this, -1, -1, -1, -1, true)) throw new Exception("Decoder Failed to start");
chs = decoder.getChannels();
freq = decoder.getSampleRate();
if (!encoder.start(this, -1, -1, -1, chs, freq, outCodec, false, true)) throw new Exception("Encoder Failed to start");
short samples[];
while (true) {
int type = decoder.read();
if (type == MediaCoder.NULL_FRAME) continue; //metadata
if (type == MediaCoder.END_FRAME) break; //end of data
samples = decoder.getAudio();
if (samples == null) break;
encoder.addAudio(samples);
}
decoder.stop();
encoder.stop();
fin.close();
fout.close();
} catch (Exception e) {
JFLog.log(e);
return false;
}
return true;
}
public int read(MediaCoder coder, byte[] bytes) {
if (coder == decoder) {
try {
return fin.read(bytes, 0, bytes.length);
} catch (Exception e) {
JFLog.log(e);
return 0;
}
}
return 0;
}
public int write(MediaCoder coder, byte[] bytes) {
if (coder == encoder) {
try {
fout.write(bytes);
return bytes.length;
} catch (Exception e) {
JFLog.log(e);
return 0;
}
}
return 0;
}
public long seek(MediaCoder coder, long pos, int how) {
if (coder == decoder) {
try {
switch (how) {
case MediaCoder.SEEK_SET: break;
case MediaCoder.SEEK_CUR: pos += fin.getFilePointer(); break;
case MediaCoder.SEEK_END: pos += fin.length(); break;
}
fin.seek(pos);
return pos;
} catch (Exception e) {
JFLog.log(e);
}
return 0;
} else if (coder == encoder) {
try {
switch (how) {
case MediaCoder.SEEK_SET: break;
case MediaCoder.SEEK_CUR: pos += fout.getFilePointer(); break;
case MediaCoder.SEEK_END: pos += fout.length(); break;
}
fout.seek(pos);
return pos;
} catch (Exception e) {
JFLog.log(e);
}
return 0;
}
return 0;
}
}