hb_audio_remap_t* hb_audio_remap_init(uint64_t channel_layout, hb_chan_map_t *map_out, hb_chan_map_t *map_in) { hb_audio_remap_t *remap = malloc(sizeof(hb_audio_remap_t)); if (remap == NULL) return NULL; remap->remap_table = hb_audio_remap_build_table(channel_layout, map_out, map_in); if (remap->remap_table == NULL) { hb_audio_remap_free(remap); return NULL; } int ii; remap->nchannels = av_get_channel_layout_nb_channels(channel_layout); remap->sample_size = remap->nchannels * sizeof(hb_sample_t); remap->remap_needed = 0; for (ii = 0; ii < remap->nchannels; ii++) { if (remap->remap_table[ii] != ii) { remap->remap_needed = 1; break; } } return remap; }
/*********************************************************************** * Close *********************************************************************** * **********************************************************************/ void encCoreAudioClose(hb_work_object_t *w) { hb_work_private_t *pv = w->private_data; if (pv != NULL) { if (pv->converter) { AudioConverterDispose(pv->converter); } if (pv->buf != NULL) { free(pv->buf); } if (pv->remap != NULL) { hb_audio_remap_free(pv->remap); } hb_list_empty(&pv->list); free(pv); w->private_data = NULL; } }
hb_audio_remap_t* hb_audio_remap_init(enum AVSampleFormat sample_fmt, hb_chan_map_t *channel_map_out, hb_chan_map_t *channel_map_in) { hb_audio_remap_t *remap = calloc(1, sizeof(hb_audio_remap_t)); if (remap == NULL) { hb_error("hb_audio_remap_init: failed to allocate remap"); goto fail; } // sample format switch (sample_fmt) { case AV_SAMPLE_FMT_U8P: case AV_SAMPLE_FMT_S16P: case AV_SAMPLE_FMT_S32P: case AV_SAMPLE_FMT_FLTP: case AV_SAMPLE_FMT_DBLP: remap->remap = &remap_planar; break; case AV_SAMPLE_FMT_U8: remap->remap = &remap_u8_interleaved; break; case AV_SAMPLE_FMT_S16: remap->remap = &remap_s16_interleaved; break; case AV_SAMPLE_FMT_S32: remap->remap = &remap_s32_interleaved; break; case AV_SAMPLE_FMT_FLT: remap->remap = &remap_flt_interleaved; break; case AV_SAMPLE_FMT_DBL: remap->remap = &remap_dbl_interleaved; break; default: hb_error("hb_audio_remap_init: unsupported sample format '%s'", av_get_sample_fmt_name(sample_fmt)); goto fail; } // input/output channel order if (channel_map_in == NULL || channel_map_out == NULL) { hb_error("hb_audio_remap_init: invalid channel map(s)"); goto fail; } remap->channel_map_in = channel_map_in; remap->channel_map_out = channel_map_out; // remap can't be done until the channel layout has been set remap->remap_needed = 0; return remap; fail: hb_audio_remap_free(remap); return NULL; }