30.03.2012, 23:21

Here's a bunch of new yuv4mpeg-tools: ssim.tar.gz (20 KB)

Most importantly a SSE2-Implementation of the calculation of the necessary values for SSIM and PSNR for 8x8-blocks.


Pipe in a y4m-stream, compares each frame with its successor and prints the SSIM and PSNR indices.


usage: fdel <mod> <rem>

Passes only those frames from stdin to stdout, whose (frame number % mod) != rem. Useful for very basic 3:2-pulldown. Also see y4mivtc in the mjpegtools-distribution for a comparable (but rather fixed) approach.


Concatenates several y4m-streams into a single stream; warns about header information mismatches (may be disabled) and allows header adjustments.

   pixel aspect ratio (N:M)
  -f            force overridden header fields for all inputs, disable warnings
  -i {p|t|b}    interlace code: p (none), t (top first), b (bottom first)
  -h            this help message
  -r      frame rate in Hz as ratio (N:M)
  -v     verbosity: 0 (quiet), 1 (normal), 2 (verbose/debug)
  -x    specify chroma format, 'help' for list of formats

Default is to copy the stream header from the first source, given options
override that.
If FILE is '-' then stdin is read at its place. Use ./- for an existing file
with that name.]]>

Compares each frame from the video on stdin to each frame in a video given as parameter using SSIM or PSNR. The resulting matrix gives precise information about the similarity of certain parts of the video (search for diagonal lines consisting of 1.0 values, top-left to bottom-right).

  > overlap.matrix

  -m          don't make use of seekability for second input:
              load all frames to memory (faster)
  -p    precision of output for non-quantized values
              (# fractional digits) [4]
  -q   quantize output to integers (divide, truncate)
  -r          enable rounding instead of truncation for quantization
  -s          output SSIM instead of PSNR (slower)
  -v     verbosity (0: quiet, 1: normal, 2: verbose/debug)

Outputs an NxM matrix with N = #frames(stdin) and M = #frames().
Each entry (i,j) contains the smilarity index between frame i from stdin
and frame j from .
A diagonal in direction from top-left to bottom-right containing high values
indicates a match between the parts represented by the indices - an overlap
between both inputs.

If the second input, , is not seekable it will fully be loaded into
memory. This may cause problems for large sequences.]]>
Also a JNI-wrapper around the SSE2 SSIM- and PSNR- (or rather the MSE-) calculation is provided as well as a small y4m-Java-class providing support for reading mjpegtools' YUV4MPEG2-streams.
25.09.2010, 17:24

SSE2-Patch für yuvdenoise

Patch für temporalen und räumlichen denoise-Filter. Er kann auf den Code der Version 1.9.0 der mjpegtools angewendet werden.

Durch optionale Nutzung vorhandener SSE2-Fähigkeiten der CPU wird eine Beschleunigung von rund 400% erreicht. Dies gilt nicht für den sogenannten High-Quality-Modus.

Update: Temporaler Filter 8x und räumlicher Filter mit SSE3 5x

Patch v3. Zu applizieren mittels patch -p1 < yuvdenoise-sse2-3.patch im mjpegtools-1.9.0-Verzeichnis. Mehr Informationen folgen später.

31.03.2009, 01:33


License: GPL v2

Download: yuvcut.c (9,1 KB)

Voraussetzung für den Betrieb dieses Filters ist das mjpegtools-Paket. Kompilieren mit cc -std=c99 -pedantic -O2 -Wall -Wextra `pkg-config --cflags --libs mjpegtools` yuvcut.c -o yuvcut

yuvcut diente für mich als Einstieg in das Programmieren von Filtern für die Stream-Video-Tools des MJPEGtools-Pakets.

Wie ich erst nach Fertigstellung herausgefunden habe, macht dieses Tool das Selbe wie das Gleichnamige aus den yuvutils von Herrn Lehtinen; es ist vollkommen unabhängig davon entstanden.

Das Programm extrahiert bzw. unterdrückt Frames im Strom und nimmt ansonsten keinerlei Veränderung an den Daten vor. Dies ist beispielsweise für eine schnelle Vorschau eines bestimmten temporalen Bereichs des Videos nützlich. Als weiteren Anwendungsbereich bietet sich das Entfernen von unerwünschten Frames (wie z.B. Werbungsabschnitte oder solche Frames, die durch defekte Eingabedaten entstanden sind) an.

Die zu verwerfenden oder weiterzuleitenden Bereiche können entweder durch Zeitcodes oder die entsprechenden Framenummern angegeben werden.

yuvcut copies slices of frames in the yuv4mpeg-stream
usage: ... |  yuvcut [-a] { { -n | -s } FRAMES | { -N | -S } TIME } [...]  | ...

  -a         next argument uses absolute addressing
  -n FRAMES  output the next FRAMES frames
  -s FRAMES  skip the next FRAMES frames
  -N TIME    output the next frames up to TIME
  -S TIME    skip the next frames up to TIME
  -x         stop execution immediatly after last range
  -h         shows this help message
  -v N       set log-level (0: quiet, 1: normal, 2:verbose/debug)

TIME is a timestamp given in the following form: [[HH:]MM:]SS[.FF]; HH for
hours, MM for minutes, SS for seconds and FF for frames.