On 15/09/17 16:11, Carl Eugen Hoyos wrote:
> 2017-09-15 16:37 GMT+02:00 Mark Thompson <s...@jkqxz.net>:
>> On 15/09/17 13:09, Carl Eugen Hoyos wrote:
>>> 2017-09-15 0:37 GMT+02:00 Mark Thompson <s...@jkqxz.net>:
>>>> On 14/09/17 22:30, Carl Eugen Hoyos wrote:
>>>>> 2017-09-07 23:56 GMT+02:00 Mark Thompson <s...@jkqxz.net>:
>>>>>
>>>>>> +static const struct {
>>>>>> +    enum AVPixelFormat pixfmt;
>>>>>> +    uint32_t drm_format;
>>>>>> +} kmsgrab_formats[] = {
>>>>>> +    { AV_PIX_FMT_GRAY8,    DRM_FORMAT_R8       },
>>>>>> +    { AV_PIX_FMT_GRAY16LE, DRM_FORMAT_R16      },
>>>>>> +    { AV_PIX_FMT_RGB24,    DRM_FORMAT_RGB888   },
>>>>>> +    { AV_PIX_FMT_BGR24,    DRM_FORMAT_BGR888   },
>>>>>> +    { AV_PIX_FMT_0RGB,     DRM_FORMAT_XRGB8888 },
>>>>>> +    { AV_PIX_FMT_0BGR,     DRM_FORMAT_XBGR8888 },
>>>>>> +    { AV_PIX_FMT_RGB0,     DRM_FORMAT_RGBX8888 },
>>>>>> +    { AV_PIX_FMT_BGR0,     DRM_FORMAT_BGRX8888 },
>>>>>> +    { AV_PIX_FMT_ARGB,     DRM_FORMAT_ARGB8888 },
>>>>>> +    { AV_PIX_FMT_ABGR,     DRM_FORMAT_ABGR8888 },
>>>>>> +    { AV_PIX_FMT_RGBA,     DRM_FORMAT_RGBA8888 },
>>>>>> +    { AV_PIX_FMT_BGRA,     DRM_FORMAT_BGRA8888 },
>>>>>> +    { AV_PIX_FMT_YUYV422,  DRM_FORMAT_YUYV     },
>>>>>> +    { AV_PIX_FMT_YVYU422,  DRM_FORMAT_YVYU     },
>>>>>> +    { AV_PIX_FMT_UYVY422,  DRM_FORMAT_UYVY     },
>>>>>> +    { AV_PIX_FMT_NV12,     DRM_FORMAT_NV12     },
>>>>>> +    { AV_PIX_FMT_YUV420P,  DRM_FORMAT_YUV420   },
>>>>>> +    { AV_PIX_FMT_YUV422P,  DRM_FORMAT_YUV422   },
>>>>>> +    { AV_PIX_FMT_YUV444P,  DRM_FORMAT_YUV444   },
>>>>>
>>>>> Which of those were you able to test?
>>>>
>>>> Only the 32-bit RGB0-type ones (all of them are testable because you just 
>>>> get the colours in a different order).
>>>
>>> So RGB0, BGR0, 0RGB and 0BGR all work fine?
>>
>> Yes.
>>
>> I've verified YUYV/UYVY directly on Intel as well now.
>>
>>>> Intel at least should work with others in near-future versions (e.g. 
>>>> <https://lists.freedesktop.org/archives/intel-gfx/2017-July/132642.html>), 
>>>> though I haven't actually tested this.  It seemed sensible to include all 
>>>> core DRM formats which map to ffmpeg pixfmts to account for other drivers 
>>>> (possibly future) which I can't test now.
> 
>>> Good idea, twelve more are attached.
>>
>> Looks sensible.
> 
> May I commit?

Are you able to test at all?  I believe I should be able to test at least 565 
properly a bit later today (and settle the ordering question - I do think now 
that my interpretation is wrong and that it was working because the same method 
was used in both directions).

>> I think the ordering of the packed-within-bytes formats (565, etc.) should 
>> be verified before applying them, though, just in case there is something 
>> funny going on here.  I had a look at RGB565, which is usable for output on 
>> Intel, but I can't easily get the result anywhere (map fails, VAAPI doesn't 
>> like the format).
>>
>> On BIG_ENDIAN, I'm not sure whether it has any use or testing at all - none 
>> of the libdrm test programs allow it, and it is suspiciously absent from all 
>> but the most generic parts of drivers/gpu/drm in Linux.
>>
>>>> I've tested on amdgpu, exynos, i915 and rockchip.  It should work on other 
>>>> KMS drivers, though if the output is tiled or not-CPU-mappable it can be 
>>>> hard to get the output somewhere where it can actually be used.  (The ARM 
>>>> ones are fine and allow hwdownload directly.  Intels I've tried are 
>>>> mappable but tiled so hwdownload is messed up, but they interoperate 
>>>> cleanly with VAAPI.  The AMD I have makes the objects completely 
>>>> unmappable from the CPU, but they can be imported to other GPU things with 
>>>> Mesa.)
>>>>
>>>>> I find the comments in the header file very misleading:
>>>>> What is "little-endian 8:8:8:8 ARGB"?
>>>>
>>>> It is just A-R-G-B in memory in that order as you might expect
>>>> without the comment.
>>>
>>> So the comment is simply wrong for the 8:8:8:8 RGB formats?
>>> Iirc, the same comment in the SDL sources defines another
>>> order (or OpenGL, I don't remember atm), as does FFmpeg
>>> through its RGB32 formats.
>>
>> Hmm.  Maybe this is actually wrong in my code.  The format is provided by 
>> the user, because there is no way to retrieve that information from the 
>> framebuffer itself, and therefore we are always doing the mapping in both 
>> directions - the default of AV_PIX_FMT_BGR0 is mapped to DRM_FORMAT_BGRX8888 
>> and then back to AV_PIX_FMT_BGR0 for hwdownload or hwmap.  If the sense were 
>> actually the opposite and the framebuffer was in fact DRM_FORMAT_XRGB8888, 
>> this would still work identically and have correct output, because the 
>> intermediate doesn't matter as long as it's reversible.
>>
>> I think I need to test this with an explicit program to do the modeset and 
>> set framebuffer formats directly and then match them to the output pixel 
>> values, because there is no other way to tell.
> 
> Thank you!
> 
> Could we agree, just for the wording (you know that I am all for
> commit early), that you were - so far - not able to test any of
> above formats?

The ones in your list, no.

The things I have actually tested are all permutations of RGBX (though not 
necessarily being able to distinguish between them), and then also YUYV and 
UYVY (4:2:2).

- Mark
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to