Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
yuv4mpeg(5)		       MJPEG Tools Manual		     yuv4mpeg(5)

NAME
     YUV4MPEG2 - video stream format used by pipe-based MJPEGtools

DESCRIPTION
     Many of the MJPEGtools communicate via pipes and act as filters (or sources
     or  sinks).   The	format of video data used in the pipes is referred to as
     "YUV4MPEG", or, more precisely, "YUV4MPEG2".  (The format was extended  and
     codified during v1.5.x of the tools.)

     The  basic  structure is a stream header followed by an unlimited number of
     frames.  Each frame itself consists of a header  followed	by  video  data.
     The  headers are vaguely human-readable ASCII, but the video data is simple
     byte-size binary.

     The MJPEGtools distribution has a C library (libmjpegutils) which	contains
     functions	for  manipulating  YUV4MPEG2 streams.  We recommend that you use
     this library rather than writing your own code if possible.  See the header
     file "yuv4mpeg.h" for a description of these functions.

     Design Goals:

     o	    Easy to parse both via C or sh.

     o	    Extensible; easy to add new parameters while  maintaining  backwards
	    compatibility.

     o	    Simple upgrade from original "YUV4MPEG" format.

     Drawbacks:

     o	    Frame  headers  do	not have constant size, so streams are not seek-
	    able.

GRAMMAR
     The precise description of the the YUV4MPEG2 stream format is as follows:

     STREAM consists of

     -	one STREAM-HEADER

     -	unlimited number of FRAMEs

     STREAM-HEADER consists of

     -	magic string "YUV4MPEG2"

     -	unlimited number of TAGGED-FIELDs,  each  preceeded  by  a  ' '  (single
	space) separator

     -	single '\n' line terminator

     FRAME consists of

     -	one FRAME-HEADER

     -	"length"  octets  of planar YCbCr 4:2:0 image data (If the stream is in-
	terlaced, then the two fields per frame  are  interleaved,  with  proper
	spatial ordering.)

     FRAME-HEADER consists of

     -	magic string "FRAME"

     -	unlimited  number  of  TAGGED-FIELDs,  each  preceeded	by a ' ' (single
	space) separator

     -	single '\n' line terminator

     TAGGED-FIELD consists of

     -	single ASCII character tag

     -	VALUE (which does not contain whitespace)

     VALUE consists of

     -	RATIO, or

     -	integer (base 10 ASCII representation), or

     -	single ascii character, or

     -	string (multiple ASCII characters)

     RATIO consists of

     -	numerator (base 10 ASCII integer)

     -	':' (a colon)

     -	denominator (base 10 ASCII integer)

     Header tags fall into three categories:   optional,  required  and  has-de-
     fault.   Optional	tags  are  completely optional and may be omitted from a
     header.  Required tags must be present in a header.  Has-Default tags  have
     a default value which is implied if the tag is not present.  Independent of
     these categories, some tags allow an "unknown" value and some do not.

     The supported tags for the STREAM-HEADER:

	    W[integer] - frame width in pixels, must be > 0 (required)

	    H[integer] - frame height in pixels, must be > 0 (required)

	    C[string] - chroma subsampling, image data format (has default)
		    420jpeg  - 4:2:0 with JPEG/MPEG-1 siting (default)
		    420mpeg2 - 4:2:0 with MPEG-2 siting
		    420paldv - 4:2:0 with PAL-DV siting
		    411      - 4:1:1, cosited
		    422      - 4:2:2, cosited
		    444      - 4:4:4 (no subsampling)
		    444alpha - 4:4:4 with an alpha channel
		    mono     - luma (Y') plane only

	    I[char] - interlacing specification:  (has default)
		    ? - unknown (default)
		    p - progressive/none
		    t - top-field-first
		    b - bottom-field-first
		    m - mixed-mode: refer to 'I' tag in frame header

	    F[ratio] - frame-rate (has default of 0:0 == unknown)

	    A[ratio] - sample aspect ratio (has default of 0:0 == unknown)

	    X[string] - 'metadata' (optional; unparsed, but passed around)

     The currently supported tags for the FRAME-HEADER:

	    I[string] - framing  and  sampling	(required  if-and-only-if  Im is
		   present in stream header).  Value is a string of three  char-
		   acters "xyz" which have the following meanings:
		    x: frame presentation
		       t - top-field-first
		       T - top-field-first and repeat
		       b - bottom-field-first
		       B - bottom-field-first and repeat
		       1 - single progressive frame
		       2 - double progressive frame (repeat)
		       3 - triple progressive frame (repeat)
		    y: frame temporal sampling
		       p - progressive (fields sampled at same time)
		       i - interlaced (fields sampled at different times)
		    z: frame chroma-subsampling
		       p - progressive (subsampling over whole frame)
		       i - interlaced (each field subsampled independently)
		       ? - unknown (allowed only for non-4:2:0 subsampling)

	    X[string] - 'metadata' (optional; unparsed, but passed around)

     Note  that  a  filter application must faithfully forward all "X" tags from
     input pipe to output pipe (unless it uses one of those  tags,  of	course).
     The   supplied   library  will  do  this  automatically  if  the  functions
     y4m_copy_stream_info() and y4m_copy_frame_info() are used appropriately.

NOTES ON IMAGE DATA
     All image data is in the CCIR-601 Y'CbCr  colorspace,  presented  plane-by-
     plane  in	row-major  order.   Each  sample  within each plane is one octet
     (8-bits) in size.	When all planes are present, they are transmitted in the
     order Y', Cb, Cr, potentially followed by an alpha/transparency mask  plane
     (for  the	444alpha  chroma format).  The alpha channel data is follows the
     same range as the Y' luma channel:  full transparency is  at  16  and  full
     opacity is at 235.

     All  Y'  and  alpha planes consist of (height X width) octets.  The size of
     the chroma planes depends on the subsampling mode:

     -	4:4:4 - (height X width) octets

     -	4:2:2 - (height X width) / 2 octets

     -	4:1:1 - (height X width) / 4 octets

     -	4:2:0 - (height X width) / 4 octets

NOTES ON FRAMING
     For more details about reading and writing yuv4mpeg files read the  sources
     - there are many utility programs, some simple, some complex that can serve
     as guides.

SEE ALSO
     mjpegtools(1), yuv4mpeg.h

AUTHOR
     This manual page Copyright 2004 Matthew J. Marjanovic.

MJPEG Tools Team		25 November 2002		     yuv4mpeg(5)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=yuv4mpeg&sektion=5&manpath=FreeBSD+Ports+15.1.quarterly>

home | help