<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Feature Request: ippiCopy_*_C2P2R and ippiCopy_*_P2C2R in Intel® Integrated Performance Primitives</title>
    <link>https://community.intel.com/t5/Intel-Integrated-Performance/Feature-Request-ippiCopy-C2P2R-and-ippiCopy-P2C2R/m-p/937039#M17249</link>
    <description>&lt;P&gt;First, I understand that IPP tries to reduce bloat by excluding some rare staff and functions that can be easily implemented using the existing ones. And I see it as a positive thing. However, I believe that it should support conversions from otherwise unsupported formats to a workable form, so that when I encounter such format I could still efficiently convert and use IPP.&lt;/P&gt;

&lt;P&gt;Now, one such thing is a conversion from 2-channel interleaved images to 2-channel planar (and vice versa). Such 2-channel images are sometimes used (for example for grayscale + alpha as in PNG), and are supported by other libraries (like OpenGL). IPP lacks ippiCopy_*_C2P2R and ippiCopy_*_P2C2R functions, and I couldn't find a way to bake them using other functions other than invoking ippiTranspose_&lt;SPAN class="keyword"&gt;*_C1R&lt;/SPAN&gt; on each row.&lt;/P&gt;

&lt;P&gt;Thank you in advance,&lt;BR /&gt;
	Yakov Galka&lt;BR /&gt;
	&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 12 Dec 2013 16:04:19 GMT</pubDate>
    <dc:creator>yakov_galka</dc:creator>
    <dc:date>2013-12-12T16:04:19Z</dc:date>
    <item>
      <title>Feature Request: ippiCopy_*_C2P2R and ippiCopy_*_P2C2R</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Feature-Request-ippiCopy-C2P2R-and-ippiCopy-P2C2R/m-p/937039#M17249</link>
      <description>&lt;P&gt;First, I understand that IPP tries to reduce bloat by excluding some rare staff and functions that can be easily implemented using the existing ones. And I see it as a positive thing. However, I believe that it should support conversions from otherwise unsupported formats to a workable form, so that when I encounter such format I could still efficiently convert and use IPP.&lt;/P&gt;

&lt;P&gt;Now, one such thing is a conversion from 2-channel interleaved images to 2-channel planar (and vice versa). Such 2-channel images are sometimes used (for example for grayscale + alpha as in PNG), and are supported by other libraries (like OpenGL). IPP lacks ippiCopy_*_C2P2R and ippiCopy_*_P2C2R functions, and I couldn't find a way to bake them using other functions other than invoking ippiTranspose_&lt;SPAN class="keyword"&gt;*_C1R&lt;/SPAN&gt; on each row.&lt;/P&gt;

&lt;P&gt;Thank you in advance,&lt;BR /&gt;
	Yakov Galka&lt;BR /&gt;
	&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 12 Dec 2013 16:04:19 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Feature-Request-ippiCopy-C2P2R-and-ippiCopy-P2C2R/m-p/937039#M17249</guid>
      <dc:creator>yakov_galka</dc:creator>
      <dc:date>2013-12-12T16:04:19Z</dc:date>
    </item>
    <item>
      <title>Hi Yakov,</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Feature-Request-ippiCopy-C2P2R-and-ippiCopy-P2C2R/m-p/937040#M17250</link>
      <description>&lt;P&gt;Hi Yakov,&lt;/P&gt;

&lt;P&gt;for 16s,32f &amp;amp; 64f data you can use ipps functions&amp;nbsp;with row-by-row access:&lt;/P&gt;

&lt;P&gt;/* /////////////////////////////////////////////////////////////////////////////&lt;BR /&gt;
	//&amp;nbsp; Name:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ippsCplxToReal&lt;BR /&gt;
	//&amp;nbsp; Purpose:&amp;nbsp;&amp;nbsp;&amp;nbsp; form the real and imaginary parts of the input complex vector&lt;BR /&gt;
	//&amp;nbsp; Parameters:&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; pSrc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointer to the input complex vector&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; pDstRe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointer to output vector to store the real part&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; pDstIm&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointer to output vector to store the imaginary part&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; len&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; length of the vectors, number of items&lt;BR /&gt;
	//&amp;nbsp; Return:&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; ippStsNullPtrErr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointer(s) to the data is NULL&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; ippStsSizeErr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; length of the vectors is less or equal zero&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; ippStsNoErr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; otherwise&lt;BR /&gt;
	*/&lt;/P&gt;

&lt;P&gt;IPPAPI(IppStatus, ippsCplxToReal_64fc,( const Ipp64fc* pSrc, Ipp64f* pDstRe,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ipp64f* pDstIm, int len ))&lt;BR /&gt;
	IPPAPI(IppStatus, ippsCplxToReal_32fc,( const Ipp32fc* pSrc, Ipp32f* pDstRe,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ipp32f* pDstIm, int len ))&lt;BR /&gt;
	IPPAPI(IppStatus, ippsCplxToReal_16sc,( const Ipp16sc* pSrc, Ipp16s* pDstRe,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ipp16s* pDstIm, int len ))&lt;/P&gt;

&lt;P&gt;/* /////////////////////////////////////////////////////////////////////////////&lt;BR /&gt;
	//&amp;nbsp; Name:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ippsRealToCplx&lt;BR /&gt;
	//&amp;nbsp; Purpose:&amp;nbsp;&amp;nbsp;&amp;nbsp; form complex vector from the real and imaginary components&lt;BR /&gt;
	//&amp;nbsp; Parameters:&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; pSrcRe&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointer to the input vector with real part, may be NULL&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; pSrcIm&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointer to the input vector with imaginary part, may be NULL&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; pDst&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointer to the output complex vector&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; len&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; length of the vectors&lt;BR /&gt;
	//&amp;nbsp; Return:&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; ippStsNullPtrErr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointer to the destination data is NULL&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; ippStsSizeErr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; length of the vectors is less or equal zero&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp; ippStsNoErr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; otherwise&lt;BR /&gt;
	//&lt;BR /&gt;
	//&amp;nbsp; Notes:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; one of the two input pointers may be NULL. In this case&lt;BR /&gt;
	//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the corresponding values of the output complex elements is 0&lt;BR /&gt;
	*/&lt;/P&gt;

&lt;P&gt;IPPAPI(IppStatus, ippsRealToCplx_64f,( const Ipp64f* pSrcRe,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const Ipp64f* pSrcIm, Ipp64fc* pDst, int len ))&lt;BR /&gt;
	IPPAPI(IppStatus, ippsRealToCplx_32f,( const Ipp32f* pSrcRe,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const Ipp32f* pSrcIm, Ipp32fc* pDst, int len ))&lt;BR /&gt;
	IPPAPI(IppStatus, ippsRealToCplx_16s,( const Ipp16s* pSrcRe,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; const Ipp16s* pSrcIm, Ipp16sc* pDst, int len ))&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&lt;/P&gt;

&lt;P&gt;also it's not clear which format and data type you are going to convert - there are available for example the next conversions:&lt;/P&gt;

&lt;P&gt;IPPAPI(IppStatus, ippiYCbCr422ToYCbCr420_8u_C2P2R,( const Ipp8u* pSrc, int srcStep, Ipp8u* pDstY, int dstYStep,Ipp8u* pDstCbCr,int dstCbCrStep, IppiSize roiSize ))&lt;BR /&gt;
	IPPAPI(IppStatus, ippiCbYCr422ToYCbCr420_8u_C2P2R,( const Ipp8u* pSrc, int srcStep, Ipp8u* pDstY, int dstYStep,Ipp8u* pDstCbCr,int dstCbCrStep, IppiSize roiSize ))&lt;BR /&gt;
	IPPAPI(IppStatus, ippiYCbCr420ToYCbCr422_8u_P2C2R,(const Ipp8u* pSrcY, int srcYStep,const Ipp8u* pSrcCbCr,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int srcCbCrStep, Ipp8u* pDst, int dstStep, IppiSize roiSize))&lt;BR /&gt;
	IPPAPI(IppStatus, ippiYCbCr420ToYCbCr422_Filter_8u_P2C2R,(const Ipp8u* pSrcY, int srcYStep,const Ipp8u* pSrcCbCr,&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int srcCbCrStep, Ipp8u* pDst, int dstStep, IppiSize roiSize,int layout))&lt;BR /&gt;
	and some other...&lt;/P&gt;

&lt;P&gt;regards, Igor&lt;/P&gt;</description>
      <pubDate>Fri, 13 Dec 2013 16:23:08 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Feature-Request-ippiCopy-C2P2R-and-ippiCopy-P2C2R/m-p/937040#M17250</guid>
      <dc:creator>Igor_A_Intel</dc:creator>
      <dc:date>2013-12-13T16:23:08Z</dc:date>
    </item>
    <item>
      <title>Hi Igor,</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Feature-Request-ippiCopy-C2P2R-and-ippiCopy-P2C2R/m-p/937041#M17251</link>
      <description>&lt;P&gt;Hi Igor,&lt;/P&gt;

&lt;P&gt;Thank you for the CplxToReal/RealToCplx tip. It will indeed work for the 2, 4, and 8 byte types.&lt;/P&gt;

&lt;P&gt;Yet, we do use images of 8-bit (most frequently), 16-bit (less frequently) and 32-bit (not for this specific conversion, but we are likely to do this in the future) data types.&lt;/P&gt;

&lt;P&gt;Unfortunately the YCbCr422ToYCbCr420/YCbCr420ToYCbCr422 family you propose do a downscaling/upscaling in the vertical direction, which makes them inappropriate for the conversion I need. For example,&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static const int w = 4, h = 4;&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;uint8_t src[w*h*2];&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;for(int i = 0; i &amp;lt; w*h*2; ++i)&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;src&lt;I&gt; = i;&lt;/I&gt;&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;uint8_t dest1[w*h], dest2[w*h];&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;memset(dest1, 0xff, sizeof(dest1));&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;memset(dest2, 0xff, sizeof(dest2));&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;IppiSize roi = { w, h };&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;ippiYCbCr422ToYCbCr420_8u_C2P2R(src, w*2, dest1, w, dest2, w, roi);&lt;/P&gt;

&lt;P&gt;The contents of dest1 is, correctly,&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00 02 04 06&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;08 0A 0C 0E&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;10 12 14 16&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;18 1A 1C 1E&lt;/P&gt;

&lt;P&gt;whereas the contents of dest2 is&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 01 03 05 07&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;11 13 15 17&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;FF FF FF FF&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; FF FF FF FF&lt;/P&gt;

&lt;P&gt;or&lt;/P&gt;

&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 01 03 05 07&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; FF FF FF FF&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp; &amp;nbsp;11 13 15 17&lt;BR /&gt;
	&amp;nbsp;&amp;nbsp;&amp;nbsp; FF FF FF FF&lt;/P&gt;

&lt;P&gt;if I double the third stride.&lt;/P&gt;

&lt;P&gt;Thanks,&lt;BR /&gt;
	Yakov&lt;/P&gt;</description>
      <pubDate>Tue, 17 Dec 2013 14:21:26 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Feature-Request-ippiCopy-C2P2R-and-ippiCopy-P2C2R/m-p/937041#M17251</guid>
      <dc:creator>yakov_galka</dc:creator>
      <dc:date>2013-12-17T14:21:26Z</dc:date>
    </item>
    <item>
      <title>Hi Yakov,</title>
      <link>https://community.intel.com/t5/Intel-Integrated-Performance/Feature-Request-ippiCopy-C2P2R-and-ippiCopy-P2C2R/m-p/937042#M17252</link>
      <description>&lt;P&gt;Hi Yakov,&lt;/P&gt;

&lt;P&gt;ok, I see, so currently you don't have an appropriate workaround for C2P2 &amp;amp; P2C2 for 8u. We'll consider this feature request for one of the future releases.&lt;/P&gt;

&lt;P&gt;regards, Igor&lt;/P&gt;</description>
      <pubDate>Wed, 18 Dec 2013 08:37:42 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Integrated-Performance/Feature-Request-ippiCopy-C2P2R-and-ippiCopy-P2C2R/m-p/937042#M17252</guid>
      <dc:creator>Igor_A_Intel</dc:creator>
      <dc:date>2013-12-18T08:37:42Z</dc:date>
    </item>
  </channel>
</rss>

