The current loop only works if the input and output have the same number of planes. However, with the new scaling logic, we can also optimize into a noop the case where the input has extra unneeded planes. For the memcpy fallback to work in these cases we have to instead check if the *output* pointer is set, rather than the input pointer.
Unified · Split
| @@ -115,8 +115,10 @@ static void run_copy(const SwsImg *out_base, const SwsImg *in_base, · 114 unmodified lines | |||
| 115 | SwsImg in = shift_img(in_base, y); | 115 | SwsImg in = shift_img(in_base, y); |
| 116 | SwsImg out = shift_img(out_base, y); | 116 | SwsImg out = shift_img(out_base, y); |
| 117 | 117 | ||
| 118 | for (int i = 0; i < FF_ARRAY_ELEMS(in.data) && in.data[i]; i++) { | 118 | for (int i = 0; i < FF_ARRAY_ELEMS(out.data) && out.data[i]; i++) { |
| 119 | const int lines = h >> vshift(in.fmt, i); | 119 | const int lines = h >> vshift(in.fmt, i); |
| 120 | av_assert1(in.data[i]); | ||
| 121 | |||
| 120 | if (in.linesize[i] == out.linesize[i]) { | 122 | if (in.linesize[i] == out.linesize[i]) { |
| 121 | memcpy(out.data[i], in.data[i], lines * out.linesize[i]); | 123 | memcpy(out.data[i], in.data[i], lines * out.linesize[i]); |
| 122 | } else { | 124 | } else { |