BountiesStoreLedgerDocs
Bounties
image / image-decode-jpegBuilt by daveRuns on Liberas

Decode JPEG

Decodes baseline and progressive 8-bit JPEG, grayscale or YCbCr (any chroma subsampling), to RGBA8 with alpha 255. Output must match the reference bit for bit: it uses libjpeg's integer "islow" IDCT, triangle (fancy) chroma upsampling off, and the standard fixed-point YCbCr→RGB conversion, as jpeg-decoder 0.3 implements them. CMYK, 12-bit, lossless and arithmetic-coded files are errors. At most 16,777,216 pixels; larger images are an error.

image-decode-jpeg.wit
package root:component;

world root {
  import liberas:image/types@0.1.0;

  export liberas:image/decode@0.1.0;
}
package liberas:image@0.1.0 {
  interface types {
    record image {
      width: u32,
      height: u32,
      pixels: list<u8>,
    }
  }
  interface decode {
    use types.{image};

    decode: func(data: list<u8>) -> result<image, string>;
  }
}
image-decode-jpeg.cases.json
[
  {
    "args": {
      "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA0JCgsKCA0LCgsODg0PEyAVExISEyccHhcgLikxMC4pLSwzOko+MzZGNywtQFdBRkxOUlNSMj5aYVpQYEpRUk//wgALCAAIABABAREA/8QAFAABAAAAAAAAAAAAAAAAAAAABP/aAAgBAQAAAAE6P//EABcQAQEBAQAAAAAAAAAAAAAAAAECAxP/2gAIAQEAAQUCiczMHn//xAAaEAACAgMAAAAAAAAAAAAAAAAAAQIRAyJh/9oACAEBAAY/AnpIpYlb6f/EABcQAQEBAQAAAAAAAAAAAAAAAAERAEH/2gAIAQEAAT8hRBmQEDAAidrf/9oACAEBAAAAEH//xAAaEAEAAgMBAAAAAAAAAAAAAAABESEAMbFB/9oACAEBAAE/EEoWABWty8wSSAWEFtAd9z//2Q=="
    }
  },
  {
    "args": {
      "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/wAALCAAJAAkBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/AOW8OaZ4RsPCV5LD4Y1iW4kgMUEUscUau7DABYOSOpJwDwDxUP8AZP8A1T//AMn/AP7VXrNn/wAi/Zf9faf+gPXU1//Z"
    }
  },
  {
    "args": {
      "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wgARCAAOABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQCAwX/xAAWAQEBAQAAAAAAAAAAAAAAAAABAwT/2gAMAwEAAhADEAAAAUnbI5xgwyz/AP/EABkQAQEBAAMAAAAAAAAAAAAAAAIDAQQSE//aAAgBAQABBQKYiY4d8R3A2NUeRhkqOOr/xAAcEQACAgIDAAAAAAAAAAAAAAABAgADETJxgeL/2gAIAQMBAT8BcjTqNdeDhFGOPU//xAAcEQABAwUAAAAAAAAAAAAAAAABAAQSAgMRsfD/2gAIAQIBAT8BZETySrTSVAPbX//EACAQAAICAQMFAAAAAAAAAAAAAAECACEDBBExIiNBUZL/2gAIAQEABj8CPaffapsunAJ9mAMmP5MRTmrmqiLlfI48DmdGIkCrqf/EACEQAQEAAQEJAQAAAAAAAAAAAAERAGEhMUFxgZGhscHw/9oACAEBAAE/IW8dQECvfCl1nF8bMjCZfw42grcnpzycYLSL1dTNVjNfc//aAAwDAQACAAMAAAAQRy//xAAaEQEAAgMBAAAAAAAAAAAAAAABESEAMVFB/9oACAEDAQE/EN4ywDbu3nncQqCibVWP/8QAGxEAAgIDAQAAAAAAAAAAAAAAASEAETFBUZH/2gAIAQIBAT8QrrTJ2ceQzdjgj//EAB0QAQEAAgIDAQAAAAAAAAAAAAERACExQWGBkXH/2gAIAQEAAT8QU8wvoQLX7w8YfgoWIDVgTwHPeFneBXXrwx3haqqAGyM21Z8MP0UEBBXR0H32/gEJknJAotbe8//Z"
    }
  },
  {
    "args": {
      "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAYACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDndEsNAs/Dt08Wi6jJM8RjijkSNAzMMAZ3E+/APANdHa2lwnh6OCx8NW8VzPIihppzIAoO4naFUnoB171R1uZhFpNheeK02sxnK2CAtkDapZoVyBy3BOD6ccWtSbTrq8tbSe91nWILZN/llHZY5MZ3fvCvUEDj0PTvwcORarKrUu1dy+09F/4CjTERk4+y1eign7zV3rLX3VtdNPqrFm/i1e10S2tLpNG0sSfP9oaMoynB2hTIxU5AfjBPHaotYuDLe6PY3nimMpEGfNgg3BztyGaFc4wVODwffHEFlb2s2sS/2b4duZ4IlWENcOsLAg4YAKHyM5Oc556DFauiRalPqRvrHQLaK2VXmKXG6Z8ZJGCCo6ADHt19OrCKnTpUoS0ajF/ZWspqy1cneyZEoxdT3rKMpb+6vdgvNya1s/0VytY2mqXXiGaa00KytbaH92VuWebbtyCQwKADjOMcc807T7++STVNSn1vR7JlLZtPMgAjb7uzL5bOeMHvxx0ooriympehXaS92Dt16Pvc5aWJlOqrpac8tVfVPTe+xQs5rSLRNQkuvFF55zgQbYPOSMkkL8ojXaeMn5euCfeoWj0aS1ilvbDWbi4uNgkeaNHkZVyc5MmTjaooor3qlL6vGnVg3fli+i2cmtkj0amEjQoNQk/4aXRWUnZ7JdPyP//Z"
    }
  },
  {
    "args": {
      "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAKAAwDAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDndEsNAs/Dt08Wi6jJM8RjijkSNAzMMAZ3E+/APANfHxliqmKinUile73ei+S/M66dTFYXLZupVhaS5d3f3tNFbVpNu3W263Ov8P6b/wASyL/ilP8Ayb/+119Gp/8AUR/5L/8AbHTgMJ+5X+0/+S//AGxH8ZZpdO+HmkzafI9pK2qxIXgYxsV8mY4yO3A/KvkeFIRrZjUjVXMuR76/aieRlFKGIpRjWSkr7PXv3Mjw/wCINZ/syL/ib6j/AOBL/wCNfoqwWG/59x+5H6vgMtwfsV+5j/4Cv8j/2Q=="
    }
  },
  {
    "args": {
      "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAANAAcDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDP0iDRbGxM50y9YjAClEG4/wDfX4/hRVq6ivrq0tbeTU5VjLM58pFjJIGByoB7njpRXgU6cJrmqS19X/wB1sXiaElSpVeVJLz1tfqvM//Z"
    }
  },
  {
    "args": {
      "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD/AD/6KKKAP//Z"
    }
  },
  {
    "args": {
      "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABsSFBcUERsXFhceHBsgKEIrKCUlKFE6PTBCYFVlZF9VXVtqeJmBanGQc1tdhbWGkJ6jq62rZ4C8ybqmx5moq6T/2wBDARweHigjKE4rK06kbl1upKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKT/wAARCAAQABgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCvDHbpbsRBISRgAgDJ/OrCowtwqWqhmI+82f0pkzcRRvdjn5v3Y/qo+tOkMTOqM80yqM4wcA/jWeHWt3+o5J2t8uo5xMkKowhizzuxj+Zx60U1FQzHy7ZmUcfMQP8AGisqmkYry8i4U+Zt/wCR/9k="
    }
  },
  {
    "args": {
      "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAARCAAQABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwClaw2UVjIVtJ2YrtUMFAJPvmr0cbiyCRaeiu7AAu+7jr0wKhunO23gl1IYJL4hAz6DJQe5qSYwSSxxPNdXSRjO3BIBx1+YjsaxwK97mfr16fcVNO3L6Lr137H/2Q=="
    }
  },
  {
    "args": {
      "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAIAAgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzvwV4Z8BaF8O9Tmt/Bev3N7LbNbW1vcQ28CSyuNoBcSsQOSThWOFPBooor8wymq6Uasm3JuT3lPpbtJHkcSwh7TDYeonOMacbXlPS7d/hkt7L7vU//9k="
    }
  },
  {
    "args": {
      "data": "bm90IGFuIGltYWdlIGF0IGFsbA=="
    }
  },
  {
    "args": {
      "data": "iVBORw0KGgoAAAANSUhEUgAAAAIAAAAJCAAAAAA9GqI7AAAAHklEQVR42mNg4GdU5mdREmBRFmBR5mcUF2BR5ocgABV7AbAPb6LJAAAAAElFTkSuQmCC"
    }
  }
]

Verification

  • Outputs must match the private reference implementation bit for bit.
  • Cases are the spec's 12 vectors plus ones generated from the interface's types: edge values and random ones seeded by your component's hash.
  • Components may not import anything but the interfaces of the specs they depend on: no files, no network, no clock.
  • Runs on Liberas: the component never leaves the platform, and every call is metered on the ledger.
  • A remote call may execute up to 4,000,000,000 instructions.
  • Already built: a component that passes and uses at most 0.9× the current one's fuel on the same cases replaces it, and earns the spec's shares in proportion to the saving.
  • Found an input where the current component disagrees with the spec? Submit it as a case (API or `liberas case`): it joins the vectors for good and earns 10% of the spec's shares. A component that then passes replaces the broken one for 25%.