2013-10-03 4 views
17

मैं ओपनमैक्स का उपयोग किए बिना रास्पबेरी पीआई सीधे पर वीडियो डिकोडिंग का एक उदाहरण ढूंढ रहा हूं।ओपनमैक्स का उपयोग किए बिना रास्पबेरी पीआई में वीडियो डीकोड करें?

यह मल्टीमीडिया सॉफ्टवेयर के विभिन्न परतों बताते हैं:

Raspberry Pi Architecture

एक अतिरिक्त परत जो यहां से दिखाई नहीं दे रहा है, "MMAL" परत है जो (मेरा मानना ​​है कि) OpenMAX के चारों ओर एक ब्रॉडकॉम आवरण नहीं है । (यदि नहीं, तो यह कर्नेल ड्राइवर के शीर्ष पर बैठे ओपनमैक्स विकल्प होगा) उदाहरण के लिए एमएमएएल का उपयोग करके रास्पिवल और रास्पिस्टिल लिखा गया है।

मुझे वीडियो डिकोड का एक उदाहरण चाहिए जहां इनपुट कच्चे H.264 है, और आउटपुट या तो स्क्रीन पर स्मृति या वीडियो में वीडियो है। मैं इसे को VCHIQ का उपयोग करके सीधे का उपयोग करना चाहता हूं, ओपनमैक्स का उपयोग नहीं कर रहा हूं। (मुख्य रूप से प्रदर्शन और परिवर्तनशीलता कारणों के लिए)

यह GitHub भंडार: https://github.com/raspberrypi/userland/ ऊपर दिखाए गए सब कुछ के लिए स्रोत (नारंगी और हरे रंग बॉक्स होता है; VCHIQ खुद के लिए स्रोत, VCHIQ, यह भी ओपन और EGL कार्यान्वयन के शीर्ष पर OpenMAX आईएल कार्यान्वयन, ...)। तो सिद्धांत में यह शुरू करने के लिए पर्याप्त होना चाहिए। समस्या यह है कि यह बेहद स्पष्ट नहीं है कि इसका उपयोग कैसे किया जाए, भले ही कोई ओपनमैक्स से और मल्टीमीडिया ढांचे के साथ सामान्य रूप से परिचित हो।

उदाहरण के लिए: vchiq_bulk_transmit() ऐसा प्रतीत होता है जो कोई डिकोडर को वीडियो भेजने के लिए उपयोग करेगा। लेकिन टाइप VCHIQ_SERVICE_HANDLE_T के पहले तर्क को कैसे प्रारंभ करें? परिणाम कहां जाते हैं, फ्रेमबफर में, या परिणामस्वरूप हैंडल, या ...?

संपादित इनाम या तो वीडियो डीकोड की एक काम उदाहरण उपलब्ध कराने के इस लिखने के लिए vchiq हैं, तो API पूर्वाभ्यास (यहां तक ​​कि किसी सक्रिय उदाहरण है) या पर्याप्त दस्तावेज़ के लिए सूचक है कि फोन करने के क्रम दर्शाती का उपयोग करके एकत्र किया जा सकता। एक कामकाजी उदाहरण एक भारी अतिरिक्त बक्षीस मिलेगा :)

+1

क्या ओपनमैक्स का उपयोग नहीं करने का कोई विशेष कारण है? – drahnr

+1

@drahnr: मुझे एक एपीआई चाहिए जिसमें मुझे अपना डीकोडेड डेटा तुरंत मिल जाए। ओपनमैक्स आईएल में बफर का एक गुच्छा है, उनके साथ कोई कार्यान्वयन क्या हो सकता है, इस पर कोई विशेष बाधा नहीं है, यह संभावित रूप से कई फ्रेम बफर कर सकता है और इसे नियंत्रित करने के लिए एपीआई में कोई रास्ता नहीं है। मैंने कार्यान्वयन देखा है जो डेटा लौटने में काफी धीमी है (थ्रुपुट अभी भी ऊंचा है, डेटा बस देरी हो रही है)। ... मुझे लगता है कि अगर कोई इसका जवाब देने के लिए एक शॉट चाहता था तो यह दिखाता है कि आरपीआई पर एक सेकंड के 1/60 वें से कम में ओपनमैक्स का उपयोग करके डीकोडेड फ्रेम कैसे प्राप्त करें, यह भी ठीक होगा :) –

+0

शायद यह नहीं है आप सुनना चाहते हैं, लेकिन एच 264 डिकोडर को कार्यान्वित करना बहुत चुनौतीपूर्ण है और मुझे एक ऐसी आत्मा नहीं पता है जो इसे मुफ्त में कोड करेगी (भले ही आपने 500 प्रतिनिधि बक्षीस रखा हो)। – karlphillip

उत्तर

2

मेरे पास एक कामकाजी उदाहरण नहीं है, लेकिन मेरे पास एक एपीआई walkthrough है। की क्रमबद्ध करें ..

Link to the full source code

मैं निम्नलिखित कार्यक्षमता प्रदर्शित कि आप कैसे फोन कर सकते हैं vchiq_bulk_transmit

int32_t vchi_bulk_queue_transmit(VCHI_SERVICE_HANDLE_T handle, 
    void *data_src, 
    uint32_t data_size, 
    VCHI_FLAGS_T flags, 
    void *bulk_handle) 
{ 
    SHIM_SERVICE_T *service = (SHIM_SERVICE_T *)handle; 
    .. 
    status = vchiq_bulk_transmit(service->handle, data_src, 
     data_size, bulk_handle, mode); 
    .. 
    return vchiq_status_to_vchi(status); 
} 
EXPORT_SYMBOL(vchi_bulk_queue_transmit); 

VCHI_SERVICE_HANDLE_T

int32_t vchi_service_create(VCHI_INSTANCE_T instance_handle, 
    SERVICE_CREATION_T *setup, 
    VCHI_SERVICE_HANDLE_T *handle) 
{ 
    VCHIQ_INSTANCE_T instance = (VCHIQ_INSTANCE_T)instance_handle; 
    SHIM_SERVICE_T *service = service_alloc(instance, setup); 

    *handle = (VCHI_SERVICE_HANDLE_T)service; 
    .. 
    return (service != NULL) ? 0 : -1; 
} 
EXPORT_SYMBOL(vchi_service_create); 

लेकिन तुम बनाने के लिए एक समारोह है पाया VCHI_INSTANCE_T की आवश्यकता है जिसे यहां प्रारंभ किया जा सकता है

int32_t vchi_initialise(VCHI_INSTANCE_T *instance_handle) 
{ 
    VCHIQ_INSTANCE_T instance; 
    VCHIQ_STATUS_T status; 

    status = vchiq_initialise(&instance); 

    *instance_handle = (VCHI_INSTANCE_T)instance; 

    return vchiq_status_to_vchi(status); 
} 
EXPORT_SYMBOL(vchi_initialise); 
0

मुझे लगता है कि ओपनमैक्स मल्टीमीडिया प्रसंस्करण में अधिक प्रदर्शन देता है। आप gstreamer के लिए सरल दो चल रहे संबंधित पाइपलाइनों के लिए इन दो विकल्पों के प्रदर्शन की तुलना कर सकते हैं। इस क्रिया के लिए प्रोग्रामिंग की आवश्यकता नहीं है और आप इस उद्देश्य के लिए जीएसटी-लॉन्च का उपयोग कर सकते हैं। Gstreamer के लिए ओपनमैक्स प्लगइन्स 'omx' उपसर्ग के साथ शुरू होता है। कोडिंग और डिकोडिंग ऑपरेशंस पूरी तरह से ओएमएक्स के साथ निष्पादित करते हैं जबकि मुख्य सीपीयू को कोई लोड नहीं मिलता है। एच 264 कोडिंग या डिकोडिंग के लिए मालिकाना कार्यान्वयन बहुत मुश्किल समस्या है और पुस्तकालयों का उपयोग किए बिना आप इन सालों से खर्च कर सकते हैं।

+0

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

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