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 | 115 | SwsImg in = shift_img(in_base, y); |
| 116 | 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 | 119 | const int lines = h >> vshift(in.fmt, i); |
| 120 | + av_assert1(in.data[i]); | |
| 121 | + | |
| 120 | 122 | if (in.linesize[i] == out.linesize[i]) { |
| 121 | 123 | memcpy(out.data[i], in.data[i], lines * out.linesize[i]); |
| 122 | 124 | } else { |