DMABUF рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ OpenGLESv2 рдмрдирд╛рд╡рдЯ рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░рдирд╛


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ DMABUF рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ OpenGLES рдмрдирд╛рд╡рдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдореИрдВрдиреЗ рд╣реИрдмрд░ рдореЗрдВ рджреЗрдЦрд╛ рдФрд░ рдореЗрд░реЗ рдЖрд╢реНрдЪрд░реНрдп рдХреЛ, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рднреА рд▓реЗрдЦ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд╣рдмреНрд░ Q & A рдореЗрдВ рднреА рдЗрд╕рдХрд╛ рдХреБрдЫ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ред рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реИред рддрдХрдиреАрдХ рдХрд╛рдлреА рд╕рдордп рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджреА рдереА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдм рдЕрд╕реНрдкрд╖реНрдЯ рдФрд░ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХреЛ рдКрдкрд░ рдХреЗ рдбреЗрдореЛ рдкрд░ рд▓рд┐рдЦ рдкрд╛рдКрдВ, рдореИрдВрдиреЗ рдпрд╣ рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдереЛрдбрд╝реА-рдереЛрдбрд╝реА рдХрд░рдХреЗ рдПрдХрддреНрд░ рдХреАред рдпрд╣рд╛рдБ, рдбреЗрдореЛ рдкрд░, рдореЗрд░реЗ рд╕реНрд╡-рдирд┐рд░реНрдорд┐рдд рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░, рдЬреЛ рдХрд┐ gstreamer рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд░ рдмрд╛рд░ OpenGLESv2 рдЯреЗрдХреНрд╕рдЪрд░ рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рд░рд╛рд╕реНрдкрдмреЗрд░реА Pi4 рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рддред рдлрд╝реНрд░реЗрдо рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдФрд░ рдбреАрдПрдордП рдЙрдиреНрд╣реЗрдВ рдЬреАрдкреАрдпреВ рдореЗрдореЛрд░реА рдореЗрдВ рдЯреЗрдХреНрд╕рдЪрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдЧреЗ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ред

рдЖрдорддреМрд░ рдкрд░, OpenGLESv2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдПрдХ рдмрдирд╛рд╡рдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрдгреЛрдВ рдХреА рд╡реЗрд╢рднреВрд╖рд╛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдмрджрд▓рддреА рд╣реИ рдФрд░ рдХрднреА-рдХрднреА glTexSubImage2D () рдХреЗ рд╕рд╛рде рдмрдирд╛рд╡рдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛рдПрдВ рддрдм рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдмрдирд╛рд╡рдЯ рдЧрддрд┐рд╢реАрд▓ рд╣реЛрддреА рд╣реИ, рдЬрдм рдЖрдкрдХреЛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд▓рдЧрднрдЧ рд╣рд░ рдлреНрд░реЗрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред GlTexSubImage2D () рдлрд╝рдВрдХреНрд╢рди рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИред рдареАрдХ рд╣реИ, рдХрд┐рддрдирд╛ рдзреАрдорд╛ - рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рдХрдВрдкреНрдпреВрдЯрд░ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдЬреИрд╕реЗ рдХрдордЬреЛрд░ рдПрдХрд▓-рдмреЛрд░реНрдб рдХрд╛рд░реНрдб рдкрд░ рднреА рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред

SoC рд╕рд┐рдВрдЧрд▓-рдмреЛрд░реНрдб рд╡рд╛рд▓реЗ рд╕рд╣рд┐рдд рдХрдИ рдЖрдзреБрдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдРрд╕реА рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдореЛрд░реА GPU рдореЗрдореЛрд░реА рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЛрдВ рдХреА GPU рдореЗрдореЛрд░реА рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рд╣реА glTexSubImage2D () рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдХрд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ рдХрд┐ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкрд┐рдХреНрд╕рд▓реНрд╕ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕рдЪ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ред

рддреЛ DMABUF рддрдХрдиреАрдХ рдореБрдЭреЗ рдХреНрдпрд╛ рджреЗрддреА рд╣реИ? рдореЗрдореЛрд░реА рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб рд╕реЗ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд╡рд▓ рдкрд┐рдХреНрд╕реЗрд▓ рд▓рд┐рдЦ рд╕рдХрддреА рд╣реИ рдЬрдм рднреА рд╡рд╣ рдЪрд╛рд╣реЗред рдбреАрдПрдордП рд╕реНрд╡рдпрдВ рдЬреАрдкреАрдпреВ рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрдирд╛рд╡рдЯ рдореЗрдВ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛ред рд╕реБрдВрджрд░ рд╣реИ рдХрд┐ рдирд╣реАрдВ?

рдореБрдЭреЗ рддреБрд░рдВрдд рдпрд╣ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореБрдЭреЗ PBO рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ - Pixel Buffer Object, рдЖрдорддреМрд░ рдкрд░ PBO рдХреА рдорджрдж рд╕реЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЯреЗрдХреНрд╕рдЪрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, DMA рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╣рд╛рдБ рднреА рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди PBO рдХреЗрд╡рд▓ OpenGLESv3 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдФрд░ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рдирд╣реАрдВред рддреЛ рдирд╣реАрдВ - рдЕрдлрд╕реЛрд╕, рдпрд╣ рдореЗрд░рд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рд▓реЗрдЦ рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдФрд░ рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░ рдФрд░ рд╢рд╛рдпрдж рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд░реБрдЪрд┐ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдУрдкрдирдЬреАрдПрд▓рдИрдПрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдбреАрдПрдордПрдмреАрдпреВрдПрдл рддрдХрдиреАрдХ рднреА рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред NDK)ред

рдореИрдВ рдПрдХ рд░рд╛рд╕реНрдкрдмреЗрд░реА Pi4 рдкрд░ DMABUF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦреВрдВрдЧрд╛ред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ ubuntu рдХреЗ рддрд╣рдд рд╕рд╛рдзрд╛рд░рдг рдЗрдВрдЯреЗрд▓ x86 / x86_64 рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ рд╣реЛрдЧрд╛)ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА OpenGLESv2 API рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдирд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдЪреБрдиреМрддрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реЛрдВрдЧреАред рдЕрдзрд┐рдХрддрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ioctl рдХрд╛ рдЬрд╛рджреВ рд╣реЛрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рдПрдкреАрдЖрдИ DMABUF рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдИрдЬреАрдПрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╕реВрдЪреА рджреЗрдЦреЗрдВ:

char* EglExtString = (char*)eglQueryString( esContext->eglDisplay, EGL_EXTENSIONS ); if( strstr( EglExtString, "EGL_EXT_image_dma_buf_import") ) { cout << "DMA_BUF feature must be supported!!!\n"; } 

рдЗрд╕рд▓рд┐рдП рд╣рдо рддреБрд░рдВрдд рд╕рдордЭ рдЬрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ DMABUF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ рдпрд╛ рдХреЛрдИ рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд╛рд╕реНрдкрдмреЗрд░реА Pi3 рдФрд░ рд╕рднреА рдкрд┐рдЫрд▓реЗ рдмреЛрд░реНрдбреЛрдВ рдкрд░ рдХреЛрдИ рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред рдмреАрдЖрд░рд╕реАрдПрдо рдмреНрд░реЛрдЪ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдУрдкрдирдЬреАрдПрд▓рдИрдПрд╕ 2 рднреА рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдиреАрдЪреЗ рдЫреАрди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЕрдм рд░рд╛рд╕реНрдкрдмреЗрд░реА Pi4 рдкрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ OpenGLES рд╣реИ, рд╡рд┐рд╕реНрддрд╛рд░ EGL_EXT_image_dma_buf_import рд╣реИ, рд╣реБрд░реНрд░реЗред

рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХрд▓-рдмреЛрд░реНрдб Pi4 рдкрд░ рдореМрдЬреВрдж OS рдХреНрдпрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:

 pi@raspberrypi:~ $ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 10 (buster) Release: 10 Codename: buster pi@raspberrypi:~ $ uname -a Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux 

рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ EGL_EXT_image_dma_buf_import рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдСрд░реЗрдВрдЬ рдкрд╛рдИ рдкреАрд╕реА (рдорд╛рд▓реА -400) / рдкреАрд╕реА 2 (рдорд╛рд▓реА -450) рдкрд░ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЗрди рдмреЛрд░реНрдбреЛрдВ рдкрд░ рдорд╛рд▓реА рдЬреАрдкреАрдпреВ рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ (рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрд░реНрдордмрд┐рдпрди рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдореИрдВрдиреЗ рдЦреБрдж рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ) рдХрд░реНрдиреЗрд▓ рдбреНрд░рд╛рдЗрд╡рд░ рдЕрд╕реЗрдВрдмрд▓реА)ред рдпрд╛рдиреА DMABUF рд▓рдЧрднрдЧ рд╣рд░ рдЬрдЧрд╣ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд▓реЗрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ / dev / dri / card0 рдпрд╛ / dev / dri / card1 рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ, рдпрд╣ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЖрдкрдХреЛ DRM_CAP_DUMB_BFFFF рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 int OpenDrm() { int fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); if( fd < 0 ) { cout << "cannot open /dev/dri/card0\n"; return -1; } uint64_t hasDumb = 0; if( drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &hasDumb) < 0 ) { close( fd ); cout << "/dev/dri/card0 has no support for DUMB_BUFFER\n"; //maybe Raspberry Pi4 or other platform fd = open("/dev/dri/card1", O_RDWR | O_CLOEXEC); if( fd < 0 ) { cout << "cannot open /dev/dri/card1\n"; return -1; } hasDumb = 0; if( drmGetCap(fd, DRM_CAP_DUMB_BUFFER, &hasDumb) < 0 ) { close( fd ); cout << "/dev/dri/card1 has no support for DUMB_BUFFER\n"; return -1; } } if( !hasDumb ) { close( fd ); cout << "no support for DUMB_BUFFER\n"; return -1; } //Get DRM authorization drm_magic_t magic; if( drmGetMagic(fd, &magic) ) { cout << "no DRM magic\n"; close( fd ); return -1; } Window root = DefaultRootWindow( x_display ); if( !DRI2Authenticate( x_display, root, magic ) ) { close( fd ); cout << "Failed DRI2Authenticate\n"; return -1; } cout << "DRM fd "<< fd <<"\n"; return fd; } 

рдпрд╣рд╛рдБ рд╡реИрд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдХрдердиреАрдп рд╕реВрдХреНрд╖реНрдорддрд╛ рд╣реИред рдХреБрдЫ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ DRI2Authenticate () рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рджрд░рд╛рд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдСрд░реЗрдВрдЬ рдкрд╛рдИ рдкреАрд╕реА рдХреЗ рд▓рд┐рдП 32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реИред рдпрд╣ рд╕рдм рдХреБрдЫ рдЕрдЬреАрдм рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ GITHUB: github.com/robclark/libdri2 рдкрд░ рдРрд╕реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдорд┐рд▓реА, рдЗрд╕реЗ рд▓рд┐рдпрд╛, рдЗрдХрдЯреНрдард╛ рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рдпрд╣ рдЕрдЬреАрдм рд╣реИ рдХрд┐ рд▓реИрдкрдЯреЙрдк рдкрд░ рдореЗрд░реЗ рдЙрдмрдВрдЯреВ 18 (64 рдмрд┐рдЯ) рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ / dev / dri / cardX рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ KHR (рдЦреНрд░реЛрдиреЛрдВ) рдХреЗ рддреАрди рдмрд╣реБрдд рд╣реА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 PFNEGLCREATEIMAGEKHRPROC funcEglCreateImageKHR = nullptr; PFNEGLDESTROYIMAGEKHRPROC funcEglDestroyImageKHR = nullptr; PFNGLEGLIMAGETARGETTEXTURE2DOESPROC funcGlEGLImageTargetTexture2DOES = nullptr; ... funcEglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC) eglGetProcAddress("eglCreateImageKHR"); funcEglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC) eglGetProcAddress("eglDestroyImageKHR"); funcGlEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress("glEGLImageTargetTexture2DOES"); if( funcEglCreateImageKHR && funcEglDestroyImageKHR && funcGlEGLImageTargetTexture2DOES ) { cout << "DMA_BUF feature supported!!!\n"; } else { CloseDrm(); } 

рдЕрдм рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ DMABUF рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрд┐рдЯрдореИрдк рдЪреМрдбрд╝рд╛рдИ, рдКрдБрдЪрд╛рдИ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ DmaFd рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╣реИрдВрдбрд▓рд░ рдФрд░ рдкреНрд▓реЗрди рдмрд┐рдЯрдореИрдк рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 nt CreateDmaBuf( int Width, int Height, int* DmaFd, void** Plane ) { int dmaFd = *DmaFd = 0; void* pplane = *Plane = nullptr; // Create dumb buffer drm_mode_create_dumb buffer = { 0 }; buffer.width = Width; buffer.height = Height; buffer.handle = 0; buffer.bpp = 32; //Bits per pixel buffer.flags = 0; int ret = drmIoctl( DriCardFd, DRM_IOCTL_MODE_CREATE_DUMB, &buffer); cout << "DRM_IOCTL_MODE_CREATE_DUMB " << buffer.handle << " " << ret << "\n"; if (ret < 0) { cout << "Error cannot DRM_IOCTL_MODE_CREATE_DUMB\n"; return -1; } // Get the dmabuf for the buffer drm_prime_handle prime; memset(&prime, 0, sizeof prime); prime.handle = buffer.handle; prime.flags = /*DRM_CLOEXEC |*/ DRM_RDWR; ret = drmIoctl( DriCardFd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &prime); if (ret < 0) { cout << "Error cannot DRM_IOCTL_PRIME_HANDLE_TO_FD " << errno << " " << ret <<"\n"; return -1; } dmaFd = prime.fd; // Map the buffer to userspace int Bpp = 32; pplane = mmap(NULL, Width*Height*Bpp/8, PROT_READ | PROT_WRITE, MAP_SHARED, dmaFd, 0); if( pplane == MAP_FAILED ) { cout << "Error cannot mmap\n"; return -1; } //return valid values *DmaFd = dmaFd; *Plane = pplane; cout << "DMABUF created "<< dmaFd << " " << (void*)Plane <<"\n"; return 0; } 

рдЕрдм рд╣рдореЗрдВ DmaFd рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдЬреБрдбрд╝реА рдПрдХ EGL рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 int CreateDmaBufferImage( ESContext* esContext, int Width, int Height, int* DmaFd, void** Plane, EGLImageKHR* Image ) { int dmaFd = 0; void* planePtr = nullptr; int Bpp = 32; int ret0 = CreateDmaBuf( Width, Height, &dmaFd, &planePtr ); if( ret0<0 ) return -1; EGLint img_attrs[] = { EGL_WIDTH, Width, EGL_HEIGHT, Height, EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ABGR8888, EGL_DMA_BUF_PLANE0_FD_EXT, dmaFd, EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, EGL_DMA_BUF_PLANE0_PITCH_EXT, Width * Bpp / 8, EGL_NONE }; EGLImageKHR image = funcEglCreateImageKHR( esContext->eglDisplay, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, 0, &img_attrs[0] ); *Plane = planePtr; *DmaFd = dmaFd; *Image = image; cout << "DMA_BUF pointer " << (void*)planePtr << "\n"; cout << "DMA_BUF fd " << (int)dmaFd << "\n"; cout << "EGLImageKHR " << image << "\n"; return 0; } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд░рд┐рдгрд╛рдо рд▓рдЧрднрдЧ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдП рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдИрдЬреАрдПрд▓ рдЫрд╡рд┐ рдФрд░ рдУрдкрдирдЬреАрдПрд▓рдИрдПрд╕ 2 рдЫрд╡рд┐ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡рд╣рд╛рдВ рдЖрдк рдмрд╕ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рдереНрд░реЗрдб рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдордп рдХреЗ рд╕рд╛рде рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбреАрдПрдордПрдмреАрдпреВрдПрдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреАрдкреАрдпреВ рдмрдирд╛рд╡рдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред

 void* CreateVideoTexture( ESContext* esContext, int Width, int Height ) { CreateDmaBufferImage( esContext, Width, Height, &esContext->DmaFd, &esContext->Plane, &esContext->ImageKHR ); GLuint texId; glGenTextures ( 1, &texId ); glBindTexture ( GL_TEXTURE_2D, texId ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); funcGlEGLImageTargetTexture2DOES(GL_TEXTURE_2D, esContext->ImageKHR ); checkGlError( __LINE__ ); UserData *userData = (UserData*)esContext->userData; userData->textureV = texId; userData->textureV_ready = true; return esContext->Plane; } 

GlEGLImageTargetTexture2DOES (..) рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдпрд╣ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рд╡рдЯ рдЖрдИрдбреА рдирд┐рд░реНрдорд╛рдг glGenTextures (..) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП esContext-> ImageKHR EGL рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдмрдирд╛рд╡рдЯ userData-> рдмрдирд╛рд╡рдЯ V рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдпрдорд┐рдд рд╢реЗрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рд╕реВрдЪрдХ esContext-> рд╡рд┐рдорд╛рди рд╕реНрдореГрддрд┐ рдореЗрдВ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдмрдирд╛рд╡рдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ рдЬреЛ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ:

 GstFlowReturn on_new_sample( GstAppSink *pAppsink, gpointer pParam ) { GstFlowReturn ret = GST_FLOW_OK; GstSample *Sample = gst_app_sink_pull_sample(pAppsink); if( Sample ) { if( VideoWidth==0 || VideoHeight==0 ) { GstCaps* caps = gst_sample_get_caps( Sample ); GstStructure* structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &VideoWidth); gst_structure_get_int (structure, "height", &VideoHeight); cout << "Stream Resolution " << VideoWidth << " " << VideoHeight << "\n"; } GstBuffer *Buffer = gst_sample_get_buffer( Sample ); if( Buffer ) { GstMapInfo MapInfo; memset(&MapInfo, 0, sizeof(MapInfo)); gboolean Mapped = gst_buffer_map( Buffer, &MapInfo, GST_MAP_READ ); if( Mapped ) { if( dmabuf_ptr ) memcpy( dmabuf_ptr, MapInfo.data, MapInfo.size ); gst_buffer_unmap( Buffer, &MapInfo); frame_ready = true; update_cv.notify_one(); } } gst_sample_unref( Sample ); } return ret; } 

рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ рд╡реАрдбрд┐рдпреЛ рдлрд╝реНрд░реЗрдо рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдкрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди gstreamer рджреНрд╡рд╛рд░рд╛ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ gst_app_sink_pull_sample () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдореЗрдорд╕реАрдкреА () рд╣реИ, рдЬреЛ рдлреНрд░реЗрдо рдХреЛ DMABUF рдореЗрдореЛрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдлрд╝реНрд░реЗрдо_рд░реЗрдб рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ std рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ :: condition_variable update_cv.notify_one (), рдЬреЛ рд╕реНрдЯреНрд░реАрдо рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЬрд╛рдЧ рдЧрдпрд╛ рд╣реИред

рд╢рд╛рдпрдж рдпрд╣реА рд╕рдм рд╣реИ ...

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдирд╣реАрдВ, рдореИрдВ рдЭреВрда рдмреЛрд▓ рд░рд╣рд╛ рд╣реВрдБред рдЕрднреА рднреА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдореБрджреНрджреЗ рд╣реИрдВред

рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдореЛрд░реА рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЗ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдХреИрд╢ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдЖрдпреЛрдЬрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдХреИрд╢ рдХреИрд╢ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рджреВрд╕рд░рд╛ - рдпрд╣ рдЬрд╛рдирдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдбреАрдПрдордП рдкрд╣рд▓реЗ рд╣реА рдХрд╛рдо рдХрд░ рдЪреБрдХрд╛ рд╣реИ рдФрд░ рдЖрдк рд░реЗрдВрдбрд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдЕрдЧрд░ рдкрд╣рд▓реЗ рдореИрдВ рдЕрднреА рднреА рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ - рдирд╣реАрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред

рдФрд░ рдПрдХ рдмрд╛рддред рдореИрдВ gstreamer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдРрдкрд▓рд┐рдВрдХ рдЬреЛрдбрд╝рд╛, рдЬреЛ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рд╕реЗ рдкрд┐рдХреНрд╕рд▓реНрд╕ рд▓реЗрддрд╛ рд╣реВрдВ рдФрд░ рдмрд╕ рдЙрдиреНрд╣реЗрдВ DMABUF рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдореЗрдордХреАрдкреА () рдХреЙрдкреА рдХрд░рддрд╛ рд╣реВрдВред рд░реЗрдВрдбрд░рд┐рдВрдЧ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рд╣реИ, рдореБрдЦреНрдп ()ред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкреНрд░рддрд┐ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╣рд░ рдХреЙрдкреА рдореЗрдВ рдмреБрд░рд╛рдИ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╢рдмреНрдж рд╢реВрдиреНрдп-рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рднреА рд╣реИред рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ gstreamer рдЦреБрдж рдХреЛ DMABUF рдореЗрдВ рддреБрд░рдВрдд рдлреНрд░реЗрдо рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдПрдХ рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рдореИрдВрдиреЗ gstreamer рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦрд╛ - рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ OpenGLESv2 рдмрдирд╛рд╡рдЯ рдореЗрдВ gstreamer рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢реВрдиреНрдп-рдХреЙрдкреА рдлрд╝реНрд░реЗрдо рдХреИрд╕реЗ рдмрдирд╛рдПрдВ - рд▓рд┐рдЦреЗрдВред

рд╢рд╛рдпрдж рдЖрдЦрд┐рд░реА рдмрд┐рдВрджреБ: рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореИрдВ 32-рдмрд┐рдЯ рдмрд┐рдЯрдореИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ рдХрд┐ Ystreamer рд╕реЗ YUV рд▓рд┐рдпрд╛ рдЬрд╛рдП, рддрдм рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдХрд╛ рдЖрдХрд╛рд░ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрд░реНрдХ рдЬрдЯрд┐рд▓ рд╣реИ - рдореБрдЭреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ Y, U, V. рдЦреИрд░, рддреАрди рд╢реЗрдпрд░реНрд╕ рдХреЗ рд▓рд┐рдП 3 DMABUF рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╢реИрдбрд░ рднреА рдЬрдЯрд┐рд▓ рд╣реИ, рдЖрдкрдХреЛ YUV рдХреЛ ARGB рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╕рд╣реА рдореЗрдВ shader

рдЖрдк рдкреВрд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЧрд┐рдердм рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рд╕рд╣реА рдХреЛрдб / рд╢реИрд▓реА рдХреЗ рдкреНрд░реЗрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ Google-рдЦрд╛рди-рдкреЗрд╕реНрдЯ рдХреА рдорджрдж рд╕реЗ рд▓рд╛рдкрд░рд╡рд╛рд╣реА рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред

Source: https://habr.com/ru/post/hi481540/


All Articles