MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / take_samples

Function take_samples

libavfilter/avfilter.c:1129–1188  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1127}
1128
1129static 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;

Callers 1

Calls 9

samples_readyFunction · 0.85
ff_framequeue_peekFunction · 0.85
ff_framequeue_takeFunction · 0.85
ff_get_audio_bufferFunction · 0.85
av_frame_copy_propsFunction · 0.85
av_frame_freeFunction · 0.85
av_samples_copyFunction · 0.85

Tested by

no test coverage detected