Turbojpeg (turbojpeg v0.3.0) View Source

TurboJPEG

Fast JPEG encoding from raw YUV data using libjpeg-turbo

CircleCI

Installation

This library requires libjpeg-turbo to be installed

Arch linux

sudo pacman -S libjpeg-turbo

Ubuntu/Debian

sudo apt-get install libturbojpeg libturbojpeg0-dev

OSX

brew install libjpeg-turbo

Develement Dependencies

Arch linux

sudo pacman -S imagemagick

Ubuntu/Debian

sudo apt-get install imagemagick

OSX

brew install imagemagick

If available in Hex, the package can be installed by adding turbojpeg to your list of dependencies in mix.exs:

def deps do
  [
    {:turbojpeg, "~> 0.3"}
  ]
end

Basic Usage

iex(1)> frame = File.read!("fixture/i420.yuv")
<<0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 2, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...>>
iex(2)> {:ok, jpeg} = Turbojpeg.yuv_to_jpeg(frame, 1920, 1080, 90, :I420)
{:ok, <<255, 216, 255, 224, 0, 16, 74, 70, 73, 70, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 255,
  219, 0, 67, 0, 3, 2, 2, 3, 2, 2, 3, 3, 3, 3, 4, 3, 3, 4, 5, 8, 5, 5, 4, 4, 5,
  10, 7, 7, 6, ...>>}
iex(3)> File.write!("test.jpg", jpeg)
:ok

Membrane Sink Usage

Pleas See the membrane guide before using this.

defmodule Your.Module.Pipeline do
  use Membrane.Pipeline

  @impl true
  def handle_init(location) do
    children = %{
      source: %SomeMembraneSourceModule{location: location},
      decoder: Membrane.Element.FFmpeg.H264.Decoder,
      jpeg_converter: %Turbojpeg.Sink{filename: "/tmp/frame.jpeg", quality: 100},
    }

    links = [
      link(:source) 
      |> to(:decoder) 
      |> to(:jpeg_converter) 
    ]

    spec = %ParentSpec{
      children: children,
      links: links
    }

    {{:ok, spec: spec}, %{}}
  end

end

Copyright and License

Copyright 2021, Binary Noggin

Link to this section Summary

Functions

Gets the header from a jpegv

Converts jpeg to yuv

Link to this section Types

Specs

dimension() :: pos_integer()

Specs

error() :: {:error, atom()} | {:error, struct()}

Specs

format() :: :I420 | :I422 | :I444 | :GRAY

Specs

height() :: dimension()

Specs

jpeg_header() :: %{format: format(), width: width(), height: height()}

Specs

quality() :: 0..100

Specs

width() :: dimension()

Link to this section Functions

Specs

get_jpeg_header(binary()) :: {:ok, jpeg_header()} | error()

Gets the header from a jpegv

 iex> {:ok, header} = Turbojpeg.get_jpeg_header(jpeg)
   {:ok,
     %{
        format: :I422,
        width: 192,
        height: 192
      }
   }

Specs

jpeg_to_yuv(binary()) :: {:ok, binary()} | error()

Converts jpeg to yuv

  iex> {:ok, yuv} = Turbojpeg.jpeg_to_yuv(jpeg)
    {:ok,<<..>>}
Link to this function

yuv_to_jpeg(yuv, width, height, quality, format)

View Source

Specs

yuv_to_jpeg(binary(), width(), height(), quality(), format()) ::
  {:ok, binary()} | error()

Converts yuv to jpeg images

  iex> {:ok, jpeg} = Turbojpeg.yuv_to_jpeg(frame, 1920, 1080, 90, :I420)
    {:ok, <<....>>}