[FFmpeg-devel] libavformat/rtpdec_jpeg.c patch to allow fragmentation offset to include q header and table data

Hayden Myers haydenm315 at gmail.com
Fri Oct 8 00:40:07 EEST 2021


On Fri, Sep 10, 2021, 2:48 PM Hayden Myers <haydenm315 at gmail.com> wrote:

> From fb2b280e44b785b99b27c24503c61574168701b9 Mon Sep 17 00:00:00 2001
> From: Hayden Myers <hmyers at 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 at 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?

>


More information about the ffmpeg-devel mailing list