[MPlayer-cvslog] CVS: main/libmpcodecs ad_realaud.c,1.38,1.39

Roberto Togni CVS syncmail at mplayerhq.hu
Fri Dec 9 17:25:39 CET 2005


CVS change done by Roberto Togni CVS

Update of /cvsroot/mplayer/main/libmpcodecs
In directory mail:/var2/tmp/cvs-serv5540/libmpcodecs

Modified Files:
	ad_realaud.c 
Log Message:
Move audio packets reordering from codec interface to demuxers for real 
files (old and new format), pass only real extradata to the codec
Enable cook codec from lavc, prefer lavc codecs for 14_4 and 28_8 
formats. Disable internal 28_8, it's broken now and will be removed soon


Index: ad_realaud.c
===================================================================
RCS file: /cvsroot/mplayer/main/libmpcodecs/ad_realaud.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- ad_realaud.c	18 Nov 2005 14:39:21 -0000	1.38
+++ ad_realaud.c	9 Dec 2005 16:25:36 -0000	1.39
@@ -291,10 +291,10 @@
 	sh->wf->wBitsPerSample,
 	sh->wf->nChannels,
 	100, // quality
-	((short*)(sh->wf+1))[0],  // subpacket size
-	((short*)(sh->wf+1))[3],  // coded frame size
-	((short*)(sh->wf+1))[4], // codec data length
-	((char*)(sh->wf+1))+10 // extras
+	sh->wf->nBlockAlign, // subpacket size
+	sh->wf->nBlockAlign, // coded frame size
+	sh->wf->cbSize, // codec data length
+	(char*)(sh->wf+1) // extras
     };
 #ifdef USE_WIN32DLL
     wra_init_t winit_data={
@@ -302,10 +302,10 @@
 	sh->wf->wBitsPerSample,
 	sh->wf->nChannels,
 	100, // quality
-	((short*)(sh->wf+1))[0],  // subpacket size
-	((short*)(sh->wf+1))[3],  // coded frame size
-	((short*)(sh->wf+1))[4], // codec data length
-	((char*)(sh->wf+1))+10 // extras
+	sh->wf->nBlockAlign, // subpacket size
+	sh->wf->nBlockAlign, // coded frame size
+	sh->wf->cbSize, // codec data length
+	(char*)(sh->wf+1) // extras
     };
 #endif
 #ifdef USE_WIN32DLL
@@ -336,42 +336,35 @@
 	raSetPwd(sh->context,"Ardubancel Quazanga"); // set password... lol.
     }
   
+  if (sh->format == mmioFOURCC('s','i','p','r')) {
+    short flavor;
+    
+    if (sh->wf->nAvgBytesPerSec > 1531)
+        flavor = 3;
+    else if (sh->wf->nAvgBytesPerSec > 937)
+        flavor = 1;
+    else if (sh->wf->nAvgBytesPerSec > 719)
+        flavor = 0;
+    else
+        flavor = 2;
+    mp_msg(MSGT_DECAUDIO,MSGL_V,"Got sipr flavor %d from bitrate %d\n",flavor, sh->wf->nAvgBytesPerSec);
+
 #ifdef USE_WIN32DLL
     if (dll_type == 1)
-	result=wraSetFlavor(sh->context,((short*)(sh->wf+1))[2]);
+	result=wraSetFlavor(sh->context,flavor);
     else
 #endif
-    result=raSetFlavor(sh->context,((short*)(sh->wf+1))[2]);
+    result=raSetFlavor(sh->context,flavor);
     if(result){
       mp_msg(MSGT_DECAUDIO,MSGL_WARN,"Decoder flavor setup failed, error code: 0x%X\n",result);
       return 0;
     }
+  } // sipr flavor
 
-#ifdef USE_WIN32DLL
-    if (dll_type == 1)
-	prop=wraGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],0,&len);
-    else
-#endif
-    prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],0,&len);
-    mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Audio codec: [%d] %s\n",((short*)(sh->wf+1))[2],prop);
-
-#ifdef USE_WIN32DLL
-    if (dll_type == 1)
-	prop=wraGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],1,&len);
-    else
-#endif
-    prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],1,&len);
-    if(prop){
-      sh->i_bps=((*((int*)prop))+4)/8;
-      mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Audio bitrate: %5.3f kbit/s (%d bps)  \n",(*((int*)prop))*0.001f,sh->i_bps);
-    } else
-      sh->i_bps=12000; // dunno :(((  [12000 seems to be OK for crash.rmvb too]
+    sh->i_bps=sh->wf->nAvgBytesPerSec;
     
-//    prop=raGetFlavorProperty(sh->context,((short*)(sh->wf+1))[2],0x13,&len);
-//    mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Samples/block?: %d  \n",(*((int*)prop)));
-
   sh->audio_out_minsize=128000; // no idea how to get... :(
-  sh->audio_in_minsize=((short*)(sh->wf+1))[1]*sh->wf->nBlockAlign;
+  sh->audio_in_minsize = sh->wf->nBlockAlign;
   
   return 1; // return values: 1=OK 0=ERROR
 }
@@ -413,83 +406,16 @@
     rv_handle = NULL;
 }
 
-static unsigned char sipr_swaps[38][2]={
-    {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
-    {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
-    {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
-    {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83},
-    {77,80} };
-
 static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen){
   int result;
   int len=-1;
-  int sps=((short*)(sh->wf+1))[0];
-  int w=sh->wf->nBlockAlign; // 5
-  int h=((short*)(sh->wf+1))[1];
-  int cfs=((short*)(sh->wf+1))[3];
-
-//  printf("bs=%d  sps=%d  w=%d h=%d \n",sh->wf->nBlockAlign,sps,w,h);
-  
-#if 1
-  if(sh->a_in_buffer_len<=0){
-		if (sh->ds->eof) return 0;
-      // fill the buffer!
-		if (sh->format == mmioFOURCC('1','4','_','4')) {
-			demux_read_data(sh->ds, sh->a_in_buffer, sh->wf->nBlockAlign);
-			sh->a_in_buffer_size=
-			sh->a_in_buffer_len=sh->wf->nBlockAlign;
-		} else
-		if (sh->format == mmioFOURCC('2','8','_','8')) {
-			int i,j;
-			for (j = 0; j < h; j++)
-				for (i = 0; i < h/2; i++)
-					demux_read_data(sh->ds, sh->a_in_buffer+i*2*w+j*cfs, cfs);
-			sh->a_in_buffer_size=
-			sh->a_in_buffer_len=sh->wf->nBlockAlign*h;
-		} else
-    if((sh->format == mmioFOURCC('s','i','p','r')) || !sps){ // is !sps really needed? (cook with sipr matrix?)
-      // 'sipr' way
-      int j,n;
-      int bs=h*w*2/96; // nibbles per subpacket
-      unsigned char *p=sh->a_in_buffer;
-      demux_read_data(sh->ds, p, h*w);
-      for(n=0;n<38;n++){
-          int i=bs*sipr_swaps[n][0];
-          int o=bs*sipr_swaps[n][1];
-	  // swap nibbles of block 'i' with 'o'      TODO: optimize
-	  for(j=0;j<bs;j++){
-	      int x=(i&1) ? (p[(i>>1)]>>4) : (p[(i>>1)]&15);
-	      int y=(o&1) ? (p[(o>>1)]>>4) : (p[(o>>1)]&15);
-	      if(o&1) p[(o>>1)]=(p[(o>>1)]&0x0F)|(x<<4);
-	        else  p[(o>>1)]=(p[(o>>1)]&0xF0)|x;
-	      if(i&1) p[(i>>1)]=(p[(i>>1)]&0x0F)|(y<<4);
-	        else  p[(i>>1)]=(p[(i>>1)]&0xF0)|y;
-	      ++i;++o;
-	  }
-      }
-      sh->a_in_buffer_size=
-      sh->a_in_buffer_len=w*h;
-    } else {
-      // 'cook' way
-      int x,y;
-      w/=sps;
-      for(y=0;y<h;y++)
-        for(x=0;x<w;x++){
-	    demux_read_data(sh->ds, sh->a_in_buffer+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), sps);
-	}
-      sh->a_in_buffer_size=
-      sh->a_in_buffer_len=w*h*sps;
-    }
-  }
 
-#else
   if(sh->a_in_buffer_len<=0){
       // fill the buffer!
       demux_read_data(sh->ds, sh->a_in_buffer, sh->wf->nBlockAlign);
       sh->a_in_buffer_size=
       sh->a_in_buffer_len=sh->wf->nBlockAlign;
   }
-#endif
   
 #ifdef USE_WIN32DLL
     if (dll_type == 1)




More information about the MPlayer-cvslog mailing list