/* zlib interaction */
uint8_t *inflated_buf;
uLongf inflated_size;
+ int valid_pixels;
} RsccContext;
static av_cold int rscc_init(AVCodecContext *avctx)
/* Get pixel format and the size of the pixel */
if (avctx->codec_tag == MKTAG('I', 'S', 'C', 'C')) {
- avctx->pix_fmt = AV_PIX_FMT_BGRA;
- ctx->component_size = 4;
+ if (avctx->extradata && avctx->extradata_size == 4) {
+ if ((avctx->extradata[0] >> 1) & 1) {
+ avctx->pix_fmt = AV_PIX_FMT_BGRA;
+ ctx->component_size = 4;
+ } else {
+ avctx->pix_fmt = AV_PIX_FMT_BGR24;
+ ctx->component_size = 3;
+ }
+ } else {
+ avctx->pix_fmt = AV_PIX_FMT_BGRA;
+ ctx->component_size = 4;
+ }
} else if (avctx->codec_tag == MKTAG('R', 'S', 'C', 'C')) {
ctx->component_size = avctx->bits_per_coded_sample / 8;
switch (avctx->bits_per_coded_sample) {
}
memcpy (frame->data[1], ctx->palette, AVPALETTE_SIZE);
}
-
- *got_frame = 1;
+ // We only return a picture when enough of it is undamaged, this avoids copying nearly broken frames around
+ if (ctx->valid_pixels < ctx->inflated_size)
+ ctx->valid_pixels += pixel_size;
+ if (ctx->valid_pixels >= ctx->inflated_size * (100 - avctx->discard_damaged_percentage) / 100)
+ *got_frame = 1;
ret = avpkt->size;
end: