@ -44,14 +44,6 @@ typedef struct {
struct video_mbuf gb_buffers ;
struct video_mmap gb_buf ;
int gb_frame ;
/* ATI All In Wonder specific stuff */
/* XXX: remove and merge in libavcodec/imgconvert.c */
int aiw_enabled ;
int deint ;
int halfw ;
uint8_t * src_mem ;
uint8_t * lum_m4_mem ;
} VideoData ;
struct {
@ -70,10 +62,6 @@ struct {
} ;
static int aiw_init ( VideoData * s ) ;
static int aiw_read_picture ( VideoData * s , uint8_t * data ) ;
static int aiw_close ( VideoData * s ) ;
static int grab_read_header ( AVFormatContext * s1 , AVFormatParameters * ap )
{
VideoData * s = s1 - > priv_data ;
@ -206,16 +194,6 @@ static int grab_read_header(AVFormatContext *s1, AVFormatParameters *ap)
s - > time_frame = av_gettime ( ) * s - > frame_rate / s - > frame_rate_base ;
s - > use_mmap = 0 ;
/* ATI All In Wonder automatic activation */
if ( ! strcmp ( s - > video_cap . name , " Km " ) ) {
if ( aiw_init ( s ) < 0 )
goto fail ;
s - > aiw_enabled = 1 ;
/* force 420P format because conversion from YUV422 to YUV420P
is done in this driver ( ugly ) */
s - > frame_format = VIDEO_PALETTE_YUV420P ;
}
} else {
s - > video_buf = mmap ( 0 , s - > gb_buffers . size , PROT_READ | PROT_WRITE , MAP_SHARED , video_fd , 0 ) ;
if ( ( unsigned char * ) - 1 = = s - > video_buf ) {
@ -339,9 +317,7 @@ static int grab_read_packet(AVFormatContext *s1, AVPacket *pkt)
pkt - > pts = curtime ;
/* read one frame */
if ( s - > aiw_enabled ) {
return aiw_read_picture ( s , pkt - > data ) ;
} else if ( s - > use_mmap ) {
if ( s - > use_mmap ) {
return v4l_mm_read_picture ( s , pkt - > data ) ;
} else {
if ( read ( s - > fd , pkt - > data , pkt - > size ) ! = pkt - > size )
@ -354,9 +330,6 @@ static int grab_read_close(AVFormatContext *s1)
{
VideoData * s = s1 - > priv_data ;
if ( s - > aiw_enabled )
aiw_close ( s ) ;
if ( s - > use_mmap )
munmap ( s - > video_buf , s - > gb_buffers . size ) ;
@ -379,474 +352,3 @@ AVInputFormat v4l_demuxer = {
grab_read_close ,
. flags = AVFMT_NOFILE ,
} ;
/* All in Wonder specific stuff */
/* XXX: remove and merge in libavcodec/imgconvert.c */
static int aiw_init ( VideoData * s )
{
int width , height ;
width = s - > width ;
height = s - > height ;
if ( ( width = = s - > video_cap . maxwidth & & height = = s - > video_cap . maxheight ) | |
( width = = s - > video_cap . maxwidth & & height = = s - > video_cap . maxheight * 2 ) | |
( width = = s - > video_cap . maxwidth / 2 & & height = = s - > video_cap . maxheight ) ) {
s - > deint = 0 ;
s - > halfw = 0 ;
if ( height = = s - > video_cap . maxheight * 2 ) s - > deint = 1 ;
if ( width = = s - > video_cap . maxwidth / 2 ) s - > halfw = 1 ;
} else {
av_log ( NULL , AV_LOG_ERROR , " \n Incorrect Grab Size Supplied - Supported Sizes Are: \n " ) ;
av_log ( NULL , AV_LOG_ERROR , " %dx%d %dx%d %dx%d \n \n " ,
s - > video_cap . maxwidth , s - > video_cap . maxheight ,
s - > video_cap . maxwidth , s - > video_cap . maxheight * 2 ,
s - > video_cap . maxwidth / 2 , s - > video_cap . maxheight ) ;
goto fail ;
}
if ( s - > halfw = = 0 ) {
s - > src_mem = av_malloc ( s - > width * 2 ) ;
} else {
s - > src_mem = av_malloc ( s - > width * 4 ) ;
}
if ( ! s - > src_mem ) goto fail ;
s - > lum_m4_mem = av_malloc ( s - > width ) ;
if ( ! s - > lum_m4_mem )
goto fail ;
return 0 ;
fail :
av_freep ( & s - > src_mem ) ;
av_freep ( & s - > lum_m4_mem ) ;
return - 1 ;
}
# ifdef HAVE_MMX
# include "i386/mmx.h"
# define LINE_WITH_UV \
movq_m2r ( ptr [ 0 ] , mm0 ) ; \
movq_m2r ( ptr [ 8 ] , mm1 ) ; \
movq_r2r ( mm0 , mm4 ) ; \
punpcklbw_r2r ( mm1 , mm0 ) ; \
punpckhbw_r2r ( mm1 , mm4 ) ; \
movq_r2r ( mm0 , mm5 ) ; \
punpcklbw_r2r ( mm4 , mm0 ) ; \
punpckhbw_r2r ( mm4 , mm5 ) ; \
movq_r2r ( mm0 , mm1 ) ; \
punpcklbw_r2r ( mm5 , mm1 ) ; \
movq_r2m ( mm1 , lum [ 0 ] ) ; \
movq_m2r ( ptr [ 16 ] , mm2 ) ; \
movq_m2r ( ptr [ 24 ] , mm1 ) ; \
movq_r2r ( mm2 , mm4 ) ; \
punpcklbw_r2r ( mm1 , mm2 ) ; \
punpckhbw_r2r ( mm1 , mm4 ) ; \
movq_r2r ( mm2 , mm3 ) ; \
punpcklbw_r2r ( mm4 , mm2 ) ; \
punpckhbw_r2r ( mm4 , mm3 ) ; \
movq_r2r ( mm2 , mm1 ) ; \
punpcklbw_r2r ( mm3 , mm1 ) ; \
movq_r2m ( mm1 , lum [ 8 ] ) ; \
punpckhdq_r2r ( mm2 , mm0 ) ; \
punpckhdq_r2r ( mm3 , mm5 ) ; \
movq_r2m ( mm0 , cb [ 0 ] ) ; \
movq_r2m ( mm5 , cr [ 0 ] ) ;
# define LINE_NO_UV \
movq_m2r ( ptr [ 0 ] , mm0 ) ; \
movq_m2r ( ptr [ 8 ] , mm1 ) ; \
movq_r2r ( mm0 , mm4 ) ; \
punpcklbw_r2r ( mm1 , mm0 ) ; \
punpckhbw_r2r ( mm1 , mm4 ) ; \
movq_r2r ( mm0 , mm5 ) ; \
punpcklbw_r2r ( mm4 , mm0 ) ; \
punpckhbw_r2r ( mm4 , mm5 ) ; \
movq_r2r ( mm0 , mm1 ) ; \
punpcklbw_r2r ( mm5 , mm1 ) ; \
movq_r2m ( mm1 , lum [ 0 ] ) ; \
movq_m2r ( ptr [ 16 ] , mm2 ) ; \
movq_m2r ( ptr [ 24 ] , mm1 ) ; \
movq_r2r ( mm2 , mm4 ) ; \
punpcklbw_r2r ( mm1 , mm2 ) ; \
punpckhbw_r2r ( mm1 , mm4 ) ; \
movq_r2r ( mm2 , mm3 ) ; \
punpcklbw_r2r ( mm4 , mm2 ) ; \
punpckhbw_r2r ( mm4 , mm3 ) ; \
movq_r2r ( mm2 , mm1 ) ; \
punpcklbw_r2r ( mm3 , mm1 ) ; \
movq_r2m ( mm1 , lum [ 8 ] ) ;
# define LINE_WITHUV_AVG \
movq_m2r ( ptr [ 0 ] , mm0 ) ; \
movq_m2r ( ptr [ 8 ] , mm1 ) ; \
movq_r2r ( mm0 , mm4 ) ; \
punpcklbw_r2r ( mm1 , mm0 ) ; \
punpckhbw_r2r ( mm1 , mm4 ) ; \
movq_r2r ( mm0 , mm5 ) ; \
punpcklbw_r2r ( mm4 , mm0 ) ; \
punpckhbw_r2r ( mm4 , mm5 ) ; \
movq_r2r ( mm0 , mm1 ) ; \
movq_r2r ( mm5 , mm2 ) ; \
punpcklbw_r2r ( mm7 , mm1 ) ; \
punpcklbw_r2r ( mm7 , mm2 ) ; \
paddw_r2r ( mm6 , mm1 ) ; \
paddw_r2r ( mm2 , mm1 ) ; \
psraw_i2r ( 1 , mm1 ) ; \
packuswb_r2r ( mm7 , mm1 ) ; \
movd_r2m ( mm1 , lum [ 0 ] ) ; \
movq_m2r ( ptr [ 16 ] , mm2 ) ; \
movq_m2r ( ptr [ 24 ] , mm1 ) ; \
movq_r2r ( mm2 , mm4 ) ; \
punpcklbw_r2r ( mm1 , mm2 ) ; \
punpckhbw_r2r ( mm1 , mm4 ) ; \
movq_r2r ( mm2 , mm3 ) ; \
punpcklbw_r2r ( mm4 , mm2 ) ; \
punpckhbw_r2r ( mm4 , mm3 ) ; \
movq_r2r ( mm2 , mm1 ) ; \
movq_r2r ( mm3 , mm4 ) ; \
punpcklbw_r2r ( mm7 , mm1 ) ; \
punpcklbw_r2r ( mm7 , mm4 ) ; \
paddw_r2r ( mm6 , mm1 ) ; \
paddw_r2r ( mm4 , mm1 ) ; \
psraw_i2r ( 1 , mm1 ) ; \
packuswb_r2r ( mm7 , mm1 ) ; \
movd_r2m ( mm1 , lum [ 4 ] ) ; \
punpckhbw_r2r ( mm7 , mm0 ) ; \
punpckhbw_r2r ( mm7 , mm2 ) ; \
paddw_r2r ( mm6 , mm0 ) ; \
paddw_r2r ( mm2 , mm0 ) ; \
psraw_i2r ( 1 , mm0 ) ; \
packuswb_r2r ( mm7 , mm0 ) ; \
punpckhbw_r2r ( mm7 , mm5 ) ; \
punpckhbw_r2r ( mm7 , mm3 ) ; \
paddw_r2r ( mm6 , mm5 ) ; \
paddw_r2r ( mm3 , mm5 ) ; \
psraw_i2r ( 1 , mm5 ) ; \
packuswb_r2r ( mm7 , mm5 ) ; \
movd_r2m ( mm0 , cb [ 0 ] ) ; \
movd_r2m ( mm5 , cr [ 0 ] ) ;
# define LINE_NOUV_AVG \
movq_m2r ( ptr [ 0 ] , mm0 ) ; \
movq_m2r ( ptr [ 8 ] , mm1 ) ; \
pand_r2r ( mm5 , mm0 ) ; \
pand_r2r ( mm5 , mm1 ) ; \
pmaddwd_r2r ( mm6 , mm0 ) ; \
pmaddwd_r2r ( mm6 , mm1 ) ; \
packssdw_r2r ( mm1 , mm0 ) ; \
paddw_r2r ( mm6 , mm0 ) ; \
psraw_i2r ( 1 , mm0 ) ; \
movq_m2r ( ptr [ 16 ] , mm2 ) ; \
movq_m2r ( ptr [ 24 ] , mm3 ) ; \
pand_r2r ( mm5 , mm2 ) ; \
pand_r2r ( mm5 , mm3 ) ; \
pmaddwd_r2r ( mm6 , mm2 ) ; \
pmaddwd_r2r ( mm6 , mm3 ) ; \
packssdw_r2r ( mm3 , mm2 ) ; \
paddw_r2r ( mm6 , mm2 ) ; \
psraw_i2r ( 1 , mm2 ) ; \
packuswb_r2r ( mm2 , mm0 ) ; \
movq_r2m ( mm0 , lum [ 0 ] ) ;
# define DEINT_LINE_LUM(ptroff) \
movd_m2r ( lum_m4 [ ( ptroff ) ] , mm0 ) ; \
movd_m2r ( lum_m3 [ ( ptroff ) ] , mm1 ) ; \
movd_m2r ( lum_m2 [ ( ptroff ) ] , mm2 ) ; \
movd_m2r ( lum_m1 [ ( ptroff ) ] , mm3 ) ; \
movd_m2r ( lum [ ( ptroff ) ] , mm4 ) ; \
punpcklbw_r2r ( mm7 , mm0 ) ; \
movd_r2m ( mm2 , lum_m4 [ ( ptroff ) ] ) ; \
punpcklbw_r2r ( mm7 , mm1 ) ; \
punpcklbw_r2r ( mm7 , mm2 ) ; \
punpcklbw_r2r ( mm7 , mm3 ) ; \
punpcklbw_r2r ( mm7 , mm4 ) ; \
psllw_i2r ( 2 , mm1 ) ; \
psllw_i2r ( 1 , mm2 ) ; \
paddw_r2r ( mm6 , mm1 ) ; \
psllw_i2r ( 2 , mm3 ) ; \
paddw_r2r ( mm2 , mm1 ) ; \
paddw_r2r ( mm4 , mm0 ) ; \
paddw_r2r ( mm3 , mm1 ) ; \
psubusw_r2r ( mm0 , mm1 ) ; \
psrlw_i2r ( 3 , mm1 ) ; \
packuswb_r2r ( mm7 , mm1 ) ; \
movd_r2m ( mm1 , lum_m2 [ ( ptroff ) ] ) ;
# else
# include "dsputil.h"
# define LINE_WITH_UV \
lum [ 0 ] = ptr [ 0 ] ; lum [ 1 ] = ptr [ 2 ] ; lum [ 2 ] = ptr [ 4 ] ; lum [ 3 ] = ptr [ 6 ] ; \
cb [ 0 ] = ptr [ 1 ] ; cb [ 1 ] = ptr [ 5 ] ; \
cr [ 0 ] = ptr [ 3 ] ; cr [ 1 ] = ptr [ 7 ] ; \
lum [ 4 ] = ptr [ 8 ] ; lum [ 5 ] = ptr [ 10 ] ; lum [ 6 ] = ptr [ 12 ] ; lum [ 7 ] = ptr [ 14 ] ; \
cb [ 2 ] = ptr [ 9 ] ; cb [ 3 ] = ptr [ 13 ] ; \
cr [ 2 ] = ptr [ 11 ] ; cr [ 3 ] = ptr [ 15 ] ; \
lum [ 8 ] = ptr [ 16 ] ; lum [ 9 ] = ptr [ 18 ] ; lum [ 10 ] = ptr [ 20 ] ; lum [ 11 ] = ptr [ 22 ] ; \
cb [ 4 ] = ptr [ 17 ] ; cb [ 5 ] = ptr [ 21 ] ; \
cr [ 4 ] = ptr [ 19 ] ; cr [ 5 ] = ptr [ 23 ] ; \
lum [ 12 ] = ptr [ 24 ] ; lum [ 13 ] = ptr [ 26 ] ; lum [ 14 ] = ptr [ 28 ] ; lum [ 15 ] = ptr [ 30 ] ; \
cb [ 6 ] = ptr [ 25 ] ; cb [ 7 ] = ptr [ 29 ] ; \
cr [ 6 ] = ptr [ 27 ] ; cr [ 7 ] = ptr [ 31 ] ;
# define LINE_NO_UV \
lum [ 0 ] = ptr [ 0 ] ; lum [ 1 ] = ptr [ 2 ] ; lum [ 2 ] = ptr [ 4 ] ; lum [ 3 ] = ptr [ 6 ] ; \
lum [ 4 ] = ptr [ 8 ] ; lum [ 5 ] = ptr [ 10 ] ; lum [ 6 ] = ptr [ 12 ] ; lum [ 7 ] = ptr [ 14 ] ; \
lum [ 8 ] = ptr [ 16 ] ; lum [ 9 ] = ptr [ 18 ] ; lum [ 10 ] = ptr [ 20 ] ; lum [ 11 ] = ptr [ 22 ] ; \
lum [ 12 ] = ptr [ 24 ] ; lum [ 13 ] = ptr [ 26 ] ; lum [ 14 ] = ptr [ 28 ] ; lum [ 15 ] = ptr [ 30 ] ;
# define LINE_WITHUV_AVG \
sum = ( ptr [ 0 ] + ptr [ 2 ] + 1 ) > > 1 ; lum [ 0 ] = sum ; \
sum = ( ptr [ 4 ] + ptr [ 6 ] + 1 ) > > 1 ; lum [ 1 ] = sum ; \
sum = ( ptr [ 1 ] + ptr [ 5 ] + 1 ) > > 1 ; cb [ 0 ] = sum ; \
sum = ( ptr [ 3 ] + ptr [ 7 ] + 1 ) > > 1 ; cr [ 0 ] = sum ; \
sum = ( ptr [ 8 ] + ptr [ 10 ] + 1 ) > > 1 ; lum [ 2 ] = sum ; \
sum = ( ptr [ 12 ] + ptr [ 14 ] + 1 ) > > 1 ; lum [ 3 ] = sum ; \
sum = ( ptr [ 9 ] + ptr [ 13 ] + 1 ) > > 1 ; cb [ 1 ] = sum ; \
sum = ( ptr [ 11 ] + ptr [ 15 ] + 1 ) > > 1 ; cr [ 1 ] = sum ; \
sum = ( ptr [ 16 ] + ptr [ 18 ] + 1 ) > > 1 ; lum [ 4 ] = sum ; \
sum = ( ptr [ 20 ] + ptr [ 22 ] + 1 ) > > 1 ; lum [ 5 ] = sum ; \
sum = ( ptr [ 17 ] + ptr [ 21 ] + 1 ) > > 1 ; cb [ 2 ] = sum ; \
sum = ( ptr [ 19 ] + ptr [ 23 ] + 1 ) > > 1 ; cr [ 2 ] = sum ; \
sum = ( ptr [ 24 ] + ptr [ 26 ] + 1 ) > > 1 ; lum [ 6 ] = sum ; \
sum = ( ptr [ 28 ] + ptr [ 30 ] + 1 ) > > 1 ; lum [ 7 ] = sum ; \
sum = ( ptr [ 25 ] + ptr [ 29 ] + 1 ) > > 1 ; cb [ 3 ] = sum ; \
sum = ( ptr [ 27 ] + ptr [ 31 ] + 1 ) > > 1 ; cr [ 3 ] = sum ;
# define LINE_NOUV_AVG \
sum = ( ptr [ 0 ] + ptr [ 2 ] + 1 ) > > 1 ; lum [ 0 ] = sum ; \
sum = ( ptr [ 4 ] + ptr [ 6 ] + 1 ) > > 1 ; lum [ 1 ] = sum ; \
sum = ( ptr [ 8 ] + ptr [ 10 ] + 1 ) > > 1 ; lum [ 2 ] = sum ; \
sum = ( ptr [ 12 ] + ptr [ 14 ] + 1 ) > > 1 ; lum [ 3 ] = sum ; \
sum = ( ptr [ 16 ] + ptr [ 18 ] + 1 ) > > 1 ; lum [ 4 ] = sum ; \
sum = ( ptr [ 20 ] + ptr [ 22 ] + 1 ) > > 1 ; lum [ 5 ] = sum ; \
sum = ( ptr [ 24 ] + ptr [ 26 ] + 1 ) > > 1 ; lum [ 6 ] = sum ; \
sum = ( ptr [ 28 ] + ptr [ 30 ] + 1 ) > > 1 ; lum [ 7 ] = sum ;
# define DEINT_LINE_LUM(ptroff) \
sum = ( - lum_m4 [ ( ptroff ) ] + ( lum_m3 [ ( ptroff ) ] < < 2 ) + ( lum_m2 [ ( ptroff ) ] < < 1 ) + ( lum_m1 [ ( ptroff ) ] < < 2 ) - lum [ ( ptroff ) ] ) ; \
lum_m4 [ ( ptroff ) ] = lum_m2 [ ( ptroff ) ] ; \
lum_m2 [ ( ptroff ) ] = cm [ ( sum + 4 ) > > 3 ] ; \
sum = ( - lum_m4 [ ( ptroff ) + 1 ] + ( lum_m3 [ ( ptroff ) + 1 ] < < 2 ) + ( lum_m2 [ ( ptroff ) + 1 ] < < 1 ) + ( lum_m1 [ ( ptroff ) + 1 ] < < 2 ) - lum [ ( ptroff ) + 1 ] ) ; \
lum_m4 [ ( ptroff ) + 1 ] = lum_m2 [ ( ptroff ) + 1 ] ; \
lum_m2 [ ( ptroff ) + 1 ] = cm [ ( sum + 4 ) > > 3 ] ; \
sum = ( - lum_m4 [ ( ptroff ) + 2 ] + ( lum_m3 [ ( ptroff ) + 2 ] < < 2 ) + ( lum_m2 [ ( ptroff ) + 2 ] < < 1 ) + ( lum_m1 [ ( ptroff ) + 2 ] < < 2 ) - lum [ ( ptroff ) + 2 ] ) ; \
lum_m4 [ ( ptroff ) + 2 ] = lum_m2 [ ( ptroff ) + 2 ] ; \
lum_m2 [ ( ptroff ) + 2 ] = cm [ ( sum + 4 ) > > 3 ] ; \
sum = ( - lum_m4 [ ( ptroff ) + 3 ] + ( lum_m3 [ ( ptroff ) + 3 ] < < 2 ) + ( lum_m2 [ ( ptroff ) + 3 ] < < 1 ) + ( lum_m1 [ ( ptroff ) + 3 ] < < 2 ) - lum [ ( ptroff ) + 3 ] ) ; \
lum_m4 [ ( ptroff ) + 3 ] = lum_m2 [ ( ptroff ) + 3 ] ; \
lum_m2 [ ( ptroff ) + 3 ] = cm [ ( sum + 4 ) > > 3 ] ;
# endif
/* Read two fields separately. */
static int aiw_read_picture ( VideoData * s , uint8_t * data )
{
uint8_t * ptr , * lum , * cb , * cr ;
int h ;
# ifndef HAVE_MMX
int sum ;
# endif
uint8_t * src = s - > src_mem ;
uint8_t * ptrend = & src [ s - > width * 2 ] ;
lum = data ;
cb = & lum [ s - > width * s - > height ] ;
cr = & cb [ ( s - > width * s - > height ) / 4 ] ;
if ( s - > deint = = 0 & & s - > halfw = = 0 ) {
while ( read ( s - > fd , src , s - > width * 2 ) < 0 ) {
usleep ( 100 ) ;
}
for ( h = 0 ; h < s - > height - 2 ; h + = 2 ) {
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 , cb + = 8 , cr + = 8 ) {
LINE_WITH_UV
}
read ( s - > fd , src , s - > width * 2 ) ;
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 ) {
LINE_NO_UV
}
read ( s - > fd , src , s - > width * 2 ) ;
}
/*
* Do last two lines
*/
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 , cb + = 8 , cr + = 8 ) {
LINE_WITH_UV
}
read ( s - > fd , src , s - > width * 2 ) ;
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 ) {
LINE_NO_UV
}
/* drop second field */
while ( read ( s - > fd , src , s - > width * 2 ) < 0 ) {
usleep ( 100 ) ;
}
for ( h = 0 ; h < s - > height - 1 ; h + + ) {
read ( s - > fd , src , s - > width * 2 ) ;
}
} else if ( s - > halfw = = 1 ) {
# ifdef HAVE_MMX
mmx_t rounder ;
mmx_t masker ;
rounder . uw [ 0 ] = 1 ;
rounder . uw [ 1 ] = 1 ;
rounder . uw [ 2 ] = 1 ;
rounder . uw [ 3 ] = 1 ;
masker . ub [ 0 ] = 0xff ;
masker . ub [ 1 ] = 0 ;
masker . ub [ 2 ] = 0xff ;
masker . ub [ 3 ] = 0 ;
masker . ub [ 4 ] = 0xff ;
masker . ub [ 5 ] = 0 ;
masker . ub [ 6 ] = 0xff ;
masker . ub [ 7 ] = 0 ;
pxor_r2r ( mm7 , mm7 ) ;
movq_m2r ( rounder , mm6 ) ;
# endif
while ( read ( s - > fd , src , s - > width * 4 ) < 0 ) {
usleep ( 100 ) ;
}
ptrend = & src [ s - > width * 4 ] ;
for ( h = 0 ; h < s - > height - 2 ; h + = 2 ) {
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 8 , cb + = 4 , cr + = 4 ) {
LINE_WITHUV_AVG
}
read ( s - > fd , src , s - > width * 4 ) ;
# ifdef HAVE_MMX
movq_m2r ( masker , mm5 ) ;
# endif
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 8 ) {
LINE_NOUV_AVG
}
read ( s - > fd , src , s - > width * 4 ) ;
}
/*
* Do last two lines
*/
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 8 , cb + = 4 , cr + = 4 ) {
LINE_WITHUV_AVG
}
read ( s - > fd , src , s - > width * 4 ) ;
# ifdef HAVE_MMX
movq_m2r ( masker , mm5 ) ;
# endif
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 8 ) {
LINE_NOUV_AVG
}
/* drop second field */
while ( read ( s - > fd , src , s - > width * 4 ) < 0 ) {
usleep ( 100 ) ;
}
for ( h = 0 ; h < s - > height - 1 ; h + + ) {
read ( s - > fd , src , s - > width * 4 ) ;
}
} else {
uint8_t * lum_m1 , * lum_m2 , * lum_m3 , * lum_m4 ;
# ifdef HAVE_MMX
mmx_t rounder ;
rounder . uw [ 0 ] = 4 ;
rounder . uw [ 1 ] = 4 ;
rounder . uw [ 2 ] = 4 ;
rounder . uw [ 3 ] = 4 ;
movq_m2r ( rounder , mm6 ) ;
pxor_r2r ( mm7 , mm7 ) ;
# else
uint8_t * cm = ff_cropTbl + MAX_NEG_CROP ;
# endif
/* read two fields and deinterlace them */
while ( read ( s - > fd , src , s - > width * 2 ) < 0 ) {
usleep ( 100 ) ;
}
for ( h = 0 ; h < ( s - > height / 2 ) - 2 ; h + = 2 ) {
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 , cb + = 8 , cr + = 8 ) {
LINE_WITH_UV
}
read ( s - > fd , src , s - > width * 2 ) ;
/* skip a luminance line - will be filled in later */
lum + = s - > width ;
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 , cb + = 8 , cr + = 8 ) {
LINE_WITH_UV
}
/* skip a luminance line - will be filled in later */
lum + = s - > width ;
read ( s - > fd , src , s - > width * 2 ) ;
}
/*
* Do last two lines
*/
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 , cb + = 8 , cr + = 8 ) {
LINE_WITH_UV
}
/* skip a luminance line - will be filled in later */
lum + = s - > width ;
read ( s - > fd , src , s - > width * 2 ) ;
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 , cb + = 8 , cr + = 8 ) {
LINE_WITH_UV
}
/*
*
* SECOND FIELD
*
*/
lum = & data [ s - > width ] ;
while ( read ( s - > fd , src , s - > width * 2 ) < 0 ) {
usleep ( 10 ) ;
}
/* First (and last) two lines not interlaced */
for ( h = 0 ; h < 2 ; h + + ) {
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 ) {
LINE_NO_UV
}
read ( s - > fd , src , s - > width * 2 ) ;
/* skip a luminance line */
lum + = s - > width ;
}
lum_m1 = & lum [ - s - > width ] ;
lum_m2 = & lum_m1 [ - s - > width ] ;
lum_m3 = & lum_m2 [ - s - > width ] ;
memmove ( s - > lum_m4_mem , & lum_m3 [ - s - > width ] , s - > width ) ;
for ( ; h < ( s - > height / 2 ) - 1 ; h + + ) {
lum_m4 = s - > lum_m4_mem ;
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 , lum_m1 + = 16 , lum_m2 + = 16 , lum_m3 + = 16 , lum_m4 + = 16 ) {
LINE_NO_UV
DEINT_LINE_LUM ( 0 )
DEINT_LINE_LUM ( 4 )
DEINT_LINE_LUM ( 8 )
DEINT_LINE_LUM ( 12 )
}
read ( s - > fd , src , s - > width * 2 ) ;
/* skip a luminance line */
lum + = s - > width ;
lum_m1 + = s - > width ;
lum_m2 + = s - > width ;
lum_m3 + = s - > width ;
// lum_m4 += s->width;
}
/*
* Do last line
*/
lum_m4 = s - > lum_m4_mem ;
for ( ptr = & src [ 0 ] ; ptr < ptrend ; ptr + = 32 , lum + = 16 , lum_m1 + = 16 , lum_m2 + = 16 , lum_m3 + = 16 , lum_m4 + = 16 ) {
LINE_NO_UV
DEINT_LINE_LUM ( 0 )
DEINT_LINE_LUM ( 4 )
DEINT_LINE_LUM ( 8 )
DEINT_LINE_LUM ( 12 )
}
}
emms_c ( ) ;
return s - > frame_size ;
}
static int aiw_close ( VideoData * s )
{
av_freep ( & s - > lum_m4_mem ) ;
av_freep ( & s - > src_mem ) ;
return 0 ;
}