#include "common.h"
#include <stdlib.h>
+#include <unistd.h>
#ifdef __DARWIN__
#endif
+
+void swab2( const void *from, void *to, int n )
+{
+#if defined(USE_SSE)
+#define SWAB_STEP 16
+ __asm__ volatile
+ (
+ "loop_start: \n\t"
+
+ /* load */
+ "movdqa 0(%[from]), %%xmm0 \n\t"
+ "add $0x10, %[from] \n\t"
+
+ /* duplicate to temp registers */
+ "movdqa %%xmm0, %%xmm1 \n\t"
+
+ /* shift right temp register */
+ "psrlw $8, %%xmm1 \n\t"
+
+ /* shift left main register */
+ "psllw $8, %%xmm0 \n\t"
+
+ /* compose them back */
+ "por %%xmm0, %%xmm1 \n\t"
+
+ /* save */
+ "movdqa %%xmm1, 0(%[to]) \n\t"
+ "add $0x10, %[to] \n\t"
+
+ "dec %[cnt] \n\t"
+ "jnz loop_start \n\t"
+
+ :
+ : [from]"r"(from), [to]"r"(to), [cnt]"r"(n / SWAB_STEP)
+ : "xmm0", "xmm1"
+ );
+
+ from = (unsigned char*) from + n - (n % SWAB_STEP);
+ to = (unsigned char*) to + n - (n % SWAB_STEP);
+ n = (n % SWAB_STEP);
+#endif
+ swab(from, to, n);
+};
char* getCString( DLString aDLString );
void freeCString( char* aCString );
void freeDLString( DLString aDLString );
+void swab2( const void *from, void *to, int n );
#endif // DECKLINK_COMMON_H
// Normal non-keyer playout - needs byte swapping
if ( !progressive && m_displayMode->GetFieldDominance() == bmdUpperFieldFirst )
// convert lower field first to top field first
- swab( (char*) image, (char*) buffer + stride, stride * ( height - 1 ) );
+ swab2( (char*) image, (char*) buffer + stride, stride * ( height - 1 ) );
else
- swab( (char*) image, (char*) buffer, stride * height );
+ swab2( (char*) image, (char*) buffer, stride * height );
}
else if ( !mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "test_image" ) )
{
for ( int i = 1; i < m_vancLines + 1; i++ )
{
if ( vanc->GetBufferForVerticalBlankingLine( i, &buffer ) == S_OK )
- swab( (char*) buffer, (char*) image + ( i - 1 ) * video->GetRowBytes(), video->GetRowBytes() );
+ swab2( (char*) buffer, (char*) image + ( i - 1 ) * video->GetRowBytes(), video->GetRowBytes() );
else
mlt_log_debug( getProducer(), "failed capture vanc line %d\n", i );
}
if ( image && buffer )
{
size = video->GetRowBytes() * video->GetHeight();
- swab( (char*) buffer, (char*) image + m_vancLines * video->GetRowBytes(), size );
+ swab2( (char*) buffer, (char*) image + m_vancLines * video->GetRowBytes(), size );
mlt_frame_set_image( frame, (uint8_t*) image, size, mlt_pool_release );
}
else if ( image )