aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-09-27 03:16:58 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-09-27 03:21:56 +0200
commit28b1698a7cccded1df32a543321fd24af928e06c (patch)
tree3603f43634bf4f4bc24a4b24f61827441a7232b7
parent01831fd004908f9dbc3777400169505a63a7adef (diff)
parentce42316321145c435029dc288c2b5f1d48519dde (diff)
downloadffmpeg-28b1698a7cccded1df32a543321fd24af928e06c.tar.gz
Merge commit 'ce42316321145c435029dc288c2b5f1d48519dde'
* commit 'ce42316321145c435029dc288c2b5f1d48519dde': h264: Always invoke the get_format() callback Conflicts: libavcodec/h264_slice.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/h264_slice.c80
1 files changed, 44 insertions, 36 deletions
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 453094a7d4..ffb7de5237 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1025,76 +1025,79 @@ static int clone_slice(H264Context *dst, H264Context *src)
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)) {
if (h->avctx->colorspace == AVCOL_SPC_RGB) {
- return AV_PIX_FMT_GBRP9;
+ pix_fmts[0] = AV_PIX_FMT_GBRP9;
} else
- return AV_PIX_FMT_YUV444P9;
+ pix_fmts[0] = AV_PIX_FMT_YUV444P9;
} else if (CHROMA422(h))
- return AV_PIX_FMT_YUV422P9;
+ pix_fmts[0] = AV_PIX_FMT_YUV422P9;
else
- return AV_PIX_FMT_YUV420P9;
+ pix_fmts[0] = AV_PIX_FMT_YUV420P9;
break;
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;
case 12:
if (CHROMA444(h)) {
if (h->avctx->colorspace == AVCOL_SPC_RGB) {
- return AV_PIX_FMT_GBRP12;
+ pix_fmts[0] = AV_PIX_FMT_GBRP12;
} else
- return AV_PIX_FMT_YUV444P12;
+ pix_fmts[0] = AV_PIX_FMT_YUV444P12;
} else if (CHROMA422(h))
- return AV_PIX_FMT_YUV422P12;
+ pix_fmts[0] = AV_PIX_FMT_YUV422P12;
else
- return AV_PIX_FMT_YUV420P12;
+ pix_fmts[0] = AV_PIX_FMT_YUV420P12;
break;
case 14:
if (CHROMA444(h)) {
if (h->avctx->colorspace == AVCOL_SPC_RGB) {
- return AV_PIX_FMT_GBRP14;
+ pix_fmts[0] = AV_PIX_FMT_GBRP14;
} else
- return AV_PIX_FMT_YUV444P14;
+ pix_fmts[0] = AV_PIX_FMT_YUV444P14;
} else if (CHROMA422(h))
- return AV_PIX_FMT_YUV422P14;
+ pix_fmts[0] = AV_PIX_FMT_YUV422P14;
else
- return AV_PIX_FMT_YUV420P14;
+ 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:
@@ -1102,6 +1105,11 @@ static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback)
"Unsupported bit depth %d\n", h->sps.bit_depth_luma);
return AVERROR_INVALIDDATA;
}
+
+ 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 */