changeset 1167:35b80080b2db libavcodec

support for DV aspect ratio and erroneous audio patch by (Dan Dennedy (dan at dennedy dot org) and Roman Shaposhnick <rvs at sun dot com>)
author michaelni
date Fri, 04 Apr 2003 13:45:45 +0000
parents 54384dc71fe7
children 5af9aeadbdc3
files dv.c dvdata.h
diffstat 2 files changed, 23 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/dv.c	Fri Apr 04 13:36:07 2003 +0000
+++ b/dv.c	Fri Apr 04 13:45:45 2003 +0000
@@ -567,6 +567,17 @@
 
     avctx->width = width;
     avctx->height = height;
+    
+    /* Once again, this is pretty complicated by the fact that the same
+     * field is used differently by IEC 68134[apt == 0] and 
+     * SMPTE 314M[apt == 1].
+     */
+    if (buf[VAUX_TC61_OFFSET] == 0x61 &&
+        ((apt == 0 && (buf[VAUX_TC61_OFFSET + 2] & 0x07) == 0x07) ||
+	 (apt == 1 && (buf[VAUX_TC61_OFFSET + 2] & 0x07) == 0x02)))
+        avctx->aspect_ratio = 16.0 / 9.0;
+    else
+        avctx->aspect_ratio = 4.0 / 3.0;
 
     s->picture.reference= 0;
     if(avctx->get_buffer(avctx, &s->picture) < 0) {
@@ -674,12 +685,11 @@
    144000 bytes for PAL) 
 
    There's a couple of assumptions being made here:
-         1. We don't do any kind of audio error correction. It means,
-	    that erroneous samples 0x8000 are being passed upwards.
-            Do we need to silence erroneous samples ? Average them ?
+         1. By default we silence erroneous (0x8000/16bit 0x800/12bit) 
+	    audio samples. We can pass them upwards when ffmpeg will be ready
+	    to deal with them.
 	 2. We don't do software emphasis.
-	 3. We are not checking for 'speed' argument being valid.
-	 4. Audio is always returned as 16bit linear samples: 12bit
+	 3. Audio is always returned as 16bit linear samples: 12bit
 	    nonlinear samples are converted into 16bit linear ones.
 */
 static int dvaudio_decode_frame(AVCodecContext *avctx, 
@@ -693,7 +703,7 @@
     uint8_t *buf_ptr;
     
     /* parse id */
-    init_get_bits(&s->gb, &buf[AAUX_OFFSET], 5*8);
+    init_get_bits(&s->gb, &buf[AAUX_AS_OFFSET], 5*8);
     i = get_bits(&s->gb, 8);
     if (i != 0x50) { /* No audio ? */
 	*data_size = 0;
@@ -747,6 +757,8 @@
 		   if (quant == 0) {  /* 16bit quantization */
 		       i = unshuffle[difseg][ad] + (dp - 8)/2 * stride;
 		       ((short *)data)[i] = (buf_ptr[dp] << 8) | buf_ptr[dp+1]; 
+		       if (((unsigned short *)data)[i] == 0x8000)
+		           ((short *)data)[i] = 0;
 		   } else {           /* 12bit quantization */
 		       if (difseg >= nb_dif_segs/2)
 			   goto out;  /* We're not doing 4ch at this time */
@@ -755,8 +767,8 @@
 			    ((uint16_t)buf_ptr[dp+2] >> 4);
 		       rc = ((uint16_t)buf_ptr[dp+1] << 4) |
 			    ((uint16_t)buf_ptr[dp+2] & 0x0f);
-		       lc = dv_audio_12to16(lc);
-		       rc = dv_audio_12to16(rc);
+		       lc = (lc == 0x800 ? 0 : dv_audio_12to16(lc));
+		       rc = (rc == 0x800 ? 0 : dv_audio_12to16(rc));
 
 		       i = unshuffle[difseg][ad] + (dp - 8)/3 * stride;
 		       ((short *)data)[i] = lc;
--- a/dvdata.h	Fri Apr 04 13:36:07 2003 +0000
+++ b/dvdata.h	Fri Apr 04 13:45:45 2003 +0000
@@ -23,7 +23,9 @@
  */
  
 #define NB_DV_VLC 409
-#define AAUX_OFFSET (80*6 + 80*16*3 + 3)
+#define AAUX_AS_OFFSET  (80*6 + 80*16*3 + 3)
+#define AAUX_ASC_OFFSET (80*6 + 80*16*4 + 3)
+#define VAUX_TC61_OFFSET (80*5 + 48 + 5)
 
 static const uint16_t dv_vlc_bits[409] = {
  0x0000, 0x0002, 0x0007, 0x0008, 0x0009, 0x0014, 0x0015, 0x0016,