diff options
author | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2014-07-18 20:31:24 +0200 |
---|---|---|
committer | Carl Eugen Hoyos <cehoyos@ag.or.at> | 2014-07-18 23:11:11 +0200 |
commit | ee88a2080ef0dc753d4c4aa60cde79ddaac70296 (patch) | |
tree | 1b23743172cf3aa11b6cdbf5d6fe12f04b1005b6 | |
parent | 0e70266bbfade1457189cc402cab2cdd7ec94c7b (diff) | |
download | ffmpeg-ee88a2080ef0dc753d4c4aa60cde79ddaac70296.tar.gz |
Parse dri when receiving jpg via rtp.
Based on a patch by contact at iridiummobile ru.
Fixes ticket #3780.
-rw-r--r-- | libavformat/rtpdec_jpeg.c | 23 |
1 files 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); |