{
  "schemaVersion": 1,
  "contentVersion": "ca42e61ede0a24f789d7287a0001244ad22f4abf",
  "id": "docs/codecs/video/vp8",
  "collection": "docs",
  "title": "VP8",
  "description": "VP8 is the royalty-free web video codec Google open-sourced in 2010; today it matters mainly for WebRTC and older WebM files.",
  "canonicalUrl": "https://encode.wiki/codecs/video/vp8/",
  "apiUrl": "https://encode.wiki/api/v1/documents/docs/codecs/video/vp8.json",
  "markdownUrl": "https://encode.wiki/api/v1/markdown/docs/codecs/video/vp8.md",
  "status": "current",
  "tags": [
    "migrated",
    "video"
  ],
  "license": "CC BY-SA 4.0",
  "dates": {
    "lastVerified": "2026-10-08T00:00:00.000Z"
  },
  "authors": [],
  "sources": [
    {
      "title": "RFC 6386 — VP8 Data Format and Decoding Guide",
      "url": "https://www.rfc-editor.org/rfc/rfc6386",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "RFC 7741 — RTP Payload Format for VP8 Video",
      "url": "https://www.rfc-editor.org/rfc/rfc7741",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "RFC 7742 — WebRTC Video Processing and Codec Requirements",
      "url": "https://www.rfc-editor.org/rfc/rfc7742",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Technical overview of VP8, an open source video codec for the web",
      "url": "https://ieeexplore.ieee.org/abstract/document/6012227",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    },
    {
      "title": "Fiona Glaser, \"Diary of an x264 developer\" — VP8 analysis (archived)",
      "url": "https://web.archive.org/web/20150301015756/http://x264dev.multimedia.cx/archives/486",
      "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": "FFmpeg libvpx encoder documentation",
      "url": "https://ffmpeg.org/ffmpeg-codecs.html#libvpx",
      "accessedAt": "2026-10-08T00:00:00.000Z"
    }
  ],
  "provenance": {
    "originUrl": "https://github.com/av1-community-contributors/codec-wiki/blob/37c3317fd058b23c71a87679bed5619a98f77752/docs/video/VP8.mdx",
    "originCommit": "37c3317fd058b23c71a87679bed5619a98f77752",
    "migratedAt": "2026-08-21T00:00:00.000Z",
    "modified": true,
    "originPath": "docs/video/VP8.mdx"
  },
  "headings": [
    {
      "depth": 2,
      "text": "When to use VP8",
      "anchor": "when-to-use-vp8"
    },
    {
      "depth": 2,
      "text": "Format summary",
      "anchor": "format-summary"
    },
    {
      "depth": 2,
      "text": "Coding tools",
      "anchor": "coding-tools"
    },
    {
      "depth": 2,
      "text": "History and reception",
      "anchor": "history-and-reception"
    },
    {
      "depth": 2,
      "text": "Encoders and decoders",
      "anchor": "encoders-and-decoders"
    },
    {
      "depth": 2,
      "text": "Licensing",
      "anchor": "licensing"
    }
  ],
  "sections": [
    {
      "id": "_preamble",
      "title": "Page introduction",
      "depth": 0,
      "canonicalUrl": "https://encode.wiki/codecs/video/vp8/",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/_preamble.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/_preamble.md",
      "checksum": "bfa4c1865d17e1f291d98bda6b16e8e5043fc952626db6f4dfdcf41122d789a0",
      "bytes": 455
    },
    {
      "id": "when-to-use-vp8",
      "title": "When to use VP8",
      "depth": 2,
      "anchor": "when-to-use-vp8",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp8/#when-to-use-vp8",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/when-to-use-vp8.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/when-to-use-vp8.md",
      "checksum": "2687b6b3fe23be573467e3e6eadf1e1cc9c32b5329698433ea6411b4fe289139",
      "bytes": 364
    },
    {
      "id": "format-summary",
      "title": "Format summary",
      "depth": 2,
      "anchor": "format-summary",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp8/#format-summary",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/format-summary.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/format-summary.md",
      "checksum": "ae7df60d99aff1ca165b50e12170690ff4239a3c066e50f7f69635111ceccbda",
      "bytes": 1054
    },
    {
      "id": "coding-tools",
      "title": "Coding tools",
      "depth": 2,
      "anchor": "coding-tools",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp8/#coding-tools",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/coding-tools.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/coding-tools.md",
      "checksum": "f50f937cdb410bd382135dda000003433c6b5dd2c621d042a5db88e369e6e29d",
      "bytes": 1703
    },
    {
      "id": "history-and-reception",
      "title": "History and reception",
      "depth": 2,
      "anchor": "history-and-reception",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp8/#history-and-reception",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/history-and-reception.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/history-and-reception.md",
      "checksum": "49bcdb071bbb60b77b8dffa7c4326fa7d3ac9212916dcca2f359594c7bd556b6",
      "bytes": 1290
    },
    {
      "id": "encoders-and-decoders",
      "title": "Encoders and decoders",
      "depth": 2,
      "anchor": "encoders-and-decoders",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp8/#encoders-and-decoders",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/encoders-and-decoders.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/encoders-and-decoders.md",
      "checksum": "182d257119988cf07653edf321eed6599608c0845c2fd5672a0465d341aaace3",
      "bytes": 1267
    },
    {
      "id": "licensing",
      "title": "Licensing",
      "depth": 2,
      "anchor": "licensing",
      "canonicalUrl": "https://encode.wiki/codecs/video/vp8/#licensing",
      "apiUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/licensing.json",
      "markdownUrl": "https://encode.wiki/api/v1/sections/docs/codecs/video/vp8/licensing.md",
      "checksum": "2c1c17cd264786c11539fbc36f60f5876bb05084d75804f6b2c5c1d4374d809b",
      "bytes": 301
    }
  ],
  "outboundReferences": [
    "/api/v1/catalog.json",
    "/codecs/images/webp/",
    "/codecs/video/av1/",
    "/codecs/video/avc/",
    "/codecs/video/vp9/",
    "/media/content/b793c1a831f2d857-vp8_rd_up.webp",
    "/tools/software-encoders/vpxenc/",
    "https://chromium.googlesource.com/webm/libvpx/+/refs/tags/v1.17.0",
    "https://web.archive.org/web/20150301015756/http://x264dev.multimedia.cx/archives/486",
    "https://www.rfc-editor.org/rfc/rfc6386",
    "https://www.rfc-editor.org/rfc/rfc7741",
    "https://www.rfc-editor.org/rfc/rfc7742"
  ],
  "checksum": "d5eff05e4eb956c3a88bfda729543144bb5b1995c1ce6118b38e1b2f6cdcbd04",
  "contentFormat": "markdown",
  "markdown": "VP8 is a video format created by On2 Technologies and announced in 2008. Google bought On2 in 2010 and released VP8 that year as an open, royalty-free codec, together with the WebM container and the libvpx encoder and decoder. It was designed to compete with [H.264](/codecs/video/avc/), and it is the ancestor of [VP9](/codecs/video/vp9/) and [AV1](/codecs/video/av1/). Lossy [WebP](/codecs/images/webp/) images are VP8 intra frames in a RIFF container.\n\n## When to use VP8\n\n- **WebRTC.** Browsers must implement VP8 and H.264 Constrained Baseline ([RFC 7742](https://www.rfc-editor.org/rfc/rfc7742)), so VP8 is the safe common codec for realtime video.\n- **Old WebM players and pipelines** that only accept VP8.\n\nFor anything else, use VP9 or AV1: both are much more efficient, and VP9 plays in every current browser.\n\n## Format summary\n\n| Property     | VP8                                                                    |\n| ------------ | ---------------------------------------------------------------------- |\n| Samples      | 8-bit YUV 4:2:0 only, progressive only (no interlacing)                |\n| Picture size | Up to 16383×16383 (14-bit width and height fields)                     |\n| Frames       | Keyframes and interframes; no B-frames                                 |\n| Profiles     | Versions 1–3 replace the six-tap motion interpolation with bilinear or full-pixel filters for low-power decoders; virtually all streams use version 0 |\n| Containers   | WebM/Matroska (`V_VP8`), IVF, RTP ([RFC 7741](https://www.rfc-editor.org/rfc/rfc7741)) |\n| HDR, 10-bit  | Not supported; tone-map HDR sources to SDR before encoding             |\n\nThere is no lossless VP8 mode; WebP's lossless mode is a separate format. Alpha in WebM VP8 is carried as a second VP8 stream in Matroska `BlockAdditional` data, which browsers support but many other players ignore.\n\n## Coding tools\n\nVP8's design is close to H.264 Baseline with some ideas of its own:\n\n- **16×16 macroblocks** (8×8 for each chroma plane), with 4×4 subblocks.\n- **Intra prediction**: DC, vertical, horizontal and TrueMotion (TM_PRED) for 16×16 luma and 8×8 chroma; ten modes for 4×4 luma blocks. TrueMotion predicts each pixel as left + above − above-left.\n- **Three reference frames**: the last frame, a **golden frame** (an older frame kept as a long-term reference, e.g. for a static background), and an **alternate reference (alt-ref) frame**, which is decoded but never shown. Encoders build alt-ref frames from future source frames, often temporally filtered, which recovers much of the benefit of B-frames without reordering.\n- **Motion**: quarter-pel luma vectors with six-tap interpolation; `SPLITMV` lets a macroblock carry up to 16 motion vectors.\n- **Transforms**: a 4×4 DCT, plus a Walsh–Hadamard transform over the 16 luma DC coefficients in 16×16-predicted macroblocks.\n- **Quantisation**: a 0–127 quantiser index with per-component adjustments, and up to four segments per frame with their own quantiser and loop-filter level.\n- **Entropy coding**: a boolean arithmetic coder. Probabilities are fixed within a frame and can be updated per frame, which is simpler than H.264's CABAC and helps error recovery.\n- **Token partitions**: coefficient data can be split into 1, 2, 4 or 8 partitions by macroblock row, so decoders can run multiple threads.\n- **In-loop deblocking** with \"normal\" and \"simple\" filters, adjustable per segment and per reference/mode, and skipped on internal edges of macroblocks that have no coefficients and don't use 4×4 prediction or split motion.\n\n## History and reception\n\nVP8 launched with bold efficiency claims that early tests did not bear out. Moscow State University's comparison, for example, showed libvpx well behind x264:\n\n![VP8 rate–distortion on Pixar's \"Up\": libvpx compared with x264 and Xvid](/media/content/b793c1a831f2d857-vp8_rd_up.webp)\n\nFiona Glaser, an x264 developer and co-author of FFmpeg's fast native VP8 decoder, wrote an [influential analysis](https://web.archive.org/web/20150301015756/http://x264dev.multimedia.cx/archives/486) at launch. She liked parts of the design, including TrueMotion prediction and the simple arithmetic coding, but criticised the slow loop filter, parts of the transform design, and above all the specification: the \"bitstream guide\" was incomplete and libvpx's behaviour differed from it. That problem was never fully fixed. When the format was published as [RFC 6386](https://www.rfc-editor.org/rfc/rfc6386) in November 2011, it stated that the bitstream is defined by the reference decoder source code, and the text yields to the code where they conflict.\n\nLater royalty-free formats learned from this: AV1 was developed with a written specification and conformance streams alongside the reference code. VP8 also set a precedent for web video by dropping interlacing entirely.\n\n## Encoders and decoders\n\n**VP8 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 VP8 encoding and decoding. Scope: Encoder Decoder. Sources: [libvpx v1.17.0 source](https://chromium.googlesource.com/webm/libvpx/+/refs/tags/v1.17.0). | Documented |\n\n[Open the complete typed relationship catalog](/api/v1/catalog.json).\n\n[libvpx](/tools/software-encoders/vpxenc/) is the only encoder in practical use (`vpxenc`, or `libvpx` in FFmpeg). Decoding is cheap: FFmpeg's native `vp8` decoder and libvpx both run fast in software, and some Intel, NVIDIA and mobile SoCs also decode VP8 in hardware.\n\nA VP8 WebM with FFmpeg:\n\n```sh\nffmpeg -i input.mkv -c:v libvpx -crf 10 -b:v 1M -c:a libopus output.webm\n```\n\nFor VP8, `-crf` (libvpx's `cq-level`, 0–63, lower is better) works as constrained quality: the encoder aims for that quality with `-b:v` as the bitrate ceiling. Always set both: without `-b:v`, FFmpeg falls back to a 256 kbit/s target, and that cap rather than `-crf` decides the quality. Choose `-b:v` for your resolution and content. See [vpxenc](/tools/software-encoders/vpxenc/) for realtime settings.\n\n## Licensing\n\nVP8 is royalty-free; Google licenses its patents under the WebM project's patent grant and libvpx is BSD-licensed. In 2013 Google and MPEG LA reached an agreement licensing VP8-related patents from a group of H.264 patent holders, which ended MPEG LA's effort to form a VP8 patent pool.\n"
}
