From ee88a2080ef0dc753d4c4aa60cde79ddaac70296 Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Fri, 18 Jul 2014 20:31:24 +0200 Subject: [PATCH] Parse dri when receiving jpg via rtp. Based on a patch by contact at iridiummobile ru. Fixes ticket #3780. --- libavformat/rtpdec_jpeg.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/libavformat/rtpdec_jpeg.c b/libavformat/rtpdec_jpeg.c index 80fe2952b3..ccd80ad7e8 100644 --- a/libavformat/rtpdec_jpeg.c +++ b/libavformat/rtpdec_jpeg.c @@ -106,7 +106,8 @@ static void jpeg_put_marker(PutByteContext *pbc, int code) } static int jpeg_create_header(uint8_t *buf, int size, uint32_t type, uint32_t w, - uint32_t h, const uint8_t *qtable, int nb_qtable) + uint32_t h, const uint8_t *qtable, int nb_qtable, + int dri) { PutByteContext pbc; uint8_t *dht_size_ptr; @@ -132,6 +133,12 @@ static int jpeg_create_header(uint8_t *buf, int size, uint32_t type, uint32_t w, bytestream2_put_byte(&pbc, 0); bytestream2_put_byte(&pbc, 0); + if (dri) { + jpeg_put_marker(&pbc, DRI); + bytestream2_put_be16(&pbc, 4); + bytestream2_put_be16(&pbc, dri); + } + /* DQT */ jpeg_put_marker(&pbc, DQT); bytestream2_put_be16(&pbc, 2 + nb_qtable * (1 + 64)); @@ -226,7 +233,7 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, const uint8_t *qtables = NULL; uint16_t qtable_len; uint32_t off; - int ret; + int ret, dri = 0; if (len < 8) { av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n"); @@ -242,6 +249,16 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, buf += 8; len -= 8; + if (type & 0x40) { + if (len < 4) { + av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n"); + return AVERROR_INVALIDDATA; + } + dri = AV_RB16(buf); + buf += 4; + len -= 4; + type &= ~0x40; + } /* Parse the restart marker header. */ if (type > 63) { av_log(ctx, AV_LOG_ERROR, @@ -332,7 +349,7 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, * interchange format. */ jpeg->hdr_size = jpeg_create_header(hdr, sizeof(hdr), type, width, height, qtables, - qtable_len / 64); + qtable_len / 64, dri); /* Copy JPEG header to frame buffer. */ avio_write(jpeg->frame, hdr, jpeg->hdr_size);