mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
rtpdec_jpeg: Store and reuse old qtables for q values 128-254
Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
a252649059
commit
a218deb856
@ -32,6 +32,8 @@ struct PayloadContext {
|
|||||||
AVIOContext *frame; ///< current frame buffer
|
AVIOContext *frame; ///< current frame buffer
|
||||||
uint32_t timestamp; ///< current frame timestamp
|
uint32_t timestamp; ///< current frame timestamp
|
||||||
int hdr_size; ///< size of the current frame header
|
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] = {
|
static const uint8_t default_quantizers[128] = {
|
||||||
@ -267,12 +269,6 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg,
|
|||||||
if (precision)
|
if (precision)
|
||||||
av_log(ctx, AV_LOG_WARNING, "Only 8-bit precision is supported.\n");
|
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 (qtable_len > 0) {
|
||||||
if (len < qtable_len) {
|
if (len < qtable_len) {
|
||||||
av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n");
|
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;
|
qtables = buf;
|
||||||
buf += qtable_len;
|
buf += qtable_len;
|
||||||
len -= 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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user