diff options
Diffstat (limited to 'ffmpeg/libavcodec/lagarith.c')
| -rw-r--r-- | ffmpeg/libavcodec/lagarith.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/ffmpeg/libavcodec/lagarith.c b/ffmpeg/libavcodec/lagarith.c index 8599784..0a4d23e 100644 --- a/ffmpeg/libavcodec/lagarith.c +++ b/ffmpeg/libavcodec/lagarith.c @@ -174,7 +174,15 @@ static int lag_read_prob_header(lag_rac *rac, GetBitContext *gb) if (cumul_prob & (cumul_prob - 1)) { uint64_t mul = softfloat_reciprocal(cumul_prob); - for (i = 1; i < 257; i++) { + for (i = 1; i <= 128; i++) { + rac->prob[i] = softfloat_mul(rac->prob[i], mul); + scaled_cumul_prob += rac->prob[i]; + } + if (scaled_cumul_prob <= 0) { + av_log(rac->avctx, AV_LOG_ERROR, "Scaled probabilities invalid\n"); + return AVERROR_INVALIDDATA; + } + for (; i < 257; i++) { rac->prob[i] = softfloat_mul(rac->prob[i], mul); scaled_cumul_prob += rac->prob[i]; } @@ -556,6 +564,28 @@ static int lag_decode_frame(AVCodecContext *avctx, } } break; + case FRAME_SOLID_COLOR: + if (avctx->bits_per_coded_sample == 24) { + avctx->pix_fmt = AV_PIX_FMT_RGB24; + } else { + avctx->pix_fmt = AV_PIX_FMT_RGB32; + offset_gu |= 0xFFU << 24; + } + + if ((ret = ff_thread_get_buffer(avctx, &frame,0)) < 0) + return ret; + + dst = p->data[0]; + for (j = 0; j < avctx->height; j++) { + for (i = 0; i < avctx->width; i++) + if (avctx->bits_per_coded_sample == 24) { + AV_WB24(dst + i * 3, offset_gu); + } else { + AV_WN32(dst + i * 4, offset_gu); + } + dst += p->linesize[0]; + } + break; case FRAME_ARITH_RGBA: avctx->pix_fmt = AV_PIX_FMT_RGB32; planes = 4; @@ -703,6 +733,7 @@ static av_cold int lag_decode_end(AVCodecContext *avctx) AVCodec ff_lagarith_decoder = { .name = "lagarith", + .long_name = NULL_IF_CONFIG_SMALL("Lagarith lossless"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_LAGARITH, .priv_data_size = sizeof(LagarithContext), @@ -710,5 +741,4 @@ AVCodec ff_lagarith_decoder = { .close = lag_decode_end, .decode = lag_decode_frame, .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS, - .long_name = NULL_IF_CONFIG_SMALL("Lagarith lossless"), }; |
