On Fri, Sep 10, 2021, 2:48 PM Hayden Myers <haydenm...@gmail.com> wrote:
> From fb2b280e44b785b99b27c24503c61574168701b9 Mon Sep 17 00:00:00 2001 > From: Hayden Myers <hmy...@skylinenet.net> > Date: Fri, 10 Sep 2021 14:35:28 -0400 > Subject: [PATCH] libavformat/rtpdec_jpeg.c: Allow fragmentation offset to > include q header and data > > Some jpeg over rtp streams include the quantization header and table data > in the > reported fragmentation offset value of the jpeg header. ffmpeg stores q > table > data separate from the jpeg stream data. When the fragmentation offset is > compared > against the current position in the jpeg frame, it's off by q header + q > data bytes. > This results in all packets being dropped. It thinks there's data loss, > but there > really isn't. Added a conditional to check if the offset differs by q > header + > q data bytes, before dropping the packet. > > Signed-off-by: Hayden Myers <hmy...@skylinenet.net> > --- > libavformat/rtpdec_jpeg.c | 26 ++++++++++++++++++++++---- > 1 file changed, 22 insertions(+), 4 deletions(-) > > diff --git a/libavformat/rtpdec_jpeg.c b/libavformat/rtpdec_jpeg.c > index b32d074136..4ec9fc8bd9 100644 > --- a/libavformat/rtpdec_jpeg.c > +++ b/libavformat/rtpdec_jpeg.c > @@ -211,6 +211,7 @@ static void create_default_qtables(uint8_t *qtables, > uint8_t q) > } > } > > + > static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, > AVStream *st, AVPacket *pkt, uint32_t > *timestamp, > const uint8_t *buf, int len, uint16_t seq, > @@ -350,10 +351,27 @@ static int jpeg_parse_packet(AVFormatContext *ctx, > PayloadContext *jpeg, > return AVERROR_INVALIDDATA; > } > > - if (off != avio_tell(jpeg->frame) - jpeg->hdr_size) { > - av_log(ctx, AV_LOG_ERROR, > - "Missing packets; dropping frame.\n"); > - return AVERROR(EAGAIN); > + if (off != (avio_tell(jpeg->frame) - jpeg->hdr_size)) { > + > + /* Take into account that the fragment offset may include the > quant > + * table data. Allow the offset to differ by the size of the > + * q header and table. > + */ > + > + //Default to 2 * 64 byte tables for 8 bit precision. > + uint8_t qtable_len = 128; > + > + // Use the q table len value stored in the ctx > + if (q >= 127 && q < 255) > + qtable_len = jpeg->qtables_len[q-128]; > + > + // account for MBZ, Precision, and Length bytes. > + qtable_len += 4; > + > + if (off != (avio_tell(jpeg->frame) - (jpeg->hdr_size - > qtable_len))) { > + av_log(ctx, AV_LOG_ERROR, "Missing packets; dropping > frame.\n"); > + return AVERROR(EAGAIN); > + } > } > > /* Copy data to frame buffer. */ > -- > 2.25.1 > Haven't seen any activity on this patch. What am I missing? > _______________________________________________ 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".