예제 #1
0
 void BgrToBgra(const uint8_t *bgr, size_t width, size_t height, size_t bgrStride, uint8_t *bgra, size_t bgraStride, uint8_t alpha)
 {
     for(size_t row = 1; row < height; ++row)
     {
         BgrToBgra(bgr, width, bgra, true, false, alpha);
         bgr += bgrStride;
         bgra += bgraStride;
     }
     BgrToBgra(bgr, width, bgra, true, true, alpha);
 }
예제 #2
0
파일: SimdFrame.hpp 프로젝트: pozdneev/Simd
	template <class A> SIMD_INLINE void Convert(const Frame<A> & src, Frame<A> & dst)
	{
		assert(EqualSize(src, dst) && src.format && dst.format);

		if (src.format == dst.format)
		{
			Copy(src, dst);
			return;
		}

		switch (src.format)
		{
		case Frame<A>::Nv12:
			switch (dst.format)
			{
			case Frame<A>::Yuv420p:
				Copy(src.planes[0], dst.planes[0]);
				DeinterleaveUv(src.planes[1], dst.planes[1], dst.planes[2]);
				break;
			case Frame<A>::Bgra32:
			{
				View<A> u(src.Size(), View<A>::Gray8), v(src.Size(), View<A>::Gray8);
				DeinterleaveUv(src.planes[1], u, v);
				Yuv420pToBgra(src.planes[0], u, v, dst.planes[0]);
				break;
			}
			case Frame<A>::Bgr24:
			{
				View<A> u(src.Size(), View<A>::Gray8), v(src.Size(), View<A>::Gray8);
				DeinterleaveUv(src.planes[1], u, v);
				Yuv420pToBgr(src.planes[0], u, v, dst.planes[0]);
				break;
			}
			case Frame<A>::Gray8:
				Copy(src.planes[0], dst.planes[0]);
				break;
			default:
				assert(0);
			}
			break;

		case Frame<A>::Yuv420p:
			switch (dst.format)
			{
			case Frame<A>::Nv12:
				Copy(src.planes[0], dst.planes[0]);
				InterleaveUv(src.planes[1], src.planes[2], dst.planes[1]);
				break;
			case Frame<A>::Bgra32:
				Yuv420pToBgra(src.planes[0], src.planes[1], src.planes[2], dst.planes[0]);
				break;
			case Frame<A>::Bgr24:
				Yuv420pToBgr(src.planes[0], src.planes[1], src.planes[2], dst.planes[0]);
				break;
			case Frame<A>::Gray8:
				Copy(src.planes[0], dst.planes[0]);
				break;
			default:
				assert(0);
			}
			break;

		case Frame<A>::Bgra32:
			switch (dst.format)
			{
			case Frame<A>::Nv12:
			{
				View<A> u(src.Size(), View<A>::Gray8), v(src.Size(), View<A>::Gray8);
				BgraToYuv420p(src.planes[0], dst.planes[0], u, v);
				InterleaveUv(u, v, dst.planes[1]);
				break;
			}
			case Frame<A>::Yuv420p:
				BgraToYuv420p(src.planes[0], dst.planes[0], dst.planes[1], dst.planes[2]);
				break;
			case Frame<A>::Bgr24:
				BgraToBgr(src.planes[0], dst.planes[0]);
				break;
			case Frame<A>::Gray8:
				BgraToGray(src.planes[0], dst.planes[0]);
				break;
			default:
				assert(0);
			}
			break;

		case Frame<A>::Bgr24:
			switch (dst.format)
			{
			case Frame<A>::Nv12:
			{
				View<A> u(src.Size(), View<A>::Gray8), v(src.Size(), View<A>::Gray8);
				BgrToYuv420p(src.planes[0], dst.planes[0], u, v);
				InterleaveUv(u, v, dst.planes[1]);
				break;
			}
			case Frame<A>::Yuv420p:
				BgrToYuv420p(src.planes[0], dst.planes[0], dst.planes[1], dst.planes[2]);
				break;
			case Frame<A>::Bgra32:
				BgrToBgra(src.planes[0], dst.planes[0]);
				break;
			case Frame<A>::Gray8:
				BgrToGray(src.planes[0], dst.planes[0]);
				break;
			default:
				assert(0);
			}
			break;

		case Frame<A>::Gray8:
			switch (dst.format)
			{
			case Frame<A>::Nv12:
				Copy(src.planes[0], dst.planes[0]);
				Fill(dst.planes[1], 128);
			case Frame<A>::Yuv420p:
				Copy(src.planes[0], dst.planes[0]);
				Fill(dst.planes[1], 128);
				Fill(dst.planes[2], 128);
				break;
			case Frame<A>::Bgra32:
				GrayToBgra(src.planes[0], dst.planes[0]);
				break;
			case Frame<A>::Bgr24:
				GrayToBgr(src.planes[0], dst.planes[0]);
				break;
			default:
				assert(0);
			}
			break;

		default:
			assert(0);
		}
	}