diff options
author | Sven Gothel <[email protected]> | 2017-12-25 23:53:54 +0100 |
---|---|---|
committer | Bradley Sepos <[email protected]> | 2018-05-28 23:56:18 -0400 |
commit | 2326243b027a6341285bbfee9d99bc23567e2b5e (patch) | |
tree | 518164dfa7a3d195ded39672c11d823526694c43 /contrib/ffmpeg/old/A05-p10-output-support.patch | |
parent | 6c5faa037d2955421dd7bae44f6f5f15b9b011a2 (diff) |
FFMPEG #974: Use latest FFMPEG 3.4.1 (2/2)
Patch 2/2 for https://github.com/HandBrake/HandBrake/issues/974
moving to FFMPEG 3.4.1 from LIBAV 12.2.
All patches have been moved to subfolder 'old' since they do not apply cleanly anymore.
Work has to be performed to validate whether patches are still required.
Diffstat (limited to 'contrib/ffmpeg/old/A05-p10-output-support.patch')
-rw-r--r-- | contrib/ffmpeg/old/A05-p10-output-support.patch | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/contrib/ffmpeg/old/A05-p10-output-support.patch b/contrib/ffmpeg/old/A05-p10-output-support.patch new file mode 100644 index 000000000..d6f95508a --- /dev/null +++ b/contrib/ffmpeg/old/A05-p10-output-support.patch @@ -0,0 +1,149 @@ +diff -Naur ../libav-12.org/libswscale/output.c ./libswscale/output.c +--- ../libav-12.org/libswscale/output.c 2016-10-16 23:10:02.000000000 +0200 ++++ ./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 ./libswscale/utils.c +--- ../libav-12.org/libswscale/utils.c 2016-10-16 23:10:02.000000000 +0200 ++++ ./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 ./libswscale/x86/swscale.c +--- ../libav-12.org/libswscale/x86/swscale.c 2016-10-16 23:10:02.000000000 +0200 ++++ ./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; \ + } |