mirror of https://git.ffmpeg.org/ffmpeg.git
Parse dri when receiving jpg via rtp.
Based on a patch by contact at iridiummobile ru. Fixes ticket #3780.
This commit is contained in:
parent
0e70266bbf
commit
ee88a2080e
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue