History

avcodec/videotoolbox: add support for full range pixel formats

Akemi committed 7 years ago

Commit 2a9d4611 parent 787c56b4 files · +33 −13Browse files

Unified · Split

4 files
  1. fftools/ffmpeg_videotoolbox.c +4 −2
  2. libavcodec/videotoolbox.c +9 −5
  3. libavutil/hwcontext_videotoolbox.c +14 −6
  4. libavutil/hwcontext_videotoolbox.h +6 −0
fftools/ffmpeg_videotoolbox.c+4−2
@@ -51,10 +51,12 @@ static int videotoolbox_retrieve_data(AVCodecContext *s, AVFrame *frame) · 50 unmodified lines
5151 case kCVPixelFormatType_422YpCbCr8: vt->tmp_frame->format = AV_PIX_FMT_UYVY422; break;
5252 case kCVPixelFormatType_32BGRA: vt->tmp_frame->format = AV_PIX_FMT_BGRA; break;
5353 #ifdef kCFCoreFoundationVersionNumber10_7
54− case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange: vt->tmp_frame->format = AV_PIX_FMT_NV12; break;
54+ case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
55+ case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange: vt->tmp_frame->format = AV_PIX_FMT_NV12; break;
5556 #endif
5657 #if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
57− case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange: vt->tmp_frame->format = AV_PIX_FMT_P010; break;
58+ case kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange:
59+ case kCVPixelFormatType_420YpCbCr10BiPlanarFullRange: vt->tmp_frame->format = AV_PIX_FMT_P010; break;
5860 #endif
5961 default:
6062 av_log(NULL, AV_LOG_ERROR,
libavcodec/videotoolbox.c+9−5
@@ -1084,8 +1084,9 @@ static int videotoolbox_common_init(AVCodecContext *avctx) · 1083 unmodified lines
10841084 goto fail;
10851085 }
10861086
1087+ bool full_range = avctx->color_range == AVCOL_RANGE_JPEG;
10871088 vtctx->vt_ctx->cv_pix_fmt_type =
1088− av_map_videotoolbox_format_from_pixfmt(hw_frames->sw_format);
1089+ av_map_videotoolbox_format_from_pixfmt2(hw_frames->sw_format, full_range);
10891090 if (!vtctx->vt_ctx->cv_pix_fmt_type) {
10901091 av_log(avctx, AV_LOG_ERROR, "Unknown sw_format.\n");
10911092 err = AVERROR(EINVAL);
@@ -1208,14 +1209,15 @@ const AVHWAccel ff_mpeg4_videotoolbox_hwaccel = { · 116 unmodified lines
12081209 .priv_data_size = sizeof(VTContext),
12091210 };
12101211
1211−static AVVideotoolboxContext *av_videotoolbox_alloc_context_with_pix_fmt(enum AVPixelFormat pix_fmt)
1212+static AVVideotoolboxContext *av_videotoolbox_alloc_context_with_pix_fmt(enum AVPixelFormat pix_fmt,
1213+ bool full_range)
12121214 {
12131215 AVVideotoolboxContext *ret = av_mallocz(sizeof(*ret));
12141216
12151217 if (ret) {
12161218 ret->output_callback = videotoolbox_decoder_callback;
12171219
1218− OSType cv_pix_fmt_type = av_map_videotoolbox_format_from_pixfmt(pix_fmt);
1220+ OSType cv_pix_fmt_type = av_map_videotoolbox_format_from_pixfmt2(pix_fmt, full_range);
12191221 if (cv_pix_fmt_type == 0) {
12201222 cv_pix_fmt_type = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
12211223 }
@@ -1227,7 +1229,7 @@ static AVVideotoolboxContext *av_videotoolbox_alloc_context_with_pix_fmt(enum AV · 5 unmodified lines
12271229
12281230 AVVideotoolboxContext *av_videotoolbox_alloc_context(void)
12291231 {
1230− return av_videotoolbox_alloc_context_with_pix_fmt(AV_PIX_FMT_NONE);
1232+ return av_videotoolbox_alloc_context_with_pix_fmt(AV_PIX_FMT_NONE, false);
12311233 }
12321234
12331235 int av_videotoolbox_default_init(AVCodecContext *avctx)
@@ -1237,7 +1239,9 @@ int av_videotoolbox_default_init(AVCodecContext *avctx) · 3 unmodified lines
12371239
12381240 int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *vtctx)
12391241 {
1240− avctx->hwaccel_context = vtctx ?: av_videotoolbox_alloc_context_with_pix_fmt(videotoolbox_best_pixel_format(avctx));
1242+ enum AVPixelFormat pix_fmt = videotoolbox_best_pixel_format(avctx);
1243+ bool full_range = avctx->color_range == AVCOL_RANGE_JPEG;
1244+ avctx->hwaccel_context = vtctx ?: av_videotoolbox_alloc_context_with_pix_fmt(pix_fmt, full_range);
12411245 if (!avctx->hwaccel_context)
12421246 return AVERROR(ENOMEM);
12431247 return videotoolbox_start(avctx);
libavutil/hwcontext_videotoolbox.c+14−6
@@ -34,16 +34,19 @@ · 33 unmodified lines
3434
3535 static const struct {
3636 uint32_t cv_fmt;
37+ bool full_range;
3738 enum AVPixelFormat pix_fmt;
3839 } cv_pix_fmts[] = {
39− { kCVPixelFormatType_420YpCbCr8Planar, AV_PIX_FMT_YUV420P },
40− { kCVPixelFormatType_422YpCbCr8, AV_PIX_FMT_UYVY422 },
41− { kCVPixelFormatType_32BGRA, AV_PIX_FMT_BGRA },
40+ { kCVPixelFormatType_420YpCbCr8Planar, false, AV_PIX_FMT_YUV420P },
41+ { kCVPixelFormatType_422YpCbCr8, false, AV_PIX_FMT_UYVY422 },
42+ { kCVPixelFormatType_32BGRA, false, AV_PIX_FMT_BGRA },
4243 #ifdef kCFCoreFoundationVersionNumber10_7
43− { kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, AV_PIX_FMT_NV12 },
44+ { kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, false, AV_PIX_FMT_NV12 },
45+ { kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, true, AV_PIX_FMT_NV12 },
4446 #endif
4547 #if HAVE_KCVPIXELFORMATTYPE_420YPCBCR10BIPLANARVIDEORANGE
46− { kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, AV_PIX_FMT_P010 },
48+ { kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, false, AV_PIX_FMT_P010 },
49+ { kCVPixelFormatType_420YpCbCr10BiPlanarFullRange, true, AV_PIX_FMT_P010 },
4750 #endif
4851 };
4952
@@ -58,10 +61,15 @@ enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt) · 8 unmodified lines
5861 }
5962
6063 uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt)
64+{
65+ return av_map_videotoolbox_format_from_pixfmt2(pix_fmt, false);
66+}
67+
68+uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range)
6169 {
6270 int i;
6371 for (i = 0; i < FF_ARRAY_ELEMS(cv_pix_fmts); i++) {
64− if (cv_pix_fmts[i].pix_fmt == pix_fmt)
72+ if (cv_pix_fmts[i].pix_fmt == pix_fmt && cv_pix_fmts[i].full_range == full_range)
6573 return cv_pix_fmts[i].cv_fmt;
6674 }
6775 return 0;
libavutil/hwcontext_videotoolbox.h+6−0
@@ -51,4 +51,10 @@ enum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt); · 50 unmodified lines
5151 */
5252 uint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt);
5353
54+/**
55+ * Same as av_map_videotoolbox_format_from_pixfmt function, but can map and
56+ * return full range pixel formats via a flag.
57+ */
58+uint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range);
59+
5460 #endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t