Merge commit 'fb845ffdd335a1efd6dfd43e8adeb530397b348e'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 16 Jan 2013 11:01:21 +0000 (12:01 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 16 Jan 2013 11:01:21 +0000 (12:01 +0100)
* commit 'fb845ffdd335a1efd6dfd43e8adeb530397b348e':
  h264: add 3 pixels below for subpixel filter wait position
  dvdsubdec: Support palette in mkv

Conflicts:
libavcodec/dvdsubdec.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/dvdsubdec.c

@@@ -127,26 -120,19 +127,26 @@@ static int decode_rle(uint8_t *bitmap, 
      return 0;
  }
  
- static void guess_palette(uint32_t *rgba_palette,
-                           DVDSubContext* ctx,
+ static void guess_palette(DVDSubContext* ctx,
+                           uint32_t *rgba_palette,
 -                          uint8_t *colormap,
 -                          uint8_t *alpha,
                            uint32_t subtitle_color)
  {
 +    static const uint8_t level_map[4][4] = {
 +        // this configuration (full range, lowest to highest) in tests
 +        // seemed most common, so assume this
 +        {0xff},
 +        {0x00, 0xff},
 +        {0x00, 0x80, 0xff},
 +        {0x00, 0x55, 0xaa, 0xff},
 +    };
      uint8_t color_used[16] = { 0 };
      int nb_opaque_colors, i, level, j, r, g, b;
 +    uint8_t *colormap = ctx->colormap, *alpha = ctx->alpha;
  
 -    if (ctx->has_palette) {
 -        for (i = 0; i < 4; i++)
 +    if(ctx->has_palette) {
 +        for(i = 0; i < 4; i++)
              rgba_palette[i] = (ctx->palette[colormap[i]] & 0x00ffffff)
 -                              | ((alpha[i] * 17) << 24);
 +                              | ((alpha[i] * 17U) << 24);
          return;
      }
  
@@@ -351,8 -338,9 +351,8 @@@ static int decode_dvd_subtitles(DVDSubC
                      yuv_a_to_rgba(yuv_palette, alpha, (uint32_t*)sub_header->rects[0]->pict.data[1], 256);
                  } else {
                      sub_header->rects[0]->nb_colors = 4;
-                     guess_palette((uint32_t*)sub_header->rects[0]->pict.data[1], ctx,
 -                    guess_palette(ctx,
 -                                  (uint32_t*)sub_header->rects[0]->pict.data[1],
 -                                  colormap, alpha, 0xffff00);
++                    guess_palette(ctx, (uint32_t*)sub_header->rects[0]->pict.data[1],
 +                                  0xffff00);
                  }
                  sub_header->rects[0]->x = x1;
                  sub_header->rects[0]->y = y1;
@@@ -541,63 -512,26 +541,63 @@@ static int dvdsub_parse_extradata(AVCod
          return AVERROR(ENOMEM);
      memcpy(data, avctx->extradata, avctx->extradata_size);
      data[avctx->extradata_size] = '\0';
 -    cur = data;
 -
 -    while (*cur) {
 -        if (strncmp("palette:", cur, 8) == 0) {
 -            int i;
 -            char *p = cur + 8;
 -            ctx->has_palette = 1;
 -            for (i = 0; i < 16; i++) {
 -                ctx->palette[i] = strtoul(p, &p, 16);
 -                while (*p == ',' || isspace(*p))
 -                    p++;
 -            }
 +
 +    for(;;) {
 +        int pos = strcspn(data, "\n\r");
 +        if (pos==0 && *data==0)
 +            break;
 +
 +        if (strncmp("palette:", data, 8) == 0) {
 +            parse_palette(ctx, data + 8);
 +        } else if (strncmp("size:", data, 5) == 0) {
 +            int w, h;
 +            if (sscanf(data + 5, "%dx%d", &w, &h) == 2 &&
 +                av_image_check_size(w, h, 0, avctx) >= 0)
 +                avcodec_set_dimensions(avctx, w, h);
          }
 -        cur += strcspn(cur, "\n\r");
 -        cur += strspn(cur, "\n\r");
 +
 +        data += pos;
 +        data += strspn(data, "\n\r");
      }
 -    av_free(data);
 -    return 0;
 +
 +    av_free(dataorig);
 +    return 1;
  }
  
-     DVDSubContext *ctx = (DVDSubContext*) avctx->priv_data;
 +static int dvdsub_init(AVCodecContext *avctx)
 +{
++    DVDSubContext *ctx = avctx->priv_data;
 +    int ret;
 +
 +    if ((ret = dvdsub_parse_extradata(avctx)) < 0)
 +        return ret;
 +
 +    if (ctx->palette_str)
 +        parse_palette(ctx, ctx->palette_str);
 +    if (ctx->has_palette) {
 +        int i;
 +        av_log(avctx, AV_LOG_DEBUG, "palette:");
 +        for(i=0;i<16;i++)
 +            av_log(avctx, AV_LOG_DEBUG, " 0x%06x", ctx->palette[i]);
 +        av_log(avctx, AV_LOG_DEBUG, "\n");
 +    }
 +
 +    return 1;
 +}
 +
 +#define OFFSET(field) offsetof(DVDSubContext, field)
 +#define VD AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_DECODING_PARAM
 +static const AVOption options[] = {
 +    { "palette", "set the global palette", OFFSET(palette_str), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VD },
 +    { NULL }
 +};
 +static const AVClass class = {
 +    .class_name = "dvdsubdec",
 +    .item_name  = av_default_item_name,
 +    .option     = options,
 +    .version    = LIBAVUTIL_VERSION_INT,
 +};
 +
  AVCodec ff_dvdsub_decoder = {
      .name           = "dvdsub",
      .type           = AVMEDIA_TYPE_SUBTITLE,