changeset 408:b61c5c4484f8

- applied overlay patch by Jens H
author atmosfear
date Sat, 14 Apr 2001 17:55:20 +0000
parents 0a5b131f1f11
children 90a50c8e15b8
files DOCS/codecs.conf codec-cfg.c codec-cfg.h dll_init.c libvo/img_format.h libvo/video_out.h libvo/vo_sdl.c libvo/vo_xv.c
diffstat 8 files changed, 208 insertions(+), 101 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/codecs.conf	Sat Apr 14 17:51:37 2001 +0000
+++ b/DOCS/codecs.conf	Sat Apr 14 17:55:20 2001 +0000
@@ -250,7 +250,7 @@
   fourcc ASV2
   driver vfw
   dll "asusasv2.dll"
-;  out YVYU
+  out YVYU
   out BGR32,BGR24,BGR15 flip
 
 audiocodec divx
--- a/codec-cfg.c	Sat Apr 14 17:51:37 2001 +0000
+++ b/codec-cfg.c	Sat Apr 14 17:55:20 2001 +0000
@@ -15,7 +15,7 @@
 #include <assert.h>
 #include <string.h>
 
-#include "libvo/video_out.h"
+#include "libvo/img_format.h"
 #include "codec-cfg.h"
 
 #define PRINT_LINENUM printf(" at line %d\n", line_num)
@@ -99,38 +99,35 @@
 	return 1;
 }
 
+
 static int add_to_out(char *sfmt, char *sflags, unsigned int *outfmt,
 		unsigned char *outflags)
 {
-	static char *fmtstr[] = {
-		"YUY2",
-		"YV12",
-		"RGB8",
-		"RGB15",
-		"RGB16",
-		"RGB24",
-		"RGB32",
-		"BGR8",
-		"BGR15",
-		"BGR16",
-		"BGR24",
-		"BGR32",
-		NULL
+        static struct {
+	        const char *name;
+	        const unsigned int num;
+	} fmt_table[] = {
+		"YV12",  IMGFMT_YV12,
+		"I420",  IMGFMT_I420,
+		"IYUV",  IMGFMT_IYUV,
+
+		"YUY2",  IMGFMT_YUY2,
+		"UYVY",  IMGFMT_UYVY,
+		"YVYU",  IMGFMT_YVYU,
+
+	        "RGB8",  IMGFMT_RGB|8,
+		"RGB15", IMGFMT_RGB|15, 
+		"RGB16", IMGFMT_RGB|16,
+		"RGB24", IMGFMT_RGB|24,
+		"RGB32", IMGFMT_RGB|32,
+		"BGR8",  IMGFMT_BGR|8,
+		"BGR15", IMGFMT_BGR|15,
+		"BGR16", IMGFMT_BGR|16,
+		"BGR24", IMGFMT_BGR|24,
+		"BGR32", IMGFMT_BGR|32,
+		NULL,    0
 	};
-	static unsigned int fmtnum[] = {
-		IMGFMT_YUY2,
-		IMGFMT_YV12,
-		IMGFMT_RGB|8,
-		IMGFMT_RGB|15,
-		IMGFMT_RGB|16,
-		IMGFMT_RGB|24,
-		IMGFMT_RGB|32,
-		IMGFMT_BGR|8,
-		IMGFMT_BGR|15,
-		IMGFMT_BGR|16,
-		IMGFMT_BGR|24,
-		IMGFMT_BGR|32
-	};
+
 	static char *flagstr[] = {
 		"flip",
 		"noflip",
@@ -165,15 +162,15 @@
 	}
 
 	do {
-		for (j = 0; fmtstr[j] != NULL; j++)
-			if (!strncmp(sfmt, fmtstr[j], strlen(fmtstr[j])))
+		for (j = 0; fmt_table[j].name != NULL; j++)
+			if (!strncmp(sfmt, fmt_table[j].name, strlen(fmt_table[j].name)))
 				break;
-		if (fmtstr[j] == NULL)
+		if (fmt_table[j].name == NULL)
 			goto err_out_parse_error;
-		outfmt[i] = fmtnum[j];
+		outfmt[i] = fmt_table[j].num;
 		outflags[i] = flags;
                 ++i;
-		sfmt+=strlen(fmtstr[j]);
+		sfmt+=strlen(fmt_table[j].name);
 	} while ((*(sfmt++) == ',') && --freeslots);
 
 	if (!freeslots)
--- a/codec-cfg.h	Sat Apr 14 17:51:37 2001 +0000
+++ b/codec-cfg.h	Sat Apr 14 17:55:20 2001 +0000
@@ -1,15 +1,6 @@
 #ifndef __CODEC_CFG_H
 #define __CODEC_CFG_H
 
-#ifndef IMGFMT_YV12
-#define IMGFMT_YV12 0x32315659
-#define IMGFMT_YUY2 (('2'<<24)|('Y'<<16)|('U'<<8)|'Y')
-#define IMGFMT_RGB_MASK 0xFFFFFF00
-#define IMGFMT_RGB (('R'<<24)|('G'<<16)|('B'<<8))
-#define IMGFMT_BGR_MASK 0xFFFFFF00
-#define IMGFMT_BGR (('B'<<24)|('G'<<16)|('R'<<8))
-#endif
-
 #define CODECS_MAX_FOURCC	16
 #define CODECS_MAX_OUTFMT	16
 
--- a/dll_init.c	Sat Apr 14 17:51:37 2001 +0000
+++ b/dll_init.c	Sat Apr 14 17:55:20 2001 +0000
@@ -138,23 +138,61 @@
 //  sh_video->o_bih.biPlanes=3;
 //  sh_video->o_bih.biBitCount=16;
 
-  if(outfmt==IMGFMT_YUY2)
-    sh_video->o_bih.biBitCount=16;
-  else
-    sh_video->o_bih.biBitCount=outfmt&0xFF;//   //24;
+
+  switch (outfmt) {
+
+/* planar format */
+  case IMGFMT_YV12:
+  case IMGFMT_I420:
+  case IMGFMT_IYUV:
+      sh_video->o_bih.biBitCount=12;
 
-  if(sh_video->o_bih.biBitCount==15) ++sh_video->o_bih.biBitCount;
+/* packed format */
+  case IMGFMT_YUY2:
+  case IMGFMT_UYVY:
+  case IMGFMT_YVYU:
+      sh_video->o_bih.biBitCount=16;
+      break;
 
-  sh_video->o_bih.biSizeImage=sh_video->o_bih.biWidth*sh_video->o_bih.biHeight*(sh_video->o_bih.biBitCount/8);
+/* rgb/bgr format */
+  case IMGFMT_RGB8:
+  case IMGFMT_BGR8:
+      sh_video->o_bih.biBitCount=8;
+      break;
 
-  if(!(sh_video->codec->outflags[sh_video->outfmtidx]&CODECS_FLAG_FLIP))
-    sh_video->o_bih.biHeight=-sh_video->bih.biHeight; // flip image!
+  case IMGFMT_RGB15:
+  case IMGFMT_RGB16:
+  case IMGFMT_BGR15:
+  case IMGFMT_BGR16:
+      sh_video->o_bih.biBitCount=16;
+      break;
+
+  case IMGFMT_RGB24:
+  case IMGFMT_BGR24:
+      sh_video->o_bih.biBitCount=24;
+      break;
+
+  case IMGFMT_RGB32:
+  case IMGFMT_BGR32:
+      sh_video->o_bih.biBitCount=32;
+      break;
 
-  if(outfmt==IMGFMT_YUY2 && !(sh_video->codec->outflags[sh_video->outfmtidx]&CODECS_FLAG_YUVHACK))
-    sh_video->o_bih.biCompression = mmioFOURCC('Y','U','Y','2');
+  default:
+      printf("unsupported image format: 0x%x\n", outfmt);
+      return 0;
+  }
+
+  sh_video->o_bih.biSizeImage = sh_video->o_bih.biWidth * sh_video->o_bih.biHeight * (sh_video->o_bih.biBitCount/8);
 
-//  sh_video->o_bih.biCompression = mmioFOURCC('U','Y','V','Y');
+  if(!(sh_video->codec->outflags[sh_video->outfmtidx]&CODECS_FLAG_FLIP)) {
+      sh_video->o_bih.biHeight=-sh_video->bih.biHeight; // flip image!
+  }
 
+  // this looks suspicious :-)
+  if(!(outfmt == IMGFMT_YUY2 && (sh_video->codec->outflags[sh_video->outfmtidx] & CODECS_FLAG_YUVHACK))
+     && (outfmt & IMGFMT_RGB_MASK) != IMGFMT_RGB  && (outfmt & IMGFMT_BGR_MASK ) != IMGFMT_BGR) {
+	 sh_video->o_bih.biCompression = outfmt;
+  }
 
   if(verbose) {
     printf("Starting decompression, format:\n");
@@ -163,7 +201,7 @@
 	printf("  biHeight %d\n", sh_video->bih.biHeight);
 	printf("  biPlanes %d\n", sh_video->bih.biPlanes);
 	printf("  biBitCount %d\n", sh_video->bih.biBitCount);
-	printf("  biCompression %d='%.4s'\n", sh_video->bih.biCompression, &sh_video->bih.biCompression);
+	printf("  biCompression 0x%x ('%.4s')\n", sh_video->bih.biCompression, &sh_video->bih.biCompression);
 	printf("  biSizeImage %d\n", sh_video->bih.biSizeImage);
     printf("Dest fmt:\n");
 	printf("  biSize %d\n", sh_video->o_bih.biSize);
@@ -171,7 +209,7 @@
 	printf("  biHeight %d\n", sh_video->o_bih.biHeight);
 	printf("  biPlanes %d\n", sh_video->o_bih.biPlanes);
 	printf("  biBitCount %d\n", sh_video->o_bih.biBitCount);
-	printf("  biCompression %d='%.4s'\n", sh_video->o_bih.biCompression, &sh_video->o_bih.biCompression);
+	printf("  biCompression 0x%x ('%.4s')\n", sh_video->o_bih.biCompression, &sh_video->o_bih.biCompression);
 	printf("  biSizeImage %d\n", sh_video->o_bih.biSizeImage);
   }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libvo/img_format.h	Sat Apr 14 17:55:20 2001 +0000
@@ -0,0 +1,54 @@
+
+#ifndef __IMG_FORMAT_H
+#define __IMG_FORMAT_H
+
+/* RGB/BGR Formats */
+
+#define IMGFMT_RGB_MASK 0xFFFFFF00
+#define IMGFMT_RGB (('R'<<24)|('G'<<16)|('B'<<8))
+#define IMGFMT_RGB8  (IMGFMT_RGB|8)
+#define IMGFMT_RGB15 (IMGFMT_RGB|15)
+#define IMGFMT_RGB16 (IMGFMT_RGB|16)
+#define IMGFMT_RGB24 (IMGFMT_RGB|24)
+#define IMGFMT_RGB32 (IMGFMT_RGB|32)
+
+#define IMGFMT_BGR_MASK 0xFFFFFF00
+#define IMGFMT_BGR (('B'<<24)|('G'<<16)|('R'<<8))
+#define IMGFMT_BGR8 (IMGFMT_BGR|8)
+#define IMGFMT_BGR15 (IMGFMT_BGR|15)
+#define IMGFMT_BGR16 (IMGFMT_BGR|16)
+#define IMGFMT_BGR24 (IMGFMT_BGR|24)
+#define IMGFMT_BGR32 (IMGFMT_BGR|32)
+
+
+/* Planar YUV Formats */
+
+#define IMGFMT_YVU9 0x39555659
+#define IMGFMT_IF09 0x39304649
+#define IMGFMT_YV12 0x32315659
+#define IMGFMT_I420 0x30323449
+#define IMGFMT_IYUV 0x56555949
+#define IMGFMT_CLPL 0x4C504C43
+
+/* Packed YUV Formats */
+
+#define IMGFMT_IYU1 0x31555949
+#define IMGFMT_IYU2 0x32555949
+#define IMGFMT_UYVY 0x59565955
+#define IMGFMT_UYNV 0x564E5955
+#define IMGFMT_cyuv 0x76757963
+#define IMGFMT_YUY2 0x32595559
+#define IMGFMT_YUNV 0x564E5559
+#define IMGFMT_YVYU 0x55595659
+#define IMGFMT_Y41P 0x50313459
+#define IMGFMT_Y211 0x31313259
+#define IMGFMT_Y41T 0x54313459
+#define IMGFMT_Y42T 0x54323459
+#define IMGFMT_V422 0x32323456
+#define IMGFMT_V655 0x35353656
+#define IMGFMT_CLJR 0x524A4C43
+#define IMGFMT_YUVP 0x50565559
+#define IMGFMT_UYVP 0x50565955
+
+
+#endif
--- a/libvo/video_out.h	Sat Apr 14 17:51:37 2001 +0000
+++ b/libvo/video_out.h	Sat Apr 14 17:55:20 2001 +0000
@@ -9,19 +9,7 @@
 #include <inttypes.h>
 
 #include "font_load.h"
-
-#define IMGFMT_YV12 0x32315659
-//#define IMGFMT_YUY2 (('Y'<<24)|('U'<<16)|('Y'<<8)|'2')
-#define IMGFMT_YUY2 (('2'<<24)|('Y'<<16)|('U'<<8)|'Y')
-
-#define IMGFMT_RGB_MASK 0xFFFFFF00
-#define IMGFMT_RGB (('R'<<24)|('G'<<16)|('B'<<8))
-#define IMGFMT_BGR_MASK 0xFFFFFF00
-#define IMGFMT_BGR (('B'<<24)|('G'<<16)|('R'<<8))
-#define IMGFMT_RGB15 (IMGFMT_RGB|15)
-#define IMGFMT_RGB16 (IMGFMT_RGB|16)
-#define IMGFMT_RGB24 (IMGFMT_RGB|24)
-#define IMGFMT_RGB32 (IMGFMT_RGB|32)
+#include "img_format.h"
 
 #define VO_EVENT_EXPOSE 1
 #define VO_EVENT_RESIZE 2
--- a/libvo/vo_sdl.c	Sat Apr 14 17:51:37 2001 +0000
+++ b/libvo/vo_sdl.c	Sat Apr 14 17:55:20 2001 +0000
@@ -146,14 +146,21 @@
 //void vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride);
 
 static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
-    struct sdl_priv_s *priv = &sdl_priv;
-    int x,y;
+	struct sdl_priv_s *priv = &sdl_priv;
+	int x,y;
 	
-  if (priv->format==IMGFMT_YV12)
-    vo_draw_alpha_yv12(w,h,src,srca,stride,((uint8_t *) *(priv->overlay->pixels))+priv->width*y0+x0,priv->width);
-  else
-    vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) *(priv->overlay->pixels))+2*(priv->width*y0+x0),2*priv->width);
-
+	switch(priv->format) {
+		case IMGFMT_YV12:  
+		case IMGFMT_I420:
+        	case IMGFMT_IYUV:
+    			vo_draw_alpha_yv12(w,h,src,srca,stride,((uint8_t *) *(priv->overlay->pixels))+priv->width*y0+x0,priv->width);
+		break;
+		case IMGFMT_YUY2:
+        	case IMGFMT_UYVY:
+        	case IMGFMT_YVYU:		
+    			vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) *(priv->overlay->pixels))+2*(priv->width*y0+x0),2*priv->width);
+		break;	
+  	}	
 }
 
 
@@ -380,6 +387,10 @@
 	  	sdl_format=SDL_YUY2_OVERLAY;
 		printf("SDL: Using YUY2 image format\n");
 	  break;
+          case IMGFMT_UYVY:
+	  	sdl_format=SDL_UYVY_OVERLAY;
+		printf("SDL: Using UYVY image format\n");
+	  break;
           default:
             printf("SDL: Unsupported image format (0x%X)\n",format);
             return -1;
@@ -472,6 +483,8 @@
 
         switch(priv->format){
         case IMGFMT_YV12:
+        case IMGFMT_I420:
+        case IMGFMT_IYUV:
 	    dst = (uint8_t *) *(priv->overlay->pixels);
 	    memcpy (dst, src[0], priv->framePlaneY);
 	    dst += priv->framePlaneY;
@@ -479,14 +492,16 @@
 	    dst += priv->framePlaneUV;
 	    memcpy (dst, src[1], priv->framePlaneUV);
             break;
+
         case IMGFMT_YUY2:
+        case IMGFMT_UYVY:
+        case IMGFMT_YVYU:
 	    dst = (uint8_t *) *(priv->overlay->pixels);
 	    memcpy (dst, src[0], priv->width*priv->height*2);
             break;
         }
         	
 	SDL_UnlockYUVOverlay (priv->overlay);
-
 	return 0;
 }
 
@@ -711,7 +726,11 @@
 {
     switch(format){
     case IMGFMT_YV12:
+    case IMGFMT_I420:
+    case IMGFMT_IYUV:
     case IMGFMT_YUY2:
+    case IMGFMT_UYVY:
+    case IMGFMT_YVYU:
 //    case IMGFMT_RGB|24:
 //    case IMGFMT_BGR|24:
         return 1;
--- a/libvo/vo_xv.c	Sat Apr 14 17:51:37 2001 +0000
+++ b/libvo/vo_xv.c	Sat Apr 14 17:55:20 2001 +0000
@@ -265,10 +265,18 @@
 static void draw_alpha(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
     int x,y;
 
-  if (xv_format==IMGFMT_YV12)
-    vo_draw_alpha_yv12(w,h,src,srca,stride,xvimage[0]->data+image_width*y0+x0,image_width);
-  else
-    vo_draw_alpha_yuy2(w,h,src,srca,stride,xvimage[0]->data+2*(image_width*y0+x0),2*image_width);
+  switch (xv_format) {
+	case IMGFMT_YV12:  
+	case IMGFMT_I420:
+        case IMGFMT_IYUV:
+    		vo_draw_alpha_yv12(w,h,src,srca,stride,xvimage[0]->data+image_width*y0+x0,image_width);
+	break;
+	case IMGFMT_YUY2:
+        case IMGFMT_UYVY:
+        case IMGFMT_YVYU:	
+    		vo_draw_alpha_yuy2(w,h,src,srca,stride,xvimage[0]->data+2*(image_width*y0+x0),2*image_width);
+	break;
+  }		
 
 }
 
@@ -332,43 +340,55 @@
 {
  int foo;
 
- if(xv_format==IMGFMT_YUY2)
-  {
-   // YUY2 packed, flipped
+ switch (xv_format) {
+ case IMGFMT_YUY2:
+ case IMGFMT_UYVY:
+ case IMGFMT_YVYU:
+
+     // YUY2 packed, flipped
 #if 0
-   int i;
-   unsigned short *s=(unsigned short *)src[0];
-   unsigned short *d=(unsigned short *)xvimage[0]->data;
-   s+=image_width*image_height;
-   for(i=0;i<image_height;i++)
-    {
-     s-=image_width;
-     memcpy(d,s,image_width*2);
-     d+=image_width;
-    }
+     int i;
+     unsigned short *s=(unsigned short *)src[0];
+     unsigned short *d=(unsigned short *)xvimage[0]->data;
+     s+=image_width*image_height;
+     for(i=0;i<image_height;i++) {
+	 s-=image_width;
+	 memcpy(d,s,image_width*2);
+	 d+=image_width;
+     }
 #else
-   memcpy(xvimage[0]->data,src[0],image_width*image_height*2);
+     memcpy(xvimage[0]->data,src[0],image_width*image_height*2);
 #endif
-  }
-   else
-    {
+     break;
+
+ case IMGFMT_YV12:
+ case IMGFMT_I420:
+ case IMGFMT_IYUV:
+
      // YV12 planar
      memcpy(xvimage[0]->data,src[0],image_width*image_height);
      memcpy(xvimage[0]->data+image_width*image_height,src[2],image_width*image_height/4);
      memcpy(xvimage[0]->data+image_width*image_height*5/4,src[1],image_width*image_height/4);
-    }
+     break;
+ }
 
   return 0;
 }
 
 static uint32_t query_format(uint32_t format)
 {
+
+// umm, this is a kludge, we need to ask the server.. (see init function above)
+    return 1;
+/*
  switch(format)
   {
    case IMGFMT_YV12:
-   case IMGFMT_YUY2: return 1;
+   case IMGFMT_YUY2: 
+       return 1;
   }
  return 0;
+*/
 }
 
 static void uninit(void) {