2012-01-05 14 views
6

मैंने जेपीईजी डिकोडर बनाया, लेकिन मैंने पुनरारंभ मार्कर तर्क को लागू नहीं किया। यही कारण है कि मेरा प्रोग्राम कुछ छवियों पर काम नहीं करता है (उदाहरण के लिए फ़ोटोशॉप के साथ सहेजी गई छवियां: फ़ाइल-> सहेजें-- jpeg)। मैं पुनरारंभ मार्कर तर्क को कार्यान्वित करना चाहता हूं, लेकिन कोई विस्तृत ऑनलाइन स्पष्टीकरण नहीं है कि मार्कर तर्क कैसे पुनरारंभ करता है। कृपया मुझे मार्कर को पुनरारंभ करने के बारे में और बताएं, या मुझे ऑनलाइन संसाधन सुझाएं जहां मैं इसके बारे में अधिक पढ़ सकता हूं। धन्यवाद!जेपीईजी मार्कर

उत्तर

13

पुनरारंभ मार्कर काफी सरल हैं। उन्हें एक त्रुटि के बाद पुन: सिंक्रनाइज़ेशन की अनुमति देने के लिए डिज़ाइन किया गया था। चूंकि अधिकांश जेपीईजी छवियां त्रुटि मुक्त चैनलों पर प्रसारित होती हैं, इसलिए उन्हें शायद ही कभी आवश्यकता होती है। एक पुनरारंभ अंतराल को एफएफडीडी मार्कर के साथ 2-बाइट संख्या के रूप में परिभाषित किया जाता है। यह बताता है कि मार्करों को पुनरारंभ करने के बीच कितने एमसीयू हैं। जब आप पुनरारंभ मार्कर (एफएफडी 0-एफएफडी 7) का सामना करते हैं, तो डीसी मान (वाई, सीआर, सीबी) को 0 पर रीसेट करें और बिटस्ट्रीम बाइट सीमा (एफएफडीएक्स के बाद) पर शुरू हो गया है। जब आप छवि को डीकोड करते हैं तो यह अंतराल को फिर से शुरू करने के माध्यम से गिनने का मामला है। पुनरारंभ मार्कर मान FFD0 से FFD7 तक बढ़ेगा और फिर FFD0 पर फिर से शुरू होगा। मार्कर मान स्वयं बहुत महत्वपूर्ण नहीं है, लेकिन यह इंगित कर सकता है कि डेटा के बड़े हिस्से गुम हैं या नहीं। यहां एक उदाहरण दिया गया है कि मैं इसे अपने डिकोडर में कैसे करता हूं। मैंने अपने बिटस्ट्रीम रीडर में पुनरारंभ मार्करों को फेंक दिया।

iRestartCount = iRestartInterval; 
for (y=0; y<Height_in_MCUs; y++) 
    { 
    for (x=0; x<Width_in_MCUs; x++) 
     { 
     <decode an MCU> 
     if (iRestartInterval) // if there is a restart interval defined 
      { 
      if (--iRestartCount == 0) 
      { 
      iRestartCount = iRestartInterval; // reset restart inverval counter 
      iDCPred0 = iDCPred1 = iDCPred2 = 0; // reset DC predictors 
      if (*iBit & 7) // adjust bitstream to start on the next byte boundary 
       { 
       *iBit += (8 - (*iBit & 7)); 
       } 
      } // if restart interval expired 
      } // if restart interval defined 
     } // for x 
    } // for y 

अद्यतन: पुनः प्रारंभ मार्कर अब एक नया उद्देश्य पूरा - बहु लड़ी जेपीईजी एनकोडर और डिकोडर अनुमति देने के लिए। चूंकि एमसीयू के प्रत्येक "स्ट्रिप" में प्रत्येक डीसी मानों को प्रत्येक पुनरारंभ अंतराल की शुरुआत में रीसेट किया जाता है और बाइट सीमा पर शुरू होता है, इसलिए प्रत्येक पुनरारंभ अंतराल को अलग-अलग थ्रेड द्वारा स्वतंत्र रूप से एन्कोड या डीकोड किया जा सकता है। एक एन्कोडर अब मनमाने ढंग से कार्य को एन थ्रेड में विभाजित कर सकता है और फिर मार्कर को पुनरारंभ करने के साथ डेटा को 'गोंद' कर सकता है। डिकोडर्स के लिए, यह इतना आसान नहीं है। यदि पुनरारंभ मार्कर मौजूद हैं, तो प्रत्येक अंतराल को एक अलग धागे को सौंपा जा सकता है। यदि मौजूद नहीं है, तो आप नौकरी को कई धागे में विभाजित करने के लिए अभी भी कुछ पूर्व-डिकोडिंग चाल कर सकते हैं।

+0

कृपया आप मुझे और अधिक कार्यान्वयन विवरण और तर्क बता सकते हैं? – MrD

+0

क्या होगा यदि यह interleaving के साथ एक बहु घटक छवि है? – adikshit

+0

@adikshit - जहां तक ​​मैंने देखा है, पुनरारंभ अंतराल एमसीयू (न्यूनतम कोडित इकाइयों) को संदर्भित करता है चाहे कॉन्फ़िगरेशन क्या हो। 3-घटक रंग छवि (वाई/सीबी/सीआर) के लिए, पुनरारंभ अंतराल 3 डीसीटी ब्लॉक के समूहों को संदर्भित करता है। उदाहरण के लिए, 100 का अंतराल 300 डीसीटी ब्लॉक (100 एमसीयू) का मतलब होगा। – BitBank

संबंधित मुद्दे