On Mon, Mar 28, 2016 at 5:36 PM, Janne Grunau <[email protected]> wrote:
> 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
Yes, but since we don't know what size is the component until we start
decoding, I simplified a bit the code and initialized the buffer to
the max size available ( ctx->inflated_size = avctx->width *
avctx->height * 4) in _init.
I'd use the container value but I'm not sure it's trustworthy.
>> - 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.
Will add a comment.
> otherwise ok
>
> Janne
> _______________________________________________
> libav-devel mailing list
> [email protected]
> https://lists.libav.org/mailman/listinfo/libav-devel
--
Vittorio
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel