Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 14 Jul 2012 23:21:05 +0000 (01:21 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 14 Jul 2012 23:23:16 +0000 (01:23 +0200)
* qatar/master:
  eval: add gt(), gte(), lt() and lte() fate tests
  eval: fix swapping of lt() and lte()
  imgconvert: deprecate avcodec_find_best_pix_fmt()
  imgconvert: add avcodec_find_best_pix_fmt2()
  imgconvert: avoid undefined left shift in avcodec_find_best_pix_fmt

Conflicts:
libavcodec/imgconvert.c
libavcodec/version.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/avcodec.h
libavcodec/imgconvert.c
libavcodec/version.h
libavutil/eval.c
tests/ref/fate/eval

@@@ -4437,42 -4227,32 +4440,65 @@@ int avcodec_get_pix_fmt_loss(enum Pixel
   * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur.
   * @return The best pixel format to convert to or -1 if none was found.
   */
+ attribute_deprecated
  enum PixelFormat avcodec_find_best_pix_fmt(int64_t pix_fmt_mask, enum PixelFormat src_pix_fmt,
                                int has_alpha, int *loss_ptr);
 -enum PixelFormat avcodec_find_best_pix_fmt2(enum PixelFormat *pix_fmt_list,
+ #endif /* FF_API_FIND_BEST_PIX_FMT */
+ /**
+  * Find the best pixel format to convert to given a certain source pixel
+  * format.  When converting from one pixel format to another, information loss
+  * may occur.  For example, when converting from RGB24 to GRAY, the color
+  * information will be lost. Similarly, other losses occur when converting from
+  * some formats to other formats. avcodec_find_best_pix_fmt2() searches which of
+  * the given pixel formats should be used to suffer the least amount of loss.
+  * The pixel formats from which it chooses one, are determined by the
+  * pix_fmt_list parameter.
+  *
+  *
+  * @param[in] pix_fmt_list PIX_FMT_NONE terminated array of pixel formats to choose from
+  * @param[in] src_pix_fmt source pixel format
+  * @param[in] has_alpha Whether the source pixel format alpha channel is used.
+  * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur.
+  * @return The best pixel format to convert to or -1 if none was found.
+  */
++enum PixelFormat avcodec_find_best_pix_fmt_of_list(enum PixelFormat *pix_fmt_list,
+                                             enum PixelFormat src_pix_fmt,
+                                             int has_alpha, int *loss_ptr);
  
 +/**
 + * Find the best pixel format to convert to given a certain source pixel
 + * format and a selection of two destination pixel formats. When converting from
 + * one pixel format to another, information loss may occur.  For example, when converting
 + * from RGB24 to GRAY, the color information will be lost. Similarly, other losses occur when
 + * converting from some formats to other formats. avcodec_find_best_pix_fmt2() selects which of
 + * the given pixel formats should be used to suffer the least amount of loss.
 + *
 + * If one of the destination formats is PIX_FMT_NONE the other pixel format (if valid) will be
 + * returned.
 + *
 + * @code
 + * src_pix_fmt = PIX_FMT_YUV420P;
 + * dst_pix_fmt1= PIX_FMT_RGB24;
 + * dst_pix_fmt2= PIX_FMT_GRAY8;
 + * dst_pix_fmt3= PIX_FMT_RGB8;
 + * loss= FF_LOSS_CHROMA; // don't care about chroma loss, so chroma loss will be ignored.
 + * dst_pix_fmt = avcodec_find_best_pix_fmt2(dst_pix_fmt1, dst_pix_fmt2, src_pix_fmt, alpha, &loss);
 + * dst_pix_fmt = avcodec_find_best_pix_fmt2(dst_pix_fmt, dst_pix_fmt3, src_pix_fmt, alpha, &loss);
 + * @endcode
 + *
 + * @param[in] dst_pix_fmt1 One of the two destination pixel formats to choose from
 + * @param[in] dst_pix_fmt2 The other of the two destination pixel formats to choose from
 + * @param[in] src_pix_fmt Source pixel format
 + * @param[in] has_alpha Whether the source pixel format alpha channel is used.
 + * @param[in, out] loss_ptr Combination of loss flags. In: selects which of the losses to ignore, i.e.
 + *                               NULL or value of zero means we care about all losses. Out: the loss
 + *                               that occurs when converting from src to selected dst pixel format.
 + * @return The best pixel format to convert to or -1 if none was found.
 + */
 +enum PixelFormat avcodec_find_best_pix_fmt2(enum PixelFormat dst_pix_fmt1, enum PixelFormat dst_pix_fmt2,
 +                                            enum PixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
 +
  enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt);
  
  /**
@@@ -508,35 -538,114 +508,37 @@@ int avcodec_get_pix_fmt_loss(enum Pixel
  
  static int avg_bits_per_pixel(enum PixelFormat pix_fmt)
  {
 -    int bits;
 -    const PixFmtInfo *pf;
 +    const PixFmtInfo *info = &pix_fmt_info[pix_fmt];
      const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt];
  
 -    pf = &pix_fmt_info[pix_fmt];
 -    switch(pf->pixel_type) {
 -    case FF_PIXEL_PACKED:
 -        switch(pix_fmt) {
 -        case PIX_FMT_YUYV422:
 -        case PIX_FMT_UYVY422:
 -        case PIX_FMT_RGB565BE:
 -        case PIX_FMT_RGB565LE:
 -        case PIX_FMT_RGB555BE:
 -        case PIX_FMT_RGB555LE:
 -        case PIX_FMT_RGB444BE:
 -        case PIX_FMT_RGB444LE:
 -        case PIX_FMT_BGR565BE:
 -        case PIX_FMT_BGR565LE:
 -        case PIX_FMT_BGR555BE:
 -        case PIX_FMT_BGR555LE:
 -        case PIX_FMT_BGR444BE:
 -        case PIX_FMT_BGR444LE:
 -            bits = 16;
 -            break;
 -        case PIX_FMT_UYYVYY411:
 -            bits = 12;
 -            break;
 -        default:
 -            bits = pf->depth * pf->nb_channels;
 -            break;
 -        }
 -        break;
 -    case FF_PIXEL_PLANAR:
 -        if (desc->log2_chroma_w == 0 && desc->log2_chroma_h == 0) {
 -            bits = pf->depth * pf->nb_channels;
 -        } else {
 -            bits = pf->depth + ((2 * pf->depth) >>
 -                                (desc->log2_chroma_w + desc->log2_chroma_h));
 -        }
 -        break;
 -    case FF_PIXEL_PALETTE:
 -        bits = 8;
 -        break;
 -    default:
 -        bits = -1;
 -        break;
 -    }
 -    return bits;
 -}
 -
 -static enum PixelFormat avcodec_find_best_pix_fmt1(enum PixelFormat *pix_fmt_list,
 -                                      enum PixelFormat src_pix_fmt,
 -                                      int has_alpha,
 -                                      int loss_mask)
 -{
 -    int dist, i, loss, min_dist;
 -    enum PixelFormat dst_pix_fmt;
 -
 -    /* find exact color match with smallest size */
 -    dst_pix_fmt = PIX_FMT_NONE;
 -    min_dist = 0x7fffffff;
 -    i = 0;
 -    while (pix_fmt_list[i] != PIX_FMT_NONE) {
 -        enum PixelFormat pix_fmt = pix_fmt_list[i];
 -
 -        if (i > PIX_FMT_NB) {
 -            av_log(NULL, AV_LOG_ERROR, "Pixel format list longer than expected, "
 -                   "it is either not properly terminated or contains duplicates\n");
 -            return PIX_FMT_NONE;
 -        }
 -
 -        loss = avcodec_get_pix_fmt_loss(pix_fmt, src_pix_fmt, has_alpha) & loss_mask;
 -        if (loss == 0) {
 -            dist = avg_bits_per_pixel(pix_fmt);
 -            if (dist < min_dist) {
 -                min_dist = dist;
 -                dst_pix_fmt = pix_fmt;
 -            }
 -        }
 -        i++;
 -    }
 -    return dst_pix_fmt;
 +    return info->padded_size ?
 +        info->padded_size : av_get_bits_per_pixel(desc);
  }
  
+ #if FF_API_FIND_BEST_PIX_FMT
  enum PixelFormat avcodec_find_best_pix_fmt(int64_t pix_fmt_mask, enum PixelFormat src_pix_fmt,
 -                              int has_alpha, int *loss_ptr)
 +                                            int has_alpha, int *loss_ptr)
  {
 -    enum PixelFormat list[64];
 -    int i, j = 0;
 +    enum PixelFormat dst_pix_fmt;
 +    int i;
 +
 +    if (loss_ptr) /* all losses count (for backward compatibility) */
 +        *loss_ptr = 0;
  
 -    // test only the first 64 pixel formats to avoid undefined behaviour
 -    for (i = 0; i < 64; i++) {
 +    dst_pix_fmt = PIX_FMT_NONE; /* so first iteration doesn't have to be treated special */
 +    for(i = 0; i< FFMIN(PIX_FMT_NB, 64); i++){
          if (pix_fmt_mask & (1ULL << i))
 -            list[j++] = i;
 +            dst_pix_fmt = avcodec_find_best_pix_fmt2(dst_pix_fmt, i, src_pix_fmt, has_alpha, loss_ptr);
      }
 -    list[j] = PIX_FMT_NONE;
 -
 -    return avcodec_find_best_pix_fmt2(list, src_pix_fmt, has_alpha, loss_ptr);
 +    return dst_pix_fmt;
  }
+ #endif /* FF_API_FIND_BEST_PIX_FMT */
  
 -enum PixelFormat avcodec_find_best_pix_fmt2(enum PixelFormat *pix_fmt_list,
 -                                            enum PixelFormat src_pix_fmt,
 -                                            int has_alpha, int *loss_ptr)
 +enum PixelFormat avcodec_find_best_pix_fmt2(enum PixelFormat dst_pix_fmt1, enum PixelFormat dst_pix_fmt2,
 +                                            enum PixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
  {
      enum PixelFormat dst_pix_fmt;
 -    int loss_mask, i;
 +    int loss1, loss2, loss_order1, loss_order2, i, loss_mask;
      static const int loss_mask_order[] = {
          ~0, /* no loss first */
          ~FF_LOSS_ALPHA,
@@@ -27,8 -27,8 +27,8 @@@
   */
  
  #define LIBAVCODEC_VERSION_MAJOR 54
- #define LIBAVCODEC_VERSION_MINOR  39
- #define LIBAVCODEC_VERSION_MICRO 101
 -#define LIBAVCODEC_VERSION_MINOR 21
 -#define LIBAVCODEC_VERSION_MICRO  0
++#define LIBAVCODEC_VERSION_MINOR  40
++#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
Simple merge
Simple merge