Exemplo n.º 1
0
static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
{
    sample_t level=a52_level, bias=384;
    int flags=a52_flags|A52_ADJUST_LEVEL;
    int i,len=-1;
	if (sh_audio->sample_format == AF_FORMAT_FLOAT_NE)
	    bias = 0;
	if(!sh_audio->a_in_buffer_len)
	    if(a52_fillbuff(sh_audio)<0) return len; /* EOF */
	sh_audio->a_in_buffer_len=0;
	if (a52_frame (a52_state, sh_audio->a_in_buffer, &flags, &level, bias)){
	    mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error decoding frame\n");
	    return len;
	}

	/* handle dynrng */
	if (a52_drc_action != DRC_NO_ACTION) {
	    if (a52_drc_action == DRC_NO_COMPRESSION)
		a52_dynrng(a52_state, NULL, NULL);
	    else
		a52_dynrng(a52_state, dynrng_call, NULL);
	}

	len=0;
	for (i = 0; i < 6; i++) {
	    if (a52_block (a52_state)){
		mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error at resampling\n");
		break;
	    }
	    len+=2*a52_resample(a52_samples(a52_state),(int16_t *)&buf[len]);
	}
	assert(len <= maxlen);
  return len;
}
static int a52_decode_frame(unsigned char *buf, int maxlen,
			    struct frame_fmt *fmt)
{
	sample_t level = 1, bias = 384;
	int flags;
	int i, len = -1;
	if (!a52_buffer.a_in_buffer_len)
		if (a52_fillbuff(&a52_buffer) < 0)
			return len;
	a52_buffer.a_in_buffer_len = 0;

	flags = a52_flags | A52_ADJUST_LEVEL;
	level *= gain;

	if (a52_frame(a52_state, a52_buffer.a_in_buffer, &flags, &level, bias)) {
		printf("a52_decode_frame a52: error decoding frame\n");
		return len;
	}

	len = 0;
	for (i = 0; i < 6; i++) {
		if (a52_block(a52_state)) {
			printf("a52: error at resampling\n");
			break;
		}
		len +=
		    2 * a52_resample(a52_samples(a52_state),
				     (int16_t *) & buf[len]);
	}

	assert(len <= maxlen);
	return len;
}