रिग्रेसिव (Regressive) JPEG
(maurycyz.com)- Progressive JPEG की मल्टी-स्कैन संरचना को बदलकर, डाउनलोड आगे बढ़ने पर इमेज क्वालिटी बेहतर होने के बजाय पहले से दिख रही इमेज को लगातार किसी दूसरी इमेज में बदला जा सकता है
- हर scan color channel, DCT frequency range और precision तय करता है, और समान resolution वाले JPEG से कुछ markers हटाकर उन्हें जोड़ने पर मौजूदा rendering data को overwrite किया जा सकता है
- Decoder compression bomb जैसी समस्याओं से बचने के लिए process किए जाने वाले scans की संख्या सीमित करते हैं; Chrome लगभग 90 frames तक render करता है और Firefox आदि उससे अधिक process करते हैं
- अगर हर frame में केवल एक DC-only scan इस्तेमाल किया जाए, तो frames की संख्या बढ़ाते हुए ghosting से बचा जा सकता है, लेकिन DCT block की प्रकृति के कारण परिणामी resolution मूल का 1/16 रह जाता है
- एक ही JPEG में video की तरह कई frames रखे जा सकते हैं, लेकिन timing information न होने से playback speed network delay पर निर्भर रहती है; यह व्यावहारिक video की तुलना में partial rendering का उपयोग करने वाले HTML और single-page app experiments के लिए अधिक उपयुक्त है
Progressive JPEG इमेज कैसे दिखाता है
- JPEG पहले low-frequency components store करता है, ताकि file का केवल कुछ हिस्सा डाउनलोड होने पर भी कटी हुई इमेज की जगह low-resolution preview दिखाया जा सके
- Compressed data कई scans में बंटा होता है और हर scan से पहले header होता है
FF DAscan start marker है- इसके बाद length field, शामिल channels की संख्या और ID, तथा Huffman table index आते हैं
- start/end DCT bins और precision तय करने के बाद Huffman-encoded DCT coefficients store किए जाते हैं
- पहले scan में तीनों color channels के सबसे कम DC frequency bin शामिल होते हैं
YCbCr और चरणबद्ध quality improvement
- JPEG के तीन color channels आम RGB के बजाय YCbCr का उपयोग करते हैं
Yluminance है, इसलिए high quality चाहिएCb,Crchroma components हैं, इसलिए quality कम करने पर visual impact ज्यादा नहीं होता- बहुत मोटे तौर पर कहें तो
Y = G,Cb = B - G,Cr = R - Gहै
- example JPEG scan 0 से 9 तक data को चरणबद्ध रूप से भरता है
- scan 0:
Y Cb Cr, DCT bin0–0को half precision में store कर बहुत low-resolution preview देता है - scan 1:
Y, bins1–5को 1/4 precision में जोड़कर luminance details मजबूत करता है - scan 2·3:
Cb,Crके bins1–63को half precision में जोड़ते हैं - scan 4:
Yके bins6–63को 1/4 precision में भरकर scan 1 से छोड़ी गई range पूरी करता है - scan 5:
Yके bins1–63को half precision में सुधारता है - scan 6–9: हर channel में अंतिम bit जोड़कर full quality बनाते हैं
- scan 0:
- Chroma data luminance से पहले पूरा हो जाता है, लेकिन chroma half resolution, यानी 1/4 pixel count में store होता है, इसलिए
Cr + Cbकी कुल capacity भी luminance की केवल आधी होती है
डाउनलोड के दौरान इमेज बदलना
- क्योंकि हर scan लागू होने वाली frequency range स्पष्ट करता है, बाद के scans से पहले से rendered image data को overwrite करने वाला JPEG बनाया जा सकता है
- समान resolution वाली कई images को जोड़ते हुए अगले markers को filter out करने के तरीके से इसे implement किया जाता है
- image start (start-of-image)
- frame start (start-of-frame)
- image end (end-of-image)
- Hex editor से भी बनाया जा सकता है, लेकिन वास्तविक generation के लिए एक सरल C program इस्तेमाल किया जाता है
- file को slow network पर भेजने पर, download आगे बढ़ने के दौरान कई images बारी-बारी से switch होती हैं
Decoder की scan limit
- अधिकांश JPEG decoders एक निश्चित संख्या के scans process करने के बाद रुक जाते हैं
- माना जाता है कि यह compression bomb जैसी समस्याओं से बचने की limit है, और simple concatenation method से 9 frames से अधिक implement करना मुश्किल है
- लंबा animation बनाने के लिए हर frame के लिए आवश्यक scans की संख्या न्यूनतम करनी होगी
Baseline JPEG इस्तेमाल न कर पाने का कारण
- केवल एक scan इस्तेमाल करने वाले Baseline JPEG से शुरू करने का तरीका काम नहीं करता
- Progressive mode में एक ही scan में DC data यानी bin 0 और AC data यानी bin 1 या उससे ऊपर को साथ नहीं रखा जा सकता
- Baseline mode में यह restriction नहीं है, लेकिन Baseline decoder पहले scan के बाद processing रोक देता है
- AC data को DC data के बाद आना होता है, इसलिए सबसे छोटा progressive JPEG frame केवल DC-only scan से बना होता है
DC-only frame की संरचना और resolution
- DCT 16×16 blocks के स्तर पर process होता है, इसलिए केवल DC data शामिल होने पर भी यह single-color नहीं, बल्कि मूल की 1/16 resolution वाली image बना सकता है
- न्यूनतम frame केवल एक scan इस्तेमाल करता है, जो
Y Cb Crतीनों channels के DCT bins0–0को full precision में store करता है - इस configuration में Chrome processing रोकने से पहले लगभग 90 frames render करता है
- Firefox जैसे दूसरे browsers अधिक scans process करते हैं
- 90 scans से बनी image लगभग सभी browsers में काम करती है
Ghosting के बिना frame transition
- simple concatenation method में ghosting इसलिए होती है क्योंकि AC scans को मौजूदा data को refine करने के लिए design किया गया है
- सामान्य progressive JPEG में file size बहुत बढ़ाए बिना कई precision steps रखे जा सकते हैं, लेकिन images को replace करने के तरीके के लिए यह उपयुक्त नहीं है
- वास्तविक progressive improvement के बिना केवल DC-only scans इस्तेमाल करने पर पिछले AC data की refinement नहीं होती, इसलिए ghosting से बचा जा सकता है
- DC-only frame standard-compliant JPEG image है, इसलिए special encoder की जरूरत नहीं होती
- scan specification में
0,1,2:0-0,0,0;की तरह तीनों channels के केवल DC bins specify किए जाते हैं
- scan specification में
single JPEG video की सीमाएं
- DC-only frames को जोड़ने पर एक JPEG file में पूरा video रखा जा सकता है
- JPEG scans में frame timing जोड़ने का कोई तरीका नहीं है, इसलिए playback speed पूरी तरह network delay पर निर्भर रहती है
- गैर-पारंपरिक Rickroll या prank के अलावा इसका कोई practical use case नहीं है
partial rendering को बढ़ाने वाले experiments
- partial rendering का उपयोग करके JPEG frame replacement के अलावा भी experiments किए जा सकते हैं
<dialog>tagだけ इस्तेमाल किए गए pure HTML video से Bad Apple video implement किया गया- data को file में hardcode किए बिना, CSS या JavaScript के बिना interactive single-page application भी implement किया गया
- image generation के लिए
merge.cC code इस्तेमाल किया गया
1 टिप्पणियां
Hacker News की राय
Adam7 इंटरलेस PNG के साथ बहुत मिलता-जुलता काम किया था: https://www.da.vidbuchanan.co.uk/adamation/image.png
प्लेबैक आखिरकार नेटवर्क latency पर निर्भर करता है, लेकिन मैंने सर्वर को इस तरह सेट किया था कि वह हर फ्रेम को तय अंतराल पर अलग-अलग भेजे। फ्रेम छोटे हैं, इसलिए अगर नेटवर्क असामान्य रूप से धीमा न हो तो सर्वर ही तय करता है कि प्लेबैक कब होगा
Refreshसेट करके क्लाइंट से समय-समय पर नया animation frame मंगवा सकते हैं[1]। 2013 के IOCCC entry में भी इसी तकनीक से PNG में render की गई घड़ी लगातार अपडेट होती रहती है[2][1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/...
[2] https://www.ioccc.org/2013/mills/index.html
अगली पंक्ति में
Refreshheader उल्टा encode किया गया है: https://github.com/ioccc-src/winner/blob/619f554bbdb19e5003a...यह cursed technique है, लेकिन यहीं पर फिट बैठती है
सोच रहा हूँ कि क्या इस तकनीक से डेटा को सामने छिपाने वाली steganography संभव है। ज़्यादातर automated image analysis programs शायद सिर्फ आखिरी image को जांचें, इसलिए छात्र इसका इस्तेमाल स्कूल के content filter को bypass करने में कर सकते हैं
शायद इसे उसी network पर parallel में load होने वाली चीज़ों के progress bar की तरह इस्तेमाल किया जा सकता है, ताकि user अंदाज़ा लगा सके कि कितनी latency बाकी है
अगर web server चलते-चलते “JPEG” बनाकर उसे समय-अंतराल वाले टुकड़ों में client को भेजे, तो प्लेबैक timing को कुछ हद तक नियंत्रित किया जा सकता है। अगर source webcam हो, तो एक अंतहीन “JPEG” भी संभव है
multipart/x-mixed-replaceनाम की MIME तकनीक से यह करती हैं। इसमें server क्लाइंट को बताता है कि अभी भेजे गए data को नए data से replace कर दो, और यह JavaScript के बिना सिर्फ सामान्य HTTP और JPEG से काम करता हैService Worker से slow connection का नाटक करके प्लेबैक speed नियंत्रित की जा सकती है
अलग-अलग environments में इसका अलग व्यवहार अजीब है। desktop Firefox में यह सही चलता है, लेकिन iOS mobile पर “JPEG के अंदर पूरा वीडियो” लगभग एकरंगी भूरे→नारंगी→लाल 3 फ्रेम और धुंधली बिल्ली की बस रूपरेखा जैसा दिखता है
रंग हर फ्रेम में बदलते हैं, इसलिए पता चलता है कि यह काम कर रहा है, लेकिन इसे वीडियो कहना मुश्किल है। desktop पर यह सच में वीडियो जैसा चलता है, जो चौंकाने वाला था, और लगता है कि यह iOS image decoder की कोई अजीब boundary condition छू रहा है
हाल ही में OpenGL और jpeg-turbo के साथ images को तेज़ी से दिखाने पर काम किया, और JPEG का progressive mode चालू करने पर decoding काफ़ी धीमी हो गई। progressive JPEG अच्छा होता है वाली पुरानी सलाह अब शायद वैध नहीं रही
दशकों से images को चरणबद्ध तरीके से साफ़ होते हुए लगभग देखा ही नहीं, इसलिए इसकी व्यावहारिक value भी कम लगती है
उदाहरण: https://youtube.com/watch?v=UphN1_7nP8U
पहले तो मैंने यह सोचा कि पहली image के “गलत” coefficients से high-frequency coefficients को मुश्किल तरीके से निकाला जाए, लेकिन दो images को बस जोड़ देने वाला तरीका काफ़ी चतुर है। एक image के low-frequency components के बाद दूसरी image के high-frequency components जोड़ देने भर से यह हैरान करने वाली हद तक अच्छा काम करता है
सोच रहा हूँ कि क्या camera से भी low-frequency components सीधे लिए जा सकते हैं। MRI का तरीका भी याद आता है, जहाँ k-space में low frequency पहले ली जाती है