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 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".