72 : m_width(src->m_width),
73 m_height(src->m_height),
74 m_pixFmt(src->m_pixFmt),
75 m_rectOnScreen(src->GetScreenRect()),
77 m_numPlanes(src->m_numPlanes),
78 m_numObjects(src->m_numObjects)
94 void *src_buffer = NULL;
95 void *dst_buffer = NULL;
101 dst_buffer = malloc(src->
m_size[
object]);
102 src_buffer = mmap(NULL, src->
m_size[
object], PROT_READ, MAP_SHARED, src->
m_dmaBufHandle[
object], 0);
103 if (src_buffer == MAP_FAILED) {
104 LOGERROR(
"drmbuffer: %s (clone): cannot map buffer size %d prime_fd %d (%d): %m",
109 LOGDEBUG2(
L_GRAB,
"drmbuffer: %s (clone): Copy %p to %p", __FUNCTION__, src_buffer, dst_buffer);
110 memcpy(dst_buffer, src_buffer, src->
m_size[
object]);
111 munmap(src_buffer, src->
m_size[
object]);
112 for (
int plane = 0; plane <
m_numPlanes; plane++) {
114 m_pPlane[plane] = (uint8_t *)dst_buffer;
115 LOGDEBUG2(
L_GRAB,
"drmbuffer: %s (clone): plane[%d] gets %p (object %d)", __FUNCTION__, plane, dst_buffer,
object);
120 for (
int plane = 0; plane <
m_numPlanes; plane++) {
121 dst_buffer = malloc(
m_size[plane]);
123 m_pPlane[plane] = (uint8_t *)dst_buffer;
127 for (
int plane = 0; plane <
m_numPlanes; plane++) {
128 LOGDEBUG2(
L_GRAB,
"drmbuffer: %s (clone): Cloned plane %d address %p pitch %d offset %d handle %d size %d",
243 { DRM_FORMAT_NV12,
"NV12", 2, { { 8, 1, 1 }, { 16, 2, 2 } }, },
244 { DRM_FORMAT_YUV420,
"YU12", 3, { { 8, 1, 1 }, { 8, 2, 2 }, {8, 2, 2 } }, },
245 { DRM_FORMAT_ARGB8888,
"AR24", 1, { { 32, 1, 1 } }, },
275void cDrmBuffer::Setup(
int drmDeviceFd, uint32_t width, uint32_t height, uint32_t pixFmt, AVDRMFrameDescriptor *primedata,
bool closeHandleOnDestroy)
277 uint64_t modifier[4] = { 0, 0, 0, 0 };
278 uint32_t mod_flags = 0;
292 if (!primedata->nb_objects)
293 LOGFATAL(
"drmbuffer: %s: No primedata objects available!", __FUNCTION__);
295 AVDRMLayerDescriptor *layer = &primedata->layers[0];
305 for (
int object = 0;
object < primedata->nb_objects;
object++) {
306 if (drmPrimeFDToHandle(drmDeviceFd, primedata->objects[
object].fd, &
m_objectPrimeHandle[
object])) {
307 LOGFATAL(
"drmbuffer: %s: PRIMEDATA Failed to retrieve the Prime Handle %i size %zu (%d): %m", __FUNCTION__,
308 primedata->objects[
object].fd,
309 primedata->objects[
object].size, errno);
313 m_size[object] = primedata->objects[object].size;
320 for (
int plane = 0; plane < layer->nb_planes; plane++) {
321 int object = layer->planes[plane].object_index;
325 m_pitch[plane] = layer->planes[plane].pitch;
326 m_offset[plane] = layer->planes[plane].offset;
328 if (primedata->objects[
object].format_modifier)
329 modifier[plane] = primedata->objects[object].format_modifier;
335 if (modifier[0] && modifier[0] != DRM_FORMAT_MOD_INVALID)
336 mod_flags = DRM_MODE_FB_MODIFIERS;
340 LOGFATAL(
"drmbuffer: %s: No suitable format found!", __FUNCTION__);
350 struct drm_mode_create_dumb creq;
353 creq.bpp = plane_info->
bitspp;
359 if (drmIoctl(drmDeviceFd, DRM_IOCTL_MODE_CREATE_DUMB, &creq) < 0)
360 LOGFATAL(
"drmbuffer: %s: cannot create dumb buffer %dx%d@%d (%d): %m", __FUNCTION__,
361 creq.width, creq.height, creq.bpp, errno);
365 m_size[plane] = creq.size;
367 struct drm_mode_map_dumb mreq;
368 memset(&mreq, 0,
sizeof(
struct drm_mode_map_dumb));
371 if (drmIoctl(drmDeviceFd, DRM_IOCTL_MODE_MAP_DUMB, &mreq))
372 LOGFATAL(
"drmbuffer: %s: cannot prepare dumb buffer for mapping (%d): %m", __FUNCTION__, errno);
374 m_pPlane[plane] = (uint8_t *)mmap(0, creq.size, PROT_READ | PROT_WRITE, MAP_SHARED, drmDeviceFd, mreq.offset);
377 LOGFATAL(
"drmbuffer: %s: cannot map dumb buffer (%d): %m", __FUNCTION__, errno);
391 LOGERROR(
"drmbuffer: %s: cannot create modifiers framebuffer (%d): %m", __FUNCTION__, errno);
398 LOGFATAL(
"drmbuffer: %s: cannot create framebuffer (%d): %m", __FUNCTION__, errno);
400 LOGDEBUG2(
L_DRM,
"drmbuffer: %s: Added %sFB fb_id %d width %d height %d pix_fmt %4.4s", __FUNCTION__,