Parse dri when receiving jpg via rtp.

Based on a patch by contact at iridiummobile ru.
Fixes ticket #3780.
pull/77/merge
Carl Eugen Hoyos 11 years ago
parent 0e70266bbf
commit ee88a2080e
  1. 23
      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, 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; PutByteContext pbc;
uint8_t *dht_size_ptr; 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);
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 */ /* DQT */
jpeg_put_marker(&pbc, DQT); jpeg_put_marker(&pbc, DQT);
bytestream2_put_be16(&pbc, 2 + nb_qtable * (1 + 64)); 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; const uint8_t *qtables = NULL;
uint16_t qtable_len; uint16_t qtable_len;
uint32_t off; uint32_t off;
int ret; int ret, dri = 0;
if (len < 8) { if (len < 8) {
av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n"); 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; buf += 8;
len -= 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. */ /* Parse the restart marker header. */
if (type > 63) { if (type > 63) {
av_log(ctx, AV_LOG_ERROR, av_log(ctx, AV_LOG_ERROR,
@ -332,7 +349,7 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg,
* interchange format. */ * interchange format. */
jpeg->hdr_size = jpeg_create_header(hdr, sizeof(hdr), type, width, jpeg->hdr_size = jpeg_create_header(hdr, sizeof(hdr), type, width,
height, qtables, height, qtables,
qtable_len / 64); qtable_len / 64, dri);
/* Copy JPEG header to frame buffer. */ /* Copy JPEG header to frame buffer. */
avio_write(jpeg->frame, hdr, jpeg->hdr_size); avio_write(jpeg->frame, hdr, jpeg->hdr_size);

Loading…
Cancel
Save