diff options
-rw-r--r-- | src/gallium/auxiliary/util/u_video.h | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/util/u_video.h b/src/gallium/auxiliary/util/u_video.h index 9196afc11be..7e743de253e 100644 --- a/src/gallium/auxiliary/util/u_video.h +++ b/src/gallium/auxiliary/util/u_video.h @@ -130,6 +130,43 @@ u_copy_yv12_to_nv12(void *const *destination_data, } static inline void +u_copy_yv12_img_to_nv12_surf(ubyte *const *src, + ubyte *dst, + unsigned width, + unsigned height, + unsigned src_stride, + unsigned dst_stride, + int field) +{ + if (field == 0) { + ubyte *src_0 = src[field]; + for (int i = 0; i < height ; i++) { + memcpy(dst, src_0, width); + dst += dst_stride; + src_0 += src_stride; + } + } else if (field == 1) { + const ubyte *src_1 = src[field]; + const ubyte *src_2 = src[field+1]; + bool odd = false; + for (unsigned i = 0; i < height ; i++) { + for (unsigned j = 0; j < width*2 ; j++) { + if (odd == false) { + dst[j] = src_1[j/2]; + odd = true; + } else { + dst[j] = src_2[j/2]; + odd = false; + } + } + dst += dst_stride; + src_1 += src_stride; + src_2 += src_stride; + } + } +} + +static inline void u_copy_swap422_packed(void *const *destination_data, uint32_t const *destination_pitches, int src_plane, int src_field, |