cook: output float samples instead of converting to int16
This commit is contained in:
parent
69e7ad8dbc
commit
c25df22365
@ -124,7 +124,7 @@ typedef struct cook {
|
|||||||
void (* interpolate) (struct cook *q, float* buffer,
|
void (* interpolate) (struct cook *q, float* buffer,
|
||||||
int gain_index, int gain_index_next);
|
int gain_index, int gain_index_next);
|
||||||
|
|
||||||
void (* saturate_output) (struct cook *q, int chan, int16_t *out);
|
void (* saturate_output) (struct cook *q, int chan, float *out);
|
||||||
|
|
||||||
AVCodecContext* avctx;
|
AVCodecContext* avctx;
|
||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
@ -229,7 +229,7 @@ static av_cold int init_cook_mlt(COOKContext *q) {
|
|||||||
q->mlt_window[j] *= sqrt(2.0 / q->samples_per_channel);
|
q->mlt_window[j] *= sqrt(2.0 / q->samples_per_channel);
|
||||||
|
|
||||||
/* Initialize the MDCT. */
|
/* Initialize the MDCT. */
|
||||||
if (ff_mdct_init(&q->mdct_ctx, av_log2(mlt_size)+1, 1, 1.0)) {
|
if (ff_mdct_init(&q->mdct_ctx, av_log2(mlt_size)+1, 1, 1.0/32768.0)) {
|
||||||
av_free(q->mlt_window);
|
av_free(q->mlt_window);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -867,22 +867,18 @@ decode_bytes_and_gain(COOKContext *q, COOKSubpacket *p, const uint8_t *inbuffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saturate the output signal to signed 16bit integers.
|
* Saturate the output signal and interleave.
|
||||||
*
|
*
|
||||||
* @param q pointer to the COOKContext
|
* @param q pointer to the COOKContext
|
||||||
* @param chan channel to saturate
|
* @param chan channel to saturate
|
||||||
* @param out pointer to the output vector
|
* @param out pointer to the output vector
|
||||||
*/
|
*/
|
||||||
static void
|
static void saturate_output_float(COOKContext *q, int chan, float *out)
|
||||||
saturate_output_float (COOKContext *q, int chan, int16_t *out)
|
|
||||||
{
|
{
|
||||||
int j;
|
int j;
|
||||||
float *output = q->mono_mdct_output + q->samples_per_channel;
|
float *output = q->mono_mdct_output + q->samples_per_channel;
|
||||||
/* Clip and convert floats to 16 bits.
|
|
||||||
*/
|
|
||||||
for (j = 0; j < q->samples_per_channel; j++) {
|
for (j = 0; j < q->samples_per_channel; j++) {
|
||||||
out[chan + q->nb_channels * j] =
|
out[chan + q->nb_channels * j] = av_clipf(output[j], -1.0, 1.0);
|
||||||
av_clip_int16(lrintf(output[j]));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -902,7 +898,7 @@ saturate_output_float (COOKContext *q, int chan, int16_t *out)
|
|||||||
static inline void
|
static inline void
|
||||||
mlt_compensate_output(COOKContext *q, float *decode_buffer,
|
mlt_compensate_output(COOKContext *q, float *decode_buffer,
|
||||||
cook_gains *gains_ptr, float *previous_buffer,
|
cook_gains *gains_ptr, float *previous_buffer,
|
||||||
int16_t *out, int chan)
|
float *out, int chan)
|
||||||
{
|
{
|
||||||
imlt_gain(q, decode_buffer, gains_ptr, previous_buffer);
|
imlt_gain(q, decode_buffer, gains_ptr, previous_buffer);
|
||||||
q->saturate_output (q, chan, out);
|
q->saturate_output (q, chan, out);
|
||||||
@ -917,7 +913,9 @@ mlt_compensate_output(COOKContext *q, float *decode_buffer,
|
|||||||
* @param inbuffer pointer to the inbuffer
|
* @param inbuffer pointer to the inbuffer
|
||||||
* @param outbuffer pointer to the outbuffer
|
* @param outbuffer pointer to the outbuffer
|
||||||
*/
|
*/
|
||||||
static void decode_subpacket(COOKContext *q, COOKSubpacket* p, const uint8_t *inbuffer, int16_t *outbuffer) {
|
static void decode_subpacket(COOKContext *q, COOKSubpacket *p,
|
||||||
|
const uint8_t *inbuffer, float *outbuffer)
|
||||||
|
{
|
||||||
int sub_packet_size = p->size;
|
int sub_packet_size = p->size;
|
||||||
/* packet dump */
|
/* packet dump */
|
||||||
// for (i=0 ; i<sub_packet_size ; i++) {
|
// for (i=0 ; i<sub_packet_size ; i++) {
|
||||||
@ -991,12 +989,13 @@ static int cook_decode_frame(AVCodecContext *avctx,
|
|||||||
q->subpacket[i].bits_per_subpacket = (q->subpacket[i].size*8)>>q->subpacket[i].bits_per_subpdiv;
|
q->subpacket[i].bits_per_subpacket = (q->subpacket[i].size*8)>>q->subpacket[i].bits_per_subpdiv;
|
||||||
q->subpacket[i].ch_idx = chidx;
|
q->subpacket[i].ch_idx = chidx;
|
||||||
av_log(avctx,AV_LOG_DEBUG,"subpacket[%i] size %i js %i %i block_align %i\n",i,q->subpacket[i].size,q->subpacket[i].joint_stereo,offset,avctx->block_align);
|
av_log(avctx,AV_LOG_DEBUG,"subpacket[%i] size %i js %i %i block_align %i\n",i,q->subpacket[i].size,q->subpacket[i].joint_stereo,offset,avctx->block_align);
|
||||||
decode_subpacket(q, &q->subpacket[i], buf + offset, (int16_t*)data);
|
decode_subpacket(q, &q->subpacket[i], buf + offset, data);
|
||||||
offset += q->subpacket[i].size;
|
offset += q->subpacket[i].size;
|
||||||
chidx += q->subpacket[i].num_channels;
|
chidx += q->subpacket[i].num_channels;
|
||||||
av_log(avctx,AV_LOG_DEBUG,"subpacket[%i] %i %i\n",i,q->subpacket[i].size * 8,get_bits_count(&q->gb));
|
av_log(avctx,AV_LOG_DEBUG,"subpacket[%i] %i %i\n",i,q->subpacket[i].size * 8,get_bits_count(&q->gb));
|
||||||
}
|
}
|
||||||
*data_size = sizeof(int16_t) * q->nb_channels * q->samples_per_channel;
|
*data_size = q->nb_channels * q->samples_per_channel *
|
||||||
|
av_get_bytes_per_sample(avctx->sample_fmt);
|
||||||
|
|
||||||
/* Discard the first two frames: no valid audio. */
|
/* Discard the first two frames: no valid audio. */
|
||||||
if (avctx->frame_number < 2) *data_size = 0;
|
if (avctx->frame_number < 2) *data_size = 0;
|
||||||
@ -1240,7 +1239,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
|
||||||
if (channel_mask)
|
if (channel_mask)
|
||||||
avctx->channel_layout = channel_mask;
|
avctx->channel_layout = channel_mask;
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user