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. >
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. Best regards, Jan > 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".