diff options
author | maxd <maxim.d33@gmail.com> | 2017-02-08 13:17:00 +0100 |
---|---|---|
committer | Bradley Sepos <bradley@bradleysepos.com> | 2017-03-05 12:06:11 -0500 |
commit | 5daaebf8a105bbc62d6431730478b419cb3f14e0 (patch) | |
tree | 99e6e24ec65ab99e495cbbff8690b14350e02bfa /contrib | |
parent | 45eb6a58ae7fd4e0f84d9e64eb78def0eebfe274 (diff) |
qsv: adding hevc10 support starting from KBL platform
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/ffmpeg/A05-p10-output-support.patch | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/contrib/ffmpeg/A05-p10-output-support.patch b/contrib/ffmpeg/A05-p10-output-support.patch new file mode 100644 index 000000000..5656cfc46 --- /dev/null +++ b/contrib/ffmpeg/A05-p10-output-support.patch @@ -0,0 +1,149 @@ +diff -Naur ./libav-12.org/libswscale/output.c ./libav-12/libswscale/output.c +--- ./libav-12.org/libswscale/output.c 2016-10-16 23:10:02.000000000 +0200 ++++ ./libav-12/libswscale/output.c 2017-02-07 23:37:28.150180400 +0100 +@@ -295,6 +295,98 @@ + } + } + ++ ++#define output_pixel(pos, val) \ ++ if (big_endian) { \ ++ AV_WB16(pos, av_clip_uintp2(val >> shift, 10) << 6); \ ++ } else { \ ++ AV_WL16(pos, av_clip_uintp2(val >> shift, 10) << 6); \ ++ } ++ ++static void yuv2p010l1_c(const int16_t *src, ++ uint16_t *dest, int dstW, ++ int big_endian) ++{ ++ int i; ++ int shift = 5; ++ ++ for (i = 0; i < dstW; i++) { ++ int val = src[i] + (1 << (shift - 1)); ++ output_pixel(&dest[i], val); ++ } ++} ++ ++static void yuv2p010lX_c(const int16_t *filter, int filterSize, ++ const int16_t **src, uint16_t *dest, int dstW, ++ int big_endian) ++{ ++ int i, j; ++ int shift = 17; ++ ++ for (i = 0; i < dstW; i++) { ++ int val = 1 << (shift - 1); ++ ++ for (j = 0; j < filterSize; j++) ++ val += src[j][i] * filter[j]; ++ ++ output_pixel(&dest[i], val); ++ } ++} ++ ++static void yuv2p010cX_c(SwsContext *c, const int16_t *chrFilter, int chrFilterSize, ++ const int16_t **chrUSrc, const int16_t **chrVSrc, ++ uint8_t *dest8, int chrDstW) ++{ ++ uint16_t *dest = (uint16_t*)dest8; ++ int shift = 17; ++ int big_endian = c->dstFormat == AV_PIX_FMT_P010BE; ++ int i, j; ++ ++ for (i = 0; i < chrDstW; i++) { ++ int u = 1 << (shift - 1); ++ int v = 1 << (shift - 1); ++ ++ for (j = 0; j < chrFilterSize; j++) { ++ u += chrUSrc[j][i] * chrFilter[j]; ++ v += chrVSrc[j][i] * chrFilter[j]; ++ } ++ ++ output_pixel(&dest[2*i] , u); ++ output_pixel(&dest[2*i+1], v); ++ } ++} ++ ++static void yuv2p010l1_LE_c(const int16_t *src, ++ uint8_t *dest, int dstW, ++ const uint8_t *dither, int offset) ++{ ++ yuv2p010l1_c(src, (uint16_t*)dest, dstW, 0); ++} ++ ++static void yuv2p010l1_BE_c(const int16_t *src, ++ uint8_t *dest, int dstW, ++ const uint8_t *dither, int offset) ++{ ++ yuv2p010l1_c(src, (uint16_t*)dest, dstW, 1); ++} ++ ++static void yuv2p010lX_LE_c(const int16_t *filter, int filterSize, ++ const int16_t **src, uint8_t *dest, int dstW, ++ const uint8_t *dither, int offset) ++{ ++ yuv2p010lX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 0); ++} ++ ++static void yuv2p010lX_BE_c(const int16_t *filter, int filterSize, ++ const int16_t **src, uint8_t *dest, int dstW, ++ const uint8_t *dither, int offset) ++{ ++ yuv2p010lX_c(filter, filterSize, src, (uint16_t*)dest, dstW, 1); ++} ++ ++#undef output_pixel ++ ++ + #define accumulate_bit(acc, val) \ + acc <<= 1; \ + acc |= (val) >= (128 + 110) +@@ -1361,7 +1453,11 @@ + enum AVPixelFormat dstFormat = c->dstFormat; + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(dstFormat); + +- if (is16BPS(dstFormat)) { ++ if (dstFormat == AV_PIX_FMT_P010LE || dstFormat == AV_PIX_FMT_P010BE) { ++ *yuv2plane1 = isBE(dstFormat) ? yuv2p010l1_BE_c : yuv2p010l1_LE_c; ++ *yuv2planeX = isBE(dstFormat) ? yuv2p010lX_BE_c : yuv2p010lX_LE_c; ++ *yuv2nv12cX = yuv2p010cX_c; ++ } else if (is16BPS(dstFormat)) { + *yuv2planeX = isBE(dstFormat) ? yuv2planeX_16BE_c : yuv2planeX_16LE_c; + *yuv2plane1 = isBE(dstFormat) ? yuv2plane1_16BE_c : yuv2plane1_16LE_c; + } else if (is9_OR_10BPS(dstFormat)) { +diff -Naur ./libav-12.org/libswscale/utils.c ./libav-12/libswscale/utils.c +--- ./libav-12.org/libswscale/utils.c 2016-10-16 23:10:02.000000000 +0200 ++++ ./libav-12/libswscale/utils.c 2017-02-07 23:20:09.617945500 +0100 +@@ -185,8 +185,8 @@ + [AV_PIX_FMT_GBRAP16BE] = { 1, 0 }, + [AV_PIX_FMT_XYZ12BE] = { 0, 0, 1 }, + [AV_PIX_FMT_XYZ12LE] = { 0, 0, 1 }, +- [AV_PIX_FMT_P010LE] = { 1, 0 }, +- [AV_PIX_FMT_P010BE] = { 1, 0 }, ++ [AV_PIX_FMT_P010LE] = { 1, 1 }, ++ [AV_PIX_FMT_P010BE] = { 1, 1 }, + }; + + int sws_isSupportedInput(enum AVPixelFormat pix_fmt) +diff -Naur ./libav-12.org/libswscale/x86/swscale.c ./libav-12/libswscale/x86/swscale.c +--- ./libav-12.org/libswscale/x86/swscale.c 2016-10-16 23:10:02.000000000 +0200 ++++ ./libav-12/libswscale/x86/swscale.c 2017-02-07 23:15:14.000000000 +0100 +@@ -338,14 +338,14 @@ + #define ASSIGN_VSCALEX_FUNC(vscalefn, opt, do_16_case, condition_8bit) \ + switch(c->dstBpc){ \ + case 16: do_16_case; break; \ +- case 10: if (!isBE(c->dstFormat)) vscalefn = ff_yuv2planeX_10_ ## opt; break; \ ++ case 10: if (!isBE(c->dstFormat) && c->dstFormat != AV_PIX_FMT_P010LE) vscalefn = ff_yuv2planeX_10_ ## opt; break; \ + case 9: if (!isBE(c->dstFormat)) vscalefn = ff_yuv2planeX_9_ ## opt; break; \ + default: if (condition_8bit) vscalefn = ff_yuv2planeX_8_ ## opt; break; \ + } + #define ASSIGN_VSCALE_FUNC(vscalefn, opt1, opt2, opt2chk) \ + switch(c->dstBpc){ \ + case 16: if (!isBE(c->dstFormat)) vscalefn = ff_yuv2plane1_16_ ## opt1; break; \ +- case 10: if (!isBE(c->dstFormat) && opt2chk) vscalefn = ff_yuv2plane1_10_ ## opt2; break; \ ++ case 10: if (!isBE(c->dstFormat) && c->dstFormat != AV_PIX_FMT_P010LE && opt2chk) vscalefn = ff_yuv2plane1_10_ ## opt2; break; \ + case 9: if (!isBE(c->dstFormat) && opt2chk) vscalefn = ff_yuv2plane1_9_ ## opt2; break; \ + default: vscalefn = ff_yuv2plane1_8_ ## opt1; break; \ + } |