blob: c29d064729251d710d670976f8eaa25970ae04c3 [file] [log] [blame]
// Copyright 2012 Google Inc. All Rights Reserved.
// Author: frkoenig@google.com (Fritz Koenig)
import com.google.libvpx.IVFReader;
import com.google.libvpx.IVFWriter;
import com.google.libvpx.LibVpxDec;
import com.google.libvpx.LibVpxEnc;
import com.google.libvpx.LibVpxEncConfig;
import com.google.libvpx.LibVpxException;
import com.google.libvpx.Rational;
import com.google.libvpx.VpxCodecCxPkt;
import com.google.libvpx.WebmWriter;
import com.google.libvpx.Y4MReader;
import com.google.libvpx.Y4MWriter;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
/**
* Simple application that loads a file, compresses it and then
* decompresses that file.
*/
public class Application {
static int maxFramesToDecode = 30;
public static void main(String[] args) {
File y4mFileName = new File("input/foreman_cif.y4m");
File ivfFileName = new File("output/foreman_cif_420p_352x288.ivf");
File webmFileName = new File("output/foreman_cif_420p_352x288.webm");
Y4MReader y4mReader;
try {
y4mReader = new Y4MReader(y4mFileName);
} catch (IOException e) {
System.err.println("Error reading " + y4mFileName + " : " + e);
System.exit(-1);
// TODO(frkoenig) : fix warning that y4mReader is not initialized when
// System.exit(-1) is called without return;
return;
}
LibVpxEncConfig encoderConfig = null;
IVFWriter ivfWriter = null;
LibVpxEnc encoder = null;
WebmWriter webmWriter = null;
try {
encoderConfig = new LibVpxEncConfig(y4mReader.getWidth(),
y4mReader.getHeight());
encoder = new LibVpxEnc(encoderConfig);
ivfWriter = new IVFWriter(ivfFileName,
encoderConfig.getFourcc(),
encoderConfig.getWidth(),
encoderConfig.getHeight(),
encoderConfig.getTimebase());
byte[] uncompressedFrame;
Rational timeBase = encoderConfig.getTimebase();
Rational timeMultiplier = timeBase.multiply(y4mReader.getFrameRate()).reciprocal();
int framesIn = 1;
webmWriter = new WebmWriter(webmFileName,
encoderConfig.getWidth(),
encoderConfig.getHeight(),
encoderConfig.getTimebase(),
y4mReader.getFrameRate());
while ((uncompressedFrame = y4mReader.getUncompressedFrame()) != null &&
framesIn < maxFramesToDecode) {
long frameStart = timeMultiplier.multiply(framesIn - 1).toLong();
long nextFrameStart = timeMultiplier.multiply(framesIn).toLong();
ArrayList<VpxCodecCxPkt> encPkt = encoder.encodeFrame(
uncompressedFrame, LibVpxEnc.VPX_IMG_FMT_I420, frameStart, nextFrameStart - frameStart);
for (int i = 0; i < encPkt.size(); i++) {
VpxCodecCxPkt pkt = encPkt.get(i);
ivfWriter.writeFrame(pkt, 0L);
webmWriter.writeFrame(pkt);
}
++framesIn;
}
} catch (IOException e) {
System.err.println(e);
} catch (LibVpxException e) {
System.err.println("Encoder error : " + e);
} finally {
if (encoder != null) {
encoder.close();
}
if (encoderConfig != null) {
encoderConfig.close();
}
if (ivfWriter != null) {
ivfWriter.close();
}
if (webmWriter != null) {
webmWriter.close();
}
}
File y4mOutputFileName = new File("output/foreman_cif.y4m");
LibVpxDec decoder = null;
Y4MWriter y4mWriter = null;
try {
IVFReader ivfReader = new IVFReader(ivfFileName);
decoder = new LibVpxDec();
y4mWriter = new Y4MWriter(y4mOutputFileName,
ivfReader.getWidth(), ivfReader.getHeight(), y4mReader.getFrameRate());
byte[] compressedFrame;
while ((compressedFrame = ivfReader.readNextFrame()) != null) {
byte[] uncompressedFrame = decoder.decodeFrameToBuffer(compressedFrame);
if (uncompressedFrame != null) {
y4mWriter.writeFrame(uncompressedFrame);
}
}
System.out.println("vpx version: " + decoder.versionString());
} catch (IOException e) {
System.err.println("Error reading " + ivfFileName + " : " + e);
} catch (LibVpxException e) {
System.err.println("Decoder error : " + e);
} finally {
if (decoder != null) {
decoder.close();
}
if (y4mWriter != null) {
y4mWriter.close();
}
}
if (LibVpxEnc.haveLibyuv()) {
final int width = 320;
final int height = 180;
final int rate = 24;
final int scale = 1;
final int framesToEncode = 200;
byte[] rgbFrame = new byte[width * height * 3];
// Create a green gradiant.
for (int y = 0; y < height; ++y) {
final byte green = (byte)y;
final int xStart = y * width * 3;
for (int x = 0; x < width; ++x) {
rgbFrame[xStart + (x * 3)] = 0;
rgbFrame[xStart + (x * 3) + 1] = green;
rgbFrame[xStart + (x * 3) + 2] = 0;
}
}
String outputWebM = "output/rgbframe.webm";
String outStr = BindingsSamples.testVideoConvertEncode(outputWebM,
rgbFrame, LibVpxEnc.FOURCC_24BG, width, height, rate, scale, framesToEncode);
if (outStr != "Success!")
System.err.println(outStr);
}
}
}