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

Function discard_samples

libavcodec/decode.c:319–409  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

317}
318
319static int discard_samples(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples)
320{
321 AVCodecInternal *avci = avctx->internal;
322 AVFrameSideData *side;
323 uint32_t discard_padding = 0;
324 uint8_t skip_reason = 0;
325 uint8_t discard_reason = 0;
326
327 side = av_frame_get_side_data(frame, AV_FRAME_DATA_SKIP_SAMPLES);
328 if (side && side->size >= 10) {
329 avci->skip_samples = AV_RL32(side->data);
330 avci->skip_samples = FFMAX(0, avci->skip_samples);
331 discard_padding = AV_RL32(side->data + 4);
332 av_log(avctx, AV_LOG_DEBUG, "skip %d / discard %d samples due to side data\n",
333 avci->skip_samples, (int)discard_padding);
334 skip_reason = AV_RL8(side->data + 8);
335 discard_reason = AV_RL8(side->data + 9);
336 }
337
338 if ((avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) {
339 if (!side && (avci->skip_samples || discard_padding))
340 side = av_frame_new_side_data(frame, AV_FRAME_DATA_SKIP_SAMPLES, 10);
341 if (side && (avci->skip_samples || discard_padding)) {
342 AV_WL32(side->data, avci->skip_samples);
343 AV_WL32(side->data + 4, discard_padding);
344 AV_WL8(side->data + 8, skip_reason);
345 AV_WL8(side->data + 9, discard_reason);
346 avci->skip_samples = 0;
347 }
348 return 0;
349 }
350 av_frame_remove_side_data(frame, AV_FRAME_DATA_SKIP_SAMPLES);
351
352 if ((frame->flags & AV_FRAME_FLAG_DISCARD)) {
353 avci->skip_samples = FFMAX(0, avci->skip_samples - frame->nb_samples);
354 *discarded_samples += frame->nb_samples;
355 return AVERROR(EAGAIN);
356 }
357
358 if (avci->skip_samples > 0) {
359 if (frame->nb_samples <= avci->skip_samples){
360 *discarded_samples += frame->nb_samples;
361 avci->skip_samples -= frame->nb_samples;
362 av_log(avctx, AV_LOG_DEBUG, "skip whole frame, skip left: %d\n",
363 avci->skip_samples);
364 return AVERROR(EAGAIN);
365 } else {
366 av_samples_copy(frame->extended_data, frame->extended_data, 0, avci->skip_samples,
367 frame->nb_samples - avci->skip_samples, avctx->ch_layout.nb_channels, frame->format);
368 if (avctx->pkt_timebase.num && avctx->sample_rate) {
369 int64_t diff_ts = av_rescale_q(avci->skip_samples,
370 (AVRational){1, avctx->sample_rate},
371 avctx->pkt_timebase);
372 if (frame->pts != AV_NOPTS_VALUE)
373 frame->pts += diff_ts;
374 if (frame->pkt_dts != AV_NOPTS_VALUE)
375 frame->pkt_dts += diff_ts;
376 if (frame->duration >= diff_ts)

Callers 2

decode_simple_internalFunction · 0.85

Calls 6

av_frame_get_side_dataFunction · 0.85
av_logFunction · 0.85
av_frame_new_side_dataFunction · 0.85
av_samples_copyFunction · 0.85
av_rescale_qFunction · 0.85

Tested by

no test coverage detected