| 242 | } |
| 243 | |
| 244 | hb_buffer_t* hb_audio_resample(hb_audio_resample_t *resample, |
| 245 | const uint8_t **samples, int nsamples) |
| 246 | { |
| 247 | if (resample == NULL) |
| 248 | { |
| 249 | hb_error("hb_audio_resample: resample is NULL"); |
| 250 | return NULL; |
| 251 | } |
| 252 | if (resample->resample_needed && resample->swresample == NULL) |
| 253 | { |
| 254 | hb_error("hb_audio_resample: resample needed but libswresample context " |
| 255 | "is NULL"); |
| 256 | return NULL; |
| 257 | } |
| 258 | |
| 259 | hb_buffer_t *out; |
| 260 | int out_size, out_samples; |
| 261 | |
| 262 | if (resample->resample_needed) |
| 263 | { |
| 264 | out_samples = nsamples * resample->out.sample_rate / |
| 265 | resample->in.sample_rate + 1; |
| 266 | out_size = av_samples_get_buffer_size(NULL, resample->out.ch_layout.nb_channels, |
| 267 | out_samples, |
| 268 | resample->out.sample_fmt, 0); |
| 269 | out = hb_buffer_init(out_size); |
| 270 | out_samples = swr_convert(resample->swresample, &out->data, out_samples, |
| 271 | samples, nsamples); |
| 272 | |
| 273 | if (out_samples <= 0) |
| 274 | { |
| 275 | if (out_samples < 0) |
| 276 | { |
| 277 | hb_log("hb_audio_resample: swr_convert() failed"); |
| 278 | } |
| 279 | // don't send empty buffers downstream (EOF) |
| 280 | hb_buffer_close(&out); |
| 281 | return NULL; |
| 282 | } |
| 283 | out->size = (out_samples * |
| 284 | resample->out.sample_size * resample->out.ch_layout.nb_channels); |
| 285 | } |
| 286 | else |
| 287 | { |
| 288 | out_samples = nsamples; |
| 289 | out_size = (out_samples * |
| 290 | resample->out.sample_size * resample->out.ch_layout.nb_channels); |
| 291 | out = hb_buffer_init(out_size); |
| 292 | memcpy(out->data, samples[0], out_size); |
| 293 | } |
| 294 | |
| 295 | /* |
| 296 | * Dual Mono to Mono. |
| 297 | * |
| 298 | * Copy all left or right samples to the first half of the buffer and halve |
| 299 | * the buffer size. |
| 300 | */ |
| 301 | if (resample->dual_mono_downmix) |
no test coverage detected