{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/codecs/video/vp9",
  "collection": "docs",
  "title": "VP9",
  "description": "VP9 is Google's royalty-free successor to VP8, widely supported in browsers and used by YouTube; this page covers its profiles, encoders, playback support and pitfalls.",
  "canonicalUrl": "https://encode.wiki/codecs/video/vp9/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/codecs/video/vp9.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/codecs/video/vp9.md",
  "status": "current",
  "tags": [
    "migrated",
    "video",
    "vp9"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "title": "WebM Project VP9 page",
      "url": "https://www.webmproject.org/vp9/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "VP9 Bitstream & Decoding Process Specification draft v0.7",
      "url": "https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.7-20170222-draft.pdf",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "VP9 profiles",
      "url": "https://www.webmproject.org/vp9/profiles/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "VP9 levels and decoder testing",
      "url": "https://www.webmproject.org/vp9/levels/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "VP codec ISO Media File Format binding",
      "url": "https://www.webmproject.org/vp9/mp4/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "WebM container guidelines",
      "url": "https://www.webmproject.org/docs/container/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "WebM additional IP rights grant",
      "url": "https://www.webmproject.org/license/additional/",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "FFmpeg libvpx wrapper source (rate-control selection)",
      "url": "https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/libvpxenc.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "libvpx v1.17.0 VP9 encoder defaults",
      "url": "https://github.com/webmproject/libvpx/blob/v1.17.0/vp9/vp9_cx_iface.c",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "WebRTC Android hardware encoder selection (VP9 MediaCodec encoders)",
      "url": "https://webrtc.googlesource.com/src/+/HEAD/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "NVIDIA video encode and decode support matrix",
      "url": "https://developer.nvidia.com/video-encode-decode-support-matrix",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "provenance": {
    "originUrl": "https://github.com/av1-community-contributors/codec-wiki/blob/37c3317fd058b23c71a87679bed5619a98f77752/docs/video/VP9.mdx",
    "originCommit": "37c3317fd058b23c71a87679bed5619a98f77752",
    "migratedAt": "2026-08-21T00:00:00.000Z",
    "modified": true,
    "originPath": "docs/video/VP9.mdx"
  },
  "headings": [
    {
      "depth": 2,
      "text": "When to use VP9",
      "anchor": "when-to-use-vp9"
    },
    {
      "depth": 2,
      "text": "Profiles and levels",
      "anchor": "profiles-and-levels"
    },
    {
      "depth": 2,
      "text": "Coding tools",
      "anchor": "coding-tools"
    },
    {
      "depth": 2,
      "text": "Encoders and decoders",
      "anchor": "encoders-and-decoders"
    },
    {
      "depth": 2,
      "text": "Containers and HDR",
      "anchor": "containers-and-hdr"
    },
    {
      "depth": 2,
      "text": "Licensing",
      "anchor": "licensing"
    },
    {
      "depth": 2,
      "text": "Pitfalls",
      "anchor": "pitfalls"
    }
  ],
  "sections": [
    {
      "id": "_preamble",
      "title": "Page introduction",
      "depth": 0,
      "canonicalUrl": "https://encode.wiki/codecs/video/vp9/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/_preamble.md",
      "checksum": "c047e6a28158aeee7ca8576c00fd7a4c722e3246509059fe120ef5ac1154ace2",
      "bytes": 629
    },
    {
      "id": "when-to-use-vp9",
      "title": "When to use VP9",
      "depth": 2,
      "anchor": "when-to-use-vp9",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp9/#when-to-use-vp9",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/when-to-use-vp9.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/when-to-use-vp9.md",
      "checksum": "155e716c6fc5e5240c9168a69b334427f2e43973dd4a68f96f634cf9f313cc90",
      "bytes": 433
    },
    {
      "id": "profiles-and-levels",
      "title": "Profiles and levels",
      "depth": 2,
      "anchor": "profiles-and-levels",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp9/#profiles-and-levels",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/profiles-and-levels.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/profiles-and-levels.md",
      "checksum": "b9f3d41e436a012d0f264c17b0fa528570bc5f8100cbab7011b0840dc0b3b885",
      "bytes": 714
    },
    {
      "id": "coding-tools",
      "title": "Coding tools",
      "depth": 2,
      "anchor": "coding-tools",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp9/#coding-tools",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/coding-tools.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/coding-tools.md",
      "checksum": "076fcfd0256e5438fba70aeb77879a99e47ff56fae0c881a47c11b21ec460087",
      "bytes": 1078
    },
    {
      "id": "encoders-and-decoders",
      "title": "Encoders and decoders",
      "depth": 2,
      "anchor": "encoders-and-decoders",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp9/#encoders-and-decoders",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/encoders-and-decoders.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/encoders-and-decoders.md",
      "checksum": "528b3563df0dd4bbc1fbd238dc8785114a1f3f2ddb878effc1aea7638a398c07",
      "bytes": 2535
    },
    {
      "id": "containers-and-hdr",
      "title": "Containers and HDR",
      "depth": 2,
      "anchor": "containers-and-hdr",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp9/#containers-and-hdr",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/containers-and-hdr.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/containers-and-hdr.md",
      "checksum": "0af53fdd53172bd80375ac4d22fe00562473b72e471cf24609bece35351cb716",
      "bytes": 1696
    },
    {
      "id": "licensing",
      "title": "Licensing",
      "depth": 2,
      "anchor": "licensing",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp9/#licensing",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/licensing.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/licensing.md",
      "checksum": "4653a0a8259a08be9596a211530994879739756671012f1826b5f80208d63832",
      "bytes": 310
    },
    {
      "id": "pitfalls",
      "title": "Pitfalls",
      "depth": 2,
      "anchor": "pitfalls",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp9/#pitfalls",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/pitfalls.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp9/pitfalls.md",
      "checksum": "c5ad4cbbecffa26f282bb19e921abe76430cbc451459ef024a8f52c33703afd4",
      "bytes": 468
    }
  ],
  "outboundReferences": [
    "/api/v1/catalog.json",
    "/codecs/video/av1/",
    "/codecs/video/avc/",
    "/codecs/video/hevc/",
    "/codecs/video/vp8/",
    "/containers/isobmff/",
    "/containers/matroska/",
    "/containers/webm/",
    "/reference/video-codec-support/",
    "/tools/hardware-encoders/mediacodec/",
    "/tools/hardware-encoders/qsv/",
    "/tools/hardware-encoders/vaapi/",
    "/tools/software-encoders/eve-vp9/",
    "/tools/software-encoders/svt-vp9/",
    "/tools/software-encoders/vpxenc/",
    "https://chromium.googlesource.com/webm/libvpx/+/refs/tags/v1.17.0",
    "https://github.com/OpenVisualCloud/SVT-VP9/tree/v0.3.1",
    "https://www.matroska.org/technical/codec_specs.html",
    "https://www.webmproject.org/docs/container/",
    "https://www.webmproject.org/license/additional/",
    "https://www.webmproject.org/vp9/",
    "https://www.webmproject.org/vp9/levels/",
    "https://www.webmproject.org/vp9/mp4/"
  ],
  "checksum": "caf0f3a8b4f429169c481c9b1c3de6023dc189caaf0ba24f04c63ca51e50933a",
  "contentFormat": "markdown",
  "markdown": "VP9 is a royalty-free video format developed by Google as the successor to [VP8](/codecs/video/vp8/) and released in June 2013 as part of the WebM Project. It competes with [HEVC](/codecs/video/hevc/): efficiency is in the same range, decoding is relatively light, and licensing is simpler. YouTube adopted it early and still serves much of its catalogue in VP9; it is also widely used in WebRTC, where its scalable (SVC) mode suits multi-party video calls.\n\nVP9 was never put through a standards body. The bitstream has been frozen since 2013, and the WebM Project's published specification is still labelled draft v0.7 (2017).\n\n## When to use VP9\n\n- **Web delivery** to browsers and devices that lack AV1 decode. Nearly every browser plays VP9, including Safari (macOS since Safari 14.1, iOS since 17.4).\n- **HDR on the web or YouTube** via profile 2 (10-bit), where HEVC is not an option.\n- For new encodes where [AV1](/codecs/video/av1/) decode is available, AV1 is more efficient; VP9 remains a solid middle rung between AV1 and [H.264](/codecs/video/avc/).\n\n## Profiles and levels\n\n| Profile | Bit depth | Chroma                 |\n| ------- | --------- | ---------------------- |\n| 0       | 8         | 4:2:0                  |\n| 1       | 8         | 4:2:2, 4:4:0, 4:4:4    |\n| 2       | 10, 12    | 4:2:0                  |\n| 3       | 10, 12    | 4:2:2, 4:4:0, 4:4:4    |\n\nRGB is coded as 4:4:4 in profile 1 or 3. Profile 0 is what every decoder supports; profile 2 at 10-bit is the usual HDR profile and is widely hardware-decoded on recent devices. Profiles 1 and 3 are mostly software-only.\n\n[Levels](https://www.webmproject.org/vp9/levels/) run from 1 to 6.2 and limit sample rate, picture size, bitrate and tile columns. They matter mostly for hardware decoders.\n\n## Coding tools\n\nVP9 sits between VP8 and AV1 in design:\n\n- 64×64 superblocks, recursively partitioned down to 4×4.\n- 10 intra modes: DC, vertical, horizontal, six diagonal directions and TrueMotion.\n- Three active references per frame (last, golden, alt-ref), chosen from eight stored frames, with compound prediction and 1/8-pel motion vectors using regular, sharp or smooth interpolation filters.\n- **Alt-ref frames**: hidden frames built from future (often temporally filtered) source frames and used only as references. They do much of the job of B-frames without frame reordering; libvpx's `--auto-alt-ref` and `--lag-in-frames` control them.\n- DCT and ADST transforms (mixed per direction) from 4×4 to 32×32, and a lossless mode using a Walsh-Hadamard transform.\n- A boolean arithmetic coder whose probabilities adapt between frames.\n- Segmentation (up to 8 segments with their own quantiser, loop-filter level, reference or skip), a deblocking loop filter, tiles for parallel encoding and decoding, and reference scaling so resolution can change without a keyframe.\n\n## Encoders and decoders\n\n**VP9 implementations**\n\n| Relationship | Project or format | Evidence and scope | Status |\n| --- | --- | --- | --- |\n| Implements by | [libvpx / vpxenc](/tools/software-encoders/vpxenc/) | libvpx v1.17.0 provides VP9 encoding and decoding. Scope: Encoder Decoder. Sources: [libvpx v1.17.0 source](https://chromium.googlesource.com/webm/libvpx/+/refs/tags/v1.17.0), [VP9 bitstream and decoding process specification](https://www.webmproject.org/vp9/). | Documented |\n| Implements by | [SVT-VP9](/tools/software-encoders/svt-vp9/) | SVT-VP9 v0.3.1 provides an experimental VP9 encoder. Scope: Experimental Encoder. Sources: [SVT-VP9 v0.3.1 repository](https://github.com/OpenVisualCloud/SVT-VP9/tree/v0.3.1). | Documented |\n\n[Open the complete typed relationship catalog](/api/v1/catalog.json).\n\n- **[libvpx](/tools/software-encoders/vpxenc/)** (`vpxenc`, or `libvpx-vp9` in FFmpeg) is the reference and practically the only software encoder in use. High-bit-depth (profile 2/3) encoding needs a build with high-bit-depth support enabled; most FFmpeg builds have it.\n- **[SVT-VP9](/tools/software-encoders/svt-vp9/)** and **[Eve-VP9](/tools/software-encoders/eve-vp9/)** are alternatives with limited adoption.\n- **Hardware encoding**: on PCs only Intel GPUs encode VP9 ([Quick Sync](/tools/hardware-encoders/qsv/), [VA-API](/tools/hardware-encoders/vaapi/)); NVIDIA NVENC and AMD AMF do not. Some Android SoCs (Qualcomm, Samsung Exynos) expose VP9 encoders through [MediaCodec](/tools/hardware-encoders/mediacodec/), mainly used by WebRTC.\n\nA constant-quality VP9 WebM with FFmpeg:\n\n```sh\nffmpeg -i input.mkv -c:v libvpx-vp9 -crf 31 -row-mt 1 -c:a libopus output.webm\n```\n\nWith `-crf` and no bitrate, FFmpeg runs libvpx in constant-quality mode (older guides add `-b:v 0` for the same effect; with a non-zero `-b:v`, `-crf` becomes constrained quality with that bitrate as a cap). `-row-mt 1` enables row-based multithreading, which libvpx leaves off by default and which speeds up encoding considerably on multi-core machines. Lower CRF means higher quality; see [vpxenc](/tools/software-encoders/vpxenc/) for speed (`-cpu-used`), two-pass and tile settings.\n\n**Decoders**: FFmpeg's native `vp9` decoder is fast and is what most players use; libvpx also decodes. Hardware decode of profile 0 is near-universal on current GPUs and phones; on NVIDIA it starts with the GTX 950/960 (8-bit only) and 10/12-bit with Pascal (GTX 10 series). See [video codec support](/reference/video-codec-support/) for browsers.\n\n## Containers and HDR\n\n**VP9 container mappings**\n\n| Relationship | Project or format | Evidence and scope | Status |\n| --- | --- | --- | --- |\n| Carried By | [WebM](/containers/webm/) | WebM's documented codec subset includes VP9. Scope: Container Subset. Sources: [WebM container guidelines](https://www.webmproject.org/docs/container/). | Documented |\n| Carried By | [ISO Base Media File Format](/containers/isobmff/) | The WebM Project publishes a VP codec binding for ISO Base Media File Format. Scope: Container Mapping. Sources: [VP Codec ISO Media File Format Binding](https://www.webmproject.org/vp9/mp4/). | Documented |\n| Carried By | [Matroska](/containers/matroska/) | The Matroska mapping uses the V_VP9 Codec ID. Scope: Container Mapping. Sources: [Matroska codec mappings](https://www.matroska.org/technical/codec_specs.html). | Documented |\n\n[Open the complete typed relationship catalog](/api/v1/catalog.json).\n\n- **WebM / Matroska** (`V_VP9`) is the normal container.\n- **MP4** via the WebM Project's [VP codec ISOBMFF binding](https://www.webmproject.org/vp9/mp4/) (`vp09` sample entry). Browser MSE and DASH players support it, but some players and editors expect VP9 only in WebM.\n- **IVF** is the simple raw format `vpxenc` writes for testing.\n\nVP9's own header carries bit depth, chroma subsampling, range and a colour-space value. It has no field for the transfer function (PQ or HLG), so HDR VP9 relies on the container's colour metadata: WebM/Matroska `Colour` elements, or in MP4 the `vpcC` box (primaries, transfer, matrix) plus `SmDm`/`CoLL` boxes for mastering metadata. Check that your muxer writes them. HDR10+ metadata can be carried in WebM as ITU-T T.35 data.\n\n## Licensing\n\nGoogle released VP9 royalty-free with an [additional patent grant](https://www.webmproject.org/license/additional/) for its own patents, and libvpx is BSD-licensed. Sisvel has offered a VP9 patent pool to device makers since 2019, claiming patents from third parties not bound by Google's grant.\n\n## Pitfalls\n\n- **Slow encoding at default settings**: libvpx's best-quality modes are slow; use `-row-mt 1` and a higher `-cpu-used` for faster turnaround.\n- **Profile 1/3 output**: 4:4:4 or RGB input produces profile 1 or 3 streams that many hardware decoders reject. Use `-pix_fmt yuv420p` (or `yuv420p10le` for HDR) for delivery.\n- **HDR without metadata**: a 10-bit profile 2 stream with no transfer and primaries in the container plays as SDR with wrong colours.\n"
}
