On 12/05/2019 20:00, Jonas Karlman wrote: > On 2019-05-12 19:28, Mark Thompson wrote: >> On 09/05/2019 20:38, Jonas Karlman wrote: >>> Hello, >>> >>> When a multi-layer AVDRMFrameDescriptor is used to describe a frame the >>> overall >>> frame format is missing and applications need to deduce the frame >>> DRM_FORMAT_* >>> based on sw_format or the layers format. >>> >>> This patchset adds a AVDRMFrameDescriptor.format field to remove any >>> ambiguity >>> of what frame format a multi-layer descriptor may have. >>> >>> Kodi has up until now only supported single layer AVDRMFrameDescriptor, >>> when trying to add support for multi-layer frame descriptors [1], >>> we did not want to try and deduce the frame format, hence this patchset. >>> >>> [1] https://github.com/xbmc/xbmc/pull/16102 >>> >>> Patch 1 adds a new field, format, to the AVDRMFrameDescriptor struct. >>> Patch 2-4 adds code to set the new format field. >>> >>> Regards, >>> Jonas >>> >>> --- >>> >>> Jonas Karlman (4): >>> hwcontext_drm: Add AVDRMFrameDescriptor.format field >>> hwcontext_vaapi: Set AVDRMFrameDescriptor.format in map_from >>> rkmppdec: Set AVDRMFrameDescriptor.format >>> kmsgrab: Set AVDRMFrameDescriptor.format >>> >>> doc/APIchanges | 3 +++ >>> libavcodec/rkmppdec.c | 1 + >>> libavdevice/kmsgrab.c | 1 + >>> libavutil/hwcontext_drm.h | 4 ++++ >>> libavutil/hwcontext_vaapi.c | 38 +++++++++++++++++++++++++++++++++++++ >>> libavutil/version.h | 4 ++-- >>> 6 files changed, 49 insertions(+), 2 deletions(-) >> Can you argue why this case should be put in FFmpeg rather than constructing >> the format you want in the client code? >> >> The intent of the existing format information is that each layer is >> definitely usable as the specific format stated if the device supports that >> format and format modifier. That isn't true for the top-level format - some >> devices enforce additional constraints which aren't visible. For example, >> if you take an R8 + GR88 frame from an AMD device, it probably won't work as >> NV12 with Intel video hardware because there the whole frame is required to >> be in one object (well, not quite - actually the offset from the luma plane >> to the chroma plane just has some relatively small limit; in practice this >> gets enforced as single-object, though), but it will work perfectly well as >> R8 and GR88 planes. > > The reason why I wanted to offload this to FFmpeg is that the top-level > format is already known while the application would have to guess/calculate > correct format to use when importing the video buffer into a drm plane. > > The main issue we are facing is that kernel api do not have a distinction > between single/multi layer/object when importing a video buffer into a > framebuffer, drmModeAddFB2WithModifiers is expecting the top-level format > regardless if the planes come from multiple objects or not. > (Kernel driver may still enforce additional constraints, e.g. on Rockchip the > luma plane must be contiguous after chroma plane, and Allwinner have similar > limits as Intel, chorma and luma plane must be in close proximity) > > In order to support HDR video using a framebuffer tied to a drm plane on > Intel, the top-level format passed to drmModeAddFB2WithModifiers must be P010 > even if vaExportSurfaceHandle exports the video buffer as two layers, R16 + > RG1616.
That makes sense, so I agree it's useful to add it at this level if the format is meaningful. > Changing vaapi_map_to_drm_esh in hwcontext_vaapi to try and use > VA_EXPORT_SURFACE_COMPOSED_LAYERS and fallback to > VA_EXPORT_SURFACE_SEPARATE_LAYERS could also work for our use case, the Intel > vaapi driver support both export methods and AMD only the separate layers > method. Hmm. The separate case is definitely wanted elsewhere (if importing to OpenGL or OpenCL, say), so the default can't change. I guess it could be switched by an extra option to av_hwframe_map(), but that would be a special API-specific option in the generic API so not really desirable. Given that, I definitely prefer your first answer to this one. > From what I understand support for composed layers wont be added to AMD as it > technically are multiple objects. I am not even sure if AMD have support for > NV12 as a drm plane format. Yeah. Mesa decodes to multiple objects, which can then be handled separately by all the normal graphics APIs (OpenGL / Vulkan). On the AMD systems I've seen KMS supports only packed 8- and 10-bit RGB planes, so I don't think there is anything in AMD-land which would ever want the single-layer representation. Thanks, - Mark _______________________________________________ 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".