Difference between revisions of "YUV4MPEG2"

From MultimediaWiki
Jump to navigation Jump to search
(→‎Data Format: Small tweak to the big one I did earlier)
 
(10 intermediate revisions by 4 users not shown)
Line 2: Line 2:
* Samples: http://samples.mplayerhq.hu/yuv4mpeg2/
* Samples: http://samples.mplayerhq.hu/yuv4mpeg2/


YUV4MPEG2 is a simple file format designed to hold uncompressed frames of [[YCbCr]] video formatted as [[YCbCr 4:2:0]], [[YCbCr 4:2:2]] or [[YCbCr 4:4:4]] data for the purpose of encoding, likely to [[MPEG]]-2. The part "YUV" in its name just derives from the fact that the color space YCbCr (used for color encoding in digital media) is often falsely mixed up with the color space YUV (used in analog PAL based applications, including analog TV and video tapes).
YUV4MPEG2 is a simple file format designed to hold uncompressed frames of [[YCbCr]] video formatted as [[YCbCr 4:2:0]], [[YCbCr 4:2:2]] or [[YCbCr 4:4:4]] data for the purpose of encoding, likely to [[MPEG]]-2. The part "YUV" in its name just derives from the fact that the color space YCbCr (used for color encoding in digital media) is often falsely mixed up with the color space YUV (used in analog PAL based applications, including analog TV and video tapes). Since the original MPEG-2 specification supports more than one type of color matrix (BT.601, BT.709, ...), there is no way to know, without extensions in this format, the color matrix used for conversion to YCbCr from RGB.


== Data Format ==
== Data Format ==
A Y4M file begins with a plaintext, quasi-freeform header. The first 9 bytes are a file signature of 'YUV4MPEG2'.  Following the signature is any number of parameters preceeded by a space (ASCII 0x20). The parameters that should definitely be present are width, height, and frame rate:
A Y4M file begins with a plaintext, quasi-freeform header. The first 10 bytes are a file signature of 'YUV4MPEG2 ' (last character is a space, ASCII 0x20).  Following the signature is any number of parameters preceeded by a space (ASCII 0x20). The parameters that should definitely be present are width, height, and frame rate:
* frame width: 'W' followed by a plaintext integer; example: 'W720'
* frame width: 'W' followed by a plaintext integer; example: 'W720'
* frame height: 'H' followed by a plaintext integer; example: 'H480'
* frame height: 'H' followed by a plaintext integer; example: 'H480'
* frame rate: 'F' followed by the number of frames per second, expressed as a fraction in the form numerator:denominator.  Examples: ** 'F30:1' = 30 FPS
* frame rate: 'F' followed by the number of frames per second, expressed as a fraction in the form numerator:denominator.  Examples:  
** 'F30:1' = 30 FPS
** 'F25:1' = 25 FPS (PAL/SECAM standard)
** 'F25:1' = 25 FPS (PAL/SECAM standard)
** 'F24:1' = 24 FPS (Film)
** 'F24:1' = 24 FPS (Film)
Line 17: Line 18:
** 'It' = Top field first
** 'It' = Top field first
** 'Ib' = Bottom field first
** 'Ib' = Bottom field first
** 'Im' = Mixed modes (detailed in FRAME headers
** 'Im' = Mixed modes (detailed in FRAME headers)
* Parameter 'A': Pixel aspect ratio.  Note that this is not the ratio of the picture as a whole, just the pixels.  Examples:  
* Parameter 'A': Pixel aspect ratio.  Note that this is not the ratio of the picture as a whole, just the pixels.  Examples:  
** 'A0:0' = unknown
** 'A0:0' = unknown
Line 26: Line 27:
* Parameter 'C': Colour space
* Parameter 'C': Colour space
** 'C420jpeg' = 4:2:0 with biaxially-displaced chroma planes
** 'C420jpeg' = 4:2:0 with biaxially-displaced chroma planes
** 'C420paldv' = 4:2:0 with vertically-displace chroma planes
** 'C420paldv' = 4:2:0 with vertically-displaced chroma planes
** 'C420' = 4:2:0 with coincident chroma planes
** 'C420' = 4:2:0 with coincident chroma planes
** 'C422' = 4:2:2
** 'C422' = 4:2:2
** 'C444' = 4:4:4
** 'C444' = 4:4:4
* Parameter 'X': Comment.  Ignored, but passed, by a YUV4MPEG2 processor.
** 'Cmono' = YCbCr plane only
* Parameter 'X': Comment or extension.  Ignored, but passed, by a YUV4MPEG2 processor.
** FFMPEG defines, among others, the following extensions:
*** 'XCOLORRANGE' providing information on the color space
**** 'XCOLORRANGE=FULL' JPEG / Full swing / ITU T.871 range
**** 'XCOLORRANGE=LIMITED' MPEG / Studio swing / TV range
 
If you have trouble figuring out the difference between C420jpeg and C420paldv, this might help: https://chromium.googlesource.com/webm/libvpx/+/refs/heads/main/y4minput.c


Following the header is any number of frames coded in YCbCr format in Y-Cb-Cr plane order. Each frame begins with the 5 bytes 'FRAME' followed by zero or more parameters each preceded by 0x20, ending with 0x0A.  This is then followed by the raw bytes from each plane.
Following the header is any number of frames coded in YCbCr format in Y-Cb-Cr plane order. Each frame begins with the 5 bytes 'FRAME' followed by zero or more parameters each preceded by 0x20, ending with 0x0A.  This is then followed by the raw bytes from each plane.
Line 38: Line 46:
* frame length = width * height * 3 / 2 (4:2:0)
* frame length = width * height * 3 / 2 (4:2:0)
* frame length = width * height * 2 (4:2:2)
* frame length = width * height * 2 (4:2:2)
* frame length = width * height * 3 (4:3:3)
* frame length = width * height * 3 (4:4:4)


[[Category:Container Formats]]
[[Category:Container Formats]]

Latest revision as of 09:51, 17 December 2021

YUV4MPEG2 is a simple file format designed to hold uncompressed frames of YCbCr video formatted as YCbCr 4:2:0, YCbCr 4:2:2 or YCbCr 4:4:4 data for the purpose of encoding, likely to MPEG-2. The part "YUV" in its name just derives from the fact that the color space YCbCr (used for color encoding in digital media) is often falsely mixed up with the color space YUV (used in analog PAL based applications, including analog TV and video tapes). Since the original MPEG-2 specification supports more than one type of color matrix (BT.601, BT.709, ...), there is no way to know, without extensions in this format, the color matrix used for conversion to YCbCr from RGB.

Data Format

A Y4M file begins with a plaintext, quasi-freeform header. The first 10 bytes are a file signature of 'YUV4MPEG2 ' (last character is a space, ASCII 0x20). Following the signature is any number of parameters preceeded by a space (ASCII 0x20). The parameters that should definitely be present are width, height, and frame rate:

  • frame width: 'W' followed by a plaintext integer; example: 'W720'
  • frame height: 'H' followed by a plaintext integer; example: 'H480'
  • frame rate: 'F' followed by the number of frames per second, expressed as a fraction in the form numerator:denominator. Examples:
    • 'F30:1' = 30 FPS
    • 'F25:1' = 25 FPS (PAL/SECAM standard)
    • 'F24:1' = 24 FPS (Film)
    • 'F30000:1001' = 29.97 FPS (NTSC standard)
    • 'F24000:1001' = 23.976 FPS (Film transferred to NTSC)
  • interlacing: 'I' followed by a single letter to indicate interlacing mode:
    • 'Ip' = Progressive
    • 'It' = Top field first
    • 'Ib' = Bottom field first
    • 'Im' = Mixed modes (detailed in FRAME headers)
  • Parameter 'A': Pixel aspect ratio. Note that this is not the ratio of the picture as a whole, just the pixels. Examples:
    • 'A0:0' = unknown
    • 'A1:1' = square pixels
    • 'A4:3' = NTSC-SVCD (480x480 stretched to 4:3 screen)
    • 'A4:5' = NTSC-DVD narrow-screen (720x480 compressed to a 4:3 display)
    • 'A32:27' = NTSC-DVD wide-screen (720x480 stretched to a 16:9 display)
  • Parameter 'C': Colour space
    • 'C420jpeg' = 4:2:0 with biaxially-displaced chroma planes
    • 'C420paldv' = 4:2:0 with vertically-displaced chroma planes
    • 'C420' = 4:2:0 with coincident chroma planes
    • 'C422' = 4:2:2
    • 'C444' = 4:4:4
    • 'Cmono' = YCbCr plane only
  • Parameter 'X': Comment or extension. Ignored, but passed, by a YUV4MPEG2 processor.
    • FFMPEG defines, among others, the following extensions:
      • 'XCOLORRANGE' providing information on the color space
        • 'XCOLORRANGE=FULL' JPEG / Full swing / ITU T.871 range
        • 'XCOLORRANGE=LIMITED' MPEG / Studio swing / TV range

If you have trouble figuring out the difference between C420jpeg and C420paldv, this might help: https://chromium.googlesource.com/webm/libvpx/+/refs/heads/main/y4minput.c

Following the header is any number of frames coded in YCbCr format in Y-Cb-Cr plane order. Each frame begins with the 5 bytes 'FRAME' followed by zero or more parameters each preceded by 0x20, ending with 0x0A. This is then followed by the raw bytes from each plane.

The length of each frame (excluding its header) can be computed as:

  • frame length = width * height * 3 / 2 (4:2:0)
  • frame length = width * height * 2 (4:2:2)
  • frame length = width * height * 3 (4:4:4)