blob: 194ddc50b981f2458f80dff370a8a47ed36ae9d4 [file] [log] [blame]
MIME types in GStreamer
What is a MIME type ?
A MIME type is a combination of two (short) strings (words)---the content type
and the content subtype. Content types are broad categories used for describing
almost all types of files: video, audio, text, and application are common
content types. The subtype further breaks the content type down into a more
specific type description, for example 'application/ogg', 'audio/raw',
'video/mpeg', or 'text/plain'.
So the content type and subtype make up a pair that describes the type of
information contained in a file. In multimedia processing, MIME types are used
to describe the type of information carried by a media stream. In GStreamer, we
use MIME types in the same way, to identify the types of information that are
allowed to pass between GStreamer elements. The MIME type is part of a GstCaps
object that describes a media stream. Besides a MIME type, a GstCaps object also
contains a name and some stream properties (GstProps, which hold combinations of
key/value pairs).
An example of a MIME type is 'video/mpeg'. A corresponding GstCaps could be
created using code:
GstCaps *caps = gst_caps_new_simple ("video/mpeg",
"width", G_TYPE_INT, 384,
"height", G_TYPE_INT, 288,
MIME types and their corresponding properties are of major importance in
GStreamer for uniquely identifying media streams. Therefore, we define them
per media type. All GStreamer plugins should keep to this definition.
Official MIME media types are assigned by the IANA. Current assignments are at
The problems
Some streams may have MIME types or GstCaps that do not fully describe the
stream. In most cases, this is not a problem, though. For example, if a stream
contains Ogg/Vorbis data (which is of type 'application/ogg'), we don't need to
know the samplerate of the raw audio stream, since we can't play the encoded
audio anyway. The samplerate is, however, important for raw audio, so a decoder
would need to retrieve the samplerate from the Ogg/Vorbis stream headers (the
headers are part of the bytestream) in order to pass it on in the GstCaps that
belongs to the decoded audio (which becomes a type like 'audio/raw'). However,
other plugins might want to know such properties, even for compressed streams.
One such example is an AVI muxer, which does want to know the samplerate of an
audio stream, even when it is compressed.
Another problem is that many media types can be defined in multiple ways. For
example, MJPEG video can be defined as 'video/jpeg', 'video/mjpeg',
'image/jpeg', 'video/x-msvideo' with a compression of (fourcc) MJPG, etc.
None of these is really official, since there isn't an official mimetype
for encoded MJPEG video.
The main focus of this document is to propose a standardized set of MIME types
and properties that will be used by the GStreamer plugins.
Different types of streams
There are several types of media streams. The most important distinction will be
container formats, audio codecs and video codecs. Container formats are
bytestreams that contain one or more substreams inside it, and don't provide any
direct media data itself. Examples are Quicktime, AVI or MPEG System Stream.
They mostly contain of a set of headers that define the media streams that are
packed inside the container, along with the media data itself.
Video codecs and audio codecs describe encoded audio or video data. Examples are
MPEG-1 video, DivX video, MPEG-1 layer 3 (MP3) audio or Ogg/Vorbis audio.
Actually, Ogg is a container format too (for Vorbis audio), but these are
usually used in conjunction with each other.
Finally, there are the somewhat obvious (but not commonly encountered as files)
raw data formats.
Container formats
1 - AVI (Microsoft RIFF/AVI)
MIME type: video/x-msvideo
Parser: avidemux, ffdemux_avi
Formatter: avimux
2 - Quicktime (Apple)
MIME type: video/quicktime
Parser: qtdemux
MIME type: video/mpeg
Properties: 'systemstream' = TRUE (BOOLEAN)
Parser: mpegdemux, ffdemux_mpeg (PS), ffdemux_mpegts (TS), dvddemux
Formatter: mplex
4 - ASF (Microsoft)
MIME type: video/x-ms-asf
Parser: asfdemux, ffdemux_asf
Formatter: asfmux
5 - WAV (Microsoft RIFF/WAV)
MIME type: audio/x-wav
Parser: wavparse, ffdemux_wav
Formatter: wavenc
6 - RealMedia (Real)
MIME type: application/vnd.rn-realmedia
Properties: 'systemstream' = TRUE (BOOLEAN)
Parser: rmdemux, ffdemux_rm
7 - DV (Digital Video)
MIME type: video/x-dv
Properties: 'systemstream' = TRUE (BOOLEAN)
Parser: gst1394, ffdemux_dv
8 - Ogg (Xiph)
MIME type: application/ogg
Parser: oggdemux
Formatter: oggmux
9 - Matroska
MIME type: video/x-mkv
Parser: matroskademux, ffdemux_matroska
Formatter: matroskamux
10 - Shockwave (Macromedia)
MIME type: application/x-shockwave-flash
Parser: swfdec, ffdemux_swf
11 - AU audio (Sun)
MIME type: audio/x-au
Parser: auparse, ffdemux_au
12 - Mod audio
MIME type: audio/x-mod
Parser: modplug, mikmod
13 - FLX video
MIME type: video/x-fli
Parser: flxdec
14 - Monkeyaudio
MIME type: application/x-ape
15 - AIFF audio
MIME type: audio/x-aiff
16 - SID audio
MIME type: audio/x-sid
Parser: siddec
Please note that we try to keep these MIME types as similar as possible to the
MIME types used as standards in Gnome (Gnome-VFS/Nautilus) and KDE
(Konqueror). Both will (in future) stick to a shared-mime-info database that
is hosted on, and bases itself on IANA.
Also, there is a very thin line between audio codecs and audio containers
(take mp3 vs. sid, etc.). This is just a per-case thing right now and needs to
be documented further.
Video codecs
For convenience, the fourcc codes used in the AVI container format will be
listed along with the MIME type and optional properties.
Optional properties for all video formats are the following:
width = 1 - MAXINT (INT)
height = 1 - MAXINT (INT)
pixel_width = 1 - MAXINT (INT, with pixel_height forms aspect ratio)
pixel_height = 1 - MAXINT (INT, with pixel_width forms aspect ratio)
framerate = 0 - MAXFLOAT (FLOAT)
1 - MPEG-1, -2 and -4 video (ISO/LA MPEG)
MIME type: video/mpeg
Properties: systemstream = FALSE (BOOLEAN)
mpegversion = 1/2/4 (INT)
Known fourccs: MPEG, MPGI
Encoder: mpeg1enc, mpeg2enc
Decoder: mpeg1dec, mpeg2dec, mpeg2subt
2 - DivX 3.x, 4.x and 5.x video (
MIME type: video/x-divx
Optional properties: divxversion = 3/4/5 (INT)
Known fourccs: DIV3, DIV4, DIV5, DIVX, DX50, DIVX, divx
Encoder: divxenc
Decoder: divxdec, ffdec_mpeg4
3 - Microsoft MPEG 4.1, 4.2 and 4.3
MIME type: video/x-msmpeg
Optional properties: msmpegversion = 41/42/43 (INT)
Known fourccs: MPG4, MP42, MP43
Encoder: ffenc_msmpeg4, ffenc_msmpeg4v1, ffenc_msmpeg4v2
Decoder: ffdec_msmpeg4, ffdec_msmpeg4v1, ffdec_msmpeg4v2
4 - Motion-JPEG (official and extended)
MIME type: video/x-jpeg
Known fourccs: MJPG (YUY2 MJPEG), JPEG (any), PIXL (Pinnacle/Miro), VIXL
Encoder: jpegenc
Decoder: jpegdec, ffdec_mjpeg
5 - Sorensen (Quicktime - SVQ1/SVQ3)
MIME types: video/x-svq
Properties: svqversion = 1/3 (INT)
Decoder: ffdec_svq1, ffdec_svq3
6 - H263 and related codecs
MIME type: video/x-h263
Known fourccs: H263/h263, i263, L263, M263/m263, s263, x263, VDOW, VIVO
Encoder: ffenc_h263, ffenc_h263p
Decoder: ffdec_h263, ffdec_h263i
7 - RealVideo (Real)
MIME type: video/x-pn-realvideo
Properties: rmversion = "1"/"2"/"3"/"4" (INT)
Known fourccs: RV10, RV20, RV30, RV40
Encoder: ffenc_rv10
Decoder: ffdec_rv10, ffdec_rv20
8 - Digital Video (DV)
MIME type: video/x-dv
Properties: systemstream = FALSE (BOOLEAN)
Known fourccs: DVSD/dvsd (SDTV), dvhd (HDTV), dvsl (SDTV LongPlay)
Encoder: ffenc_dvvideo
Decoder: dvdec, ffdec_dvvideo
9 - Windows Media Video 1, 2 and 3 (WMV)
MIME type: video/x-wmv
Properties: wmvversion = 1/2/3 (INT)
Encoder: ffenc_wmv1, ffenc_wmv2, none
Decoder: ffdec_wmv1, ffdec_wmv2, none
10 - XviD (
MIME type: video/x-xvid
Known fourccs: xvid, XVID
Encoder: xvidenc
Decoder: xviddec, ffdec_mpeg4
11 - 3IVX (
MIME type: video/x-3ivx
Known fourccs: 3IV0, 3IV1, 3IV2
12 - Ogg/Tarkin (Xiph)
MIME type: video/x-tarkin
13 - VP3
MIME type: video/x-vp3
Decoder: ffdec_vp3
14 - Ogg/Theora (Xiph, VP3-like)
MIME type: video/x-theora
Encoder: theoraenc
Decoder: theoradec, ffdec_theora
This is the raw stream that comes out of an ogg file.
15 - Huffyuv
MIME type: video/x-huffyuv
Known fourccs: HFYU
Decoder: ffdec_hfyu
16 - FF Video 1 (FFMPEG)
MIME type: video/x-ffv
Properties: ffvversion = 1 (INT)
Decoder: ffdec_ffv1
17 - H264
MIME type: video/x-h264
Known fourccs: VSSH
Decoder: ffdec_h264
18 - Indeo 3 (Intel)
MIME type: video/x-indeo
Properties: indeoversion = 3 (INT)
Decoder: ffdec_indeo3
19 - Portable Network Graphics (PNG)
MIME type: video/x-png
Encoder: pngenc
Decoder: pngdec, gdkpixbufdec
20 - Cinepak
MIME type: video/x-cinepak
Decoder: ffdec_cinepak
TODO: subsampling information for YUV?
TODO: colorspace identifications for MJPEG? How?
TODO: how to distinguish MJPEG-A/B (Quicktime) and lossless JPEG?
TODO: divx4/divx5/xvid/3ivx/mpeg-4 - how to make them overlap? (all
ISO MPEG-4 compatible)
3c) Audio Codecs
For convenience, the two-byte hexcodes (as used for identification in AVI files)
are also given.
Properties for all audio formats include the following:
rate = 1 - MAXINT (INT, sampling rate)
channels = 1 - MAXINT (INT, number of audio channels)
1 - Alaw Raw Audio
MIME type: audio/x-alaw
Encoder: alawenc
Decoder: alawdec
2 - Mulaw Raw Audio
MIME type: audio/x-mulaw
Encoder: mulawenc
Decoder: mulawdec
3 - MPEG-1 layer 1/2/3 audio
MIME type: audio/mpeg
Properties: mpegversion = 1 (INT)
layer = 1/2/3 (INT)
Encoder: lame, ffdec_mp3
Decoder: mad
4 - Ogg/Vorbis
MIME type: audio/x-vorbis
Encoder: rawvorbisenc (vorbisenc does rawvorbisenc+oggmux)
Decoder: vorbisdec
5 - Windows Media Audio 1, 2 and 3 (WMA)
MIME type: audio/x-wma
Properties: wmaversion = 1/2/3 (INT)
Decoder: ffdec_wmav1, ffdec_wmav2, none
6 - AC3
MIME type: audio/x-ac3
Encoder: ffenc_ac3
Decoder: a52dec, ac3parse
7 - FLAC (Free Lossless Audio Codec)
MIME type: audio/x-flac
Encoder: flacenc
Decoder: flacdec, ffdec_flac
8 - MACE 3/6 (Quicktime audio)
MIME type: audio/x-mace
Properties: maceversion = 3/6 (INT)
Decoder: ffdec_mace3, ffdec_mace6
9 - MPEG-4 AAC
MIME type: audio/mpeg
Properties: mpegversion = 4 (INT)
Encoder: faac
Decoder: faad
10 - (IMA) ADPCM (Quicktime/WAV/Microsoft/4XM)
MIME type: audio/x-adpcm
Properties: layout = "quicktime"/"wav"/"microsoft"/"4xm"/"g721"/"g722"/"g723_3"/"g723_5" (STRING)
Encoder: ffenc_adpcm_ima_[qt/wav/dk3/dk4/ws/smjpeg], ffenc_adpcm_[ms/4xm/xa/adx/ea]
Decoder: ffdec_adpcm_ima_[qt/wav/dk3/dk4/ws/smjpeg], ffdec_adpcm_[ms/4xm/xa/adx/ea]
Note: The difference between each of these four PCM formats is the number
of samples packed together per channel. For WAV, for example, each
sample is 4 bit, and 8 samples are packed together per channel in the
bytestream. For the others, refer to technical documentation. We
probably want to distinguish these differently, but I don't know how,
11 - RealAudio (Real)
MIME type: audio/x-pn-realaudio
Properties: raversion ="1"/"2" (INT)
Known fourccs: 14_4, 28_8
Decoder: ffdec_real_144 / ffdec_real_288
12 - DV Audio
MIME type: audio/x-dv
13 - GSM Audio
MIME type: audio/x-gsm
Encoder: gsmenc, rtpgsmenc
Decoder: gsmdec, rtpgsmparse
14 - Speex audio
MIME type: audio/x-speex
Encoder: speexenc
Decoder: speexdec
15 - QDM2
MIME type: audio/x-qdm2
16 - Sony ATRAC4 (detected inside realmedia and wave/avi streams, nothing to decode it yet)
MIME type: audio/
17 - Ensoniq PARIS audio
MIME type: audio/x-paris
18 - Amiga IFF / SVX8 / SV16 audio
MIME type: audio/x-svx
19 - Sphere NIST audio
MIME type: audio/x-nist
20 - Sound Blaster VOC audio
MIME type: audio/x-voc
21 - Berkeley/IRCAM/CARL audio
MIME type: audio/x-ircam
22 - Sonic Foundry's 64 bit RIFF/WAV
MIME type: audio/x-w64
TODO: adpcm/dv needs confirmation from someone with knowledge...
Raw formats
Raw formats contain unencoded, raw media information. These are rather rare from
an end user point of view since raw media files have historically been
prohibitively large ... hence the multitude of encoding formats.
Raw video formats require the following common properties, in addition to
format-specific properties:
width = 1 - MAXINT (INT)
height = 1 - MAXINT (INT)
1 - Raw Video (YUV/YCbCr)
MIME type: video/x-raw-yuv
Properties: 'format' = 'XXXX' (fourcc)
Known fourccs: YUY2, I420, Y41P, YVYU, UYVY, etc.
Some raw video formats have implicit alignment rules. We should discuss this
more. Also, some formats have multiple fourccs (e.g. IYUV/I420 or
YUY2/YUYV). For each of these, we only use one (e.g. I420 and YUY2).
Currently recognized formats:
YUY2: packed, Y-U-Y-V order, U/V hor 2x subsampled (YUV-4:2:2, 16 bpp)
YVYU: packed, Y-V-Y-U order, U/V hor 2x subsampled (YUV-4:2:2, 16 bpp)
UYVY: packed, U-Y-V-Y order, U/V hor 2x subsampled (YUV-4:2:2, 16 bpp)
Y41P: packed, UYVYUYVYYYYY order, U/V hor 4x subsampled (YUV-4:1:1, 12 bpp)
IUY2: packed, U-Y-V order, not subsampled (YUV-1:1:1, 24 bpp)
Y42B: planar, Y-U-V order, U/V hor 2x subsampled (YUV-4:2:2, 16 bpp)
YV12: planar, Y-V-U order, U/V hor+ver 2x subsampled (YUV-4:2:0, 12 bpp)
I420: planar, Y-U-V order, U/V hor+ver 2x subsampled (YUV-4:2:0, 12 bpp)
Y41B: planar, Y-U-V order, U/V hor 4x subsampled (YUV-4:1:1, 12bpp)
YUV9: planar, Y-U-V order, U/V hor+ver 4x subsampled (YUV-4:1:0, 9bpp)
YVU9: planar, Y-V-U order, U/V hor+ver 4x subsampled (YUV-4:1:0, 9bpp)
Y800: one-plane (Y-only, YUV-4:0:0, 8bpp)
See for more information.
Note: YUV-4:4:4 (both planar and packed, in multiple orders) are missing.
2 - Raw video (RGB)
MIME type: video/x-raw-rgb
Properties: endianness = 1234/4321 (INT) <- use G_LITTLE_ENDIAN/G_BIG_ENDIAN
depth = 15/16/24 (INT, color depth)
bpp = 16/24/32 (INT, bits used to store each pixel)
red_mask = bitmask (0x..) (INT)
green_mask = bitmask (0x..) (INT)
blue_mask = bitmask (0x..) (INT)
24 and 32 bit RGB should always be specified as big endian, since any little
endian format can be transformed into big endian by rearranging the color
masks. 15 and 16 bit formats should generally have the same byte order as
the CPU.
Color masks are interpreted by loading 'bpp' number of bits using the given
'endianness', and masking and shifting by each color mask. Loading a 24-bit
value cannot be done directly, but one can perform an equivalent operation.
msb .. lsb
bpp = 24
depth = 24
endianness = 4321 (G_BIG_ENDIAN)
red_mask = 0xff0000
green_mask = 0x00ff00
blue_mask = 0x0000ff
bpp = 16
depth = 15
endianness = 4321 (G_BIG_ENDIAN)
red_mask = 0x7c00
green_mask = 0x03e0
blue_mask = 0x003f
bpp = 16
depth = 15
endianness = 1234 (G_LITTLE_ENDIAN)
red_mask = 0x7c00
green_mask = 0x03e0
blue_mask = 0x003f
The raw audio formats require the following common properties, in addition to
format-specific properties:
rate = 1 - MAXINT (INT, sampling rate)
channels = 1 - MAXINT (INT, number of audio channels)
endianness = 1234/4321 (INT) <- use G_LITTLE_ENDIAN/G_BIG_ENDIAN/G_BYTE_ORDER
3 - Raw audio (integer format)
MIME type: audio/x-raw-int
properties: width = 8/16/24/32 (INT, bits used to store each sample)
depth = 8 - 32 (INT, bits actually used per sample)
4 - Raw audio (floating point format)
MIME type: audio/x-raw-float
Properties: width = 32/64 (INT)
buffer-frames: number of audio frames per buffer, 0=undefined
Plugin Guidelines
So, a short bit on what plugins should do. Above, I've stated that audio
properties like 'channels' and 'rate' or video properties like 'width' and
'height' are all optional. This doesn't mean you can just simply omit them and
everything will still work!
An example is the best way to explain all this. AVI needs the width, height,
rate and channels for the AVI header. So if these properties are missing, the
avimux element cannot properly create the AVI header. On the other hand, MPEG
doesn't have such properties in its header, so the mpegdemux element would need
to parse the separate streams in order to find them out. We don't want that
either, because a plugin only does one job. So normally, mpegdemux and avimux
wouldn't allow transcoding. To solve this problem, there are stream parser
elements (such as mpegaudioparse, ac3parse and mpeg1videoparse).
Conclusions to draw from here: a plugin gives info it can provide as seen from
its own task/job. If it can't, other elements might still need it and a stream
parser needs to be written if it doesn't already exist.
On properties that can be described by one of these (properties such as 'width',
'height', 'fps', etc.): they're forbidden and should be handled using filtered
Status of this document
Not all plugins strictly follow these guidelines yet, but these are the official
types. Plugins not following these specs either use extensions that should be
documented, or are buggy (and should be fixed).
Blame Ronald Bultje <> aka BBB for any mistakes in
this document.