मैं बहु-कार्यक्रम यूडीपी एमपीईजी -2 टीएस धाराओं के साथ काम कर रहा हूं, -दुर्भाग्य से- यादृच्छिक अंतराल पर अपने प्राथमिक स्ट्रीम पीआईडी ​​​​को गतिशील रूप से फिर से मैप करें। Microsoft के MPEG-2 डिमल्टीप्लेक्सर फ़िल्टर का उपयोग करके स्ट्रीम को डीमक्स किया जा रहा है।

मैं पीएटी/पीएमटी परिवर्तनों पर प्रतिक्रिया करने के लिए पीएसआई-पार्सर फ़िल्टर (डायरेक्टशो बेस क्लास में शामिल एक उदाहरण फ़िल्टर) का उपयोग कर रहा हूं।

कोड परिवर्तन पर ठीक से प्रतिक्रिया कर रहा है, फिर भी मैं कुछ अजीब क्रैश (हीप मेमोरी भ्रष्टाचार) का अनुभव कर रहा हूं, जब मैं डेमक्सर पिन को उनकी नई आईडी में रीमैप करता हूं। (फिर से मैपिंग उस थ्रेड के अंदर की जाती है जो ग्राफ़ इवेंट को संसाधित कर रहा है, जबकि EC_PROGRAMCHANGED संदेश संसाधित किया जा रहा है)।

दुर्घटना मेरे हिस्से में दोषपूर्ण कोड के कारण हो सकती है, फिर भी मुझे कोई संदर्भ नहीं मिला है जो मुझे बताता है कि ग्राफ़ के चलने के दौरान पिन पीआईडी ​​मैपिंग बदलना सुरक्षित है या नहीं।

यदि यह संचालन सुरक्षित है, तो क्या कोई कुछ जानकारी प्रदान कर सकता है, और यदि ऐसा नहीं है, तो मैं कैप्चर व्यवधान को कम करने के लिए क्या कर सकता हूं?

0
BlueStrat 3 पद 2018, 22:56

1 उत्तर

सबसे बढ़िया उत्तर

मैं demuxer फ़िल्टर के Windows CE संस्करण के लिए स्रोत कोड खोजने में कामयाब रहा। इसका निरीक्षण करने पर, वास्तव में, ऐसा लगता है कि फ़िल्टर के चलने के दौरान पिन को फिर से मैप करना सुरक्षित है

मैं पीएसआई-पार्सर फ़िल्टर के साथ अपनी समस्याओं का स्रोत ढूंढने में भी कामयाब रहा।

जब एक नई ट्रांसपोर्ट स्ट्रीम का पता लगाया जाता है, या PAT संस्करण बदल जाता है, तो PAT फ़्लश हो जाता है, (सभी प्रोग्राम हटा दिए जाते हैं, तालिका को फिर से पार्स किया जाता है और फिर से पॉप्युलेट किया जाता है)। CPATProcessor::flush() पद्धति में एक सूक्ष्म बग है।

//
// flush
//
// flush an array of struct: m_mpeg2_program[];
// and unmap all PMT_PIDs pids, except one: PAT
BOOL CPATProcessor::flush()
{
    BOOL bResult = TRUE;
    bResult = m_pPrograms->free_programs();   // CPrograms::free_programs() call
    if(bResult == FALSE)
        return bResult;
    bResult = UnmapPmtPid();
    return bResult;
}// flush

यहाँ CPrograms::free_programs() कार्यान्वयन है।

_inline BOOL free_programs()
    {
        for(int i= 0; i<m_ProgramCount; i++){
            if(!HeapFree(GetProcessHeap(), 0, (LPVOID) m_programs[i] ))
                return FALSE;
        }
        return TRUE;
    }

यहाँ समस्या यह है कि m_ProgramCount सदस्य कभी साफ़ नहीं किया गया है। इसलिए, - फ्लश के बाद तालिका में प्रोग्रामों की गलत संख्या की रिपोर्ट करने के अलावा (चूंकि यह तालिका में पाए जाने वाले प्रत्येक प्रोग्राम के लिए क्रमिक रूप से अपडेट किया जाता है) -, अगली बार जब तालिका फ़्लश की जाती है, तो यह मेमोरी को रिलीज़ करने का प्रयास करेगी जो पहले ही जारी किया जा चुका था

यहाँ मेरा अद्यतन संस्करण है जो ढेर भ्रष्टाचार त्रुटियों को ठीक करता है:

_inline BOOL free_programs()
    {
        for(int i= 0; i<m_ProgramCount; i++){
            if(!HeapFree(GetProcessHeap(), 0, (LPVOID) m_programs[i] ))
                return FALSE;
        }
        m_ProgramCount = 0;  // This was missing,  next call will try to free memory twice
        return TRUE;
    }
0
BlueStrat 12 पद 2018, 18:27