On Sat, 11. Apr 18:56, Jan Ekström wrote:
> On Sat, Apr 11, 2020 at 6:43 PM Andriy Gelman <andriy.gel...@gmail.com> wrote:
> >
> > On Sat, 11. Apr 15:56, Mark Thompson wrote:
> > > On 04/04/2020 21:26, Andriy Gelman wrote:
> > > > From: Andriy Gelman <andriy.gel...@gmail.com>
> > > >
> > > > The dequeued packets from vp8 (s5p-mfc) encoder are output in ivf format
> > > > which breaks the stream when the packets are muxed in avformat. This 
> > > > commit
> > > > adds an option to remove the container and thus support the encoder.
> > > >
> > > > Signed-off-by: Andriy Gelman <andriy.gel...@gmail.com>
> > > > ---
> > > >  libavcodec/v4l2_m2m.h     |  2 ++
> > > >  libavcodec/v4l2_m2m_enc.c | 53 +++++++++++++++++++++++++++++++--------
> > > >  2 files changed, 45 insertions(+), 10 deletions(-)
> > > >
> > > > diff --git a/libavcodec/v4l2_m2m.h b/libavcodec/v4l2_m2m.h
> > > > index 456281f48c..525f9456e9 100644
> > > > --- a/libavcodec/v4l2_m2m.h
> > > > +++ b/libavcodec/v4l2_m2m.h
> > > > @@ -73,6 +73,8 @@ typedef struct V4L2m2mPriv {
> > > >
> > > >      int num_output_buffers;
> > > >      int num_capture_buffers;
> > > > +    int strip_ivf;
> > > > +    int ivf_detected;
> > > >  } V4L2m2mPriv;
> > > >
> > > >  /**
> > > > diff --git a/libavcodec/v4l2_m2m_enc.c b/libavcodec/v4l2_m2m_enc.c
> > > > index c9f1741bfd..9c11f90567 100644
> > > > --- a/libavcodec/v4l2_m2m_enc.c
> > > > +++ b/libavcodec/v4l2_m2m_enc.c
> > > > @@ -25,6 +25,8 @@
> > > >  #include <sys/ioctl.h>
> > > >  #include <search.h>
> > > >  #include "libavcodec/avcodec.h"
> > > > +#include "libavcodec/internal.h"
> > > > +#include "libavutil/intreadwrite.h"
> > > >  #include "libavutil/pixdesc.h"
> > > >  #include "libavutil/pixfmt.h"
> > > >  #include "libavutil/opt.h"
> > > > @@ -256,6 +258,7 @@ static int v4l2_send_frame(AVCodecContext *avctx, 
> > > > const AVFrame *frame)
> > > >
> > > >  static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
> > > >  {
> > > > +    V4L2m2mPriv *priv = avctx->priv_data;
> > > >      V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context;
> > > >      V4L2Context *const capture = &s->capture;
> > > >      V4L2Context *const output = &s->output;
> > > > @@ -281,7 +284,28 @@ static int v4l2_receive_packet(AVCodecContext 
> > > > *avctx, AVPacket *avpkt)
> > > >      }
> > > >
> > > >  dequeue:
> > > > -    return ff_v4l2_context_dequeue_packet(capture, avpkt);
> > > > +    ret = ff_v4l2_context_dequeue_packet(capture, avpkt);
> > > > +    if (ret)
> > > > +        return ret;
> > > > +
> > > > +    if (priv->strip_ivf) {
> > > > +        int header_offset = 0;
> > > > +        if (avpkt->size >= 32 && AV_RL32(avpkt->data) == 
> > > > MKTAG('D','K','I','F')) {
> > > > +            header_offset = 32;
> > > > +            priv->ivf_detected = 1;
> > > > +        } else if (priv->ivf_detected) {
> > > > +            header_offset = 12;
> > > > +        }
> > > > +        header_offset = FFMIN(header_offset, avpkt->size);
> > > > +        avpkt->data  += header_offset;
> > > > +        avpkt->size  -= header_offset;
> > > > +
> > > > +        if (avpkt->size == 0) {
> >
> > >
> > > Does this case ever happen?  Wouldn't something have gone very wrong here 
> > > to get here?
> >
> > It happens on the first packet, when the dequeued packet only contains the
> > 32byte ivf header.
> >
> > Also when draining (not related to this patch), avpkt->size == 0 indicates 
> > that
> > all the capture buffers are flushed.
> >
> > >
> > > > +            av_packet_unref(avpkt);
> > > > +            goto dequeue;
> > > > +        }
> > > > +    }
> > > > +    return 0;
> > > >  }
> >
> > >
> > > Could the presence of the IVF container be autodetected?  I suspect it 
> > > can, because the tag will collide with the fixed start code in the intra 
> > > frame at the start of the stream.  If that were possible then it would 
> > > avoid having the tricky option which users are not going to easily know 
> > > about.
> >
> > I think it can. Will test this approach.
> >
> > >
> > > Otherwise seems ok.  It's rather horrible, but it looks like the best 
> > > solution to the problem.
> >
> > I agree it's quite ugly. I'll look into whether auto inserted bsf can be
> > extended to encoders.
> >

Hi Jan

> 
> For the record, does this relate at all to
> https://patchwork.kernel.org/patch/3781601/ ?
> 
> It sounds like the driver has an option to disable IVF output.
> 

This patch hasn't been merged, so the option is not available.
I've pinged a few times on #v4l, but didn't get a response (the patch is from
2014...)

I also tested the patch, but s5p-mfc errors out during encoding. 
Probably the register in the patch is wrong. 

Thanks,
-- 
Andriy
_______________________________________________
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".

Reply via email to