summaryrefslogtreecommitdiff
path: root/libavformat/rtpdec_jpeg.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2012-09-11 14:29:54 +0300
committerMartin Storsjö <martin@martin.st>2012-09-12 12:10:05 +0300
commita218deb856e7352b16e5aa3013a2b3fcdd0e3d2f (patch)
treef39fd21ec233fe99c1f66e9a5aa7f09ea558d9f5 /libavformat/rtpdec_jpeg.c
parenta252649059b7dd1fa05e27bd6a14b5a08436456a (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.c33
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];
}
}