On 2016-03-28 13:24:59 +0200, Vittorio Giovara wrote:
> Signed-off-by: Vittorio Giovara <[email protected]>
> ---
> libavcodec/screenpresso.c | 45 ++++++++++++++++++++++++++++++---------------
> 1 file changed, 30 insertions(+), 15 deletions(-)
>
> diff --git a/libavcodec/screenpresso.c b/libavcodec/screenpresso.c
> index 88a927b..af678cd 100644
> --- a/libavcodec/screenpresso.c
> +++ b/libavcodec/screenpresso.c
> @@ -30,7 +30,7 @@
> * rebuilt frame (not the reference), and since there is no coordinate system
> * they contain exactly as many pixel as the keyframe.
> *
> - * Supports: BGR24
> + * Supports: BGRA, BGR24, RGB555
> */
>
> #include <stdint.h>
> @@ -79,10 +79,8 @@ static av_cold int screenpresso_init(AVCodecContext *avctx)
> if (!ctx->current)
> return AVERROR(ENOMEM);
>
> - avctx->pix_fmt = AV_PIX_FMT_BGR24;
> -
> - /* Allocate maximum size possible, a full frame */
> - ctx->inflated_size = avctx->width * avctx->height * 3;
> + /* Allocate maximum size possible, a full RGBA frame */
> + ctx->inflated_size = avctx->width * avctx->height * 4;
> ctx->inflated_buf = av_malloc(ctx->inflated_size);
> if (!ctx->inflated_buf)
> return AVERROR(ENOMEM);
> @@ -108,7 +106,7 @@ static int screenpresso_decode_frame(AVCodecContext
> *avctx, void *data,
> ScreenpressoContext *ctx = avctx->priv_data;
> AVFrame *frame = data;
> uLongf length = ctx->inflated_size;
length should be component_size * avctx->width * avctx->height
> - int keyframe;
> + int keyframe, component_size;
> int ret;
>
> /* Size check */
> @@ -118,12 +116,27 @@ static int screenpresso_decode_frame(AVCodecContext
> *avctx, void *data,
> }
>
> /* Basic sanity check, but not really harmful */
> - if ((avpkt->data[0] != 0x73 && avpkt->data[0] != 0x72) ||
> - avpkt->data[1] != 8) { // bpp probably
> - av_log(avctx, AV_LOG_WARNING, "Unknown header 0x%02X%02X\n",
> - avpkt->data[0], avpkt->data[1]);
> - }
> + if (avpkt->data[0] != 0x73 && avpkt->data[0] != 0x72)
> + av_log(avctx, AV_LOG_WARNING, "Unknown header 0x%02X\n",
> avpkt->data[0]);
> +
> keyframe = (avpkt->data[0] == 0x73);
> + component_size = ((avpkt->data[1] >> 2) & 0x03) + 1;
> + /* Pixel size */
> + switch (component_size) {
> + case 2:
> + avctx->pix_fmt = AV_PIX_FMT_RGB555LE;
> + break;
> + case 3:
> + avctx->pix_fmt = AV_PIX_FMT_BGR24;
> + break;
> + case 4:
> + avctx->pix_fmt = AV_PIX_FMT_BGRA;
> + break;
> + default:
> + av_log(avctx, AV_LOG_ERROR, "Invalid bits per pixel value (%d)\n",
> + component_size);
> + return AVERROR_INVALIDDATA;
> + }
>
> /* Inflate the frame after the 2 byte header */
> ret = uncompress(ctx->inflated_buf, &length,
> @@ -142,13 +155,15 @@ static int screenpresso_decode_frame(AVCodecContext
> *avctx, void *data,
> av_image_copy_plane(ctx->current->data[0] +
> ctx->current->linesize[0] * (avctx->height - 1),
> -1 * ctx->current->linesize[0],
> - ctx->inflated_buf, avctx->width * 3,
> - avctx->width * 3, avctx->height);
> + ctx->inflated_buf,
> + FFALIGN(avctx->width * component_size, 4),
why is the linesize of the uncompressed buffer suddenly aligned by 4? If that's
what the codec does, please add a comment. Hard to judge if all samples have
sane dimensions.
otherwise ok
Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel