Message ID | CAJsRVTGmO8itG=j6zbUu+9NVDWGCZF18ms=aKnp3rLSB0xSa=w@mail.gmail.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] libavformat/rtpdec_jpeg.c patch to allow fragmentation offset to include q header and table data | expand |
On Fri, Sep 10, 2021, 2:48 PM Hayden Myers <haydenm315@gmail.com> wrote: > From fb2b280e44b785b99b27c24503c61574168701b9 Mon Sep 17 00:00:00 2001 > From: Hayden Myers <hmyers@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 <hmyers@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? >
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