|  | @@ -52,6 +52,8 @@ struct ResampleContext { | 
														
													
														
															
																|  |  | int padding_size; |  |  | int padding_size; | 
														
													
														
															
																|  |  | int initial_padding_filled; |  |  | int initial_padding_filled; | 
														
													
														
															
																|  |  | int initial_padding_samples; |  |  | int initial_padding_samples; | 
														
													
														
															
																|  |  |  |  |  | int final_padding_filled; | 
														
													
														
															
																|  |  |  |  |  | int final_padding_samples; | 
														
													
														
															
																|  |  | }; |  |  | }; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -433,27 +435,57 @@ int ff_audio_resample(ResampleContext *c, AudioData *dst, AudioData *src) | 
														
													
														
															
																|  |  | ret = ff_audio_data_combine(c->buffer, in_leftover, src, 0, in_samples); |  |  | ret = ff_audio_data_combine(c->buffer, in_leftover, src, 0, in_samples); | 
														
													
														
															
																|  |  | if (ret < 0) |  |  | if (ret < 0) | 
														
													
														
															
																|  |  | return ret; |  |  | return ret; | 
														
													
														
															
																|  |  | } else if (!in_leftover) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | } else if (in_leftover <= c->final_padding_samples) { | 
														
													
														
															
																|  |  | /* no remaining samples to flush */ |  |  | /* no remaining samples to flush */ | 
														
													
														
															
																|  |  | return 0; |  |  | return 0; | 
														
													
														
															
																|  |  | } else { |  |  |  | 
														
													
														
															
																|  |  | /* TODO: pad buffer to flush completely */ |  |  |  | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (!c->initial_padding_filled) { |  |  | if (!c->initial_padding_filled) { | 
														
													
														
															
																|  |  | int bps = av_get_bytes_per_sample(c->avr->internal_sample_fmt); |  |  | int bps = av_get_bytes_per_sample(c->avr->internal_sample_fmt); | 
														
													
														
															
																|  |  | int i; |  |  | int i; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (c->buffer->nb_samples < 2 * c->padding_size) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (src && c->buffer->nb_samples < 2 * c->padding_size) | 
														
													
														
															
																|  |  | return 0; |  |  | return 0; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | for (i = 0; i < c->padding_size; i++) |  |  | for (i = 0; i < c->padding_size; i++) | 
														
													
														
															
																|  |  | for (ch = 0; ch < c->buffer->channels; ch++) |  |  |  | 
														
													
														
															
																|  |  | memcpy(c->buffer->data[ch] + bps * i, |  |  |  | 
														
													
														
															
																|  |  | c->buffer->data[ch] + bps * (2 * c->padding_size - i), bps); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | for (ch = 0; ch < c->buffer->channels; ch++) { | 
														
													
														
															
																|  |  |  |  |  | if (c->buffer->nb_samples > 2 * c->padding_size - i) { | 
														
													
														
															
																|  |  |  |  |  | memcpy(c->buffer->data[ch] + bps * i, | 
														
													
														
															
																|  |  |  |  |  | c->buffer->data[ch] + bps * (2 * c->padding_size - i), bps); | 
														
													
														
															
																|  |  |  |  |  | } else { | 
														
													
														
															
																|  |  |  |  |  | memset(c->buffer->data[ch] + bps * i, 0, bps); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | c->initial_padding_filled = 1; |  |  | c->initial_padding_filled = 1; | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | if (!src && !c->final_padding_filled) { | 
														
													
														
															
																|  |  |  |  |  | int bps = av_get_bytes_per_sample(c->avr->internal_sample_fmt); | 
														
													
														
															
																|  |  |  |  |  | int i; | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | ret = ff_audio_data_realloc(c->buffer, in_samples + c->padding_size); | 
														
													
														
															
																|  |  |  |  |  | if (ret < 0) { | 
														
													
														
															
																|  |  |  |  |  | av_log(c->avr, AV_LOG_ERROR, "Error reallocating resampling buffer\n"); | 
														
													
														
															
																|  |  |  |  |  | return AVERROR(ENOMEM); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | for (i = 0; i < c->padding_size; i++) | 
														
													
														
															
																|  |  |  |  |  | for (ch = 0; ch < c->buffer->channels; ch++) { | 
														
													
														
															
																|  |  |  |  |  | if (in_leftover > i) { | 
														
													
														
															
																|  |  |  |  |  | memcpy(c->buffer->data[ch] + bps * (in_leftover + i), | 
														
													
														
															
																|  |  |  |  |  | c->buffer->data[ch] + bps * (in_leftover - i - 1), | 
														
													
														
															
																|  |  |  |  |  | bps); | 
														
													
														
															
																|  |  |  |  |  | } else { | 
														
													
														
															
																|  |  |  |  |  | memset(c->buffer->data[ch] + bps * (in_leftover + i), | 
														
													
														
															
																|  |  |  |  |  | 0, bps); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | c->buffer->nb_samples   += c->padding_size; | 
														
													
														
															
																|  |  |  |  |  | c->final_padding_samples = c->padding_size; | 
														
													
														
															
																|  |  |  |  |  | c->final_padding_filled  = 1; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  | /* calculate output size and reallocate output buffer if needed */ |  |  | /* calculate output size and reallocate output buffer if needed */ | 
														
													
														
															
																|  |  | /* TODO: try to calculate this without the dummy resample() run */ |  |  | /* TODO: try to calculate this without the dummy resample() run */ | 
														
													
														
															
																|  |  | if (!dst->read_only && dst->allow_realloc) { |  |  | if (!dst->read_only && dst->allow_realloc) { | 
														
													
												
													
														
															
																|  | 
 |