Merge commit 'ce42316321145c435029dc288c2b5f1d48519dde'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 27 Sep 2014 01:16:58 +0000 (03:16 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 27 Sep 2014 01:21:56 +0000 (03:21 +0200)
* commit 'ce42316321145c435029dc288c2b5f1d48519dde':
  h264: Always invoke the get_format() callback

Conflicts:
libavcodec/h264_slice.c

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

@@@ -1023,8 -973,13 +1023,14 @@@ static int clone_slice(H264Context *dst
      return 0;
  }
  
 -static enum AVPixelFormat get_pixel_format(H264Context *h)
 +static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback)
  {
+     enum AVPixelFormat pix_fmts[2];
+     const enum AVPixelFormat *choices = pix_fmts;
++    int i;
+     pix_fmts[1] = AV_PIX_FMT_NONE;
      switch (h->sps.bit_depth_luma) {
      case 9:
          if (CHROMA444(h)) {
      case 10:
          if (CHROMA444(h)) {
              if (h->avctx->colorspace == AVCOL_SPC_RGB) {
-                 return AV_PIX_FMT_GBRP10;
+                 pix_fmts[0] = AV_PIX_FMT_GBRP10;
              } else
-                 return AV_PIX_FMT_YUV444P10;
+                 pix_fmts[0] = AV_PIX_FMT_YUV444P10;
          } else if (CHROMA422(h))
-             return AV_PIX_FMT_YUV422P10;
+             pix_fmts[0] = AV_PIX_FMT_YUV422P10;
          else
-             return AV_PIX_FMT_YUV420P10;
+             pix_fmts[0] = AV_PIX_FMT_YUV420P10;
          break;
-                 return AV_PIX_FMT_GBRP12;
 +    case 12:
 +        if (CHROMA444(h)) {
 +            if (h->avctx->colorspace == AVCOL_SPC_RGB) {
-                 return AV_PIX_FMT_YUV444P12;
++                pix_fmts[0] = AV_PIX_FMT_GBRP12;
 +            } else
-             return AV_PIX_FMT_YUV422P12;
++                pix_fmts[0] = AV_PIX_FMT_YUV444P12;
 +        } else if (CHROMA422(h))
-             return AV_PIX_FMT_YUV420P12;
++            pix_fmts[0] = AV_PIX_FMT_YUV422P12;
 +        else
-                 return AV_PIX_FMT_GBRP14;
++            pix_fmts[0] = AV_PIX_FMT_YUV420P12;
 +        break;
 +    case 14:
 +        if (CHROMA444(h)) {
 +            if (h->avctx->colorspace == AVCOL_SPC_RGB) {
-                 return AV_PIX_FMT_YUV444P14;
++                pix_fmts[0] = AV_PIX_FMT_GBRP14;
 +            } else
-             return AV_PIX_FMT_YUV422P14;
++                pix_fmts[0] = AV_PIX_FMT_YUV444P14;
 +        } else if (CHROMA422(h))
-             return AV_PIX_FMT_YUV420P14;
++            pix_fmts[0] = AV_PIX_FMT_YUV422P14;
 +        else
++            pix_fmts[0] = AV_PIX_FMT_YUV420P14;
 +        break;
      case 8:
          if (CHROMA444(h)) {
-             if (h->avctx->colorspace == AVCOL_SPC_RGB) {
-                 av_log(h->avctx, AV_LOG_DEBUG, "Detected GBR colorspace.\n");
-                 return AV_PIX_FMT_GBR24P;
-             } else if (h->avctx->colorspace == AVCOL_SPC_YCGCO) {
++            if (h->avctx->colorspace == AVCOL_SPC_YCGCO)
 +                av_log(h->avctx, AV_LOG_WARNING, "Detected unsupported YCgCo colorspace.\n");
-             }
-             return h->avctx->color_range == AVCOL_RANGE_JPEG ? AV_PIX_FMT_YUVJ444P
-                                                                 : AV_PIX_FMT_YUV444P;
+             if (h->avctx->colorspace == AVCOL_SPC_RGB)
+                 pix_fmts[0] = AV_PIX_FMT_GBRP;
+             else if (h->avctx->color_range == AVCOL_RANGE_JPEG)
+                 pix_fmts[0] = AV_PIX_FMT_YUVJ444P;
+             else
+                 pix_fmts[0] = AV_PIX_FMT_YUV444P;
          } else if (CHROMA422(h)) {
-             return h->avctx->color_range == AVCOL_RANGE_JPEG ? AV_PIX_FMT_YUVJ422P
-                                                              : AV_PIX_FMT_YUV422P;
+             if (h->avctx->color_range == AVCOL_RANGE_JPEG)
+                 pix_fmts[0] = AV_PIX_FMT_YUVJ422P;
+             else
+                 pix_fmts[0] = AV_PIX_FMT_YUV422P;
          } else {
-             int i;
-             const enum AVPixelFormat * fmt = h->avctx->codec->pix_fmts ?
-                                         h->avctx->codec->pix_fmts :
-                                         h->avctx->color_range == AVCOL_RANGE_JPEG ?
-                                         h264_hwaccel_pixfmt_list_jpeg_420 :
-                                         h264_hwaccel_pixfmt_list_420;
-             for (i=0; fmt[i] != AV_PIX_FMT_NONE; i++)
-                 if (fmt[i] == h->avctx->pix_fmt && !force_callback)
-                     return fmt[i];
-             return ff_thread_get_format(h->avctx, fmt);
+             if (h->avctx->codec->pix_fmts)
+                 choices = h->avctx->codec->pix_fmts;
+             else if (h->avctx->color_range == AVCOL_RANGE_JPEG)
+                 choices = h264_hwaccel_pixfmt_list_jpeg_420;
+             else
+                 choices = h264_hwaccel_pixfmt_list_420;
          }
          break;
      default:
                 "Unsupported bit depth %d\n", h->sps.bit_depth_luma);
          return AVERROR_INVALIDDATA;
      }
 -    return ff_get_format(h->avctx, choices);
++    for (i=0; choices[i] != AV_PIX_FMT_NONE; i++)
++        if (choices[i] == h->avctx->pix_fmt && !force_callback)
++            return choices[i];
++    return ff_thread_get_format(h->avctx, choices);
  }
  
  /* export coded and cropped frame dimensions to AVCodecContext */