| 1127 | } |
| 1128 | |
| 1129 | static int take_samples(FilterLinkInternal *li, unsigned min, unsigned max, |
| 1130 | AVFrame **rframe) |
| 1131 | { |
| 1132 | FilterLink *l = &li->l; |
| 1133 | AVFilterLink *link = &l->pub; |
| 1134 | AVFrame *frame0, *frame, *buf; |
| 1135 | unsigned nb_samples, nb_frames, i, p; |
| 1136 | int ret; |
| 1137 | |
| 1138 | /* Note: this function relies on no format changes and must only be |
| 1139 | called with enough samples. */ |
| 1140 | av_assert1(samples_ready(li, l->min_samples)); |
| 1141 | frame0 = frame = ff_framequeue_peek(&li->fifo, 0); |
| 1142 | if (!li->fifo.samples_skipped && frame->nb_samples >= min && frame->nb_samples <= max) { |
| 1143 | *rframe = ff_framequeue_take(&li->fifo); |
| 1144 | return 0; |
| 1145 | } |
| 1146 | nb_frames = 0; |
| 1147 | nb_samples = 0; |
| 1148 | while (1) { |
| 1149 | if (nb_samples + frame->nb_samples > max) { |
| 1150 | if (nb_samples < min) |
| 1151 | nb_samples = max; |
| 1152 | break; |
| 1153 | } |
| 1154 | nb_samples += frame->nb_samples; |
| 1155 | nb_frames++; |
| 1156 | if (nb_frames == ff_framequeue_queued_frames(&li->fifo)) |
| 1157 | break; |
| 1158 | frame = ff_framequeue_peek(&li->fifo, nb_frames); |
| 1159 | } |
| 1160 | |
| 1161 | buf = ff_get_audio_buffer(link, nb_samples); |
| 1162 | if (!buf) |
| 1163 | return AVERROR(ENOMEM); |
| 1164 | ret = av_frame_copy_props(buf, frame0); |
| 1165 | if (ret < 0) { |
| 1166 | av_frame_free(&buf); |
| 1167 | return ret; |
| 1168 | } |
| 1169 | |
| 1170 | p = 0; |
| 1171 | for (i = 0; i < nb_frames; i++) { |
| 1172 | frame = ff_framequeue_take(&li->fifo); |
| 1173 | av_samples_copy(buf->extended_data, frame->extended_data, p, 0, |
| 1174 | frame->nb_samples, link->ch_layout.nb_channels, link->format); |
| 1175 | p += frame->nb_samples; |
| 1176 | av_frame_free(&frame); |
| 1177 | } |
| 1178 | if (p < nb_samples) { |
| 1179 | unsigned n = nb_samples - p; |
| 1180 | frame = ff_framequeue_peek(&li->fifo, 0); |
| 1181 | av_samples_copy(buf->extended_data, frame->extended_data, p, 0, n, |
| 1182 | link->ch_layout.nb_channels, link->format); |
| 1183 | ff_framequeue_skip_samples(&li->fifo, n, link->time_base); |
| 1184 | } |
| 1185 | |
| 1186 | *rframe = buf; |
no test coverage detected