2011-12-09 31 views
9

मैं ओपनजीएल ES और ffmpeg का उपयोग करके ऐप्पल टीवी के लिए मीडिया प्लेयर फ्रेमवर्क लिख रहा हूं। ओपनजीएल ईएस पर प्रतिपादन के लिए आरजीबीए में रूपांतरण की आवश्यकता है, swscale का उपयोग करके नरम कन्वर्ट असहनीय रूप से धीमा है, इसलिए इंटरनेट पर जानकारी का उपयोग करके मैं दो विचारों के साथ आया: नियॉन (जैसे here) या खंड टुकड़े और जीएल_LUMINANCE और GL_LUMINANCE_ALPHA का उपयोग कर।ऐप्पल ए 4 पर आरयूबीए के लिए यूयूवी, क्या मुझे शेडर्स या नीयन का उपयोग करना चाहिए?

मैं ओपन के बारे में लगभग कुछ भी नहीं जानते हैं, दूसरा विकल्प अभी भी काम नहीं करता है :)

आप मुझे किसी भी संकेत दिए गए देना कैसे आगे बढ़ना कर सकते हैं? अग्रिम धन्यवाद।

उत्तर

19

यह सबसे निश्चित रूप से सार्थक सीखने ओपन ES2.0 shaders है:

  1. आप लोड संतुलन कर सकते हैं GPU और सीपीयू (बाद के फ्रेम के जैसे वीडियो डिकोडिंग GPU वर्तमान फ्रेम renders जबकि) के बीच।
  2. वीडियो फ्रेम किसी भी मामले में GPU जाने की जरूरत: YCbCr का उपयोग कर आप 25% बस बैंडविड्थ की बचत होती है अगर आपके वीडियो 4 है: 2: 0 नमूना क्रोमिनेंस।
  3. आपको GPU हार्डवेयर इंटरपोलेटर के साथ, 4: 2: 0 क्रोमिनेंस अप-नमूनाकरण मुफ्त में मिलता है।
  4. iOS5 पर GPU को YCbCr बनावट धक्का (आपका शेडर ही शिखर एक ही क्षेत्र से अधिक क्रोमिनेंस बनावट सामान्य से अधिक समय दोनों Y और C{b,r} बनावट के लिए निर्देशांक, प्रभाव में उपयोग करने के लिए कॉन्फ़िगर किया जाना चाहिए।) तेजी से होता है (कोई डेटा कॉपी या swizzling) बनावट कैश के साथ (CVOpenGLESTextureCache* एपीआई कार्यों देखें)। आप NEON की तुलना में 1-2 डेटा-प्रतियां सहेज लेंगे।

मैं इन तकनीकों का शानदार प्रभाव in my super-fast iPhone camera app, SnappyCam पर उपयोग कर रहा हूं।

आप लागू करने के लिए सही रास्ते पर हैं: Y और GL_LUMINANCE_ALPHA के लिए एक GL_LUMINANCE बनावट का उपयोग करता है, तो अपने CbCr interleaved है। अन्यथाबनावट का उपयोग करें यदि आपके सभी YCbCr घटक noninterleaved हैं।

4 के लिए दो बनावट बनाना: 2: 0 द्वि-प्लानर YCbCr (जहां CbCr interleaved है) स्पष्ट है:

glBindTexture(GL_TEXTURE_2D, texture_y); 
    glTexImage2D(
     GL_TEXTURE_2D, 
     0, 
     GL_LUMINANCE,  // Texture format (8bit) 
     width, 
     height, 
     0,     // No border 
     GL_LUMINANCE,  // Source format (8bit) 
     GL_UNSIGNED_BYTE, // Source data format 
     NULL 
    ); 
    glBindTexture(GL_TEXTURE_2D, texture_cbcr); 
    glTexImage2D(
     GL_TEXTURE_2D, 
     0, 
     GL_LUMINANCE_ALPHA, // Texture format (16-bit) 
     width/2, 
     height/2, 
     0,     // No border 
     GL_LUMINANCE_ALPHA, // Source format (16-bits) 
     GL_UNSIGNED_BYTE, // Source data format 
     NULL 
    ); 

जहां तो glTexSubImage2D() या iOS5 बनावट कैश का प्रयोग करेंगे इन बनावट अद्यतन करने के लिए।

मैं 2 डी varying का उपयोग करने की भी सिफारिश करता हूं जो बनावट समन्वय अंतरिक्ष (x: [0,1], y: [0,1]) फैलाता है ताकि आप अपने टुकड़े टुकड़े में किसी भी निर्भर बनावट को पढ़ सकें। अंतिम परिणाम सुपर-फास्ट है और मेरे अनुभव में जीपीयू लोड नहीं करता है।

+0

आपको बहुत धन्यवाद, मैं वास्तव में आपके जैसा वर्णन किया गया था, लेकिन मैं आईओएस 5 में नई सुविधाओं के बारे में नहीं जानता था। इसे आजमाएं। – pawlowski

+0

आपके उत्तर के लिए धन्यवाद। आईओएस पर देशी डिकोड पिक्सेल प्रारूप के बारे में मैं और कहां से जान सकता हूं (आपकी पीटी # 2 के जवाब में)? – fionbio

0

परिवर्तित YUV नियोन का उपयोग कर आरजीबी के लिए बहुत धीमी है। जीपीयू पर ऑफलोड करने के लिए एक शेडर का प्रयोग करें।