WebP कंटेनर की खास बातें

शुरुआती जानकारी

WebP एक ऐसा इमेज फ़ॉर्मैट है जो (i) इमेज डेटा को गलत तरीके से कंप्रेस करने के लिए, VP8 की फ़्रेम एन्कोडिंग का इस्तेमाल करता है या (ii) WebP लॉसलेस एन्कोडिंग का इस्तेमाल करता है. कोड में बदलने की ये स्कीम, JPEG, GIF, और PNG जैसे पुराने फ़ॉर्मैट की तुलना में ज़्यादा बेहतर होनी चाहिए. इसे नेटवर्क पर तेज़ी से इमेज ट्रांसफ़र करने के लिए ऑप्टिमाइज़ किया गया है (जैसे, वेबसाइटों के लिए). WebP फ़ॉर्मैट में, सुविधाओं (रंग प्रोफ़ाइल, मेटाडेटा, ऐनिमेशन वगैरह) के साथ-साथ दूसरे फ़ॉर्मैट की सुविधाएं भी एक जैसी होती हैं. इस दस्तावेज़ में WebP फ़ाइल के स्ट्रक्चर के बारे में बताया गया है.

WebP कंटेनर (यानी WebP के लिए आरआईएफ़एफ़ कंटेनर), WebP के इस्तेमाल के उदाहरण के ऊपर, सुविधा को सपोर्ट करने की अनुमति देता है. इसका मतलब है कि ऐसी फ़ाइल जिसमें एक इमेज को VP8 कुंजी फ़्रेम के तौर पर एन्कोड किया गया होता है. WebP कंटेनर, इनके लिए अतिरिक्त सहायता देता है:

  • लॉसलेस कंप्रेशन: WebP में लॉसलेस फ़ॉर्मैट का इस्तेमाल करके, इमेज को आसानी से कंप्रेस किया जा सकता है.

  • मेटाडेटा: इमेज में, एक्सचेंजेबल इमेज फ़ाइल फ़ॉर्मैट (Exif) या एक्सटेंसिबल मेटाडेटा प्लैटफ़ॉर्म (XMP) फ़ॉर्मैट में मेटाडेटा सेव हो सकता है.

  • पारदर्शिता: इमेज में पारदर्शिता हो सकती है, जो कि एक ऐल्फ़ा चैनल है.

  • कलर प्रोफ़ाइल: किसी इमेज में एम्बेड की गई ICC प्रोफ़ाइल हो सकती है, जैसा कि इंटरनैशनल कलर कंसोर्टियम ने बताया है.

  • ऐनिमेशन: किसी इमेज में कई फ़्रेम हो सकते हैं, जिनके बीच में ठहराव होता है. इससे वह ऐनिमेशन बन जाता है.

इन्हें

WebP कंटेनर के बारे में बताते समय, नीचे दिए गए टाइप का इस्तेमाल करने का सुझाव दिया जाता है:

कंटेनर के फ़ॉर्मैट का नामWebP
फ़ाइल नाम एक्सटेंशन.webp
MIME-प्रकारइमेज/webp
यूनिफ़ॉर्म टाइप आइडेंटिफ़ायरorg.webmproject.webp

शब्दावली और बुनियादी बातें

इस दस्तावेज़ में मुख्य शब्द "करना चाहिए", "नहीं करना चाहिए", "ज़रूरी", "करना चाहिए", "नहीं करना चाहिए", "ज़रूरी", "नहीं", "सुझाया गया", "शायद", और "ज़रूरी नहीं" का मतलब BCP 14 में आरएफ़सी 2119 आरएफ़सी 2174 में आरएफ़सी 817 और सभी यहां दिखाए जाने पर, सिर्फ़ तब किया जाना चाहिए, जब वे कैपिटल लेटर में हों.

WebP फ़ाइल में या तो कोई इमेज (यानी, पिक्सल का एन्कोड किया गया मैट्रिक्स) या ऐनिमेशन होता है. वैकल्पिक रूप से, इसमें पारदर्शिता जानकारी, रंग प्रोफ़ाइल और मेटाडेटा भी शामिल हो सकता है. हम पिक्सल के मैट्रिक्स को इमेज का कैनवस मानते हैं.

आरएफ़सी 1166 में दी गई जानकारी के मुताबिक, चंक डायग्राम में बिट नंबरिंग सबसे अहम बिट (('MSB 0') के लिए, 0 से शुरू होती है.

इस दस्तावेज़ में इस्तेमाल किए गए कुछ अन्य शब्दों के बारे में नीचे बताया गया है:

रीडर/राइटर
WebP फ़ाइलों को पढ़ने वाले कोड को रीडर कहा जाता है, जबकि उन्हें लिखने वाले कोड को लेखक कहा जाता है.
uint16
16-बिट, लिटिल-एंडियन, बिना हस्ताक्षर वाला पूर्णांक.
uint24
24-बिट, लिटिल-एंडियन, बिना हस्ताक्षर वाला पूर्णांक.
uint32
32-बिट, लिटिल-एंडियन, बिना हस्ताक्षर वाला पूर्णांक.
FourCC
चार वर्णों वाला कोड (FourCC), एक uint32 है. इसे छोटे साइज़ के क्रम में चार ASCII वर्णों को जोड़कर बनाया जाता है. इसका मतलब है कि 'aaaa' (0x61616161) और 'AAAA' (0x41414141) को अलग-अलग FourCCs के तौर पर माना जाता है.
1-आधारित
-1 से ऑफ़सेट स्टोर करने वाला बिना साइन वाला पूर्णांक फ़ील्ड. उदाहरण के लिए, ऐसा फ़ील्ड वैल्यू 25 को 24 के तौर पर स्टोर करेगा.
ChunkHeader('ABCD')
इसका इस्तेमाल, अलग-अलग ग्रुप के FourCC और चंक साइज़ हेडर के बारे में बताने के लिए किया जाता है. इसमें 'ABCD' शब्द के लिए फ़ोरसीसी होता है. इस एलिमेंट का साइज़ 8 बाइट है.

RIFF फ़ाइल फ़ॉर्मैट

WebP फ़ाइल का फ़ॉर्मैट, RIFF (रिसोर्स इंटरचेंज फ़ाइल फ़ॉर्मैट) दस्तावेज़ फ़ॉर्मैट पर आधारित होता है.

आरआईएफ़एफ़ फ़ाइल का बेसिक एलिमेंट एक चंक होता है. इसमें ये शामिल हैं:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Chunk FourCC                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Chunk Size                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                         Chunk Payload                         :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
चंक फ़ोरसीसी: 32 बिट
चंक की पहचान करने के लिए इस्तेमाल किया जाने वाला ASCII चार वर्ण वाला कोड.
चंक साइज़: 32 बिट (uint32)
डेटा वाले हिस्से का साइज़, बाइट में. इसमें यह फ़ील्ड, हिस्से का आइडेंटिफ़ायर या पैडिंग (जगह) शामिल नहीं है.
चंक पेलोड: चंक साइज़ बाइट
डेटा पेलोड. अगर चंक साइज़ अजीब है, तो एक पैडिंग बाइट को जोड़ा जाता है, जिसे RIFF के मुताबिक होने के लिए 0 होना ज़रूरी है.

ध्यान दें: आरआईएफ़एफ़ में आम तौर पर ऑल-अपरकेस फ़ोरसीसी होते हैं, जो किसी भी आरआईएफ़एफ़ फ़ाइल फ़ॉर्मैट पर लागू होते हैं. वहीं, किसी फ़ाइल फ़ॉर्मैट के लिए बने फ़ोरसीसी, लोअरकेस में होते हैं. WebP, इस कन्वेंशन का पालन नहीं करता.

WebP फ़ाइल का हेडर

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      'R'      |      'I'      |      'F'      |      'F'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           File Size                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      'W'      |      'E'      |      'B'      |      'P'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
'RIFF': 32 बिट
ASCII वर्ण 'R', 'I', 'F', 'F'.
फ़ाइल साइज़: 32 बिट (uint32)
फ़ाइल का साइज़ बाइट में, ऑफ़सेट 8 से शुरू होता है. इस फ़ील्ड की ज़्यादा से ज़्यादा वैल्यू 2^32 माइनस 10 बाइट होती है. इस तरह पूरी फ़ाइल का साइज़ ज़्यादा से ज़्यादा 4 जीआईबी घटाकर 2 बाइट होता है.
'WEBP': 32 बिट
ASCII वर्ण 'W', 'E', 'B', 'P'.

WebP फ़ाइल, FourCC 'WEBP' के साथ RIFF हेडर से शुरू होनी चाहिए. हेडर में मौजूद फ़ाइल का साइज़, उन हिस्सों का कुल साइज़ होता है जो 'WEBP' फ़ॉर्मैट के लिए 4 बाइट के बाद आते हैं. फ़ाइल साइज़ से बताए गए डेटा के बाद, फ़ाइल में कोई डेटा नहीं होना चाहिए. पाठक, पीछे के डेटा को अनदेखा करके ऐसी फ़ाइलों को पार्स कर सकते हैं. किसी भी हिस्से का साइज़ एक जैसा होता है. इसलिए, RIFF हेडर से दिया गया साइज़ भी एक जैसा होता है. अलग-अलग हिस्सों के कॉन्टेंट के बारे में नीचे दिए गए सेक्शन में बताया गया है.

सिंपल फ़ाइल फ़ॉर्मैट (लॉसी)

इस लेआउट का इस्तेमाल तब किया जाना चाहिए, जब इमेज के लिए खराब एन्कोडिंग की ज़रूरत हो और इसके लिए पारदर्शिता या बढ़े हुए फ़ॉर्मैट की ओर से दी जाने वाली अन्य बेहतर सुविधाओं की ज़रूरत न हो. इस लेआउट वाली फ़ाइलें छोटी होती हैं और पुराने सॉफ़्टवेयर के साथ काम करती हैं.

सामान्य WebP (लॉसी) फ़ाइल फ़ॉर्मैट:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                    WebP file header (12 bytes)                |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                        'VP8 ' Chunk                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

'VP8 ' समूह:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('VP8 ')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                           VP8 data                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
VP8 डेटा: चंक साइज़ बाइट
VP8 बिटस्ट्रीम डेटा.

ध्यान दें कि 'VP8 ' फ़ोरसीसी में चौथा वर्ण ASCII स्पेस (0x20) है.

VP8 बिटस्ट्रीम फ़ॉर्मैट की खास जानकारी के बारे में, VP8 डेटा फ़ॉर्मैट और डिकोडिंग गाइड में बताया गया है. ध्यान दें कि VP8 फ़्रेम के हेडर में, VP8 फ़्रेम की चौड़ाई और ऊंचाई होती है. इसे कैनवस की चौड़ाई और ऊंचाई माना जाता है.

VP8 स्पेसिफ़िकेशन में, इमेज को Y'CbCr फ़ॉर्मैट में डिकोड करने का तरीका बताया गया है. आरजीबी में बदलने के लिए, सुझाव BT.601 का इस्तेमाल किया जाना चाहिए. ऐप्लिकेशन, कन्वर्ज़न के किसी दूसरे तरीके का इस्तेमाल कर सकते हैं, लेकिन डिकोडर के हिसाब से विज़ुअल नतीजे अलग-अलग हो सकते हैं.

सामान्य फ़ाइल फ़ॉर्मैट (लॉसलेस)

ध्यान दें: हो सकता है कि पुराने पाठक, लॉसलेस फ़ॉर्मैट वाली फ़ाइलों का इस्तेमाल न कर पाएं.

इस लेआउट का इस्तेमाल तब किया जाना चाहिए, जब इमेज को लॉसलेस एन्कोडिंग की ज़रूरत हो (वैकल्पिक पारदर्शिता चैनल के साथ), और इसके लिए एक्सटेंडेड फ़ॉर्मैट की मदद से दी गई बेहतर सुविधाओं की ज़रूरत न हो.

सामान्य WebP (लॉसलेस) फ़ाइल फ़ॉर्मैट:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                    WebP file header (12 bytes)                |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                         'VP8L' Chunk                          :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

'VP8L' चंक:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('VP8L')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                           VP8L data                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
VP8L डेटा: चंक साइज़ बाइट
VP8L बिटस्ट्रीम डेटा.

VP8L बिटस्ट्रीम की मौजूदा स्पेसिफ़िकेशन को, वेबपी लॉसलेस बिटस्ट्रीम फ़ॉर्मैट में देखा जा सकता है. ध्यान दें कि VP8L हेडर में, VP8L इमेज की चौड़ाई और ऊंचाई मौजूद होती है. इसे कैनवस की चौड़ाई और ऊंचाई माना जाता है.

बड़ा फ़ाइल फ़ॉर्मैट

ध्यान दें: हो सकता है कि बड़ी उम्र के पाठक, फ़ाइलों को बड़े किए गए फ़ॉर्मैट में इस्तेमाल करने की सुविधा न दें.

एक्सटेंडेड फ़ॉर्मैट वाली फ़ाइल में ये चीज़ें शामिल होती हैं:

  • 'VP8X' डेटा, जिसमें फ़ाइल में इस्तेमाल की गई सुविधाओं के बारे में जानकारी दी गई है.

  • कलर प्रोफ़ाइल वाला एक वैकल्पिक 'ICCP' चंक.

  • ऐनिमेशन कंट्रोल डेटा वाला एक वैकल्पिक 'ऐनिम' समूह.

  • इमेज डेटा.

  • Exif मेटाडेटा के साथ एक वैकल्पिक 'EXIF' चंक.

  • XMP मेटाडेटा के साथ एक वैकल्पिक 'XMP ' समूह.

  • अनजान हिस्सों की एक वैकल्पिक सूची.

स्टिल इमेज के लिए, इमेज डेटा में एक फ़्रेम होता है, जो इनसे बना होता है:

ऐनिमेटेड इमेज के लिए, इमेज डेटा में कई फ़्रेम होते हैं. ऐनिमेशन सेक्शन में, फ़्रेम के बारे में ज़्यादा जानकारी देखी जा सकती है.

फिर से बनाने और रंग में सुधार करने के लिए ज़रूरी सभी हिस्से, 'VP8X', 'ICCP', 'WebM', 'ANMF', 'ऐल्फ़ा', 'VP8 ', और 'VP8L', पहले बताए गए क्रम में दिखने चाहिए. जब रीकंस्ट्रक्शन और रंग में सुधार करने के लिए ज़रूरी हिस्से सही क्रम में न हों, तो पाठकों को फ़ेल होना चाहिए.

मेटाडेटा और अज्ञात हिस्से, सही क्रम में नहीं दिख सकते हैं.

वजह: डेटा को फिर से बनाने के लिए ज़रूरी हिस्से, फ़ाइल में सबसे पहले दिखने चाहिए, ताकि लोगों को पूरा डेटा मिलने से पहले, इमेज को डिकोड करना शुरू किया जा सके. लागू करने के हिसाब से मेटाडेटा के क्रम और कस्टम हिस्सों में बदलाव करने से ऐप्लिकेशन को फ़ायदा हो सकता है.

WebP फ़ाइल का बड़ा किया गया हेडर:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                   WebP file header (12 bytes)                 |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('VP8X')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv|I|L|E|X|A|R|                   Reserved                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Canvas Width Minus One               |             ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...  Canvas Height Minus One    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
रिज़र्व किया गया (Rsv): 2 बिट
0 होना चाहिए. लोगों को इस फ़ील्ड को अनदेखा करना चाहिए.
ICC प्रोफ़ाइल (I): 1 बिट
अगर फ़ाइल में 'ICCP' चंक है, तो सेट करें.
ऐल्फ़ा (L): 1 बिट
सेट करें कि इमेज के किसी भी फ़्रेम में पारदर्शिता की जानकारी शामिल है या नहीं ("ऐल्फ़ा").
Exif मेटाडेटा (E): 1 बिट
सेट करें कि फ़ाइल में Exif मेटाडेटा है या नहीं.
XMP मेटाडेटा (X): 1 बिट
सेट करें कि फ़ाइल में XMP मेटाडेटा मौजूद है या नहीं.
ऐनिमेशन (A): 1 बिट
अगर यह ऐनिमेशन वाली इमेज है, तो सेट करें. 'ऐनिम' और 'एएनएमएफ़' वाले डेटा का इस्तेमाल, ऐनिमेशन को कंट्रोल करने के लिए किया जाना चाहिए.
रिज़र्व किया गया (R): 1 बिट
0 होना चाहिए. लोगों को इस फ़ील्ड को अनदेखा करना चाहिए.
रिज़र्व किए गए: 24 बिट
0 होना चाहिए. लोगों को इस फ़ील्ड को अनदेखा करना चाहिए.
कैनवस की चौड़ाई घटाएं: 24 बिट
पिक्सल में कैनवस की 1-आधारित चौड़ाई. कैनवस की असल चौड़ाई 1 + Canvas Width Minus One है.
कैनवस की ऊंचाई माइनस एक: 24 बिट
पिक्सल में 1-आधारित ऊंचाई. कैनवस की असल ऊंचाई 1 + Canvas Height Minus One है.

कैनवस की चौड़ाई और कैनवस की ऊंचाई के प्रॉडक्ट की वैल्यू ज़्यादा से ज़्यादा 2^32 - 1 होनी चाहिए.

आने वाले समय में, अपडेट की प्रोसेस में ज़्यादा फ़ील्ड जोड़े जा सकते हैं. अनजान फ़ील्ड को अनदेखा करना ज़रूरी है.

Animation

ऐनिमेशन को 'ऐनिम' और 'एएनएमएफ़' चंक्स से कंट्रोल किया जाता है.

'ऐनिम' वाला हिस्सा:

ऐनिमेशन वाली इमेज के लिए, इस हिस्से में ऐनिमेशन के ग्लोबल पैरामीटर शामिल होते हैं.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ANIM')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Background Color                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Loop Count           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
बैकग्राउंड का रंग: 32 बिट (uint32)
कैनवस के बैकग्राउंड का डिफ़ॉल्ट रंग, [नीला, हरा, लाल, ऐल्फ़ा] बाइट क्रम में है. इस रंग का इस्तेमाल फ़्रेम के आस-पास कैनवस पर, इस्तेमाल न होने वाली जगह को भरने के लिए किया जा सकता है. साथ ही, पहले फ़्रेम के पारदर्शी पिक्सल को भी भरा जा सकता है. बैकग्राउंड के रंग का इस्तेमाल तब भी किया जाता है, जब डिस्पोज़ल तरीका 1 चुना गया है.

ध्यान दें:

  • बैकग्राउंड के रंग में नॉन-ओपेक ऐल्फ़ा वैल्यू मौजूद हो सकती है, भले ही 'VP8X' चंक में ऐल्फ़ा फ़्लैग सेट न हो.

  • व्यूअर ऐप्लिकेशन को बैकग्राउंड कलर की वैल्यू को संकेत के तौर पर देखना चाहिए. इन्हें इस्तेमाल करने की ज़रूरत नहीं है.

  • कैनवस को हर लूप की शुरुआत में मिटाया जाता है. इसे करने के लिए बैकग्राउंड के रंग का इस्तेमाल किया जा सकता है.

लूप काउंट: 16 बिट (uint16)
ऐनिमेशन को लूप में चलाने की संख्या. अगर यह 0 है, तो इसका मतलब है कि यह कभी खत्म नहीं होगा.

अगर 'VP8X' चंक में ऐनिमेशन फ़्लैग सेट है, तो यह ग्रुप दिखना ज़रूरी है. अगर ऐनिमेशन फ़्लैग सेट नहीं है और यह हिस्सा मौजूद है, तो इसे अनदेखा करना ज़रूरी है.

'ANMF' हिस्से:

ऐनिमेशन वाली इमेज के लिए, इस हिस्से में एक फ़्रेम के बारे में जानकारी होती है. अगर ऐनिमेशन फ़्लैग सेट नहीं है, तो यह हिस्सा नहीं होना चाहिए.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ANMF')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Frame X                |             ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...          Frame Y            |   Frame Width Minus One     ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...             |           Frame Height Minus One              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Frame Duration                |  Reserved |B|D|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                         Frame Data                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
फ़्रेम X: 24 बिट (uint24)
फ़्रेम के ऊपरी बाएं कोने का X निर्देशांक Frame X * 2 है.
फ़्रेम Y: 24 बिट (uint24)
फ़्रेम के ऊपरी बाएं कोने का Y निर्देशांक Frame Y * 2 है.
फ़्रेम की चौड़ाई घटाकर, एक: 24 बिट (uint24)
फ़्रेम की 1-आधारित चौड़ाई. फ़्रेम की चौड़ाई 1 + Frame Width Minus One है.
फ़्रेम की ऊंचाई माइनस एक: 24 बिट (uint24)
फ़्रेम की 1-आधारित ऊंचाई. फ़्रेम की ऊंचाई 1 + Frame Height Minus One है.
फ़्रेम अवधि: 24 बिट (uint24)
एक मिलीसेकंड में, अगला फ़्रेम दिखाने से पहले इंतज़ार करने का समय. ध्यान दें कि फ़्रेम की अवधि का 0 (और अक्सर <= 10) का मतलब, लागू करने की प्रोसेस से तय होता है. कई टूल और ब्राउज़र, GIF की तरह ही कम से कम अवधि तय करते हैं.
रिज़र्व किए गए: 6 बिट
0 होना चाहिए. लोगों को इस फ़ील्ड को अनदेखा करना चाहिए.
ब्लेंड करने का तरीका (B): एक बिट

इससे पता चलता है कि मौजूदा फ़्रेम के पारदर्शी पिक्सल, पिछले कैनवस से जुड़े पिक्सल के साथ कैसे ब्लेंड किए जाने हैं:

  • 0: ऐल्फ़ा-ब्लेंडिंग का इस्तेमाल करें. पिछले फ़्रेम को नष्ट करने के बाद, ऐल्फ़ा-ब्लेंडिंग का इस्तेमाल करके मौजूदा फ़्रेम को कैनवस पर रेंडर करें (नीचे देखें). अगर मौजूदा फ़्रेम में ऐल्फ़ा चैनल नहीं है, तो मान लें कि ऐल्फ़ा वैल्यू 255 है. यह रेक्टैंगल को बदल देगा.

  • 1: डेटा को ब्लेंड न करें. पिछले फ़्रेम को हटाने के बाद, मौजूदा फ़्रेम से कवर किए गए रेक्टैंगल को ओवरराइट करके, मौजूदा फ़्रेम को कैनवस पर रेंडर करें.

डिस्पोज़ल तरीका (D): 1 बिट

यह बताता है कि मौजूदा फ़्रेम को कैनवस पर दिखाए जाने के बाद (अगले फ़्रेम को रेंडर करने से पहले) क्या किया जाना चाहिए:

  • 0: नष्ट न करें. कैनवस को ऐसे ही छोड़ दें.

  • 1: बैकग्राउंड के रंग में डिसपोज़ करें. कैनवस के रेक्टैंगल को मौजूदा फ़्रेम से ढका हुआ रखें और उसे 'ऐनिम' वाले हिस्से में बताए गए बैकग्राउंड के रंग से भरें.

ध्यान दें:

  • फ़्रेम डिस्पोज़ल सिर्फ़ फ़्रेम रेक्टैंगल पर लागू होता है, यानी कि फ़्रेम X, फ़्रेम Y, फ़्रेम की चौड़ाई, और फ़्रेम की ऊंचाई से तय किए गए रेक्टैंगल. यह पूरे कैनवस को कवर कर भी सकता है और नहीं भी.

  • अल्फ़ा-ब्लेंडिंग:

    R, G, B, और A चैनलों में से हर एक आठ बिट है और आरजीबी चैनल को ऐल्फ़ा से पहले से गुणा नहीं किया गया है. इसलिए, 'dst' को 'src' पर ब्लेंड करने का फ़ॉर्मूला है:

    blend.A = src.A + dst.A * (1 - src.A / 255)
    if blend.A = 0 then
      blend.RGB = 0
    else
      blend.RGB =
          (src.RGB * src.A +
           dst.RGB * dst.A * (1 - src.A / 255)) / blend.A
    
  • इमेज की कलर प्रोफ़ाइल को ध्यान में रखकर, ऐल्फ़ा-ब्लेंडिंग को लीनियर कलर स्पेस में बनाया जाना चाहिए. अगर कलर प्रोफ़ाइल मौजूद नहीं है, तो स्टैंडर्ड आरजीबी (sRGB) को माना जाता है. ध्यान दें कि ~2.2 गामा की वजह से एसआरजीबी को लीनियर होना भी ज़रूरी है.

फ़्रेम डेटा: चंक साइज़ - 16 बाइट

इसमें शामिल हैं:

ध्यान दें: 'ANMF' पेलोड, फ़्रेम डेटा में अलग-अलग पैडेड हिस्से होते हैं, जैसा कि RIFF फ़ाइल फ़ॉर्मैट में बताया गया है.

ऐल्फ़ा

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ALPH')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv| P | F | C |     Alpha Bitstream...                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
रिज़र्व किया गया (Rsv): 2 बिट
0 होना चाहिए. लोगों को इस फ़ील्ड को अनदेखा करना चाहिए.
प्री-प्रोसेसिंग (P): 2 बिट

इन जानकारी बिट का इस्तेमाल, कंप्रेस किए जाने के दौरान किए गए प्री-प्रोसेसिंग को सिग्नल देने के लिए किया जाता है. डिकोडर इस जानकारी का इस्तेमाल उदाहरण के लिए, डिसप्ले से पहले वैल्यू को बदलने या ग्रेडिएंट को एक जैसा करने के लिए कर सकता है.

  • 0: प्री-प्रोसेसिंग नहीं होती.
  • 1: लेवल कम किया गया.

डिकोडर को किसी खास तरीके से इस जानकारी का इस्तेमाल करने की ज़रूरत नहीं होती है.

फ़िल्टर करने का तरीका (F): 2 बिट

फ़िल्टर करने के लिए इस्तेमाल किए गए तरीकों के बारे में यहां बताया गया है:

  • 0: कोई नहीं.
  • 1: हॉरिज़ॉन्टल फ़िल्टर.
  • 2: वर्टिकल फ़िल्टर.
  • 3: ग्रेडिएंट फ़िल्टर.

हर पिक्सल के लिए, नीचे बताए गए कैलकुलेशन का इस्तेमाल करके फ़िल्टर किया जाता है. मान लें कि X की मौजूदा जगह के आस-पास की ऐल्फ़ा वैल्यू, इस तरह लेबल की गई हैं:

 C | B |
---+---+
 A | X |

हम X स्थिति में ऐल्फ़ा वैल्यू का हिसाब लगाना चाहते हैं. पहला, फ़िल्टर करने के तरीके के आधार पर अनुमान लगाया जाता है:

  • तरीका 0: अनुमान लगाने वाला = 0
  • तरीका 1: अनुमान लगाने वाला = A
  • तरीका 2: अनुमान लगाने वाला = B
  • तरीका 3: अनुमान लगाने वाला = क्लिप(A + B - C)

जहां clip(v) इसके बराबर है:

  • अगर v < 0 है, तो 0,
  • 255, अगर v > 255 या
  • अन्य स्थिति

फ़ाइनल वैल्यू पाने के लिए, अनुमान लगाने वाले टूल में डीकंप्रेस की गई वैल्यू X जोड़कर और [256..511] रेंज को [0..255] में रैप करने के लिए, मॉड्यूलो-256 अंकगणित का इस्तेमाल किया जाता है:

alpha = (predictor + X) % 256

सबसे बाईं और सबसे ऊपर की पिक्सल स्थितियों के लिए खास केस हैं. उदाहरण के लिए, जगह पर सबसे ऊपर बाईं ओर मौजूद वैल्यू (0, 0) अनुमान लगाने वाली वैल्यू के तौर पर 0 का इस्तेमाल करती है. इसके अलावा:

  • हॉरिज़ॉन्टल या ग्रेडिएंट फ़िल्टर करने के तरीकों के लिए, जगह (0, y) पर सबसे बाईं ओर के पिक्सल का अनुमान, ऊपर दी गई जगह (0, y-1) का इस्तेमाल करके लगाया जाता है.
  • वर्टिकल या ग्रेडिएंट फ़िल्टर करने के तरीकों के लिए, जगह (x, 0) पर सबसे ऊपर वाले पिक्सल का अनुमान (x-1, 0) बाईं ओर दी गई जगह (x-1, 0) का इस्तेमाल करके लगाया जाता है.
कंप्रेस करने का तरीका (C): 2 बिट

कंप्रेस करने के लिए इस्तेमाल किया गया तरीका:

  • 0: कोई कंप्रेशन नहीं.
  • 1: WebP लॉसलेस फ़ॉर्मैट का इस्तेमाल करके कंप्रेस किया गया.
ऐल्फ़ा बिटस्ट्रीम: चंक साइज़ - 1 बाइट

कोड में बदला गया ऐल्फ़ा बिटस्ट्रीम.

इस वैकल्पिक हिस्से में, इस फ़्रेम के लिए कोड में बदला गया ऐल्फ़ा डेटा होता है. 'VP8L' चंक वाले फ़्रेम में यह हिस्सा नहीं होना चाहिए.

वजह: पारदर्शिता से जुड़ी जानकारी, पहले से ही 'VP8L' चंक का हिस्सा है.

ऐल्फ़ा चैनल का डेटा, कंप्रेस किए बिना रॉ डेटा (जब कंप्रेशन का तरीका '0' हो) के तौर पर सेव किया जाता है या लॉसलेस फ़ॉर्मैट (जब कंप्रेशन का तरीका '1' होता है) का इस्तेमाल करके कंप्रेस किया जाता है.

  • रॉ डेटा: इसमें लंबाई = चौड़ाई * ऊंचाई का बाइट क्रम होता है. इसमें स्कैन के क्रम में सभी 8-बिट पारदर्शिता वैल्यू होती हैं.

  • लॉसलेस फ़ॉर्मैट कंप्रेशन: बाइट क्रम, इंप्लिसिट डाइमेंशन, चौड़ाई x ऊंचाई की कंप्रेस की गई इमेज-स्ट्रीम ("WebP लॉसलेस बिटस्ट्रीम फ़ॉर्मैट" में बताया गया है) है. इसका मतलब है कि इस इमेज-स्ट्रीम में, इमेज के डाइमेंशन की जानकारी देने वाला कोई हेडर शामिल नहीं होता.

    वजह: डाइमेंशन को दूसरे सोर्स से पहले से पता होता है. इसलिए, उन्हें फिर से सेव करना गैर-ज़रूरी होगा और इसमें गड़बड़ी होने की संभावना होती है.

    इमेज-स्ट्रीम के अल्फ़ा, लाल, हरे, नीले (ARGB) रंग में डिकोड होने के बाद, लॉसलेस फ़ॉर्मैट जानकारी में बताई गई प्रोसेस के मुताबिक, पारदर्शिता की जानकारी ARGB क्वाड्रलेट के हरे चैनल से ली जानी चाहिए.

    वजह: ग्रीन चैनल को स्पेसिफ़िकेशन में ज़्यादा बदलाव करने की अनुमति दी गई है. वहीं, दूसरे चैनलों में ऐसा नहीं किया जा सकता, क्योंकि इससे कंप्रेस करने की प्रोसेस बेहतर हो सकती है.

बिटस्ट्रीम (VP8/VP8L)

इस हिस्से में, किसी एक फ़्रेम के लिए कंप्रेस किया गया बिटस्ट्रीम डेटा होता है.

बिटस्ट्रीम हिस्सा या तो (i) 'VP8 ' चंक हो सकता है, जिसमें 'VP8 ' (चौथे वर्ण की ज़रूरी जगह ध्यान दें) को इसके ForCC के तौर पर इस्तेमाल किया गया है या (ii) 'VP8L' हिस्से हो सकता है, जिसमें 'VP8L' को इसके फ़ोरसीसी के तौर पर इस्तेमाल किया गया हो.

'VP8 ' और 'VP8L' चंक के फ़ॉर्मैट सिंपल फ़ाइल फ़ॉर्मैट (लॉसी) और सिंपल फ़ाइल फ़ॉर्मैट (लॉसलेस) सेक्शन में बताए गए हैं.

कलर प्रोफ़ाइल

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ICCP')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                       Color Profile                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
कलर प्रोफ़ाइल: चंक साइज़ बाइट
आईसीसी प्रोफ़ाइल.

यह डेटा, इमेज के डेटा से पहले दिखना चाहिए.

इस तरह का ज़्यादा से ज़्यादा एक हिस्सा होना चाहिए. अगर इस तरह के और ज़्यादा हिस्से हैं, तो लोग पहले वाले को छोड़कर सभी को अनदेखा कर सकते हैं. ज़्यादा जानकारी के लिए, ICC की खास बातें देखें.

अगर यह हिस्सा मौजूद नहीं है, तो sRGB को माना जाना चाहिए.

मेटाडेटा

मेटाडेटा को 'EXIF' या 'XMP ' हिस्सों में सेव किया जा सकता है.

हर टाइप ('EXIF' और 'XMP ') का ज़्यादा से ज़्यादा एक हिस्सा होना चाहिए. अगर इस तरह के और भी हिस्से हैं, तो लोग पहले वाले को छोड़कर सभी को अनदेखा कर सकते हैं.

हिस्सों को इस तरह परिभाषित किया गया है:

'EXIF' समूह:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('EXIF')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                        Exif Metadata                          :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Exif मेटाडेटा: चंक साइज़ बाइट
Exif फ़ॉर्मैट में इमेज का मेटाडेटा.

'XMP ' समूह:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('XMP ')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                        XMP Metadata                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
XMP मेटाडेटा: चंक साइज़ बाइट
XMP फ़ॉर्मैट में इमेज का मेटाडेटा.

ध्यान दें कि 'XMP ' FORCC में चौथा वर्ण एक ASCII स्पेस (0x20) है.

मेटाडेटा को हैंडल करने के बारे में ज़्यादा जानकारी, मेटाडेटा वर्किंग ग्रुप के "मेटाडेटा हैंडल करने के दिशा-निर्देश" में मिल सकती है.

अज्ञात चंक

आरआईएफ़एफ़ हिस्से (आरआईएफ़एफ़ फ़ाइल फ़ॉर्मैट सेक्शन में बताया गया) जिसका फ़ोरसीसी इस दस्तावेज़ में बताए गए किसी भी हिस्से से अलग होता है उसे अज्ञात हिस्सा माना जाता है.

वजह: अज्ञात हिस्सों को अनुमति देने से, आने वाले समय में इस फ़ॉर्मैट को एक्सटेंशन मिल सकता है. साथ ही, किसी खास ऐप्लिकेशन से जुड़े डेटा को सेव करने की अनुमति भी मिलती है.

किसी फ़ाइल में अज्ञात हिस्से हो सकते हैं:

पाठकों को इन हिस्सों को अनदेखा करना चाहिए. लेखकों को इन्हें उनके मूल क्रम में बनाए रखना चाहिए, जब तक कि वे खास तौर पर इन हिस्सों में बदलाव न करना चाहें.

Frames से कैनवस असेंबली

यहां हम इस बारे में खास जानकारी देते हैं कि ऐनिमेशन वाली इमेज के मामले में, पाठक को कैनवस कैसे इकट्ठा करना चाहिए.

यह प्रोसेस 'VP8X' हिस्से में दिए गए डाइमेंशन का इस्तेमाल करके कैनवस बनाने से शुरू होती है. इस डाइमेंशन की चौड़ाई Canvas Width Minus One + 1 पिक्सल चौड़ी और Canvas Height Minus One + 1 पिक्सल है. 'ऐनिम' चंक का Loop Count फ़ील्ड यह कंट्रोल करता है कि ऐनिमेशन की प्रोसेस कितनी बार दोहराई जाए. यह Loop Count - 1, शून्य के अलावा किसी और Loop Count वैल्यू के लिए है. अगर Loop Count की वैल्यू शून्य है, तो इनफ़ाइनाइट है.

हर लूप इटरेशन की शुरुआत में, कैनवस को 'ऐनिम' चंक के बैकग्राउंड के रंग या ऐप्लिकेशन के तय किए गए रंग का इस्तेमाल करके भरा जाता है.

'ANMF' ग्रुप में, डिसप्ले के क्रम में अलग-अलग फ़्रेम होते हैं. हर फ़्रेम को रेंडर करने से पहले, पिछले फ़्रेम का Disposal method लागू किया जाता है.

डिकोड किए गए फ़्रेम को रेंडर करने की प्रोसेस, कार्टिज़न निर्देशांक (2 * Frame X, 2 * Frame Y) से शुरू होती है. इसके लिए, कैनवस के सबसे ऊपर बाएं कोने को ऑरिजिन के तौर पर इस्तेमाल किया जाता है. Frame Width Minus One + 1 पिक्सल चौड़ाई और Frame Height Minus One + 1 पिक्सल ऊंचाई को Blending method का इस्तेमाल करके कैनवस पर रेंडर किया जाता है.

कैनवस Frame Duration मिलीसेकंड तक दिखता है. यह तब तक जारी रहता है, जब तक 'ANMF' हिस्सों के सभी फ़्रेम नहीं दिखाए जाते. इसके बाद, लूप की नई प्रोसेस शुरू हो जाती है या सभी दोहराव पूरे होने पर कैनवस आखिरी स्थिति में रह जाता है.

नीचे दिया गया स्यूडोकोड, रेंडरिंग की प्रोसेस को दिखाता है. नोटेशन VP8X.field का मतलब, 'VP8X' चंक में मौजूद फ़ील्ड से है जिसकी जानकारी एक जैसी है.

VP8X.flags.hasAnimation MUST be TRUE
canvas ← new image of size VP8X.canvasWidth x VP8X.canvasHeight with
         background color ANIM.background_color.
loop_count ← ANIM.loopCount
dispose_method ← Dispose to background color
if loop_count == 0:
  loop_count = ∞
frame_params ← nil
next chunk in image_data is ANMF MUST be TRUE
for loop = 0..loop_count - 1
  clear canvas to ANIM.background_color or application-defined color
  until eof or non-ANMF chunk
    frame_params.frameX = Frame X
    frame_params.frameY = Frame Y
    frame_params.frameWidth = Frame Width Minus One + 1
    frame_params.frameHeight = Frame Height Minus One + 1
    frame_params.frameDuration = Frame Duration
    frame_right = frame_params.frameX + frame_params.frameWidth
    frame_bottom = frame_params.frameY + frame_params.frameHeight
    VP8X.canvasWidth >= frame_right MUST be TRUE
    VP8X.canvasHeight >= frame_bottom MUST be TRUE
    for subchunk in 'Frame Data':
      if subchunk.tag == "ALPH":
        alpha subchunks not found in 'Frame Data' earlier MUST be
          TRUE
        frame_params.alpha = alpha_data
      else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L":
        bitstream subchunks not found in 'Frame Data' earlier MUST
          be TRUE
        frame_params.bitstream = bitstream_data
    render frame with frame_params.alpha and frame_params.bitstream
      on canvas with top-left corner at (frame_params.frameX,
      frame_params.frameY), using Blending method
      frame_params.blendingMethod.
    canvas contains the decoded image.
    Show the contents of the canvas for
    frame_params.frameDuration * 1 ms.
    dispose_method = frame_params.disposeMethod

फ़ाइल लेआउट के उदाहरण

ऐल्फ़ा के साथ नुकसान पहुंचाने वाली एन्कोड की गई इमेज कुछ इस तरह दिख सकती है:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ALPH (alpha bitstream)
+- VP8 (bitstream)

लॉसलेस-एन्कोडेड इमेज इस तरह दिख सकती है:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- VP8L (lossless bitstream)
+- XYZW (unknown chunk)

ICC प्रोफ़ाइल और XMP मेटाडेटा के साथ लॉसलेस इमेज इस तरह दिख सकती है:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ICCP (color profile)
+- VP8L (lossless bitstream)
+- XMP  (metadata)

Exif मेटाडेटा के साथ ऐनिमेट की गई इमेज कुछ इस तरह दिख सकती है:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ANIM (global animation parameters)
+- ANMF (frame1 parameters + data)
+- ANMF (frame2 parameters + data)
+- ANMF (frame3 parameters + data)
+- ANMF (frame4 parameters + data)
+- EXIF (metadata)