提交 6aafe463 编写于 作者: M Michael Niedermayer

support for DV aspect ratio and erroneous audio patch by (Dan Dennedy (dan at...

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
上级 c9f97d82
......@@ -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;
......
......@@ -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,
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册