diff options
author | Martin Storsjö <martin@martin.st> | 2012-09-11 15:29:54 +0400 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2012-09-12 13:10:05 +0400 |
commit | a218deb856e7352b16e5aa3013a2b3fcdd0e3d2f (patch) | |
tree | f39fd21ec233fe99c1f66e9a5aa7f09ea558d9f5 /libavformat/rtpdec_jpeg.c | |
parent | a252649059b7dd1fa05e27bd6a14b5a08436456a (diff) |
rtpdec_jpeg: Store and reuse old qtables for q values 128-254
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/rtpdec_jpeg.c')
-rw-r--r-- | libavformat/rtpdec_jpeg.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/libavformat/rtpdec_jpeg.c b/libavformat/rtpdec_jpeg.c index 463bf432e2..9dd5f68764 100644 --- a/libavformat/rtpdec_jpeg.c +++ b/libavformat/rtpdec_jpeg.c @@ -32,6 +32,8 @@ struct PayloadContext { AVIOContext *frame; ///< current frame buffer uint32_t timestamp; ///< current frame timestamp int hdr_size; ///< size of the current frame header + uint8_t qtables[128][128]; + uint8_t qtables_len[128]; }; static const uint8_t default_quantizers[128] = { @@ -267,12 +269,6 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, if (precision) av_log(ctx, AV_LOG_WARNING, "Only 8-bit precision is supported.\n"); - if (q == 255 && qtable_len == 0) { - av_log(ctx, AV_LOG_ERROR, - "Invalid RTP/JPEG packet. Quantization tables not found.\n"); - return AVERROR_INVALIDDATA; - } - if (qtable_len > 0) { if (len < qtable_len) { av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n"); @@ -281,6 +277,31 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg, qtables = buf; buf += qtable_len; len -= qtable_len; + if (q < 255) { + if (jpeg->qtables_len[q - 128] && + (jpeg->qtables_len[q - 128] != qtable_len || + memcmp(qtables, &jpeg->qtables[q - 128][0], qtable_len))) { + av_log(ctx, AV_LOG_WARNING, + "Quantization tables for q=%d changed\n", q); + } else if (!jpeg->qtables_len[q - 128] && qtable_len <= 128) { + memcpy(&jpeg->qtables[q - 128][0], qtables, + qtable_len); + jpeg->qtables_len[q - 128] = qtable_len; + } + } + } else { + if (q == 255) { + av_log(ctx, AV_LOG_ERROR, + "Invalid RTP/JPEG packet. Quantization tables not found.\n"); + return AVERROR_INVALIDDATA; + } + if (!jpeg->qtables_len[q - 128]) { + av_log(ctx, AV_LOG_ERROR, + "No quantization tables known for q=%d yet.\n", q); + return AVERROR_INVALIDDATA; + } + qtables = &jpeg->qtables[q - 128][0]; + qtable_len = jpeg->qtables_len[q - 128]; } } |