[FFmpeg-devel] [PATCH v06 1/5] KMSGrab: getfb2 format_modifier if user doesnt specify
hanishkvc
hanishkvc at gmail.com
Sat Jul 4 16:17:13 EEST 2020
If user doesnt specify a format_modifier explicitly, then use GetFB2
to identify the format_modifier of the framebuffer being grabbed.
---
Changelog | 1 +
libavdevice/kmsgrab.c | 22 +++++++++++++++++++++-
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/Changelog b/Changelog
index a60e7d2eb8..3881587caa 100644
--- a/Changelog
+++ b/Changelog
@@ -2,6 +2,7 @@ Entries are sorted chronologically from oldest to youngest within each release,
releases are sorted from youngest to oldest.
version <next>:
+- kmsgrab GetFB2 format_modifier, if user doesnt specify
- AudioToolbox output device
- MacCaption demuxer
diff --git a/libavdevice/kmsgrab.c b/libavdevice/kmsgrab.c
index d0de774871..10ed707e60 100644
--- a/libavdevice/kmsgrab.c
+++ b/libavdevice/kmsgrab.c
@@ -239,6 +239,7 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx)
drmModePlaneRes *plane_res = NULL;
drmModePlane *plane = NULL;
drmModeFB *fb = NULL;
+ drmModeFB2 *fb2 = NULL;
AVStream *stream;
int err, i;
@@ -364,6 +365,23 @@ static av_cold int kmsgrab_read_header(AVFormatContext *avctx)
goto fail;
}
+ fb2 = drmModeGetFB2(ctx->hwctx->fd, plane->fb_id);
+ if (!fb2) {
+ err = errno;
+ av_log(avctx, AV_LOG_ERROR, "Failed to get "
+ "framebuffer2 %"PRIu32": %s.\n",
+ plane->fb_id, strerror(err));
+ err = AVERROR(err);
+ goto fail;
+ }
+
+ av_log(avctx, AV_LOG_INFO, "Template framebuffer2 is %"PRIu32": "
+ "%"PRIu32"x%"PRIu32", pixel_format: 0x%"PRIx32", format_modifier: 0x%"PRIx64".\n",
+ fb2->fb_id, fb2->width, fb2->height, fb2->pixel_format, fb2->modifier);
+
+ if (ctx->drm_format_modifier == DRM_FORMAT_MOD_INVALID)
+ ctx->drm_format_modifier = fb2->modifier;
+
stream = avformat_new_stream(avctx, NULL);
if (!stream) {
err = AVERROR(ENOMEM);
@@ -408,6 +426,8 @@ fail:
drmModeFreePlane(plane);
if (fb)
drmModeFreeFB(fb);
+ if (fb2)
+ drmModeFreeFB2(fb2);
return err;
}
@@ -433,7 +453,7 @@ static const AVOption options[] = {
{ .i64 = AV_PIX_FMT_BGR0 }, 0, UINT32_MAX, FLAGS },
{ "format_modifier", "DRM format modifier for framebuffer",
OFFSET(drm_format_modifier), AV_OPT_TYPE_INT64,
- { .i64 = DRM_FORMAT_MOD_NONE }, 0, INT64_MAX, FLAGS },
+ { .i64 = DRM_FORMAT_MOD_INVALID}, 0, INT64_MAX, FLAGS },
{ "crtc_id", "CRTC ID to define capture source",
OFFSET(source_crtc), AV_OPT_TYPE_INT64,
{ .i64 = 0 }, 0, UINT32_MAX, FLAGS },
--
2.25.1
More information about the ffmpeg-devel
mailing list