On 02/14/2012 05:38 PM, Paul B Mahol wrote:

> On 2/14/12, Aneesh Dogra <[email protected]> wrote:
>> ---
>>  Changelog               |    1 +
>>  libavcodec/Makefile     |    1 +
>>  libavcodec/allcodecs.c  |    2 +-
>>  libavcodec/sunrastenc.c |  246
>> +++++++++++++++++++++++++++++++++++++++++++++++
>>  libavformat/img2.c      |    3 +-
>>  5 files changed, 251 insertions(+), 2 deletions(-)
>>  create mode 100644 libavcodec/sunrastenc.c
>>
> 
> [...]
> 
>> +static av_cold int sunrast_encode_init(AVCodecContext *avctx)
>> +{
>> +    SUNRASTContext *s = avctx->priv_data;
>> +    int pixels = avctx->width * avctx->height;
>> +
>> +    avctx->coded_frame = &s->picture;
>> +
>> +    s->maplength = 0;
>> +    s->type      = (avctx->coder_type == FF_CODER_TYPE_RLE) ?
>> +                       RT_BYTE_ENCODED : RT_STANDARD;
>> +    s->maptype   = RMT_NONE;
>> +
>> +    switch (avctx->pix_fmt) {
> 
> This is wrong, checking for pix_fmt should not be in init().
> Sane image encoders like png,pam,bmp... check pix_fmt on the fly.
> 
> [...]
> 
>> +static int sunrast_encode_frame(AVCodecContext *avctx,  AVPacket *avpkt,
>> +                                const AVFrame *frame, int *got_packet_ptr)
>> +{
>> +    SUNRASTContext *s = avctx->priv_data;
>> +    AVFrame *const p  = (AVFrame *)&s->picture;
>> +    int ret;
>> +
>> +    if ((ret = ff_alloc_packet(avpkt, s->size *
>> +                   ((s->type == RT_BYTE_ENCODED) ? 2 : 1))) < 0)
> 
> This looks wrong, RLE encoding should take less memory than uncompressed.


It doesn't necessarily do so in all cases though. For 1-run values of
0x80 it encodes 2 bytes instead of 1. Also, the current code doesn't
avoid runs of 2, which it ideally should do because it takes 3 bytes
instead of 2.

-Justin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to