summaryrefslogtreecommitdiffstats
path: root/contrib/ffmpeg/old/A05-p10-output-support.patch
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2017-12-25 23:53:54 +0100
committerBradley Sepos <[email protected]>2018-05-28 23:56:18 -0400
commit2326243b027a6341285bbfee9d99bc23567e2b5e (patch)
tree518164dfa7a3d195ded39672c11d823526694c43 /contrib/ffmpeg/old/A05-p10-output-support.patch
parent6c5faa037d2955421dd7bae44f6f5f15b9b011a2 (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.patch149
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; \
+ }