From 3ab64e46e208dd2ada8a5cde01dfd19d3775d18b Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 28 Dec 2007 03:30:23 +0000 Subject: Remove AIW support code, it is unfit for ffmpeg svn, doing usleep() and colorspace convertion and deinterlacing in the demuxer. Whoever wants AIW support has to implement this cleanly! Originally committed as revision 11335 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavdevice/v4l.c | 500 +----------------------------------------------------- 1 file changed, 1 insertion(+), 499 deletions(-) (limited to 'libavdevice') diff --git a/libavdevice/v4l.c b/libavdevice/v4l.c index 8005378559..d9dc635eed 100644 --- a/libavdevice/v4l.c +++ b/libavdevice/v4l.c @@ -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, "\nIncorrect 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; -} -- cgit v1.2.3