[FFmpeg-devel] [PATCH 1/3] cljrenc: add AVOption to disable dither

Paul B Mahol onemda at gmail.com
Fri Dec 9 16:10:01 CET 2011


On 12/9/11, Michael Niedermayer <michaelni at gmx.at> wrote:
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
>  libavcodec/cljr.c |   24 +++++++++++++++++++++++-
>  1 files changed, 23 insertions(+), 1 deletions(-)
>
> diff --git a/libavcodec/cljr.c b/libavcodec/cljr.c
> index 950b46a..2c3cf1e 100644
> --- a/libavcodec/cljr.c
> +++ b/libavcodec/cljr.c
> @@ -25,12 +25,15 @@
>   */
>
>  #include "avcodec.h"
> +#include "libavutil/opt.h"
>  #include "get_bits.h"
>  #include "put_bits.h"
>
>  typedef struct CLJRContext {
> +    AVClass *avclass;

align vertically
>      AVCodecContext *avctx;
>      AVFrame         picture;
> +    int             dither_type;
>  } CLJRContext;
>
>  static av_cold int common_init(AVCodecContext *avctx)
> @@ -129,6 +132,7 @@ AVCodec ff_cljr_decoder = {
>  static int encode_frame(AVCodecContext *avctx, unsigned char *buf,
>                          int buf_size, void *data)
>  {
> +    CLJRContext *a = avctx->priv_data;
>      PutBitContext pb;
>      AVFrame *p = data;
>      int x, y;
> @@ -144,6 +148,10 @@ static int encode_frame(AVCodecContext *avctx, unsigned
> char *buf,
>          uint8_t *cb   = &p->data[1][y * p->linesize[1]];
>          uint8_t *cr   = &p->data[2][y * p->linesize[2]];
>          for (x = 0; x < avctx->width; x += 4) {
> +            switch(a->dither_type){

switch (a->dither_type) {
> +                case 0: dither = 0;                                break;
> +                case 1: dither = dither*1664525+1013904223;        break;

indentation is wrong

adding spaces around * and + is imho better, and it keeps it in sync
with rest of file.
> +            }
>              put_bits(&pb, 5, (luma[3] +  (dither>>29)   ) >> 3);
>              put_bits(&pb, 5, (luma[2] + ((dither>>26)&7)) >> 3);
>              put_bits(&pb, 5, (luma[1] + ((dither>>23)&7)) >> 3);
> @@ -151,7 +159,6 @@ static int encode_frame(AVCodecContext *avctx, unsigned
> char *buf,
>              luma += 4;
>              put_bits(&pb, 6, (*(cb++) + ((dither>>18)&3)) >> 2);
>              put_bits(&pb, 6, (*(cr++) + ((dither>>16)&3)) >> 2);
> -            dither = dither*1664525+1013904223;
>          }
>      }
>
> @@ -160,6 +167,20 @@ static int encode_frame(AVCodecContext *avctx, unsigned
> char *buf,
>      return put_bits_count(&pb) / 8;
>  }
>
> +#define OFFSET(x) offsetof(CLJRContext, x)
> +#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
> +static const AVOption options[] = {
> +    { "dither_type",   "Dither type",   OFFSET(dither_type),
> AV_OPT_TYPE_INT, { .dbl=1 }, 0, 2, VE},
> +    { NULL },
> +};
> +
> +static const AVClass class = {
> +    .class_name = "cljr encoder",
> +    .item_name  = av_default_item_name,
> +    .option     = options,
> +    .version    = LIBAVUTIL_VERSION_INT,
> +};
> +
>  AVCodec ff_cljr_encoder = {
>      .name           = "cljr",
>      .type           = AVMEDIA_TYPE_VIDEO,
> @@ -170,5 +191,6 @@ AVCodec ff_cljr_encoder = {
>      .pix_fmts       = (const enum PixelFormat[]) { PIX_FMT_YUV411P,
>                                                     PIX_FMT_NONE },
>      .long_name      = NULL_IF_CONFIG_SMALL("Cirrus Logic AccuPak"),
> +    .priv_class     = &class,
>  };
>  #endif


More information about the ffmpeg-devel mailing list