[FFmpeg-devel] [PATCH] mmaldec: Set the output pix_fmt after detecting format

wm4 nfxjfg at googlemail.com
Wed Oct 21 19:11:40 CEST 2015


On Wed, 21 Oct 2015 18:48:42 +0200
Julian Scheel <julian at jusst.de> wrote:

> Am 21.10.2015 um 17:24 schrieb wm4:
> > On Wed, 21 Oct 2015 17:15:14 +0200
> > Julian Scheel <julian at jusst.de> wrote:
> >  
> >> Am 21.10.2015 um 16:18 schrieb wm4:  
> >>> On Wed, 21 Oct 2015 16:07:08 +0200
> >>> Hendrik Leppkes <h.leppkes at gmail.com> wrote:
> >>>  
> >>>> On Wed, Oct 21, 2015 at 3:55 PM, Julian Scheel <julian at jusst.de> wrote:  
> >>>>> Wait for the first decoded frame to be returned by mmal before setting
> >>>>> pix_fmt. This is important for avformat probing to work properly as it is one
> >>>>> of the criterions to decide whether to decode a frame or not for probing.
> >>>>>
> >>>>> Signed-off-by: Julian Scheel <julian at jusst.de>
> >>>>> ---
> >>>>>    libavcodec/mmaldec.c | 10 +++++-----
> >>>>>    1 file changed, 5 insertions(+), 5 deletions(-)
> >>>>>
> >>>>> diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c
> >>>>> index 7db90d2..429990a 100644
> >>>>> --- a/libavcodec/mmaldec.c
> >>>>> +++ b/libavcodec/mmaldec.c
> >>>>> @@ -338,11 +338,6 @@ static av_cold int ffmmal_init_decoder(AVCodecContext *avctx)
> >>>>>            return AVERROR(ENOSYS);
> >>>>>        }
> >>>>>
> >>>>> -    if ((ret = ff_get_format(avctx, avctx->codec->pix_fmts)) < 0)
> >>>>> -        return ret;
> >>>>> -
> >>>>> -    avctx->pix_fmt = ret;
> >>>>> -
> >>>>>        if ((status = mmal_component_create(MMAL_COMPONENT_DEFAULT_VIDEO_DECODER, &ctx->decoder)))
> >>>>>            goto fail;
> >>>>>
> >>>>> @@ -678,6 +673,11 @@ static int ffmmal_read_frame(AVCodecContext *avctx, AVFrame *frame, int *got_fra
> >>>>>
> >>>>>                av_log(avctx, AV_LOG_INFO, "Changing output format.\n");
> >>>>>
> >>>>> +            if ((ret = ff_get_format(avctx, avctx->codec->pix_fmts)) < 0)
> >>>>> +                return ret;
> >>>>> +
> >>>>> +            avctx->pix_fmt = ret;
> >>>>> +
> >>>>>                if ((status = mmal_port_disable(decoder->output[0])))
> >>>>>                    goto done;
> >>>>>  
> >>>>
> >>>> pix_fmt is already used by the decoder before this point to decide if
> >>>> mmal surfaces or memory buffers are to be used, changing it afterwards
> >>>> will not have the same effect as doing it in init.  
> >>>
> >>> Oh, you're right. It's used in ffmal_update_format(), so this patch can
> >>> only work if the decoder sends MMAL_EVENT_FORMAT_CHANGED on init, or if
> >>> the entire decoding init is delayed and not done in AVCodec.init.  
> >>
> >> I think it would be sufficient to query the pix_fmt via ff_get_format in
> >> ffmal_update_format instead of using avctx->pix_fmt. The other paramters
> >> should be changeable without disabling the port. But this should be
> >> tested probably :)
> >> Regarding the question if MMAL_EVENT_FORMAT_CHANGED will be sent by the
> >> decoder in any case I have opened an issue for clarification:
> >> https://github.com/raspberrypi/firmware/issues/489  
> >
> > ffmal_update_format() is also called in the init function. Isn't this what
> > you're trying to avoid?  
> 
> Well yes, probably we could just skip that call. Can you possibly test 
> if that works without breaking your opaque use case?

It's needed for decoder init.

But I'm pretty sure it'd work for me if decoder init were delayed until
the first AVCodec.decode/ffmmal_decode call. (But I'd resist if the
first init were to happen any time later - makes it harder to fallback
to software decoding if mmal doesn't work.)


More information about the ffmpeg-devel mailing list