Package com.xuggle.xuggler

Source Code of com.xuggle.xuggler.UtilsTest

/*******************************************************************************
* Copyright (c) 2008, 2010 Xuggle Inc.  All rights reserved.
* This file is part of Xuggle-Xuggler-Main.
*
* Xuggle-Xuggler-Main is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xuggle-Xuggler-Main is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Xuggle-Xuggler-Main.  If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/

package com.xuggle.xuggler;

import com.xuggle.ferry.IBuffer;
import com.xuggle.test_utils.NameAwareTestClassRunner;
import com.xuggle.xuggler.IVideoPicture;
import com.xuggle.xuggler.IPixelFormat;
import com.xuggle.xuggler.ITimeValue;
import com.xuggle.xuggler.Utils;
import com.xuggle.xuggler.IVideoResampler.Feature;

import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.Color;
import java.util.Random;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.junit.*;
import org.junit.runner.RunWith;


import static junit.framework.Assert.*;

@RunWith(NameAwareTestClassRunner.class)
public class UtilsTest
{
  private String mTestName;
  @Before
  public void setUp()
  {
    mTestName = NameAwareTestClassRunner.getTestMethodName();
  }
 
  @Test
  public void testGetBlankFrame()
  {
    IVideoPicture frame = null;
    byte y = 62;
    byte u = 15;
    byte v = 33;
    int w = 100;
    int h = 200;
    long pts = 102832;
   
    frame = Utils.getBlankFrame(w, h, y, u, v, pts);
    assertTrue("got a frame", frame != null);
    assertTrue("is complete", frame.isComplete());
    assertTrue("correct pts", frame.getPts() == pts);

    // now, loop through the array and ensure it is set
    // correctly.
    IBuffer data = frame.getData();
    java.nio.ByteBuffer buffer = data.getByteBuffer(0, data.getBufferSize());
    assertNotNull(buffer);
    // we have the raw data; now we set it to the specified YUV value.
    int lineLength = 0;
    int offset = 0;

    // first let's check the L
    offset = 0;
    lineLength = frame.getDataLineSize(0);
    assertTrue("incorrect format", lineLength == w);
    for(int i = offset ; i < offset + lineLength * h; i++)
    {
      byte val = buffer.get(i);
      assertTrue("color not set correctly: " + i, val == y);
    }

    // now, check the U value
    offset = (frame.getDataLineSize(0)*h);
    lineLength = frame.getDataLineSize(1);
    assertTrue("incorrect format", lineLength == w / 2);
    for(int i = offset ; i < offset + lineLength * h / 2; i++)
    {
      byte val = buffer.get(i);
      assertTrue("color not set correctly: " + i, val == u);
    }

    // and finally the V
    offset = (frame.getDataLineSize(0)*h) + (frame.getDataLineSize(1)*h/2);
    lineLength = frame.getDataLineSize(2);
    assertTrue("incorrect format", lineLength == w / 2);
    for(int i = offset; i < offset + lineLength * h / 2; i++)
    {
      byte val = buffer.get(i);
      assertTrue("color not set correctly: " + i, val == v);
    }
   
    // And check another way
    for(int i = 0; i < w; i++)
    {
      for(int j = 0; j < h; j++)
      {
        assertEquals(y, IPixelFormat.getYUV420PPixel(frame, i, j, IPixelFormat.YUVColorComponent.YUV_Y));
        assertEquals(u, IPixelFormat.getYUV420PPixel(frame, i, j, IPixelFormat.YUVColorComponent.YUV_U));
        assertEquals(v, IPixelFormat.getYUV420PPixel(frame, i, j, IPixelFormat.YUVColorComponent.YUV_V));
      }
    }
  }
 
  @Test
  public void testSamplesToTimeValue()
  {
    ITimeValue result = Utils.samplesToTimeValue(22050, 22050);
    assertEquals(1000, result.get(ITimeValue.Unit.MILLISECONDS));
  }
 
  @Test(expected=IllegalArgumentException.class)
  public void testSamplesToTimeValueNoSampleRate()
  {
    Utils.samplesToTimeValue(1024, 0);
  }
 
  @Test
  public void testTimeValueToSamples()
  {
    ITimeValue input = ITimeValue.make(16, ITimeValue.Unit.SECONDS);
    long result = Utils.timeValueToSamples(input, 44100);
    assertEquals(44100*16, result);
  }
 
  @Test(expected=IllegalArgumentException.class)
  public void testTimeValueToSamplesNoSampleRate()
  {
    Utils.timeValueToSamples(ITimeValue.make(1, ITimeValue.Unit.SECONDS), 0);
  }
 
  @Test(expected=IllegalArgumentException.class)
  public void testTimeValueToSamplesNoTimeValue()
  {
    Utils.timeValueToSamples(null, 22050);
  }

  @SuppressWarnings("deprecation")
  @Test(expected=IllegalArgumentException.class)
  public void testVideoPictureToImageNullInput()
  {
    Utils.videoPictureToImage(null);
  }

  @SuppressWarnings("deprecation")
  @Test
  public void testVideoPictureToImageWrongFormatInput()
  {
    if (!IVideoResampler.isSupported(Feature.FEATURE_COLORSPACECONVERSION))
      return;
    IVideoPicture picture = Utils.getBlankFrame(50, 50, 0);
    assertEquals(IPixelFormat.Type.YUV420P, picture.getPixelType());
    Utils.videoPictureToImage(picture);
  }
 
  @SuppressWarnings("deprecation")
  @Test(expected=UnsupportedOperationException.class)
  public void testLGPLBuild()
  {
    if (IVideoResampler.isSupported(Feature.FEATURE_COLORSPACECONVERSION))
      throw new UnsupportedOperationException();
    IVideoPicture picture = Utils.getBlankFrame(50, 50, 0);
    assertEquals(IPixelFormat.Type.YUV420P, picture.getPixelType());
    Utils.videoPictureToImage(picture);
  }

  @SuppressWarnings("deprecation")
  @Test(expected=IllegalArgumentException.class)
  public void testImageToVideoPictureNullInput()
  {
    Utils.imageToVideoPicture(null, 0);
  }

  @SuppressWarnings("deprecation")
  @Test(expected=IllegalArgumentException.class)
  public void testImageToVideoPictureWrongFormatInput()
  {
    BufferedImage image = new BufferedImage(
      50, 50, BufferedImage.TYPE_INT_RGB);
    Utils.imageToVideoPicture(image, 0);
  }

  @SuppressWarnings("deprecation")
  @Test
  public void testImageToImageSolidColor()
  {
    int w = 50;
    int h = 50;
    int gray  = Color.GRAY .getRGB();

    // construct an all gray image

    BufferedImage image1 = new BufferedImage(
      w, h, BufferedImage.TYPE_3BYTE_BGR);
    for (int x = 0; x < w; ++x)
      for (int y = 0; y < h; ++y)
        image1.setRGB(x, y, gray);

    // convert image1 to a picture and then back to image2

    BufferedImage image2 = Utils.videoPictureToImage(
      Utils.imageToVideoPicture(image1, 0));

    // test that all the pixels in image2 are gray, but not black or
    // white

    for (int x = 0; x < w; ++x)
      for (int y = 0; y < h; ++y)
      {
        int pixel = image2.getRGB(x, y);
        assertTrue("color value missmatch", pixel == gray);
      }
  }

  @SuppressWarnings("deprecation")
  @Test
  public void testImageToImageRandomColor()
  {
    int w = 50;
    int h = 50;
    Random rnd = new Random();

    // construct an image of random colors

    BufferedImage image1 = new BufferedImage(
      w, h, BufferedImage.TYPE_3BYTE_BGR);
    for (int x = 0; x < w; ++x)
      for (int y = 0; y < h; ++y)
      {
        Color c = new Color(rnd.nextInt(255),
          rnd.nextInt(255), rnd.nextInt(255));
        image1.setRGB(x, y, c.getRGB());
      }

    // convert image1 to a picture and then back to image2

    BufferedImage image2 = Utils.videoPictureToImage(
      Utils.imageToVideoPicture(image1, 0));

    // test that all the pixels in image2 are the same as image1

    for (int x = 0; x < w; ++x)
      for (int y = 0; y < h; ++y)
      {
        int pixel1 = image1.getRGB(x, y);
        int pixel2 = image2.getRGB(x, y);
        assertTrue("color value missmatch", pixel1 == pixel2);
      }
  }

  @SuppressWarnings("deprecation")
  @Test
  public void testPictureToPictureWithRotate()
  {
    // note that the image is square in this test to make rotation
    // easier to handle

    int size = 50;
    int black = Color.BLACK.getRGB();
    int white = Color.WHITE.getRGB();

    // construct an image with black and white stripped columns

    BufferedImage image1 = new BufferedImage(
      size, size, BufferedImage.TYPE_3BYTE_BGR);
    for (int x = 0; x < size; ++x)
      for (int y = 0; y < size; ++y)
      {
        int color = x % 2 == 0 ? black : white;
        image1.setRGB(x, y, color);
      }

    // convert image1 to a picture and then back to image2

    BufferedImage image2 = Utils.videoPictureToImage(
      Utils.imageToVideoPicture(image1, 0));

    // rotae image2

    AffineTransform t = AffineTransform.getRotateInstance(
      Math.PI/2, image2.getWidth() / 2, image2.getHeight() / 2);
    AffineTransformOp ato = new AffineTransformOp(t,
      AffineTransformOp.TYPE_BICUBIC);
    BufferedImage image3 = new BufferedImage(
        size, size, BufferedImage.TYPE_3BYTE_BGR);
    ato.filter(image2, image3);

    // convert image2 to a picture and then back to image3

    BufferedImage image4 = Utils.videoPictureToImage(
      Utils.imageToVideoPicture(image3, 0));

    // test that image4 now contains stripped rows (not columns)

    for (int x = 0; x < size; ++x)
      for (int y = 0; y < size; ++y)
      {
        int pixel = image4.getRGB(x, y);
        int color = y % 2 == 0 ? black : white;
        assertTrue("color value missmatch", pixel == color);
      }
  }

  /**
   * Reads in an input file, and converts it to a new format, but replacing
   * all images with a cross-hatch test pattern.
   *
   * @throws ParseException
   */
  @Test
  public void testUtilsCrossHatch() throws ParseException
  {
    Converter converter = new Converter() {
      @Override
      protected IVideoPicture alterVideoFrame(IVideoPicture videoFrame)
      {
        // override the image passed in, and instead output a cross hatch.
        // but alternate colors every second
        final int CROSSHATCH_WIDTH = 20;
        final int CROSSHATCH_HEIGHT = 20;
        if ((videoFrame.getPts()/(Global.DEFAULT_PTS_PER_SECOND))%2==1)
         
          return Utils.getBlankFrame(
              videoFrame.getWidth(),
              videoFrame.getHeight(),
              0, 0, 0,
              videoFrame.getTimeStamp(),
              CROSSHATCH_WIDTH, CROSSHATCH_HEIGHT,
              255, 255, 255);
        else
          return Utils.getBlankFrame(
              videoFrame.getWidth(),
              videoFrame.getHeight(),
              255, 255, 255,
              videoFrame.getTimeStamp(),
              CROSSHATCH_WIDTH, CROSSHATCH_HEIGHT,
              0, 0, 0);
      }
    };

    String[] args = new String[]{
        "--containerformat",
        "mov",
        "--acodec",
        "libmp3lame",
        "--asamplerate",
        "22050",
        "--achannels",
        "2",
        "--abitrate",
        "64000",
        "--aquality",
        "0",
        "--vcodec",
        "mpeg4",
        "--vscalefactor",
        "1.0",
        "--vbitrate",
        "300000",
        "--vbitratetolerance",
        "12000000",
        "--vquality",
        "0",
        "fixtures/testfile_videoonly_20sec.flv",
        this.getClass().getName() + "_" + mTestName + ".mov"
    };

    Options options = converter.defineOptions();

    CommandLine cmdLine = converter.parseOptions(options, args);
    assertTrue("all commandline options successful", cmdLine != null);

    converter.run(cmdLine);
  }
}
TOP

Related Classes of com.xuggle.xuggler.UtilsTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.