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>)

Originally committed as revision 1731 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2003-04-04 13:45:45 +00:00
parent c9f97d8251
commit 6aafe463e5
3 changed files with 23 additions and 10 deletions

View File

@ -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;
@ -747,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 */
@ -755,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;

View File

@ -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,

View File

@ -47,7 +47,6 @@ static int dv_read_header(AVFormatContext *s,
ast->codec.codec_type = CODEC_TYPE_AUDIO;
ast->codec.codec_id = CODEC_ID_DVAUDIO;
ast->codec.channels = 2;
c->is_audio = 0;
return 0;