diff mbox series

[FFmpeg-devel,v06,1/5] KMSGrab: getfb2 format_modifier if user doesnt specify

Message ID 20200704131717.49428-2-hanishkvc@gmail.com
State Superseded
Headers show
Series KMSGrab, fbtile helpers, hwcontext_drm, hwdownload, fbdetilevf
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

hanishkvc July 4, 2020, 1:17 p.m. UTC
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(-)

Comments

Lynne July 4, 2020, 7:20 p.m. UTC | #1
Jul 4, 2020, 14:17 by hanishkvc@gmail.com:

> 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-request@ffmpeg.org>  with subject "unsubscribe".
>

This one looks fine to me, but Mark Thompson should check this one too.
hanishkvc July 5, 2020, 8:21 p.m. UTC | #2
Hi

Don't apply this patch, I will try and use ioctl directly instead of using
xf86's GetFB2.

Based on the reported compile issue with initialising global const for the
fbtile patch when using older versions of gcc, I was checking the same
using Ubuntu 16.04 setup, and realised that the older xf86drmMode.h in it
doesn't provide GetFB2.


On Sun, 5 Jul, 2020, 00:51 Lynne, <dev@lynne.ee> wrote:

> Jul 4, 2020, 14:17 by hanishkvc@gmail.com:
>
> > 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-request@ffmpeg.org>  with subject "unsubscribe".
> >
>
> This one looks fine to me, but Mark Thompson should check this one too.
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
diff mbox series

Patch

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 },