summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/dv.c
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2003-04-16 00:18:35 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2003-04-16 00:18:35 +0000
commit1d0821178b1c27e35595f72bd9adda5945c7be8b (patch)
tree217e2a8eb9c63b36c22f90486752b09fc9aa00ea /src/libffmpeg/libavcodec/dv.c
parented5ec90442b4dda3918372b43072205fb4ea6167 (diff)
downloadxine-lib-1d0821178b1c27e35595f72bd9adda5945c7be8b.tar.gz
xine-lib-1d0821178b1c27e35595f72bd9adda5945c7be8b.tar.bz2
ffmpeg update, add new files/decoders, use our fastmemcpy
tested ok with usual files (wmv7, mpeg4, divx, svq1...) CVS patchset: 4618 CVS date: 2003/04/16 00:18:35
Diffstat (limited to 'src/libffmpeg/libavcodec/dv.c')
-rw-r--r--src/libffmpeg/libavcodec/dv.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/libffmpeg/libavcodec/dv.c b/src/libffmpeg/libavcodec/dv.c
index 6d661f4cf..eb8dbb7c0 100644
--- a/src/libffmpeg/libavcodec/dv.c
+++ b/src/libffmpeg/libavcodec/dv.c
@@ -567,6 +567,17 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
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 @@ static uint16_t dv_audio_12to16(uint16_t sample)
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 @@ static int dvaudio_decode_frame(AVCodecContext *avctx,
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;
@@ -719,6 +729,7 @@ static int dvaudio_decode_frame(AVCodecContext *avctx,
return -1; /* Unsupported quantization */
avctx->sample_rate = dv_audio_frequency[freq];
+ avctx->channels = 2;
// What about:
// avctx->bit_rate =
// avctx->frame_size =
@@ -746,6 +757,8 @@ static int dvaudio_decode_frame(AVCodecContext *avctx,
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 */
@@ -754,8 +767,8 @@ static int dvaudio_decode_frame(AVCodecContext *avctx,
((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;