[FFmpeg-devel] [PATCH] encoder for adobe's flash ScreenVideo2 codec

Diego Biurrun diego
Tue Jul 21 19:46:03 CEST 2009


On Tue, Jul 21, 2009 at 08:57:15AM -0600, Joshua Warner wrote:
> 
> I've developed an encoder for Adobe's Flash ScreenVideo2 format, which is
> stored in flv files.  My encoder currently only supports a large subset of
> the format.  The only player that supports this codec (so far) is Adobe
> Flash Player itself,

What about writing a decoder first?

Your patch is missing a documentation update.

> --- libavcodec/Makefile	(revision 19479)
> +++ libavcodec/Makefile	(working copy)
> @@ -92,6 +92,7 @@
>  OBJS-$(CONFIG_FLASHSV_DECODER)         += flashsv.o
>  OBJS-$(CONFIG_FLASHSV_ENCODER)         += flashsvenc.o
> +OBJS-$(CONFIG_FLASHSV2_ENCODER)         += flashsv2enc.o

alignment

> --- libavcodec/flashsv2enc.c	(revision 0)
> +++ libavcodec/flashsv2enc.c	(revision 0)
> @@ -0,0 +1,962 @@
> +
> +#include <zlib.h>

If this encoder needs zlib, then you should declare the respective
dependency in configure.

> +typedef struct Block {
> +} Block;
> +
> +typedef struct Pallet {
> +} Pallet;

Ugh, capitalized names..

> +static int generate_default_pallet(Pallet * pallet);

Please reorder the functions so that this forward declaration is
unnecessary.

> +            b->width = (col < s->cols - 1)
> +                || (s->image_width % s->block_width ==
> +                    0) ? s->block_width : s->image_width % s->block_width;
> +            b->height = (row < s->rows - 1)
> +                || (s->image_height % s->block_height ==
> +                    0) ? s->block_height : s->image_height %
> +                s->block_height;

This sure is unreadable.

> +            b->row = row;
> +            b->col = col;
> +            b->enc = encbuf;
> +            b->data = databuf;

vertical alignment

> +static void reset_stats(FlashSV2Context * s)
> +{
> +    s->diff_blocks = 0.1;
> +    s->tot_blocks = 1;
> +    s->diff_lines = 0.1;
> +    s->tot_lines = 1;
> +    s->raw_size = s->comp_size = s->uncomp_size = 10;

ditto

> +    if (avcodec_check_dimensions(avctx, avctx->width, avctx->height) < 0) {
> +        return -1;
> +    }

pointless {}

> +    s->image_width = avctx->width;
> +    s->image_height = avctx->height;
> +
> +    s->block_width = (s->image_width / 12) & ~15;
> +    s->block_height = (s->image_height / 12) & ~15;

vertical alignment

> +    s->rows = (s->image_height + s->block_height - 1) / s->block_height;
> +    s->cols = (s->image_width + s->block_width - 1) / s->block_width;

vertical alignment

> +    s->frame_size = s->image_width * s->image_height * 3;
> +    s->blocks_size = s->rows * s->cols * sizeof(Block);

vertical alignment

> +    s->encbuffer = av_mallocz(s->frame_size);
> +    s->keybuffer = av_mallocz(s->frame_size);
> +    s->databuffer = av_mallocz(s->frame_size * 6);
> +    s->current_frame = av_mallocz(s->frame_size);
> +    s->key_frame = av_mallocz(s->frame_size);
> +    s->frame_blocks = av_mallocz(s->blocks_size);
> +    s->key_blocks = av_mallocz(s->blocks_size);
> +    s->pallet.index = av_mallocz(1 << 15);

vertical alignment

There are more instances below, please prettyprint your code where it
helps readability.

> +static int encode_zlib(Block * b, uint8_t * buf, int *buf_size, int comp)
> +{
> +    int res =
> +        compress2(buf, buf_size, b->sl_begin, b->sl_end - b->sl_begin,
> +                  comp);

weird linebreaks

> +static int encode_bgr(Block * b, uint8_t * src, int stride)
> +{
> +    int i;
> +    uint8_t *ptr = b->enc;
> +    for (i = 0; i < b->start; i++) {
> +        memcpy(ptr + i * b->width * 3, src + i * stride, b->width * 3);
> +    }
> +    b->sl_begin = ptr + i * b->width * 3;
> +    for (; i < b->start + b->len; i++) {
> +        memcpy(ptr + i * b->width * 3, src + i * stride, b->width * 3);
> +    }
> +    b->sl_end = ptr + i * b->width * 3;
> +    for (; i < b->height; i++) {
> +        memcpy(ptr + i * b->width * 3, src + i * stride, b->width * 3);
> +    }

many pointless {}

> +static inline unsigned int chroma_diff(unsigned int c1, unsigned int c2)
> +{
> +    unsigned int t1 =
> +        (c1 & 0x000000ff) + ((c1 & 0x0000ff00) >> 8) +
> +        ((c1 & 0x00ff0000) >> 16);
> +    unsigned int t2 =
> +        (c2 & 0x000000ff) + ((c2 & 0x0000ff00) >> 8) +
> +        ((c2 & 0x00ff0000) >> 16);

again, weird linebreaks

> +static inline int encode_15_7_sl(Pallet * pallet, uint8_t * dest,
> +                                 uint8_t * src, int width, int dist)
> +{
> +    int len = 0, x;
> +    for (x = 0; x < width; x++) {
> +        len += write_pixel_15_7(pallet, dest + len, src + 3 * x, dist);
> +    }

pointless {}

More below, please be consistent and drop them where unnecessary.

> +static int encode_15_7(Pallet * pallet, Block * b, uint8_t * src,
> +                       int stride, int dist)
> +{
> +    int i, len;
> +    uint8_t *ptr = b->enc;
> +    for (i = 0; i < b->start; i++) {
> +        len =
> +            encode_15_7_sl(pallet, ptr, src + i * stride, b->width, dist);

weird linebreak

> +    for (; i < b->start + b->len; i++) {
> +        len =
> +            encode_15_7_sl(pallet, ptr, src + i * stride, b->width, dist);
> +        ptr += len;

again

More below, please change them and earn extra good karma.

> +#define FLASHSV2_DUMB

debug leftover?

Diego



More information about the ffmpeg-devel mailing list