Apr 11, 2020, 15:56 by s...@jkqxz.net: > 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? > >> + 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. > > Otherwise seems ok. It's rather horrible, but it looks like the best > solution to the problem. >
I really, really don't think its a good idea to probe the packets of encoders, so I think I'm NAK on this patch for now. If a spec-compliant encoder cannot produce a packet that starts with DKIF, I'd be okay with it though. Or if ivf had a CRC at the end like ogg where a match would practically guarantee its an ivf packet. Otherwise, its just too fragile. _______________________________________________ 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".