mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-17 12:27:18 +00:00
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:
parent
c9f97d8251
commit
6aafe463e5
@ -568,6 +568,17 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
|
|||||||
avctx->width = width;
|
avctx->width = width;
|
||||||
avctx->height = height;
|
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;
|
s->picture.reference= 0;
|
||||||
if(avctx->get_buffer(avctx, &s->picture) < 0) {
|
if(avctx->get_buffer(avctx, &s->picture) < 0) {
|
||||||
fprintf(stderr, "get_buffer() failed\n");
|
fprintf(stderr, "get_buffer() failed\n");
|
||||||
@ -674,12 +685,11 @@ static uint16_t dv_audio_12to16(uint16_t sample)
|
|||||||
144000 bytes for PAL)
|
144000 bytes for PAL)
|
||||||
|
|
||||||
There's a couple of assumptions being made here:
|
There's a couple of assumptions being made here:
|
||||||
1. We don't do any kind of audio error correction. It means,
|
1. By default we silence erroneous (0x8000/16bit 0x800/12bit)
|
||||||
that erroneous samples 0x8000 are being passed upwards.
|
audio samples. We can pass them upwards when ffmpeg will be ready
|
||||||
Do we need to silence erroneous samples ? Average them ?
|
to deal with them.
|
||||||
2. We don't do software emphasis.
|
2. We don't do software emphasis.
|
||||||
3. We are not checking for 'speed' argument being valid.
|
3. Audio is always returned as 16bit linear samples: 12bit
|
||||||
4. Audio is always returned as 16bit linear samples: 12bit
|
|
||||||
nonlinear samples are converted into 16bit linear ones.
|
nonlinear samples are converted into 16bit linear ones.
|
||||||
*/
|
*/
|
||||||
static int dvaudio_decode_frame(AVCodecContext *avctx,
|
static int dvaudio_decode_frame(AVCodecContext *avctx,
|
||||||
@ -693,7 +703,7 @@ static int dvaudio_decode_frame(AVCodecContext *avctx,
|
|||||||
uint8_t *buf_ptr;
|
uint8_t *buf_ptr;
|
||||||
|
|
||||||
/* parse id */
|
/* 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);
|
i = get_bits(&s->gb, 8);
|
||||||
if (i != 0x50) { /* No audio ? */
|
if (i != 0x50) { /* No audio ? */
|
||||||
*data_size = 0;
|
*data_size = 0;
|
||||||
@ -747,6 +757,8 @@ static int dvaudio_decode_frame(AVCodecContext *avctx,
|
|||||||
if (quant == 0) { /* 16bit quantization */
|
if (quant == 0) { /* 16bit quantization */
|
||||||
i = unshuffle[difseg][ad] + (dp - 8)/2 * stride;
|
i = unshuffle[difseg][ad] + (dp - 8)/2 * stride;
|
||||||
((short *)data)[i] = (buf_ptr[dp] << 8) | buf_ptr[dp+1];
|
((short *)data)[i] = (buf_ptr[dp] << 8) | buf_ptr[dp+1];
|
||||||
|
if (((unsigned short *)data)[i] == 0x8000)
|
||||||
|
((short *)data)[i] = 0;
|
||||||
} else { /* 12bit quantization */
|
} else { /* 12bit quantization */
|
||||||
if (difseg >= nb_dif_segs/2)
|
if (difseg >= nb_dif_segs/2)
|
||||||
goto out; /* We're not doing 4ch at this time */
|
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);
|
((uint16_t)buf_ptr[dp+2] >> 4);
|
||||||
rc = ((uint16_t)buf_ptr[dp+1] << 4) |
|
rc = ((uint16_t)buf_ptr[dp+1] << 4) |
|
||||||
((uint16_t)buf_ptr[dp+2] & 0x0f);
|
((uint16_t)buf_ptr[dp+2] & 0x0f);
|
||||||
lc = dv_audio_12to16(lc);
|
lc = (lc == 0x800 ? 0 : dv_audio_12to16(lc));
|
||||||
rc = dv_audio_12to16(rc);
|
rc = (rc == 0x800 ? 0 : dv_audio_12to16(rc));
|
||||||
|
|
||||||
i = unshuffle[difseg][ad] + (dp - 8)/3 * stride;
|
i = unshuffle[difseg][ad] + (dp - 8)/3 * stride;
|
||||||
((short *)data)[i] = lc;
|
((short *)data)[i] = lc;
|
||||||
|
@ -23,7 +23,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define NB_DV_VLC 409
|
#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] = {
|
static const uint16_t dv_vlc_bits[409] = {
|
||||||
0x0000, 0x0002, 0x0007, 0x0008, 0x0009, 0x0014, 0x0015, 0x0016,
|
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_type = CODEC_TYPE_AUDIO;
|
||||||
ast->codec.codec_id = CODEC_ID_DVAUDIO;
|
ast->codec.codec_id = CODEC_ID_DVAUDIO;
|
||||||
ast->codec.channels = 2;
|
|
||||||
c->is_audio = 0;
|
c->is_audio = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user