On Thu, 10 May 2018 01:24:42 +0200
Jorge Ramirez-Ortiz <jrami...@baylibre.com> wrote:

> On 05/09/2018 04:11 PM, Mark Thompson wrote:
> > On 09/05/18 08:57, Jorge Ramirez-Ortiz wrote:  
> >> On 05/09/2018 01:33 AM, Mark Thompson wrote:  
> >>> diff --git a/libavcodec/v4l2_m2m_dec.c b/libavcodec/v4l2_m2m_dec.c
> >>> index ed5193ecc1..2b33badb08 100644
> >>> --- a/libavcodec/v4l2_m2m_dec.c
> >>> +++ b/libavcodec/v4l2_m2m_dec.c
> >>> @@ -23,12 +23,18 @@
> >>>      #include <linux/videodev2.h>
> >>>    #include <sys/ioctl.h>
> >>> +
> >>> +#include "libavutil/hwcontext.h"
> >>> +#include "libavutil/hwcontext_drm.h"
> >>>    #include "libavutil/pixfmt.h"
> >>>    #include "libavutil/pixdesc.h"
> >>>    #include "libavutil/opt.h"
> >>>    #include "libavcodec/avcodec.h"
> >>>    #include "libavcodec/decode.h"
> >>>    +#include "libavcodec/hwaccel.h"
> >>> +#include "libavcodec/internal.h"
> >>> +
> >>>    #include "v4l2_context.h"
> >>>    #include "v4l2_m2m.h"
> >>>    #include "v4l2_fmt.h"
> >>> @@ -183,6 +189,15 @@ static av_cold int v4l2_decode_init(AVCodecContext 
> >>> *avctx)
> >>>        capture->av_codec_id = AV_CODEC_ID_RAWVIDEO;
> >>>        capture->av_pix_fmt = avctx->pix_fmt;
> >>>    +    /* the client requests the codec to generate DRM frames:
> >>> +     *   - data[0] will therefore point to the returned 
> >>> AVDRMFrameDescriptor
> >>> +     *       check the ff_v4l2_buffer_to_avframe conversion function.
> >>> +     *   - the DRM frame format is passed in the DRM frame descriptor 
> >>> layer.
> >>> +     *       check the v4l2_get_drm_frame function.
> >>> +     */
> >>> +    if (avctx->pix_fmt == AV_PIX_FMT_DRM_PRIME)
> >>> +        s->output_drm = 1;
> >>> +
> >>>        ret = ff_v4l2_m2m_codec_init(avctx);
> >>>        if (ret) {
> >>>            av_log(avctx, AV_LOG_ERROR, "can't configure decoder\n");
> >>> @@ -202,6 +217,11 @@ static const AVOption options[] = {
> >>>        { NULL},
> >>>    };  
> >> As a follow up to your comment on pixel format negotiation 
> >> (AvCodecContext.getformat), notice that this is a tentative request from 
> >> the user to select a pixel format.
> >> The actual pixel format negotiation - where the decoder will select the 
> >> pixel format- will happen later during v4l2_try_start.  
> > Indeed.  get_format() will have to be called during the pixel format 
> > negotiation so that the user can pick between whatever the supported 
> > software format is (NV12, NV21, YUV420P P010, whatever) or the DRM-PRIME 
> > object hardware format (if supported).  
> 
> but in the use case that we are trying to implement, it is the user - 
> not the codec - the one that has to specifically request DRM support to 
> libavcodec since the v4l2m2m decoder can provide either of them 
> indistinctly.
> 
> it is just not clear to me how the libavcodec client can request the DRM 
> pix_fmt if not tentatively setting the pix_fmt during v4l2_decode_init.
> 
> 
> >
> > AVCodecContext.pix_fmt is intended to be set by the decoder to say what 
> > pix_fmt it intends to produce (though even in that role it's highly dubious 
> > given threaded decoders and stream changes).  For historical reasons it is 
> > also allowed to be set externally (because of libavformat interactions), 
> > but this shouldn't be used for configuration.
> >  
> >> This change enables the v4l2m2m decoder to output either dmabuf 
> >> descriptors to be consumed by a DRM or video frame formats to be consumed 
> >> by SDL (for instance).
> >> As an example, these changes have been tested with ffplay (SDL based 
> >> display) and a simple DRM application [1]
> >>
> >> Lukas tested with other tools.
> >>
> >> [1]https://github.com/baylibre/ffmpeg-drm  
> > We should make this usable in the ffmpeg application too.  The DRM object 
> > format is works fine in ffmpeg already with Rockchip decoder (consumed by 
> > the hwmap/hwdownload filters, or by mapping to OpenCL), but that doesn't 
> > need the format selection part.  (There are also kmsgrab and VAAPI, but 
> > those aren't making DRM PRIME frames directly at a decoder.)  I believe 
> > this should be straightforward with a small modification to get_format() in 
> > ffmpeg.c to accept AV_CODEC_HW_CONFIG_METHOD_INTERNAL, I can look at this 
> > once we have a codec which will need it.  
> 
> so what would be the sequence of calls for an libavcodec client to 
> request the DRM format?
> https://github.com/BayLibre/ffmpeg-drm/blob/master/main.c#L598

Like in 100% of all existing cases in ffmpeg: set a get_format
callback, and return the format from it.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to